Skip to content

fix(zigbee): Replace assert with error log to solve immediate crash #12368

fix(zigbee): Replace assert with error log to solve immediate crash

fix(zigbee): Replace assert with error log to solve immediate crash #12368

GitHub Actions / Test Results failed Jul 19, 2025 in 0s

9 errors, 33 pass in 10m 34s

 76 files   76 suites   10m 34s ⏱️
 42 tests  33 ✅ 0 💤 0 ❌  9 🔥
213 runs  202 ✅ 0 💤 0 ❌ 11 🔥

Results for commit a29b006.

Annotations

Check failure on line 0 in validation.nvs.test_nvs

See this annotation in the file changed.

@github-actions github-actions / Test Results

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

./artifacts/tests-results-wokwi-esp32-validation/validation/nvs/esp32/nvs0.xml [took 0s]
./artifacts/tests-results-wokwi-esp32-validation/validation/nvs/esp32/nvs1.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 0x7f5782557380>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f57825c2340>
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.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.13.5/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 0x7f57825574d0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7f57825570e0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = None
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7f5782557380>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-07-19_17-16-38-342368/test_nvs', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7f5782556120>}

    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.5/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-esp32-validation/validation/hello_world/esp32/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 0x7fd943b17380>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7fd943b8a480>
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.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.13.5/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 0x7fd943b174d0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7fd943b170e0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = None
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7fd943b17380>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-07-19_17-16-36-602146/test_hello_world', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7fd943b16120>}

    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.5/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-esp32-validation/validation/gpio/esp32/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 0x7eff878ff380>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7eff8796e480>
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.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.13.5/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 0x7eff878ff4d0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7eff878ff0e0>
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.esp32.json'
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7eff878ff380>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-07-19_17-16-35-832004/test_gpio', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7eff878fe120>}

    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.5/x64/lib/python3.13/site-packages/pytest_embedded_wokwi/wokwi_cli.py:61: RuntimeError

Check failure on line 0 in validation.wifi.test_wifi

See this annotation in the file changed.

@github-actions github-actions / Test Results

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

./artifacts/tests-results-wokwi-esp32-validation/validation/wifi/esp32/wifi0.xml [took 0s]
./artifacts/tests-results-wokwi-esp32-validation/validation/wifi/esp32/wifi1.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 0x7f35f7b27380>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f35f7b9a340>
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.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.13.5/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 0x7f35f7b274d0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7f35f7b270e0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = None
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7f35f7b27380>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-07-19_17-16-43-044749/test_wifi', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7f35f7b26120>}

    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.5/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-esp32-validation/validation/i2c_master/esp32/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 0x7f1a06ceb380>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f1a06d5e480>
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.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.13.5/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 0x7f1a06ceb4d0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7f1a06ceb0e0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = '/home/runner/work/arduino-esp32/arduino-esp32/tests/validation/i2c_master/diagram.esp32.json'
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7f1a06ceb380>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-07-19_17-16-37-493049/test_i2c_master', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7f1a06cea120>}

    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.5/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-esp32-validation/validation/uart/esp32/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 0x7f329124f380>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f32912be340>
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.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.13.5/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 0x7f329124f4d0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7f329124f0e0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = '/home/runner/work/arduino-esp32/arduino-esp32/tests/validation/uart/diagram.esp32.json'
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7f329124f380>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-07-19_17-16-41-478639/test_uart', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7f329124e120>}

    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.5/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-esp32-validation/validation/psram/esp32/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 0x7fca10767380>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7fca107d6340>
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.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.13.5/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 0x7fca107674d0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7fca107670e0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = None
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7fca10767380>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-07-19_17-16-39-907530/test_psram', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7fca10766120>}

    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.5/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-esp32-validation/validation/unity/esp32/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 0x7ff989b57380>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7ff989bc6340>
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.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.13.5/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 0x7ff989b574d0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7ff989b570e0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = None
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7ff989b57380>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-07-19_17-16-42-256994/test_unity', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7ff989b56120>}

    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.5/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-esp32-validation/validation/timer/esp32/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 0x7f0207d57380>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f0207dc6340>
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.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:499: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.13.5/x64/lib/python3.13/site-packages/pytest_embedded/plugin.py:1148: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.13.5/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 0x7f0207d574d0>
firmware_resolver = <pytest_embedded_wokwi.arduino.ArduinoFirmwareResolver object at 0x7f0207d570e0>
wokwi_cli_path = None, wokwi_timeout = 600000, wokwi_scenario = None
wokwi_diagram = None
app = <pytest_embedded_arduino.app.ArduinoApp object at 0x7f0207d57380>
kwargs = {'meta': Meta(logdir='/tmp/pytest-embedded/2025-07-19_17-16-40-684116/test_timer', port_target_cache={}, port_app_cache={}, logfile_extension='.log'), 'msg_queue': <pytest_embedded.log.MessageQueue object at 0x7f0207d56120>}

    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.5/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

42 tests found

There are 42 tests, see "Raw output" for the full list of tests.
Raw output
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