Skip to content

ci(pre-commit): Apply automatic fixes

35cae5e
Select commit
Loading
Failed to load commit list.
Sign in for the full log view
Merged

fix(ci): Fix tests and workflows #12024

ci(pre-commit): Apply automatic fixes
35cae5e
Select commit
Loading
Failed to load commit list.
GitHub Actions / Test Results failed Nov 20, 2025 in 0s

18 errors, 32 pass in 23m 9s

152 files  152 suites   23m 9s ⏱️
 50 tests  32 ✅ 0 💤 0 ❌ 18 🔥
270 runs  175 ✅ 0 💤 0 ❌ 95 🔥

Results for commit 35cae5e.

Annotations

Check failure on line 3 in validation/nvs/test_nvs.py

See this annotation in the file changed.

@github-actions github-actions / Test Results

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

./artifacts/test-results-wokwi-esp32-validation/validation/nvs/esp32/nvs0.xml [took 1s]
./artifacts/test-results-wokwi-esp32-validation/validation/nvs/esp32/nvs1.xml [took 1s]
./artifacts/test-results-wokwi-esp32c3-validation/validation/nvs/esp32c3/nvs0.xml [took 1s]
./artifacts/test-results-wokwi-esp32c3-validation/validation/nvs/esp32c3/nvs1.xml [took 1s]
./artifacts/test-results-wokwi-esp32c6-validation/validation/nvs/esp32c6/nvs0.xml [took 1s]
./artifacts/test-results-wokwi-esp32c6-validation/validation/nvs/esp32c6/nvs1.xml [took 1s]
./artifacts/test-results-wokwi-esp32c6-validation/validation/nvs/esp32c6/nvs2.xml [took 1s]
./artifacts/test-results-wokwi-esp32c6-validation/validation/nvs/esp32c6/nvs3.xml [took 2s]
./artifacts/test-results-wokwi-esp32h2-validation/validation/nvs/esp32h2/nvs0.xml [took 1s]
./artifacts/test-results-wokwi-esp32h2-validation/validation/nvs/esp32h2/nvs1.xml [took 1s]
./artifacts/test-results-wokwi-esp32h2-validation/validation/nvs/esp32h2/nvs2.xml [took 1s]
./artifacts/test-results-wokwi-esp32h2-validation/validation/nvs/esp32h2/nvs3.xml [took 1s]
./artifacts/test-results-wokwi-esp32p4-validation/validation/nvs/esp32p4/nvs0.xml [took 1s]
./artifacts/test-results-wokwi-esp32p4-validation/validation/nvs/esp32p4/nvs1.xml [took 1s]
./artifacts/test-results-wokwi-esp32p4-validation/validation/nvs/esp32p4/nvs2.xml [took 1s]
./artifacts/test-results-wokwi-esp32p4-validation/validation/nvs/esp32p4/nvs3.xml [took 1s]
./artifacts/test-results-wokwi-esp32s2-validation/validation/nvs/esp32s2/nvs0.xml [took 1s]
./artifacts/test-results-wokwi-esp32s2-validation/validation/nvs/esp32s2/nvs1.xml [took 1s]
./artifacts/test-results-wokwi-esp32s3-validation/validation/nvs/esp32s3/nvs0.xml [took 1s]
./artifacts/test-results-wokwi-esp32s3-validation/validation/nvs/esp32s3/nvs1.xml [took 1s]
./artifacts/test-results-wokwi-esp32s3-validation/validation/nvs/esp32s3/nvs2.xml [took 1s]
Raw output
failed on setup with "wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing."
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 0x7ff3e1588c20>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7ff3e158d010>
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.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:1159: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/dut_factory.py:526: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:87: in __init__
    raise e
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:83: in __init__
    self._setup_simulation(wokwi_diagram, firmware_path, elf_path)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:96: in _setup_simulation
    firmware = self.client.upload_file('pytest.bin', firmware_path)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:212: in sync_wrapper
    return self._call(attr(*args, **kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:79: in _call
    return future.result()  # Block until the coroutine completes or raises
           ^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:450: in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:395: in __get_result
    raise self._exception
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client.py:97: in upload_file
    return await upload_file(self._transport, filename, local_path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:25: in upload_file
    await upload(transport, filename, content)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:31: in upload
    return await transport.request("file:upload", params.model_dump())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:103: in request
    resp_msg_resp = await future
                    ^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:115: in _background_recv
    msg: IncomingMessage = await self._recv()
                           ^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wokwi_client.transport.Transport object at 0x7ff3e15897f0>

    async def _recv(self) -> IncomingMessage:
        if self._ws is None:
            raise WokwiError("Not connected")
        raw_message = await self._ws.recv()
        while isinstance(raw_message, bytes):
            warnings.warn("Unexpected binary message received and skipped", RuntimeWarning)
            raw_message = await self._ws.recv()
        try:
            message = json.loads(raw_message)
        except json.JSONDecodeError as e:
            raise WokwiError(f"Failed to parse message: {raw_message}") from e
        if "type" not in message:
            raise WokwiError(f"Invalid message: {message}")
        if message["type"] == "error":
>           raise WokwiError(f"Server error: {message['message']}")
E           wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing.

/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:171: WokwiError

Check failure on line 0 in validation.timer

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 2 runs with error: missing-run (validation.timer)

./test_errors/test-results-hardware/tests/validation/timer/esp32p4/timer_missing_0.xml
./test_errors/test-results-hardware/tests/validation/timer/esp32s2/timer_missing_0.xml
Raw output
Expected test run missing
This placeholder indicates an expected test run did not execute.

Check failure on line 0 in validation/i2c_master/test_i2c_master.py

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 7 runs with error: test_i2c_master (validation.i2c_master.test_i2c_master)

./artifacts/test-results-wokwi-esp32-validation/validation/i2c_master/esp32/i2c_master.xml [took 1s]
./artifacts/test-results-wokwi-esp32c3-validation/validation/i2c_master/esp32c3/i2c_master.xml [took 1s]
./artifacts/test-results-wokwi-esp32c6-validation/validation/i2c_master/esp32c6/i2c_master.xml [took 1s]
./artifacts/test-results-wokwi-esp32h2-validation/validation/i2c_master/esp32h2/i2c_master.xml [took 1s]
./artifacts/test-results-wokwi-esp32p4-validation/validation/i2c_master/esp32p4/i2c_master.xml [took 2s]
./artifacts/test-results-wokwi-esp32s2-validation/validation/i2c_master/esp32s2/i2c_master.xml [took 1s]
./artifacts/test-results-wokwi-esp32s3-validation/validation/i2c_master/esp32s3/i2c_master.xml [took 2s]
Raw output
failed on setup with "websockets.exceptions.ConnectionClosedError: received 1008 (policy violation) You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing.; then sent 1008 (policy violation) You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing."
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 0x7f13e9174d70>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f13e9189010>
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.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:1159: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/dut_factory.py:526: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:87: in __init__
    raise e
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:83: in __init__
    self._setup_simulation(wokwi_diagram, firmware_path, elf_path)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:98: in _setup_simulation
    self.client.upload_file('pytest.elf', elf_path)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:212: in sync_wrapper
    return self._call(attr(*args, **kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:79: in _call
    return future.result()  # Block until the coroutine completes or raises
           ^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:450: in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:395: in __get_result
    raise self._exception
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client.py:97: in upload_file
    return await upload_file(self._transport, filename, local_path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:25: in upload_file
    await upload(transport, filename, content)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:31: in upload
    return await transport.request("file:upload", params.model_dump())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:99: in request
    await self._ws.send(
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/websockets/legacy/protocol.py:635: in send
    await self.ensure_open()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <websockets.legacy.client.WebSocketClientProtocol object at 0x7f13e9177e00>

    async def ensure_open(self) -> None:
        """
        Check that the WebSocket connection is open.
    
        Raise :exc:`~websockets.exceptions.ConnectionClosed` if it isn't.
    
        """
        # Handle cases from most common to least common for performance.
        if self.state is State.OPEN:
            # If self.transfer_data_task exited without a closing handshake,
            # self.close_connection_task may be closing the connection, going
            # straight from OPEN to CLOSED.
            if self.transfer_data_task.done():
                await asyncio.shield(self.close_connection_task)
                raise self.connection_closed_exc()
            else:
                return
    
        if self.state is State.CLOSED:
            raise self.connection_closed_exc()
    
        if self.state is State.CLOSING:
            # If we started the closing handshake, wait for its completion to
            # get the proper close code and reason. self.close_connection_task
            # will complete within 4 or 5 * close_timeout after close(). The
            # CLOSING state also occurs when failing the connection. In that
            # case self.close_connection_task will complete even faster.
            await asyncio.shield(self.close_connection_task)
>           raise self.connection_closed_exc()
E           websockets.exceptions.ConnectionClosedError: received 1008 (policy violation) You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing.; then sent 1008 (policy violation) You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing.

/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/websockets/legacy/protocol.py:948: ConnectionClosedError

Check failure on line 0 in validation/hello_world/test_hello_world.py

See this annotation in the file changed.

@github-actions github-actions / Test Results

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

./artifacts/test-results-wokwi-esp32-validation/validation/hello_world/esp32/hello_world.xml [took 1s]
./artifacts/test-results-wokwi-esp32c3-validation/validation/hello_world/esp32c3/hello_world.xml [took 1s]
./artifacts/test-results-wokwi-esp32c6-validation/validation/hello_world/esp32c6/hello_world.xml [took 1s]
./artifacts/test-results-wokwi-esp32h2-validation/validation/hello_world/esp32h2/hello_world.xml [took 1s]
./artifacts/test-results-wokwi-esp32p4-validation/validation/hello_world/esp32p4/hello_world.xml [took 1s]
./artifacts/test-results-wokwi-esp32s2-validation/validation/hello_world/esp32s2/hello_world.xml [took 1s]
./artifacts/test-results-wokwi-esp32s3-validation/validation/hello_world/esp32s3/hello_world.xml [took 1s]
Raw output
failed on setup with "wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing."
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 0x7f739cd74c20>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f739cd79010>
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.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:1159: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/dut_factory.py:526: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:87: in __init__
    raise e
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:83: in __init__
    self._setup_simulation(wokwi_diagram, firmware_path, elf_path)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:98: in _setup_simulation
    self.client.upload_file('pytest.elf', elf_path)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:212: in sync_wrapper
    return self._call(attr(*args, **kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:79: in _call
    return future.result()  # Block until the coroutine completes or raises
           ^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:450: in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:395: in __get_result
    raise self._exception
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client.py:97: in upload_file
    return await upload_file(self._transport, filename, local_path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:25: in upload_file
    await upload(transport, filename, content)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:31: in upload
    return await transport.request("file:upload", params.model_dump())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:103: in request
    resp_msg_resp = await future
                    ^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:115: in _background_recv
    msg: IncomingMessage = await self._recv()
                           ^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wokwi_client.transport.Transport object at 0x7f739cd757f0>

    async def _recv(self) -> IncomingMessage:
        if self._ws is None:
            raise WokwiError("Not connected")
        raw_message = await self._ws.recv()
        while isinstance(raw_message, bytes):
            warnings.warn("Unexpected binary message received and skipped", RuntimeWarning)
            raw_message = await self._ws.recv()
        try:
            message = json.loads(raw_message)
        except json.JSONDecodeError as e:
            raise WokwiError(f"Failed to parse message: {raw_message}") from e
        if "type" not in message:
            raise WokwiError(f"Invalid message: {message}")
        if message["type"] == "error":
>           raise WokwiError(f"Server error: {message['message']}")
E           wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing.

/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:171: WokwiError

Check failure on line 0 in validation.nvs

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 6 runs with error: missing-run (validation.nvs)

./test_errors/test-results-hardware/tests/validation/nvs/esp32p4/nvs_missing_0.xml
./test_errors/test-results-hardware/tests/validation/nvs/esp32p4/nvs_missing_1.xml
./test_errors/test-results-hardware/tests/validation/nvs/esp32p4/nvs_missing_2.xml
./test_errors/test-results-hardware/tests/validation/nvs/esp32p4/nvs_missing_3.xml
./test_errors/test-results-hardware/tests/validation/nvs/esp32s2/nvs_missing_0.xml
./test_errors/test-results-hardware/tests/validation/nvs/esp32s2/nvs_missing_1.xml
Raw output
Expected test run missing
This placeholder indicates an expected test run did not execute.

Check failure on line 6 in validation/gpio/test_gpio.py

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 7 runs with error: test_gpio (validation.gpio.test_gpio)

./artifacts/test-results-wokwi-esp32-validation/validation/gpio/esp32/gpio.xml [took 1s]
./artifacts/test-results-wokwi-esp32c3-validation/validation/gpio/esp32c3/gpio.xml [took 1s]
./artifacts/test-results-wokwi-esp32c6-validation/validation/gpio/esp32c6/gpio.xml [took 0s]
./artifacts/test-results-wokwi-esp32h2-validation/validation/gpio/esp32h2/gpio.xml [took 1s]
./artifacts/test-results-wokwi-esp32p4-validation/validation/gpio/esp32p4/gpio.xml [took 1s]
./artifacts/test-results-wokwi-esp32s2-validation/validation/gpio/esp32s2/gpio.xml [took 1s]
./artifacts/test-results-wokwi-esp32s3-validation/validation/gpio/esp32s3/gpio.xml [took 1s]
Raw output
failed on setup with "wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing."
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 0x7f3ed6c70d70>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f3ed6c80b40>
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.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:1159: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/dut_factory.py:526: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:87: in __init__
    raise e
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:83: in __init__
    self._setup_simulation(wokwi_diagram, firmware_path, elf_path)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:103: in _setup_simulation
    self.client.start_simulation(firmware, elf='pytest.elf')
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:212: in sync_wrapper
    return self._call(attr(*args, **kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:79: in _call
    return future.result()  # Block until the coroutine completes or raises
           ^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:450: in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:395: in __get_result
    raise self._exception
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client.py:157: in start_simulation
    await start(
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/simulation.py:19: in start
    return await transport.request(
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:103: in request
    resp_msg_resp = await future
                    ^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:115: in _background_recv
    msg: IncomingMessage = await self._recv()
                           ^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wokwi_client.transport.Transport object at 0x7f3ed6c71940>

    async def _recv(self) -> IncomingMessage:
        if self._ws is None:
            raise WokwiError("Not connected")
        raw_message = await self._ws.recv()
        while isinstance(raw_message, bytes):
            warnings.warn("Unexpected binary message received and skipped", RuntimeWarning)
            raw_message = await self._ws.recv()
        try:
            message = json.loads(raw_message)
        except json.JSONDecodeError as e:
            raise WokwiError(f"Failed to parse message: {raw_message}") from e
        if "type" not in message:
            raise WokwiError(f"Invalid message: {message}")
        if message["type"] == "error":
>           raise WokwiError(f"Server error: {message['message']}")
E           wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing.

/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:171: WokwiError

Check failure on line 4 in validation/wifi/test_wifi.py

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 9 runs with error: test_wifi (validation.wifi.test_wifi)

./artifacts/test-results-wokwi-esp32-validation/validation/wifi/esp32/wifi0.xml [took 1s]
./artifacts/test-results-wokwi-esp32-validation/validation/wifi/esp32/wifi1.xml [took 1s]
./artifacts/test-results-wokwi-esp32c3-validation/validation/wifi/esp32c3/wifi.xml [took 2s]
./artifacts/test-results-wokwi-esp32c6-validation/validation/wifi/esp32c6/wifi.xml [took 2s]
./artifacts/test-results-wokwi-esp32s2-validation/validation/wifi/esp32s2/wifi0.xml [took 2s]
./artifacts/test-results-wokwi-esp32s2-validation/validation/wifi/esp32s2/wifi1.xml [took 1s]
./artifacts/test-results-wokwi-esp32s3-validation/validation/wifi/esp32s3/wifi0.xml [took 1s]
./artifacts/test-results-wokwi-esp32s3-validation/validation/wifi/esp32s3/wifi1.xml [took 1s]
./artifacts/test-results-wokwi-esp32s3-validation/validation/wifi/esp32s3/wifi2.xml [took 1s]
Raw output
failed on setup with "wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing."
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 0x7f0ad457cc20>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f0ad4581010>
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.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:1159: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/dut_factory.py:526: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:87: in __init__
    raise e
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:83: in __init__
    self._setup_simulation(wokwi_diagram, firmware_path, elf_path)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:98: in _setup_simulation
    self.client.upload_file('pytest.elf', elf_path)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:212: in sync_wrapper
    return self._call(attr(*args, **kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:79: in _call
    return future.result()  # Block until the coroutine completes or raises
           ^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:450: in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:395: in __get_result
    raise self._exception
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client.py:97: in upload_file
    return await upload_file(self._transport, filename, local_path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:25: in upload_file
    await upload(transport, filename, content)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:31: in upload
    return await transport.request("file:upload", params.model_dump())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:103: in request
    resp_msg_resp = await future
                    ^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:115: in _background_recv
    msg: IncomingMessage = await self._recv()
                           ^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wokwi_client.transport.Transport object at 0x7f0ad457d7f0>

    async def _recv(self) -> IncomingMessage:
        if self._ws is None:
            raise WokwiError("Not connected")
        raw_message = await self._ws.recv()
        while isinstance(raw_message, bytes):
            warnings.warn("Unexpected binary message received and skipped", RuntimeWarning)
            raw_message = await self._ws.recv()
        try:
            message = json.loads(raw_message)
        except json.JSONDecodeError as e:
            raise WokwiError(f"Failed to parse message: {raw_message}") from e
        if "type" not in message:
            raise WokwiError(f"Invalid message: {message}")
        if message["type"] == "error":
>           raise WokwiError(f"Server error: {message['message']}")
E           wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing.

/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:171: WokwiError

Check failure on line 0 in validation.democfg

See this annotation in the file changed.

@github-actions github-actions / Test Results

missing-run (validation.democfg) with error

./test_errors/test-results-hardware/tests/validation/democfg/esp32s2/democfg_missing_0.xml
Raw output
Expected test run missing
This placeholder indicates an expected test run did not execute.

Check failure on line 0 in validation/timer/test_timer.py

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 7 runs with error: test_timer (validation.timer.test_timer)

./artifacts/test-results-wokwi-esp32-validation/validation/timer/esp32/timer.xml [took 1s]
./artifacts/test-results-wokwi-esp32c3-validation/validation/timer/esp32c3/timer.xml [took 1s]
./artifacts/test-results-wokwi-esp32c6-validation/validation/timer/esp32c6/timer.xml [took 1s]
./artifacts/test-results-wokwi-esp32h2-validation/validation/timer/esp32h2/timer.xml [took 1s]
./artifacts/test-results-wokwi-esp32p4-validation/validation/timer/esp32p4/timer.xml [took 1s]
./artifacts/test-results-wokwi-esp32s2-validation/validation/timer/esp32s2/timer.xml [took 1s]
./artifacts/test-results-wokwi-esp32s3-validation/validation/timer/esp32s3/timer.xml [took 1s]
Raw output
failed on setup with "wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing."
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 0x7ff8a1990c20>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7ff8a1995010>
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.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:1159: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/dut_factory.py:526: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:87: in __init__
    raise e
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:83: in __init__
    self._setup_simulation(wokwi_diagram, firmware_path, elf_path)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:98: in _setup_simulation
    self.client.upload_file('pytest.elf', elf_path)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:212: in sync_wrapper
    return self._call(attr(*args, **kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:79: in _call
    return future.result()  # Block until the coroutine completes or raises
           ^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:450: in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:395: in __get_result
    raise self._exception
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client.py:97: in upload_file
    return await upload_file(self._transport, filename, local_path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:25: in upload_file
    await upload(transport, filename, content)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:31: in upload
    return await transport.request("file:upload", params.model_dump())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:103: in request
    resp_msg_resp = await future
                    ^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:115: in _background_recv
    msg: IncomingMessage = await self._recv()
                           ^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wokwi_client.transport.Transport object at 0x7ff8a19917f0>

    async def _recv(self) -> IncomingMessage:
        if self._ws is None:
            raise WokwiError("Not connected")
        raw_message = await self._ws.recv()
        while isinstance(raw_message, bytes):
            warnings.warn("Unexpected binary message received and skipped", RuntimeWarning)
            raw_message = await self._ws.recv()
        try:
            message = json.loads(raw_message)
        except json.JSONDecodeError as e:
            raise WokwiError(f"Failed to parse message: {raw_message}") from e
        if "type" not in message:
            raise WokwiError(f"Invalid message: {message}")
        if message["type"] == "error":
>           raise WokwiError(f"Server error: {message['message']}")
E           wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing.

/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:171: WokwiError

Check failure on line 0 in validation.hello_world

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 2 runs with error: missing-run (validation.hello_world)

./test_errors/test-results-hardware/tests/validation/hello_world/esp32p4/hello_world_missing_0.xml
./test_errors/test-results-hardware/tests/validation/hello_world/esp32s2/hello_world_missing_0.xml
Raw output
Expected test run missing
This placeholder indicates an expected test run did not execute.

Check failure on line 0 in validation/psram/test_psram.py

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 4 runs with error: test_psram (validation.psram.test_psram)

./artifacts/test-results-wokwi-esp32-validation/validation/psram/esp32/psram.xml [took 1s]
./artifacts/test-results-wokwi-esp32p4-validation/validation/psram/esp32p4/psram.xml [took 1s]
./artifacts/test-results-wokwi-esp32s2-validation/validation/psram/esp32s2/psram.xml [took 1s]
./artifacts/test-results-wokwi-esp32s3-validation/validation/psram/esp32s3/psram.xml [took 1s]
Raw output
failed on setup with "wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing."
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 0x7f1a61a70c20>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f1a61a75010>
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.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:1159: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/dut_factory.py:526: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:87: in __init__
    raise e
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:83: in __init__
    self._setup_simulation(wokwi_diagram, firmware_path, elf_path)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:96: in _setup_simulation
    firmware = self.client.upload_file('pytest.bin', firmware_path)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:212: in sync_wrapper
    return self._call(attr(*args, **kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:79: in _call
    return future.result()  # Block until the coroutine completes or raises
           ^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:450: in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:395: in __get_result
    raise self._exception
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client.py:97: in upload_file
    return await upload_file(self._transport, filename, local_path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:25: in upload_file
    await upload(transport, filename, content)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:31: in upload
    return await transport.request("file:upload", params.model_dump())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:103: in request
    resp_msg_resp = await future
                    ^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:115: in _background_recv
    msg: IncomingMessage = await self._recv()
                           ^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wokwi_client.transport.Transport object at 0x7f1a61a717f0>

    async def _recv(self) -> IncomingMessage:
        if self._ws is None:
            raise WokwiError("Not connected")
        raw_message = await self._ws.recv()
        while isinstance(raw_message, bytes):
            warnings.warn("Unexpected binary message received and skipped", RuntimeWarning)
            raw_message = await self._ws.recv()
        try:
            message = json.loads(raw_message)
        except json.JSONDecodeError as e:
            raise WokwiError(f"Failed to parse message: {raw_message}") from e
        if "type" not in message:
            raise WokwiError(f"Invalid message: {message}")
        if message["type"] == "error":
>           raise WokwiError(f"Server error: {message['message']}")
E           wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing.

/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:171: WokwiError

Check failure on line 0 in validation.touch

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 2 runs with error: missing-run (validation.touch)

./test_errors/test-results-hardware/tests/validation/touch/esp32p4/touch_missing_0.xml
./test_errors/test-results-hardware/tests/validation/touch/esp32s2/touch_missing_0.xml
Raw output
Expected test run missing
This placeholder indicates an expected test run did not execute.

Check failure on line 0 in validation.periman

See this annotation in the file changed.

@github-actions github-actions / Test Results

missing-run (validation.periman) with error

./test_errors/test-results-hardware/tests/validation/periman/esp32s2/periman_missing_0.xml
Raw output
Expected test run missing
This placeholder indicates an expected test run did not execute.

Check failure on line 0 in validation/uart/test_uart.py

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 7 runs with error: test_uart (validation.uart.test_uart)

./artifacts/test-results-wokwi-esp32-validation/validation/uart/esp32/uart.xml [took 1s]
./artifacts/test-results-wokwi-esp32c3-validation/validation/uart/esp32c3/uart.xml [took 1s]
./artifacts/test-results-wokwi-esp32c6-validation/validation/uart/esp32c6/uart.xml [took 1s]
./artifacts/test-results-wokwi-esp32h2-validation/validation/uart/esp32h2/uart.xml [took 1s]
./artifacts/test-results-wokwi-esp32p4-validation/validation/uart/esp32p4/uart.xml [took 1s]
./artifacts/test-results-wokwi-esp32s2-validation/validation/uart/esp32s2/uart.xml [took 1s]
./artifacts/test-results-wokwi-esp32s3-validation/validation/uart/esp32s3/uart.xml [took 1s]
Raw output
failed on setup with "wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing."
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 0x7f423bb78c20>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f423bb7d010>
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.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:1159: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/dut_factory.py:526: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:87: in __init__
    raise e
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:83: in __init__
    self._setup_simulation(wokwi_diagram, firmware_path, elf_path)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:98: in _setup_simulation
    self.client.upload_file('pytest.elf', elf_path)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:212: in sync_wrapper
    return self._call(attr(*args, **kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:79: in _call
    return future.result()  # Block until the coroutine completes or raises
           ^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:450: in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:395: in __get_result
    raise self._exception
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client.py:97: in upload_file
    return await upload_file(self._transport, filename, local_path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:25: in upload_file
    await upload(transport, filename, content)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:31: in upload
    return await transport.request("file:upload", params.model_dump())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:103: in request
    resp_msg_resp = await future
                    ^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:115: in _background_recv
    msg: IncomingMessage = await self._recv()
                           ^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wokwi_client.transport.Transport object at 0x7f423bb797f0>

    async def _recv(self) -> IncomingMessage:
        if self._ws is None:
            raise WokwiError("Not connected")
        raw_message = await self._ws.recv()
        while isinstance(raw_message, bytes):
            warnings.warn("Unexpected binary message received and skipped", RuntimeWarning)
            raw_message = await self._ws.recv()
        try:
            message = json.loads(raw_message)
        except json.JSONDecodeError as e:
            raise WokwiError(f"Failed to parse message: {raw_message}") from e
        if "type" not in message:
            raise WokwiError(f"Invalid message: {message}")
        if message["type"] == "error":
>           raise WokwiError(f"Server error: {message['message']}")
E           wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing.

/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:171: WokwiError

Check failure on line 0 in validation.uart

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 2 runs with error: missing-run (validation.uart)

./test_errors/test-results-hardware/tests/validation/uart/esp32p4/uart_missing_0.xml
./test_errors/test-results-hardware/tests/validation/uart/esp32s2/uart_missing_0.xml
Raw output
Expected test run missing
This placeholder indicates an expected test run did not execute.

Check failure on line 0 in validation/unity/test_unity.py

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 7 runs with error: test_unity (validation.unity.test_unity)

./artifacts/test-results-wokwi-esp32-validation/validation/unity/esp32/unity.xml [took 2s]
./artifacts/test-results-wokwi-esp32c3-validation/validation/unity/esp32c3/unity.xml [took 1s]
./artifacts/test-results-wokwi-esp32c6-validation/validation/unity/esp32c6/unity.xml [took 1s]
./artifacts/test-results-wokwi-esp32h2-validation/validation/unity/esp32h2/unity.xml [took 1s]
./artifacts/test-results-wokwi-esp32p4-validation/validation/unity/esp32p4/unity.xml [took 1s]
./artifacts/test-results-wokwi-esp32s2-validation/validation/unity/esp32s2/unity.xml [took 1s]
./artifacts/test-results-wokwi-esp32s3-validation/validation/unity/esp32s3/unity.xml [took 2s]
Raw output
failed on setup with "wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing."
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 0x7f2182c70c20>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f2182c75010>
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.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/plugin.py:1159: in wokwi
    return wokwi_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/dut_factory.py:526: in wokwi_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:87: in __init__
    raise e
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:83: in __init__
    self._setup_simulation(wokwi_diagram, firmware_path, elf_path)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded_wokwi/wokwi.py:98: in _setup_simulation
    self.client.upload_file('pytest.elf', elf_path)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:212: in sync_wrapper
    return self._call(attr(*args, **kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client_sync.py:79: in _call
    return future.result()  # Block until the coroutine completes or raises
           ^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:450: in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/concurrent/futures/_base.py:395: in __get_result
    raise self._exception
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/client.py:97: in upload_file
    return await upload_file(self._transport, filename, local_path)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:25: in upload_file
    await upload(transport, filename, content)
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/file_ops.py:31: in upload
    return await transport.request("file:upload", params.model_dump())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:103: in request
    resp_msg_resp = await future
                    ^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:115: in _background_recv
    msg: IncomingMessage = await self._recv()
                           ^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <wokwi_client.transport.Transport object at 0x7f2182c717f0>

    async def _recv(self) -> IncomingMessage:
        if self._ws is None:
            raise WokwiError("Not connected")
        raw_message = await self._ws.recv()
        while isinstance(raw_message, bytes):
            warnings.warn("Unexpected binary message received and skipped", RuntimeWarning)
            raw_message = await self._ws.recv()
        try:
            message = json.loads(raw_message)
        except json.JSONDecodeError as e:
            raise WokwiError(f"Failed to parse message: {raw_message}") from e
        if "type" not in message:
            raise WokwiError(f"Invalid message: {message}")
        if message["type"] == "error":
>           raise WokwiError(f"Server error: {message['message']}")
E           wokwi_client.exceptions.WokwiError: Server error: You have used up your Free plan monthly CI minute quota. Please upgrade to a paid plan at https://wokwi.com/pricing.

/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/wokwi_client/transport.py:171: WokwiError

Check failure on line 0 in validation.unity

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 2 runs with error: missing-run (validation.unity)

./test_errors/test-results-hardware/tests/validation/unity/esp32p4/unity_missing_0.xml
./test_errors/test-results-hardware/tests/validation/unity/esp32s2/unity_missing_0.xml
Raw output
Expected test run missing
This placeholder indicates an expected test run did not execute.

Check failure on line 0 in validation.psram

See this annotation in the file changed.

@github-actions github-actions / Test Results

missing-run (validation.psram) with error

./test_errors/test-results-hardware/tests/validation/psram/esp32p4/psram_missing_0.xml
Raw output
Expected test run missing
This placeholder indicates an expected test run did not execute.

Check notice on line 0 in .github

See this annotation in the file changed.

@github-actions github-actions / Test Results

50 tests found

There are 50 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_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
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
test_touch_errors
test_touch_interrtupt
test_touch_read
timer_clock_select_test
timer_divider_test
timer_interrupt_test
timer_read_test
validation.democfg ‑ missing-run
validation.democfg.test_democfg ‑ test_cfg
validation.gpio.test_gpio ‑ test_gpio
validation.hello_world ‑ missing-run
validation.hello_world.test_hello_world ‑ test_hello_world
validation.i2c_master.test_i2c_master ‑ test_i2c_master
validation.nvs ‑ missing-run
validation.nvs.test_nvs ‑ test_nvs
validation.periman ‑ missing-run
validation.periman.test_periman ‑ test_periman
validation.psram ‑ missing-run
validation.psram.test_psram ‑ test_psram
validation.timer ‑ missing-run
validation.timer.test_timer ‑ test_timer
validation.touch ‑ missing-run
validation.uart ‑ missing-run
validation.uart.test_uart ‑ test_uart
validation.unity ‑ missing-run
validation.unity.test_unity ‑ test_unity
validation.wifi.test_wifi ‑ test_wifi