Skip to content

feat(zigbee): Save network channel after 1st joining for faster rejoi… #18

feat(zigbee): Save network channel after 1st joining for faster rejoi…

feat(zigbee): Save network channel after 1st joining for faster rejoi… #18

GitHub Actions / Test Results failed May 18, 2025 in 0s

9 errors, 34 pass in 10m 59s

 76 files   76 suites   10m 59s ⏱️
 43 tests  34 ✅ 0 💤 0 ❌  9 🔥
213 runs  200 ✅ 0 💤 0 ❌ 13 🔥

Results for commit e2915c4.

Annotations

Check failure on line 0 in validation.wifi.test_wifi

See this annotation in the file changed.

@github-actions github-actions / Test Results

3 out of 9 runs with error: test_wifi (validation.wifi.test_wifi)

./artifacts/tests-results-wokwi-esp32s3-validation/validation/wifi/esp32s3/wifi0.xml [took 0s]
./artifacts/tests-results-wokwi-esp32s3-validation/validation/wifi/esp32s3/wifi1.xml [took 0s]
./artifacts/tests-results-wokwi-esp32s3-validation/validation/wifi/esp32s3/wifi2.xml [took 0s]
Raw output
failed on setup with "RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh"
args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'wo...logfile_extension='.log'), 'wokwi': None}})), 'app': <pytest_embedded_arduino.app.ArduinoApp object at 0x7f6330b25a90>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f6330b5ee80>
res = None

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        def _close_or_terminate(obj):
            if obj is None:
                del obj
                return
    
            try:
                if isinstance(obj, (subprocess.Popen, multiprocessing.process.BaseProcess)):
                    obj.terminate()
                    obj.kill()
                elif isinstance(obj, io.IOBase):
                    try:
                        obj.close()
                    except Exception as e:
                        logging.debug('file %s closed failed with error: %s', obj, str(e))
                else:
                    try:
                        obj.close()
                    except AttributeError:
                        try:
                            obj.terminate()
                        except AttributeError:
                            pass
                    except Exception as e:
                        logging.debug('Not properly caught object %s: %s', obj, str(e))
            except Exception as e:
                logging.debug('%s: %s', obj, str(e))
                return  # swallow up all error
            finally:
                referrers = gc.get_referrers(obj)
                for _referrer in referrers:
                    if isinstance(_referrer, list):
                        for _i, val in enumerate(_referrer):
                            if val is obj:
                                _referrer[_i] = None
                    elif isinstance(_referrer, dict):
                        for key, value in _referrer.items():
                            if value is obj:
                                _referrer[key] = None
                del obj
    
        if _COUNT == 1:
            res = None
            try:
>               res = func(*args, **kwargs)

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/dut_factory.py:510: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'WokwiCLI' object has no attribute 'returncode'") raised in repr()] WokwiCLI object at 0x7f6330b25be0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7f6330b257f0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = None
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7f6330b25a90>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-05-18_03-29-14-246468/test_wifi', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7f6330b24830>}

    def __init__(
        self,
        firmware_resolver: IDFFirmwareResolver,
        wokwi_cli_path: t.Optional[str] = None,
        wokwi_timeout: t.Optional[int] = None,
        wokwi_scenario: t.Optional[str] = None,
        wokwi_diagram: t.Optional[str] = None,
        app: t.Optional['IdfApp'] = None,
        **kwargs,
    ):
        """
        Args:
            wokwi_cli_path: Wokwi CLI arguments
        """
        self.app = app
        self.firmware_resolver = firmware_resolver
    
        # first need to check if wokwi-cli exists in PATH
        if shutil.which('wokwi-cli') is None:
>           raise RuntimeError('Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh')
E           RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded_wokwi/wokwi_cli.py:61: RuntimeError

Check failure on line 0 in validation.i2c_master.test_i2c_master

See this annotation in the file changed.

@github-actions github-actions / Test Results

test_i2c_master (validation.i2c_master.test_i2c_master) with error

./artifacts/tests-results-wokwi-esp32s3-validation/validation/i2c_master/esp32s3/i2c_master.xml [took 0s]
Raw output
failed on setup with "RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh"
args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'wo...logfile_extension='.log'), 'wokwi': None}})), 'app': <pytest_embedded_arduino.app.ArduinoApp object at 0x7fe0ce941a90>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7fe0ce97afc0>
res = None

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        def _close_or_terminate(obj):
            if obj is None:
                del obj
                return
    
            try:
                if isinstance(obj, (subprocess.Popen, multiprocessing.process.BaseProcess)):
                    obj.terminate()
                    obj.kill()
                elif isinstance(obj, io.IOBase):
                    try:
                        obj.close()
                    except Exception as e:
                        logging.debug('file %s closed failed with error: %s', obj, str(e))
                else:
                    try:
                        obj.close()
                    except AttributeError:
                        try:
                            obj.terminate()
                        except AttributeError:
                            pass
                    except Exception as e:
                        logging.debug('Not properly caught object %s: %s', obj, str(e))
            except Exception as e:
                logging.debug('%s: %s', obj, str(e))
                return  # swallow up all error
            finally:
                referrers = gc.get_referrers(obj)
                for _referrer in referrers:
                    if isinstance(_referrer, list):
                        for _i, val in enumerate(_referrer):
                            if val is obj:
                                _referrer[_i] = None
                    elif isinstance(_referrer, dict):
                        for key, value in _referrer.items():
                            if value is obj:
                                _referrer[key] = None
                del obj
    
        if _COUNT == 1:
            res = None
            try:
>               res = func(*args, **kwargs)

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/dut_factory.py:510: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'WokwiCLI' object has no attribute 'returncode'") raised in repr()] WokwiCLI object at 0x7fe0ce941be0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7fe0ce9417f0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = '/home/runner/work/arduino-esp32/arduino-esp32/tests/validation/i2c_master/diagram.esp32s3.json'
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7fe0ce941a90>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-05-18_03-29-08-481013/test_i2c_master', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7fe0ce940830>}

    def __init__(
        self,
        firmware_resolver: IDFFirmwareResolver,
        wokwi_cli_path: t.Optional[str] = None,
        wokwi_timeout: t.Optional[int] = None,
        wokwi_scenario: t.Optional[str] = None,
        wokwi_diagram: t.Optional[str] = None,
        app: t.Optional['IdfApp'] = None,
        **kwargs,
    ):
        """
        Args:
            wokwi_cli_path: Wokwi CLI arguments
        """
        self.app = app
        self.firmware_resolver = firmware_resolver
    
        # first need to check if wokwi-cli exists in PATH
        if shutil.which('wokwi-cli') is None:
>           raise RuntimeError('Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh')
E           RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded_wokwi/wokwi_cli.py:61: RuntimeError

Check failure on line 0 in validation.gpio.test_gpio

See this annotation in the file changed.

@github-actions github-actions / Test Results

1 out of 7 runs with error: test_gpio (validation.gpio.test_gpio)

./artifacts/tests-results-wokwi-esp32s3-validation/validation/gpio/esp32s3/gpio.xml [took 0s]
Raw output
failed on setup with "RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh"
args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'wo...logfile_extension='.log'), 'wokwi': None}})), 'app': <pytest_embedded_arduino.app.ArduinoApp object at 0x7f49074a5a90>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f49074defc0>
res = None

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        def _close_or_terminate(obj):
            if obj is None:
                del obj
                return
    
            try:
                if isinstance(obj, (subprocess.Popen, multiprocessing.process.BaseProcess)):
                    obj.terminate()
                    obj.kill()
                elif isinstance(obj, io.IOBase):
                    try:
                        obj.close()
                    except Exception as e:
                        logging.debug('file %s closed failed with error: %s', obj, str(e))
                else:
                    try:
                        obj.close()
                    except AttributeError:
                        try:
                            obj.terminate()
                        except AttributeError:
                            pass
                    except Exception as e:
                        logging.debug('Not properly caught object %s: %s', obj, str(e))
            except Exception as e:
                logging.debug('%s: %s', obj, str(e))
                return  # swallow up all error
            finally:
                referrers = gc.get_referrers(obj)
                for _referrer in referrers:
                    if isinstance(_referrer, list):
                        for _i, val in enumerate(_referrer):
                            if val is obj:
                                _referrer[_i] = None
                    elif isinstance(_referrer, dict):
                        for key, value in _referrer.items():
                            if value is obj:
                                _referrer[key] = None
                del obj
    
        if _COUNT == 1:
            res = None
            try:
>               res = func(*args, **kwargs)

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/dut_factory.py:510: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'WokwiCLI' object has no attribute 'returncode'") raised in repr()] WokwiCLI object at 0x7f49074a5be0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7f49074a57f0>
wokwi_cli_path = None, wokwi_timeout = 600000
wokwi_scenario = '/home/runner/work/arduino-esp32/arduino-esp32/tests/validation/gpio/scenario.yaml'
wokwi_diagram = '/home/runner/work/arduino-esp32/arduino-esp32/tests/validation/gpio/diagram.esp32s3.json'
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7f49074a5a90>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-05-18_03-29-07-050929/test_gpio', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7f49074a4830>}

    def __init__(
        self,
        firmware_resolver: IDFFirmwareResolver,
        wokwi_cli_path: t.Optional[str] = None,
        wokwi_timeout: t.Optional[int] = None,
        wokwi_scenario: t.Optional[str] = None,
        wokwi_diagram: t.Optional[str] = None,
        app: t.Optional['IdfApp'] = None,
        **kwargs,
    ):
        """
        Args:
            wokwi_cli_path: Wokwi CLI arguments
        """
        self.app = app
        self.firmware_resolver = firmware_resolver
    
        # first need to check if wokwi-cli exists in PATH
        if shutil.which('wokwi-cli') is None:
>           raise RuntimeError('Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh')
E           RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded_wokwi/wokwi_cli.py:61: RuntimeError

Check failure on line 0 in validation.nvs.test_nvs

See this annotation in the file changed.

@github-actions github-actions / Test Results

3 out of 21 runs with error: test_nvs (validation.nvs.test_nvs)

./artifacts/tests-results-wokwi-esp32s3-validation/validation/nvs/esp32s3/nvs0.xml [took 0s]
./artifacts/tests-results-wokwi-esp32s3-validation/validation/nvs/esp32s3/nvs1.xml [took 0s]
./artifacts/tests-results-wokwi-esp32s3-validation/validation/nvs/esp32s3/nvs2.xml [took 0s]
Raw output
failed on setup with "RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh"
args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'wo...logfile_extension='.log'), 'wokwi': None}})), 'app': <pytest_embedded_arduino.app.ArduinoApp object at 0x7f7ea3691a90>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f7ea36cade0>
res = None

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        def _close_or_terminate(obj):
            if obj is None:
                del obj
                return
    
            try:
                if isinstance(obj, (subprocess.Popen, multiprocessing.process.BaseProcess)):
                    obj.terminate()
                    obj.kill()
                elif isinstance(obj, io.IOBase):
                    try:
                        obj.close()
                    except Exception as e:
                        logging.debug('file %s closed failed with error: %s', obj, str(e))
                else:
                    try:
                        obj.close()
                    except AttributeError:
                        try:
                            obj.terminate()
                        except AttributeError:
                            pass
                    except Exception as e:
                        logging.debug('Not properly caught object %s: %s', obj, str(e))
            except Exception as e:
                logging.debug('%s: %s', obj, str(e))
                return  # swallow up all error
            finally:
                referrers = gc.get_referrers(obj)
                for _referrer in referrers:
                    if isinstance(_referrer, list):
                        for _i, val in enumerate(_referrer):
                            if val is obj:
                                _referrer[_i] = None
                    elif isinstance(_referrer, dict):
                        for key, value in _referrer.items():
                            if value is obj:
                                _referrer[key] = None
                del obj
    
        if _COUNT == 1:
            res = None
            try:
>               res = func(*args, **kwargs)

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/dut_factory.py:510: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'WokwiCLI' object has no attribute 'returncode'") raised in repr()] WokwiCLI object at 0x7f7ea3691be0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7f7ea36917f0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = None
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7f7ea3691a90>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-05-18_03-29-09-200773/test_nvs', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7f7ea3690830>}

    def __init__(
        self,
        firmware_resolver: IDFFirmwareResolver,
        wokwi_cli_path: t.Optional[str] = None,
        wokwi_timeout: t.Optional[int] = None,
        wokwi_scenario: t.Optional[str] = None,
        wokwi_diagram: t.Optional[str] = None,
        app: t.Optional['IdfApp'] = None,
        **kwargs,
    ):
        """
        Args:
            wokwi_cli_path: Wokwi CLI arguments
        """
        self.app = app
        self.firmware_resolver = firmware_resolver
    
        # first need to check if wokwi-cli exists in PATH
        if shutil.which('wokwi-cli') is None:
>           raise RuntimeError('Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh')
E           RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded_wokwi/wokwi_cli.py:61: RuntimeError

Check failure on line 0 in validation.hello_world.test_hello_world

See this annotation in the file changed.

@github-actions github-actions / Test Results

1 out of 7 runs with error: test_hello_world (validation.hello_world.test_hello_world)

./artifacts/tests-results-wokwi-esp32s3-validation/validation/hello_world/esp32s3/hello_world.xml [took 0s]
Raw output
failed on setup with "RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh"
args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'wo...logfile_extension='.log'), 'wokwi': None}})), 'app': <pytest_embedded_arduino.app.ArduinoApp object at 0x7f0d9de99a90>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f0d9ded2fc0>
res = None

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        def _close_or_terminate(obj):
            if obj is None:
                del obj
                return
    
            try:
                if isinstance(obj, (subprocess.Popen, multiprocessing.process.BaseProcess)):
                    obj.terminate()
                    obj.kill()
                elif isinstance(obj, io.IOBase):
                    try:
                        obj.close()
                    except Exception as e:
                        logging.debug('file %s closed failed with error: %s', obj, str(e))
                else:
                    try:
                        obj.close()
                    except AttributeError:
                        try:
                            obj.terminate()
                        except AttributeError:
                            pass
                    except Exception as e:
                        logging.debug('Not properly caught object %s: %s', obj, str(e))
            except Exception as e:
                logging.debug('%s: %s', obj, str(e))
                return  # swallow up all error
            finally:
                referrers = gc.get_referrers(obj)
                for _referrer in referrers:
                    if isinstance(_referrer, list):
                        for _i, val in enumerate(_referrer):
                            if val is obj:
                                _referrer[_i] = None
                    elif isinstance(_referrer, dict):
                        for key, value in _referrer.items():
                            if value is obj:
                                _referrer[key] = None
                del obj
    
        if _COUNT == 1:
            res = None
            try:
>               res = func(*args, **kwargs)

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/dut_factory.py:510: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'WokwiCLI' object has no attribute 'returncode'") raised in repr()] WokwiCLI object at 0x7f0d9de99be0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7f0d9de997f0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = None
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7f0d9de99a90>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-05-18_03-29-07-762108/test_hello_world', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7f0d9de98830>}

    def __init__(
        self,
        firmware_resolver: IDFFirmwareResolver,
        wokwi_cli_path: t.Optional[str] = None,
        wokwi_timeout: t.Optional[int] = None,
        wokwi_scenario: t.Optional[str] = None,
        wokwi_diagram: t.Optional[str] = None,
        app: t.Optional['IdfApp'] = None,
        **kwargs,
    ):
        """
        Args:
            wokwi_cli_path: Wokwi CLI arguments
        """
        self.app = app
        self.firmware_resolver = firmware_resolver
    
        # first need to check if wokwi-cli exists in PATH
        if shutil.which('wokwi-cli') is None:
>           raise RuntimeError('Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh')
E           RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded_wokwi/wokwi_cli.py:61: RuntimeError

Check failure on line 0 in validation.psram.test_psram

See this annotation in the file changed.

@github-actions github-actions / Test Results

test_psram (validation.psram.test_psram) with error

./artifacts/tests-results-wokwi-esp32s3-validation/validation/psram/esp32s3/psram.xml [took 0s]
Raw output
failed on setup with "RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh"
args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'wo...logfile_extension='.log'), 'wokwi': None}})), 'app': <pytest_embedded_arduino.app.ArduinoApp object at 0x7fd7fc6a5a90>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7fd7fc6dae80>
res = None

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        def _close_or_terminate(obj):
            if obj is None:
                del obj
                return
    
            try:
                if isinstance(obj, (subprocess.Popen, multiprocessing.process.BaseProcess)):
                    obj.terminate()
                    obj.kill()
                elif isinstance(obj, io.IOBase):
                    try:
                        obj.close()
                    except Exception as e:
                        logging.debug('file %s closed failed with error: %s', obj, str(e))
                else:
                    try:
                        obj.close()
                    except AttributeError:
                        try:
                            obj.terminate()
                        except AttributeError:
                            pass
                    except Exception as e:
                        logging.debug('Not properly caught object %s: %s', obj, str(e))
            except Exception as e:
                logging.debug('%s: %s', obj, str(e))
                return  # swallow up all error
            finally:
                referrers = gc.get_referrers(obj)
                for _referrer in referrers:
                    if isinstance(_referrer, list):
                        for _i, val in enumerate(_referrer):
                            if val is obj:
                                _referrer[_i] = None
                    elif isinstance(_referrer, dict):
                        for key, value in _referrer.items():
                            if value is obj:
                                _referrer[key] = None
                del obj
    
        if _COUNT == 1:
            res = None
            try:
>               res = func(*args, **kwargs)

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/dut_factory.py:510: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'WokwiCLI' object has no attribute 'returncode'") raised in repr()] WokwiCLI object at 0x7fd7fc6a5be0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7fd7fc6a57f0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = '/home/runner/work/arduino-esp32/arduino-esp32/tests/validation/psram/diagram.esp32s3.json'
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7fd7fc6a5a90>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-05-18_03-29-11-340803/test_psram', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7fd7fc6a4830>}

    def __init__(
        self,
        firmware_resolver: IDFFirmwareResolver,
        wokwi_cli_path: t.Optional[str] = None,
        wokwi_timeout: t.Optional[int] = None,
        wokwi_scenario: t.Optional[str] = None,
        wokwi_diagram: t.Optional[str] = None,
        app: t.Optional['IdfApp'] = None,
        **kwargs,
    ):
        """
        Args:
            wokwi_cli_path: Wokwi CLI arguments
        """
        self.app = app
        self.firmware_resolver = firmware_resolver
    
        # first need to check if wokwi-cli exists in PATH
        if shutil.which('wokwi-cli') is None:
>           raise RuntimeError('Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh')
E           RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded_wokwi/wokwi_cli.py:61: RuntimeError

Check failure on line 0 in validation.unity.test_unity

See this annotation in the file changed.

@github-actions github-actions / Test Results

test_unity (validation.unity.test_unity) with error

./artifacts/tests-results-wokwi-esp32s3-validation/validation/unity/esp32s3/unity.xml [took 0s]
Raw output
failed on setup with "RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh"
args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'wo...logfile_extension='.log'), 'wokwi': None}})), 'app': <pytest_embedded_arduino.app.ArduinoApp object at 0x7f1e15631a90>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f1e1566ae80>
res = None

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        def _close_or_terminate(obj):
            if obj is None:
                del obj
                return
    
            try:
                if isinstance(obj, (subprocess.Popen, multiprocessing.process.BaseProcess)):
                    obj.terminate()
                    obj.kill()
                elif isinstance(obj, io.IOBase):
                    try:
                        obj.close()
                    except Exception as e:
                        logging.debug('file %s closed failed with error: %s', obj, str(e))
                else:
                    try:
                        obj.close()
                    except AttributeError:
                        try:
                            obj.terminate()
                        except AttributeError:
                            pass
                    except Exception as e:
                        logging.debug('Not properly caught object %s: %s', obj, str(e))
            except Exception as e:
                logging.debug('%s: %s', obj, str(e))
                return  # swallow up all error
            finally:
                referrers = gc.get_referrers(obj)
                for _referrer in referrers:
                    if isinstance(_referrer, list):
                        for _i, val in enumerate(_referrer):
                            if val is obj:
                                _referrer[_i] = None
                    elif isinstance(_referrer, dict):
                        for key, value in _referrer.items():
                            if value is obj:
                                _referrer[key] = None
                del obj
    
        if _COUNT == 1:
            res = None
            try:
>               res = func(*args, **kwargs)

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/dut_factory.py:510: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'WokwiCLI' object has no attribute 'returncode'") raised in repr()] WokwiCLI object at 0x7f1e15631be0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7f1e156317f0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = None
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7f1e15631a90>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-05-18_03-29-13-521277/test_unity', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7f1e15630830>}

    def __init__(
        self,
        firmware_resolver: IDFFirmwareResolver,
        wokwi_cli_path: t.Optional[str] = None,
        wokwi_timeout: t.Optional[int] = None,
        wokwi_scenario: t.Optional[str] = None,
        wokwi_diagram: t.Optional[str] = None,
        app: t.Optional['IdfApp'] = None,
        **kwargs,
    ):
        """
        Args:
            wokwi_cli_path: Wokwi CLI arguments
        """
        self.app = app
        self.firmware_resolver = firmware_resolver
    
        # first need to check if wokwi-cli exists in PATH
        if shutil.which('wokwi-cli') is None:
>           raise RuntimeError('Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh')
E           RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded_wokwi/wokwi_cli.py:61: RuntimeError

Check failure on line 0 in validation.uart.test_uart

See this annotation in the file changed.

@github-actions github-actions / Test Results

test_uart (validation.uart.test_uart) with error

./artifacts/tests-results-wokwi-esp32s3-validation/validation/uart/esp32s3/uart.xml [took 0s]
Raw output
failed on setup with "RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh"
args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'wo...logfile_extension='.log'), 'wokwi': None}})), 'app': <pytest_embedded_arduino.app.ArduinoApp object at 0x7f6cc9019a90>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f6cc9052e80>
res = None

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        def _close_or_terminate(obj):
            if obj is None:
                del obj
                return
    
            try:
                if isinstance(obj, (subprocess.Popen, multiprocessing.process.BaseProcess)):
                    obj.terminate()
                    obj.kill()
                elif isinstance(obj, io.IOBase):
                    try:
                        obj.close()
                    except Exception as e:
                        logging.debug('file %s closed failed with error: %s', obj, str(e))
                else:
                    try:
                        obj.close()
                    except AttributeError:
                        try:
                            obj.terminate()
                        except AttributeError:
                            pass
                    except Exception as e:
                        logging.debug('Not properly caught object %s: %s', obj, str(e))
            except Exception as e:
                logging.debug('%s: %s', obj, str(e))
                return  # swallow up all error
            finally:
                referrers = gc.get_referrers(obj)
                for _referrer in referrers:
                    if isinstance(_referrer, list):
                        for _i, val in enumerate(_referrer):
                            if val is obj:
                                _referrer[_i] = None
                    elif isinstance(_referrer, dict):
                        for key, value in _referrer.items():
                            if value is obj:
                                _referrer[key] = None
                del obj
    
        if _COUNT == 1:
            res = None
            try:
>               res = func(*args, **kwargs)

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/dut_factory.py:510: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'WokwiCLI' object has no attribute 'returncode'") raised in repr()] WokwiCLI object at 0x7f6cc9019be0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7f6cc90197f0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = None
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7f6cc9019a90>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-05-18_03-29-12-803090/test_uart', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7f6cc9018830>}

    def __init__(
        self,
        firmware_resolver: IDFFirmwareResolver,
        wokwi_cli_path: t.Optional[str] = None,
        wokwi_timeout: t.Optional[int] = None,
        wokwi_scenario: t.Optional[str] = None,
        wokwi_diagram: t.Optional[str] = None,
        app: t.Optional['IdfApp'] = None,
        **kwargs,
    ):
        """
        Args:
            wokwi_cli_path: Wokwi CLI arguments
        """
        self.app = app
        self.firmware_resolver = firmware_resolver
    
        # first need to check if wokwi-cli exists in PATH
        if shutil.which('wokwi-cli') is None:
>           raise RuntimeError('Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh')
E           RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded_wokwi/wokwi_cli.py:61: RuntimeError

Check failure on line 0 in validation.timer.test_timer

See this annotation in the file changed.

@github-actions github-actions / Test Results

test_timer (validation.timer.test_timer) with error

./artifacts/tests-results-wokwi-esp32s3-validation/validation/timer/esp32s3/timer.xml [took 0s]
Raw output
failed on setup with "RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh"
args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'wo...logfile_extension='.log'), 'wokwi': None}})), 'app': <pytest_embedded_arduino.app.ArduinoApp object at 0x7f5ad528da90>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f5ad52c6e80>
res = None

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        def _close_or_terminate(obj):
            if obj is None:
                del obj
                return
    
            try:
                if isinstance(obj, (subprocess.Popen, multiprocessing.process.BaseProcess)):
                    obj.terminate()
                    obj.kill()
                elif isinstance(obj, io.IOBase):
                    try:
                        obj.close()
                    except Exception as e:
                        logging.debug('file %s closed failed with error: %s', obj, str(e))
                else:
                    try:
                        obj.close()
                    except AttributeError:
                        try:
                            obj.terminate()
                        except AttributeError:
                            pass
                    except Exception as e:
                        logging.debug('Not properly caught object %s: %s', obj, str(e))
            except Exception as e:
                logging.debug('%s: %s', obj, str(e))
                return  # swallow up all error
            finally:
                referrers = gc.get_referrers(obj)
                for _referrer in referrers:
                    if isinstance(_referrer, list):
                        for _i, val in enumerate(_referrer):
                            if val is obj:
                                _referrer[_i] = None
                    elif isinstance(_referrer, dict):
                        for key, value in _referrer.items():
                            if value is obj:
                                _referrer[key] = None
                del obj
    
        if _COUNT == 1:
            res = None
            try:
>               res = func(*args, **kwargs)

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded/dut_factory.py:510: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[AttributeError("'WokwiCLI' object has no attribute 'returncode'") raised in repr()] WokwiCLI object at 0x7f5ad528dbe0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7f5ad528d7f0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = None
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7f5ad528da90>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-05-18_03-29-12-055664/test_timer', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7f5ad528c830>}

    def __init__(
        self,
        firmware_resolver: IDFFirmwareResolver,
        wokwi_cli_path: t.Optional[str] = None,
        wokwi_timeout: t.Optional[int] = None,
        wokwi_scenario: t.Optional[str] = None,
        wokwi_diagram: t.Optional[str] = None,
        app: t.Optional['IdfApp'] = None,
        **kwargs,
    ):
        """
        Args:
            wokwi_cli_path: Wokwi CLI arguments
        """
        self.app = app
        self.firmware_resolver = firmware_resolver
    
        # first need to check if wokwi-cli exists in PATH
        if shutil.which('wokwi-cli') is None:
>           raise RuntimeError('Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh')
E           RuntimeError: Please install wokwi-cli, by running: curl -L https://wokwi.com/ci/install.sh | sh

/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/pytest_embedded_wokwi/wokwi_cli.py:61: RuntimeError

Check notice on line 0 in .github

See this annotation in the file changed.

@github-actions github-actions / Test Results

43 tests found

There are 43 tests, see "Raw output" for the full list of tests.
Raw output
auto_baudrate_test
basic_transmission_test
begin_when_running_test
change_baudrate_test
change_clock
change_cpu_frequency_test
change_pins_test
disabled_uart_calls_test
enabled_uart_calls_test
end_when_stopped_test
periman_test
psram_found
resize_buffers_test
rtc_run_clock
rtc_set_time
scan_bus
scan_bus_with_wifi
swap_pins
test_api
test_calloc_success
test_fail
test_malloc_fail
test_malloc_success
test_memcpy
test_memset_all_ones
test_memset_all_zeroes
test_memset_alternating
test_memset_random
test_pass
test_realloc_success
timer_clock_select_test
timer_divider_test
timer_interrupt_test
timer_read_test
validation.gpio.test_gpio ‑ test_gpio
validation.hello_world.test_hello_world ‑ test_hello_world
validation.i2c_master.test_i2c_master ‑ test_i2c_master
validation.nvs.test_nvs ‑ test_nvs
validation.psram.test_psram ‑ test_psram
validation.timer.test_timer ‑ test_timer
validation.uart.test_uart ‑ test_uart
validation.unity.test_unity ‑ test_unity
validation.wifi.test_wifi ‑ test_wifi