Skip to content

Merge branch 'ci/fixes' #757

Merge branch 'ci/fixes'

Merge branch 'ci/fixes' #757

GitHub Actions / Test Results failed Oct 14, 2025 in 0s

11 errors, 43 pass in 1h 45m 59s

186 files  186 suites   1h 45m 59s ⏱️
 54 tests  43 ✅ 0 💤 0 ❌ 11 🔥
454 runs  438 ✅ 0 💤 0 ❌ 16 🔥

Results for commit edd79b3.

Annotations

Check failure on line 0 in performance.linpack_double.test_linpack_double

See this annotation in the file changed.

@github-actions github-actions / Test Results

1 out of 7 runs with error: test_linpack_double (performance.linpack_double.test_linpack_double)

./artifacts/test-results-hw/performance/linpack_double/esp32c6/linpack_double.xml [took 0s]
Raw output
failed on setup with "esptool.util.FatalError: Could not open /dev/ttyUSB28, the port is busy or doesn't exist.
([Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28')"
self = Serial<id=0x7f797cda0340, open=False>(port='/dev/ttyUSB28', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

    def open(self):
        """\
        Open port with current settings. This may throw a SerialException
        if the port cannot be opened."""
        if self._port is None:
            raise SerialException("Port must be configured before it can be used.")
        if self.is_open:
            raise SerialException("Port is already open.")
        self.fd = None
        # open
        try:
>           self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E           OSError: [Errno 6] No such device or address: '/dev/ttyUSB28'

/usr/local/lib/python3.12/site-packages/serial/serialposix.py:322: OSError

During handling of the above exception, another exception occurred:

self = <esptool.targets.esp32c6.ESP32C6ROM object at 0x7f797cda02c0>
port = '/dev/ttyUSB28', baud = 115200, trace_enabled = False

    def __init__(self, port=DEFAULT_PORT, baud=ESP_ROM_BAUD, trace_enabled=False):
        """Base constructor for ESPLoader bootloader interaction
    
        Don't call this constructor, either instantiate a specific
        ROM class directly, or use cmds.detect_chip(). You can use the with
        statement to ensure the serial port is closed when done.
    
        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().
    
        """
        # True if esptool detects the ROM is in Secure Download Mode
        self.secure_download_mode = False
        # True if esptool detects conditions which require the stub to be disabled
        self.stub_is_disabled = False
    
        # Device-and-runtime-specific cache
        self.cache = {
            "flash_id": None,
            "uart_no": None,
            "usb_pid": None,
            "security_info": None,
        }
    
        if isinstance(port, str):
            try:
                self._port = serial.serial_for_url(
                    port, exclusive=True, do_not_open=True
                )
                if sys.platform == "win32":
                    # When opening a port on Windows,
                    # the RTS/DTR (active low) lines
                    # need to be set to False (pulled high)
                    # to avoid unwanted chip reset
                    self._port.rts = False
                    self._port.dtr = False
>               self._port.open()

/usr/local/lib/python3.12/site-packages/esptool/loader.py:363: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = Serial<id=0x7f797cda0340, open=False>(port='/dev/ttyUSB28', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

    def open(self):
        """\
        Open port with current settings. This may throw a SerialException
        if the port cannot be opened."""
        if self._port is None:
            raise SerialException("Port must be configured before it can be used.")
        if self.is_open:
            raise SerialException("Port is already open.")
        self.fd = None
        # open
        try:
            self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
        except OSError as msg:
            self.fd = None
>           raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
E           serial.serialutil.SerialException: [Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28'

/usr/local/lib/python3.12/site-packages/serial/serialposix.py:325: SerialException

During handling of the above exception, another exception occurred:

args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'se...oApp object at 0x7f797cda0080>, 'msg_queue': <AutoProxy[MessageQueue] object, typeid 'MessageQueue' at 0x7f797ced2ea0>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f797cd98a40>
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)
                      ^^^^^^^^^^^^^^^^^^^^^

/usr/local/lib/python3.12/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/local/lib/python3.12/site-packages/pytest_embedded/plugin.py:1131: in serial
    return serial_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^^
/usr/local/lib/python3.12/site-packages/pytest_embedded/dut_factory.py:482: in serial_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/local/lib/python3.12/site-packages/pytest_embedded_arduino/serial.py:25: in __init__
    super().__init__(
/usr/local/lib/python3.12/site-packages/pytest_embedded_serial_esp/serial.py:98: in __init__
    self.esp = esptool.get_default_connected_device(
/usr/local/lib/python3.12/site-packages/esptool/__init__.py:1157: in get_default_connected_device
    _esp = chip_class(each_port, initial_baud, trace)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <esptool.targets.esp32c6.ESP32C6ROM object at 0x7f797cda02c0>
port = '/dev/ttyUSB28', baud = 115200, trace_enabled = False

    def __init__(self, port=DEFAULT_PORT, baud=ESP_ROM_BAUD, trace_enabled=False):
        """Base constructor for ESPLoader bootloader interaction
    
        Don't call this constructor, either instantiate a specific
        ROM class directly, or use cmds.detect_chip(). You can use the with
        statement to ensure the serial port is closed when done.
    
        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().
    
        """
        # True if esptool detects the ROM is in Secure Download Mode
        self.secure_download_mode = False
        # True if esptool detects conditions which require the stub to be disabled
        self.stub_is_disabled = False
    
        # Device-and-runtime-specific cache
        self.cache = {
            "flash_id": None,
            "uart_no": None,
            "usb_pid": None,
            "security_info": None,
        }
    
        if isinstance(port, str):
            try:
                self._port = serial.serial_for_url(
                    port, exclusive=True, do_not_open=True
                )
                if sys.platform == "win32":
                    # When opening a port on Windows,
                    # the RTS/DTR (active low) lines
                    # need to be set to False (pulled high)
                    # to avoid unwanted chip reset
                    self._port.rts = False
                    self._port.dtr = False
                self._port.open()
            except serial.serialutil.SerialException as e:
                port_issues = [
                    [  # does not exist error
                        re.compile(r"Errno 2|FileNotFoundError", re.IGNORECASE),
                        "Check if the port is correct and ESP connected",
                    ],
                    [  # busy port error
                        re.compile(r"Access is denied", re.IGNORECASE),
                        "Check if the port is not used by another task",
                    ],
                ]
                if sys.platform.startswith("linux"):
                    port_issues.append(
                        [  # permission denied error
                            re.compile(r"Permission denied", re.IGNORECASE),
                            ("Try to add user into dialout or uucp group."),
                        ],
                    )
    
                hint_msg = ""
                for port_issue in port_issues:
                    if port_issue[0].search(str(e)):
                        hint_msg = f"\nHint: {port_issue[1]}\n"
                        break
    
>               raise FatalError(
                    f"Could not open {port}, the port is busy or doesn't exist."
                    f"\n({e})\n"
                    f"{hint_msg}"
                )
E               esptool.util.FatalError: Could not open /dev/ttyUSB28, the port is busy or doesn't exist.
E               ([Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28')

/usr/local/lib/python3.12/site-packages/esptool/loader.py:389: FatalError

Check failure on line 0 in performance.coremark.test_coremark

See this annotation in the file changed.

@github-actions github-actions / Test Results

1 out of 7 runs with error: test_coremark (performance.coremark.test_coremark)

./artifacts/test-results-hw/performance/coremark/esp32c6/coremark.xml [took 0s]
Raw output
failed on setup with "esptool.util.FatalError: Could not open /dev/ttyUSB28, the port is busy or doesn't exist.
([Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28')"
self = Serial<id=0x7fde26eac640, open=False>(port='/dev/ttyUSB28', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

    def open(self):
        """\
        Open port with current settings. This may throw a SerialException
        if the port cannot be opened."""
        if self._port is None:
            raise SerialException("Port must be configured before it can be used.")
        if self.is_open:
            raise SerialException("Port is already open.")
        self.fd = None
        # open
        try:
>           self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E           OSError: [Errno 6] No such device or address: '/dev/ttyUSB28'

/usr/local/lib/python3.12/site-packages/serial/serialposix.py:322: OSError

During handling of the above exception, another exception occurred:

self = <esptool.targets.esp32c6.ESP32C6ROM object at 0x7fde26eac6e0>
port = '/dev/ttyUSB28', baud = 115200, trace_enabled = False

    def __init__(self, port=DEFAULT_PORT, baud=ESP_ROM_BAUD, trace_enabled=False):
        """Base constructor for ESPLoader bootloader interaction
    
        Don't call this constructor, either instantiate a specific
        ROM class directly, or use cmds.detect_chip(). You can use the with
        statement to ensure the serial port is closed when done.
    
        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().
    
        """
        # True if esptool detects the ROM is in Secure Download Mode
        self.secure_download_mode = False
        # True if esptool detects conditions which require the stub to be disabled
        self.stub_is_disabled = False
    
        # Device-and-runtime-specific cache
        self.cache = {
            "flash_id": None,
            "uart_no": None,
            "usb_pid": None,
            "security_info": None,
        }
    
        if isinstance(port, str):
            try:
                self._port = serial.serial_for_url(
                    port, exclusive=True, do_not_open=True
                )
                if sys.platform == "win32":
                    # When opening a port on Windows,
                    # the RTS/DTR (active low) lines
                    # need to be set to False (pulled high)
                    # to avoid unwanted chip reset
                    self._port.rts = False
                    self._port.dtr = False
>               self._port.open()

/usr/local/lib/python3.12/site-packages/esptool/loader.py:363: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = Serial<id=0x7fde26eac640, open=False>(port='/dev/ttyUSB28', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

    def open(self):
        """\
        Open port with current settings. This may throw a SerialException
        if the port cannot be opened."""
        if self._port is None:
            raise SerialException("Port must be configured before it can be used.")
        if self.is_open:
            raise SerialException("Port is already open.")
        self.fd = None
        # open
        try:
            self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
        except OSError as msg:
            self.fd = None
>           raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
E           serial.serialutil.SerialException: [Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28'

/usr/local/lib/python3.12/site-packages/serial/serialposix.py:325: SerialException

During handling of the above exception, another exception occurred:

args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'se...oApp object at 0x7fde26eac3e0>, 'msg_queue': <AutoProxy[MessageQueue] object, typeid 'MessageQueue' at 0x7fde270393a0>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7fde26eb49a0>
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)
                      ^^^^^^^^^^^^^^^^^^^^^

/usr/local/lib/python3.12/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/local/lib/python3.12/site-packages/pytest_embedded/plugin.py:1131: in serial
    return serial_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^^
/usr/local/lib/python3.12/site-packages/pytest_embedded/dut_factory.py:482: in serial_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/local/lib/python3.12/site-packages/pytest_embedded_arduino/serial.py:25: in __init__
    super().__init__(
/usr/local/lib/python3.12/site-packages/pytest_embedded_serial_esp/serial.py:98: in __init__
    self.esp = esptool.get_default_connected_device(
/usr/local/lib/python3.12/site-packages/esptool/__init__.py:1157: in get_default_connected_device
    _esp = chip_class(each_port, initial_baud, trace)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <esptool.targets.esp32c6.ESP32C6ROM object at 0x7fde26eac6e0>
port = '/dev/ttyUSB28', baud = 115200, trace_enabled = False

    def __init__(self, port=DEFAULT_PORT, baud=ESP_ROM_BAUD, trace_enabled=False):
        """Base constructor for ESPLoader bootloader interaction
    
        Don't call this constructor, either instantiate a specific
        ROM class directly, or use cmds.detect_chip(). You can use the with
        statement to ensure the serial port is closed when done.
    
        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().
    
        """
        # True if esptool detects the ROM is in Secure Download Mode
        self.secure_download_mode = False
        # True if esptool detects conditions which require the stub to be disabled
        self.stub_is_disabled = False
    
        # Device-and-runtime-specific cache
        self.cache = {
            "flash_id": None,
            "uart_no": None,
            "usb_pid": None,
            "security_info": None,
        }
    
        if isinstance(port, str):
            try:
                self._port = serial.serial_for_url(
                    port, exclusive=True, do_not_open=True
                )
                if sys.platform == "win32":
                    # When opening a port on Windows,
                    # the RTS/DTR (active low) lines
                    # need to be set to False (pulled high)
                    # to avoid unwanted chip reset
                    self._port.rts = False
                    self._port.dtr = False
                self._port.open()
            except serial.serialutil.SerialException as e:
                port_issues = [
                    [  # does not exist error
                        re.compile(r"Errno 2|FileNotFoundError", re.IGNORECASE),
                        "Check if the port is correct and ESP connected",
                    ],
                    [  # busy port error
                        re.compile(r"Access is denied", re.IGNORECASE),
                        "Check if the port is not used by another task",
                    ],
                ]
                if sys.platform.startswith("linux"):
                    port_issues.append(
                        [  # permission denied error
                            re.compile(r"Permission denied", re.IGNORECASE),
                            ("Try to add user into dialout or uucp group."),
                        ],
                    )
    
                hint_msg = ""
                for port_issue in port_issues:
                    if port_issue[0].search(str(e)):
                        hint_msg = f"\nHint: {port_issue[1]}\n"
                        break
    
>               raise FatalError(
                    f"Could not open {port}, the port is busy or doesn't exist."
                    f"\n({e})\n"
                    f"{hint_msg}"
                )
E               esptool.util.FatalError: Could not open /dev/ttyUSB28, the port is busy or doesn't exist.
E               ([Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28')

/usr/local/lib/python3.12/site-packages/esptool/loader.py:389: FatalError

Check failure on line 0 in performance.linpack_float.test_linpack_float

See this annotation in the file changed.

@github-actions github-actions / Test Results

1 out of 7 runs with error: test_linpack_float (performance.linpack_float.test_linpack_float)

./artifacts/test-results-hw/performance/linpack_float/esp32c6/linpack_float.xml [took 0s]
Raw output
failed on setup with "esptool.util.FatalError: Could not open /dev/ttyUSB28, the port is busy or doesn't exist.
([Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28')"
self = Serial<id=0x7f2783e04b80, open=False>(port='/dev/ttyUSB28', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

    def open(self):
        """\
        Open port with current settings. This may throw a SerialException
        if the port cannot be opened."""
        if self._port is None:
            raise SerialException("Port must be configured before it can be used.")
        if self.is_open:
            raise SerialException("Port is already open.")
        self.fd = None
        # open
        try:
>           self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E           OSError: [Errno 6] No such device or address: '/dev/ttyUSB28'

/usr/local/lib/python3.12/site-packages/serial/serialposix.py:322: OSError

During handling of the above exception, another exception occurred:

self = <esptool.targets.esp32c6.ESP32C6ROM object at 0x7f2783e04b60>
port = '/dev/ttyUSB28', baud = 115200, trace_enabled = False

    def __init__(self, port=DEFAULT_PORT, baud=ESP_ROM_BAUD, trace_enabled=False):
        """Base constructor for ESPLoader bootloader interaction
    
        Don't call this constructor, either instantiate a specific
        ROM class directly, or use cmds.detect_chip(). You can use the with
        statement to ensure the serial port is closed when done.
    
        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().
    
        """
        # True if esptool detects the ROM is in Secure Download Mode
        self.secure_download_mode = False
        # True if esptool detects conditions which require the stub to be disabled
        self.stub_is_disabled = False
    
        # Device-and-runtime-specific cache
        self.cache = {
            "flash_id": None,
            "uart_no": None,
            "usb_pid": None,
            "security_info": None,
        }
    
        if isinstance(port, str):
            try:
                self._port = serial.serial_for_url(
                    port, exclusive=True, do_not_open=True
                )
                if sys.platform == "win32":
                    # When opening a port on Windows,
                    # the RTS/DTR (active low) lines
                    # need to be set to False (pulled high)
                    # to avoid unwanted chip reset
                    self._port.rts = False
                    self._port.dtr = False
>               self._port.open()

/usr/local/lib/python3.12/site-packages/esptool/loader.py:363: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = Serial<id=0x7f2783e04b80, open=False>(port='/dev/ttyUSB28', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

    def open(self):
        """\
        Open port with current settings. This may throw a SerialException
        if the port cannot be opened."""
        if self._port is None:
            raise SerialException("Port must be configured before it can be used.")
        if self.is_open:
            raise SerialException("Port is already open.")
        self.fd = None
        # open
        try:
            self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
        except OSError as msg:
            self.fd = None
>           raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
E           serial.serialutil.SerialException: [Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28'

/usr/local/lib/python3.12/site-packages/serial/serialposix.py:325: SerialException

During handling of the above exception, another exception occurred:

args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'se...oApp object at 0x7f2783e04920>, 'msg_queue': <AutoProxy[MessageQueue] object, typeid 'MessageQueue' at 0x7f278400d7c0>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f2783e08a40>
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)
                      ^^^^^^^^^^^^^^^^^^^^^

/usr/local/lib/python3.12/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/local/lib/python3.12/site-packages/pytest_embedded/plugin.py:1131: in serial
    return serial_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^^
/usr/local/lib/python3.12/site-packages/pytest_embedded/dut_factory.py:482: in serial_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/local/lib/python3.12/site-packages/pytest_embedded_arduino/serial.py:25: in __init__
    super().__init__(
/usr/local/lib/python3.12/site-packages/pytest_embedded_serial_esp/serial.py:98: in __init__
    self.esp = esptool.get_default_connected_device(
/usr/local/lib/python3.12/site-packages/esptool/__init__.py:1157: in get_default_connected_device
    _esp = chip_class(each_port, initial_baud, trace)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <esptool.targets.esp32c6.ESP32C6ROM object at 0x7f2783e04b60>
port = '/dev/ttyUSB28', baud = 115200, trace_enabled = False

    def __init__(self, port=DEFAULT_PORT, baud=ESP_ROM_BAUD, trace_enabled=False):
        """Base constructor for ESPLoader bootloader interaction
    
        Don't call this constructor, either instantiate a specific
        ROM class directly, or use cmds.detect_chip(). You can use the with
        statement to ensure the serial port is closed when done.
    
        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().
    
        """
        # True if esptool detects the ROM is in Secure Download Mode
        self.secure_download_mode = False
        # True if esptool detects conditions which require the stub to be disabled
        self.stub_is_disabled = False
    
        # Device-and-runtime-specific cache
        self.cache = {
            "flash_id": None,
            "uart_no": None,
            "usb_pid": None,
            "security_info": None,
        }
    
        if isinstance(port, str):
            try:
                self._port = serial.serial_for_url(
                    port, exclusive=True, do_not_open=True
                )
                if sys.platform == "win32":
                    # When opening a port on Windows,
                    # the RTS/DTR (active low) lines
                    # need to be set to False (pulled high)
                    # to avoid unwanted chip reset
                    self._port.rts = False
                    self._port.dtr = False
                self._port.open()
            except serial.serialutil.SerialException as e:
                port_issues = [
                    [  # does not exist error
                        re.compile(r"Errno 2|FileNotFoundError", re.IGNORECASE),
                        "Check if the port is correct and ESP connected",
                    ],
                    [  # busy port error
                        re.compile(r"Access is denied", re.IGNORECASE),
                        "Check if the port is not used by another task",
                    ],
                ]
                if sys.platform.startswith("linux"):
                    port_issues.append(
                        [  # permission denied error
                            re.compile(r"Permission denied", re.IGNORECASE),
                            ("Try to add user into dialout or uucp group."),
                        ],
                    )
    
                hint_msg = ""
                for port_issue in port_issues:
                    if port_issue[0].search(str(e)):
                        hint_msg = f"\nHint: {port_issue[1]}\n"
                        break
    
>               raise FatalError(
                    f"Could not open {port}, the port is busy or doesn't exist."
                    f"\n({e})\n"
                    f"{hint_msg}"
                )
E               esptool.util.FatalError: Could not open /dev/ttyUSB28, the port is busy or doesn't exist.
E               ([Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28')

/usr/local/lib/python3.12/site-packages/esptool/loader.py:389: FatalError

Check failure on line 0 in performance.ramspeed.test_ramspeed

See this annotation in the file changed.

@github-actions github-actions / Test Results

1 out of 7 runs with error: test_ramspeed (performance.ramspeed.test_ramspeed)

./artifacts/test-results-hw/performance/ramspeed/esp32c6/ramspeed.xml [took 0s]
Raw output
failed on setup with "esptool.util.FatalError: Could not open /dev/ttyUSB28, the port is busy or doesn't exist.
([Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28')"
self = Serial<id=0x7f5223c44a30, open=False>(port='/dev/ttyUSB28', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

    def open(self):
        """\
        Open port with current settings. This may throw a SerialException
        if the port cannot be opened."""
        if self._port is None:
            raise SerialException("Port must be configured before it can be used.")
        if self.is_open:
            raise SerialException("Port is already open.")
        self.fd = None
        # open
        try:
>           self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E           OSError: [Errno 6] No such device or address: '/dev/ttyUSB28'

/usr/local/lib/python3.12/site-packages/serial/serialposix.py:322: OSError

During handling of the above exception, another exception occurred:

self = <esptool.targets.esp32c6.ESP32C6ROM object at 0x7f522404e7b0>
port = '/dev/ttyUSB28', baud = 115200, trace_enabled = False

    def __init__(self, port=DEFAULT_PORT, baud=ESP_ROM_BAUD, trace_enabled=False):
        """Base constructor for ESPLoader bootloader interaction
    
        Don't call this constructor, either instantiate a specific
        ROM class directly, or use cmds.detect_chip(). You can use the with
        statement to ensure the serial port is closed when done.
    
        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().
    
        """
        # True if esptool detects the ROM is in Secure Download Mode
        self.secure_download_mode = False
        # True if esptool detects conditions which require the stub to be disabled
        self.stub_is_disabled = False
    
        # Device-and-runtime-specific cache
        self.cache = {
            "flash_id": None,
            "uart_no": None,
            "usb_pid": None,
            "security_info": None,
        }
    
        if isinstance(port, str):
            try:
                self._port = serial.serial_for_url(
                    port, exclusive=True, do_not_open=True
                )
                if sys.platform == "win32":
                    # When opening a port on Windows,
                    # the RTS/DTR (active low) lines
                    # need to be set to False (pulled high)
                    # to avoid unwanted chip reset
                    self._port.rts = False
                    self._port.dtr = False
>               self._port.open()

/usr/local/lib/python3.12/site-packages/esptool/loader.py:363: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = Serial<id=0x7f5223c44a30, open=False>(port='/dev/ttyUSB28', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

    def open(self):
        """\
        Open port with current settings. This may throw a SerialException
        if the port cannot be opened."""
        if self._port is None:
            raise SerialException("Port must be configured before it can be used.")
        if self.is_open:
            raise SerialException("Port is already open.")
        self.fd = None
        # open
        try:
            self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
        except OSError as msg:
            self.fd = None
>           raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
E           serial.serialutil.SerialException: [Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28'

/usr/local/lib/python3.12/site-packages/serial/serialposix.py:325: SerialException

During handling of the above exception, another exception occurred:

args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'se...oApp object at 0x7f5223c447a0>, 'msg_queue': <AutoProxy[MessageQueue] object, typeid 'MessageQueue' at 0x7f5223d7b4d0>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f5223c489a0>
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)
                      ^^^^^^^^^^^^^^^^^^^^^

/usr/local/lib/python3.12/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/local/lib/python3.12/site-packages/pytest_embedded/plugin.py:1131: in serial
    return serial_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^^
/usr/local/lib/python3.12/site-packages/pytest_embedded/dut_factory.py:482: in serial_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/local/lib/python3.12/site-packages/pytest_embedded_arduino/serial.py:25: in __init__
    super().__init__(
/usr/local/lib/python3.12/site-packages/pytest_embedded_serial_esp/serial.py:98: in __init__
    self.esp = esptool.get_default_connected_device(
/usr/local/lib/python3.12/site-packages/esptool/__init__.py:1157: in get_default_connected_device
    _esp = chip_class(each_port, initial_baud, trace)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <esptool.targets.esp32c6.ESP32C6ROM object at 0x7f522404e7b0>
port = '/dev/ttyUSB28', baud = 115200, trace_enabled = False

    def __init__(self, port=DEFAULT_PORT, baud=ESP_ROM_BAUD, trace_enabled=False):
        """Base constructor for ESPLoader bootloader interaction
    
        Don't call this constructor, either instantiate a specific
        ROM class directly, or use cmds.detect_chip(). You can use the with
        statement to ensure the serial port is closed when done.
    
        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().
    
        """
        # True if esptool detects the ROM is in Secure Download Mode
        self.secure_download_mode = False
        # True if esptool detects conditions which require the stub to be disabled
        self.stub_is_disabled = False
    
        # Device-and-runtime-specific cache
        self.cache = {
            "flash_id": None,
            "uart_no": None,
            "usb_pid": None,
            "security_info": None,
        }
    
        if isinstance(port, str):
            try:
                self._port = serial.serial_for_url(
                    port, exclusive=True, do_not_open=True
                )
                if sys.platform == "win32":
                    # When opening a port on Windows,
                    # the RTS/DTR (active low) lines
                    # need to be set to False (pulled high)
                    # to avoid unwanted chip reset
                    self._port.rts = False
                    self._port.dtr = False
                self._port.open()
            except serial.serialutil.SerialException as e:
                port_issues = [
                    [  # does not exist error
                        re.compile(r"Errno 2|FileNotFoundError", re.IGNORECASE),
                        "Check if the port is correct and ESP connected",
                    ],
                    [  # busy port error
                        re.compile(r"Access is denied", re.IGNORECASE),
                        "Check if the port is not used by another task",
                    ],
                ]
                if sys.platform.startswith("linux"):
                    port_issues.append(
                        [  # permission denied error
                            re.compile(r"Permission denied", re.IGNORECASE),
                            ("Try to add user into dialout or uucp group."),
                        ],
                    )
    
                hint_msg = ""
                for port_issue in port_issues:
                    if port_issue[0].search(str(e)):
                        hint_msg = f"\nHint: {port_issue[1]}\n"
                        break
    
>               raise FatalError(
                    f"Could not open {port}, the port is busy or doesn't exist."
                    f"\n({e})\n"
                    f"{hint_msg}"
                )
E               esptool.util.FatalError: Could not open /dev/ttyUSB28, the port is busy or doesn't exist.
E               ([Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28')

/usr/local/lib/python3.12/site-packages/esptool/loader.py:389: FatalError

Check failure on line 0 in performance.superpi.test_superpi

See this annotation in the file changed.

@github-actions github-actions / Test Results

1 out of 7 runs with error: test_superpi (performance.superpi.test_superpi)

./artifacts/test-results-hw/performance/superpi/esp32c6/superpi.xml [took 0s]
Raw output
failed on setup with "esptool.util.FatalError: Could not open /dev/ttyUSB28, the port is busy or doesn't exist.
([Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28')"
self = Serial<id=0x7fd0bd0e8610, open=False>(port='/dev/ttyUSB28', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

    def open(self):
        """\
        Open port with current settings. This may throw a SerialException
        if the port cannot be opened."""
        if self._port is None:
            raise SerialException("Port must be configured before it can be used.")
        if self.is_open:
            raise SerialException("Port is already open.")
        self.fd = None
        # open
        try:
>           self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E           OSError: [Errno 6] No such device or address: '/dev/ttyUSB28'

/usr/local/lib/python3.12/site-packages/serial/serialposix.py:322: OSError

During handling of the above exception, another exception occurred:

self = <esptool.targets.esp32c6.ESP32C6ROM object at 0x7fd0bd0e8770>
port = '/dev/ttyUSB28', baud = 115200, trace_enabled = False

    def __init__(self, port=DEFAULT_PORT, baud=ESP_ROM_BAUD, trace_enabled=False):
        """Base constructor for ESPLoader bootloader interaction
    
        Don't call this constructor, either instantiate a specific
        ROM class directly, or use cmds.detect_chip(). You can use the with
        statement to ensure the serial port is closed when done.
    
        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().
    
        """
        # True if esptool detects the ROM is in Secure Download Mode
        self.secure_download_mode = False
        # True if esptool detects conditions which require the stub to be disabled
        self.stub_is_disabled = False
    
        # Device-and-runtime-specific cache
        self.cache = {
            "flash_id": None,
            "uart_no": None,
            "usb_pid": None,
            "security_info": None,
        }
    
        if isinstance(port, str):
            try:
                self._port = serial.serial_for_url(
                    port, exclusive=True, do_not_open=True
                )
                if sys.platform == "win32":
                    # When opening a port on Windows,
                    # the RTS/DTR (active low) lines
                    # need to be set to False (pulled high)
                    # to avoid unwanted chip reset
                    self._port.rts = False
                    self._port.dtr = False
>               self._port.open()

/usr/local/lib/python3.12/site-packages/esptool/loader.py:363: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = Serial<id=0x7fd0bd0e8610, open=False>(port='/dev/ttyUSB28', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

    def open(self):
        """\
        Open port with current settings. This may throw a SerialException
        if the port cannot be opened."""
        if self._port is None:
            raise SerialException("Port must be configured before it can be used.")
        if self.is_open:
            raise SerialException("Port is already open.")
        self.fd = None
        # open
        try:
            self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
        except OSError as msg:
            self.fd = None
>           raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
E           serial.serialutil.SerialException: [Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28'

/usr/local/lib/python3.12/site-packages/serial/serialposix.py:325: SerialException

During handling of the above exception, another exception occurred:

args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'se...oApp object at 0x7fd0bd0e8470>, 'msg_queue': <AutoProxy[MessageQueue] object, typeid 'MessageQueue' at 0x7fd0bd1ba690>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7fd0bd0ec9a0>
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)
                      ^^^^^^^^^^^^^^^^^^^^^

/usr/local/lib/python3.12/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/local/lib/python3.12/site-packages/pytest_embedded/plugin.py:1131: in serial
    return serial_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^^
/usr/local/lib/python3.12/site-packages/pytest_embedded/dut_factory.py:482: in serial_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/local/lib/python3.12/site-packages/pytest_embedded_arduino/serial.py:25: in __init__
    super().__init__(
/usr/local/lib/python3.12/site-packages/pytest_embedded_serial_esp/serial.py:98: in __init__
    self.esp = esptool.get_default_connected_device(
/usr/local/lib/python3.12/site-packages/esptool/__init__.py:1157: in get_default_connected_device
    _esp = chip_class(each_port, initial_baud, trace)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <esptool.targets.esp32c6.ESP32C6ROM object at 0x7fd0bd0e8770>
port = '/dev/ttyUSB28', baud = 115200, trace_enabled = False

    def __init__(self, port=DEFAULT_PORT, baud=ESP_ROM_BAUD, trace_enabled=False):
        """Base constructor for ESPLoader bootloader interaction
    
        Don't call this constructor, either instantiate a specific
        ROM class directly, or use cmds.detect_chip(). You can use the with
        statement to ensure the serial port is closed when done.
    
        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().
    
        """
        # True if esptool detects the ROM is in Secure Download Mode
        self.secure_download_mode = False
        # True if esptool detects conditions which require the stub to be disabled
        self.stub_is_disabled = False
    
        # Device-and-runtime-specific cache
        self.cache = {
            "flash_id": None,
            "uart_no": None,
            "usb_pid": None,
            "security_info": None,
        }
    
        if isinstance(port, str):
            try:
                self._port = serial.serial_for_url(
                    port, exclusive=True, do_not_open=True
                )
                if sys.platform == "win32":
                    # When opening a port on Windows,
                    # the RTS/DTR (active low) lines
                    # need to be set to False (pulled high)
                    # to avoid unwanted chip reset
                    self._port.rts = False
                    self._port.dtr = False
                self._port.open()
            except serial.serialutil.SerialException as e:
                port_issues = [
                    [  # does not exist error
                        re.compile(r"Errno 2|FileNotFoundError", re.IGNORECASE),
                        "Check if the port is correct and ESP connected",
                    ],
                    [  # busy port error
                        re.compile(r"Access is denied", re.IGNORECASE),
                        "Check if the port is not used by another task",
                    ],
                ]
                if sys.platform.startswith("linux"):
                    port_issues.append(
                        [  # permission denied error
                            re.compile(r"Permission denied", re.IGNORECASE),
                            ("Try to add user into dialout or uucp group."),
                        ],
                    )
    
                hint_msg = ""
                for port_issue in port_issues:
                    if port_issue[0].search(str(e)):
                        hint_msg = f"\nHint: {port_issue[1]}\n"
                        break
    
>               raise FatalError(
                    f"Could not open {port}, the port is busy or doesn't exist."
                    f"\n({e})\n"
                    f"{hint_msg}"
                )
E               esptool.util.FatalError: Could not open /dev/ttyUSB28, the port is busy or doesn't exist.
E               ([Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28')

/usr/local/lib/python3.12/site-packages/esptool/loader.py:389: FatalError

Check failure on line 0 in hardware.missing_runner

See this annotation in the file changed.

@github-actions github-actions / Test Results

wifi2 (hardware.missing_runner) with error

./artifacts/test-results-hw/validation/wifi/esp32s3/wifi2.xml
Raw output
No available runner matches required tags: esp32s3 wifi_router (chip=esp32s3)
The hardware test could not be scheduled because no runner with the required tag combination is online/available.

Check failure on line 0 in performance.fibonacci.test_fibonacci

See this annotation in the file changed.

@github-actions github-actions / Test Results

1 out of 7 runs with error: test_fibonacci (performance.fibonacci.test_fibonacci)

./artifacts/test-results-hw/performance/fibonacci/esp32c6/fibonacci.xml [took 0s]
Raw output
failed on setup with "esptool.util.FatalError: Could not open /dev/ttyUSB28, the port is busy or doesn't exist.
([Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28')"
self = Serial<id=0x7f7030fc2710, open=False>(port='/dev/ttyUSB28', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

    def open(self):
        """\
        Open port with current settings. This may throw a SerialException
        if the port cannot be opened."""
        if self._port is None:
            raise SerialException("Port must be configured before it can be used.")
        if self.is_open:
            raise SerialException("Port is already open.")
        self.fd = None
        # open
        try:
>           self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E           OSError: [Errno 6] No such device or address: '/dev/ttyUSB28'

/usr/local/lib/python3.12/site-packages/serial/serialposix.py:322: OSError

During handling of the above exception, another exception occurred:

self = <esptool.targets.esp32c6.ESP32C6ROM object at 0x7f7031034d10>
port = '/dev/ttyUSB28', baud = 115200, trace_enabled = False

    def __init__(self, port=DEFAULT_PORT, baud=ESP_ROM_BAUD, trace_enabled=False):
        """Base constructor for ESPLoader bootloader interaction
    
        Don't call this constructor, either instantiate a specific
        ROM class directly, or use cmds.detect_chip(). You can use the with
        statement to ensure the serial port is closed when done.
    
        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().
    
        """
        # True if esptool detects the ROM is in Secure Download Mode
        self.secure_download_mode = False
        # True if esptool detects conditions which require the stub to be disabled
        self.stub_is_disabled = False
    
        # Device-and-runtime-specific cache
        self.cache = {
            "flash_id": None,
            "uart_no": None,
            "usb_pid": None,
            "security_info": None,
        }
    
        if isinstance(port, str):
            try:
                self._port = serial.serial_for_url(
                    port, exclusive=True, do_not_open=True
                )
                if sys.platform == "win32":
                    # When opening a port on Windows,
                    # the RTS/DTR (active low) lines
                    # need to be set to False (pulled high)
                    # to avoid unwanted chip reset
                    self._port.rts = False
                    self._port.dtr = False
>               self._port.open()

/usr/local/lib/python3.12/site-packages/esptool/loader.py:363: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = Serial<id=0x7f7030fc2710, open=False>(port='/dev/ttyUSB28', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

    def open(self):
        """\
        Open port with current settings. This may throw a SerialException
        if the port cannot be opened."""
        if self._port is None:
            raise SerialException("Port must be configured before it can be used.")
        if self.is_open:
            raise SerialException("Port is already open.")
        self.fd = None
        # open
        try:
            self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
        except OSError as msg:
            self.fd = None
>           raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
E           serial.serialutil.SerialException: [Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28'

/usr/local/lib/python3.12/site-packages/serial/serialposix.py:325: SerialException

During handling of the above exception, another exception occurred:

args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'se...oApp object at 0x7f7031034a10>, 'msg_queue': <AutoProxy[MessageQueue] object, typeid 'MessageQueue' at 0x7f703110ade0>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7f7031038a40>
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)
                      ^^^^^^^^^^^^^^^^^^^^^

/usr/local/lib/python3.12/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/local/lib/python3.12/site-packages/pytest_embedded/plugin.py:1131: in serial
    return serial_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^^
/usr/local/lib/python3.12/site-packages/pytest_embedded/dut_factory.py:482: in serial_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/local/lib/python3.12/site-packages/pytest_embedded_arduino/serial.py:25: in __init__
    super().__init__(
/usr/local/lib/python3.12/site-packages/pytest_embedded_serial_esp/serial.py:98: in __init__
    self.esp = esptool.get_default_connected_device(
/usr/local/lib/python3.12/site-packages/esptool/__init__.py:1157: in get_default_connected_device
    _esp = chip_class(each_port, initial_baud, trace)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <esptool.targets.esp32c6.ESP32C6ROM object at 0x7f7031034d10>
port = '/dev/ttyUSB28', baud = 115200, trace_enabled = False

    def __init__(self, port=DEFAULT_PORT, baud=ESP_ROM_BAUD, trace_enabled=False):
        """Base constructor for ESPLoader bootloader interaction
    
        Don't call this constructor, either instantiate a specific
        ROM class directly, or use cmds.detect_chip(). You can use the with
        statement to ensure the serial port is closed when done.
    
        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().
    
        """
        # True if esptool detects the ROM is in Secure Download Mode
        self.secure_download_mode = False
        # True if esptool detects conditions which require the stub to be disabled
        self.stub_is_disabled = False
    
        # Device-and-runtime-specific cache
        self.cache = {
            "flash_id": None,
            "uart_no": None,
            "usb_pid": None,
            "security_info": None,
        }
    
        if isinstance(port, str):
            try:
                self._port = serial.serial_for_url(
                    port, exclusive=True, do_not_open=True
                )
                if sys.platform == "win32":
                    # When opening a port on Windows,
                    # the RTS/DTR (active low) lines
                    # need to be set to False (pulled high)
                    # to avoid unwanted chip reset
                    self._port.rts = False
                    self._port.dtr = False
                self._port.open()
            except serial.serialutil.SerialException as e:
                port_issues = [
                    [  # does not exist error
                        re.compile(r"Errno 2|FileNotFoundError", re.IGNORECASE),
                        "Check if the port is correct and ESP connected",
                    ],
                    [  # busy port error
                        re.compile(r"Access is denied", re.IGNORECASE),
                        "Check if the port is not used by another task",
                    ],
                ]
                if sys.platform.startswith("linux"):
                    port_issues.append(
                        [  # permission denied error
                            re.compile(r"Permission denied", re.IGNORECASE),
                            ("Try to add user into dialout or uucp group."),
                        ],
                    )
    
                hint_msg = ""
                for port_issue in port_issues:
                    if port_issue[0].search(str(e)):
                        hint_msg = f"\nHint: {port_issue[1]}\n"
                        break
    
>               raise FatalError(
                    f"Could not open {port}, the port is busy or doesn't exist."
                    f"\n({e})\n"
                    f"{hint_msg}"
                )
E               esptool.util.FatalError: Could not open /dev/ttyUSB28, the port is busy or doesn't exist.
E               ([Errno 6] could not open port /dev/ttyUSB28: [Errno 6] No such device or address: '/dev/ttyUSB28')

/usr/local/lib/python3.12/site-packages/esptool/loader.py:389: FatalError

Check failure on line 0 in performance.psramspeed.test_psramspeed

See this annotation in the file changed.

@github-actions github-actions / Test Results

1 out of 3 runs with error: test_psramspeed (performance.psramspeed.test_psramspeed)

./artifacts/test-results-hw/performance/psramspeed/esp32s2/psramspeed.xml [took 0s]
Raw output
failed on setup with "esptool.util.FatalError: Could not open /dev/ttyUSB0, the port is busy or doesn't exist.
([Errno 6] could not open port /dev/ttyUSB0: [Errno 6] No such device or address: '/dev/ttyUSB0')"
self = Serial<id=0x7ff8ef5cc580, open=False>(port='/dev/ttyUSB0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

    def open(self):
        """\
        Open port with current settings. This may throw a SerialException
        if the port cannot be opened."""
        if self._port is None:
            raise SerialException("Port must be configured before it can be used.")
        if self.is_open:
            raise SerialException("Port is already open.")
        self.fd = None
        # open
        try:
>           self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E           OSError: [Errno 6] No such device or address: '/dev/ttyUSB0'

/usr/local/lib/python3.12/site-packages/serial/serialposix.py:322: OSError

During handling of the above exception, another exception occurred:

self = <esptool.targets.esp32s2.ESP32S2ROM object at 0x7ff8ef5cc680>
port = '/dev/ttyUSB0', baud = 115200, trace_enabled = False

    def __init__(self, port=DEFAULT_PORT, baud=ESP_ROM_BAUD, trace_enabled=False):
        """Base constructor for ESPLoader bootloader interaction
    
        Don't call this constructor, either instantiate a specific
        ROM class directly, or use cmds.detect_chip(). You can use the with
        statement to ensure the serial port is closed when done.
    
        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().
    
        """
        # True if esptool detects the ROM is in Secure Download Mode
        self.secure_download_mode = False
        # True if esptool detects conditions which require the stub to be disabled
        self.stub_is_disabled = False
    
        # Device-and-runtime-specific cache
        self.cache = {
            "flash_id": None,
            "uart_no": None,
            "usb_pid": None,
            "security_info": None,
        }
    
        if isinstance(port, str):
            try:
                self._port = serial.serial_for_url(
                    port, exclusive=True, do_not_open=True
                )
                if sys.platform == "win32":
                    # When opening a port on Windows,
                    # the RTS/DTR (active low) lines
                    # need to be set to False (pulled high)
                    # to avoid unwanted chip reset
                    self._port.rts = False
                    self._port.dtr = False
>               self._port.open()

/usr/local/lib/python3.12/site-packages/esptool/loader.py:363: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = Serial<id=0x7ff8ef5cc580, open=False>(port='/dev/ttyUSB0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

    def open(self):
        """\
        Open port with current settings. This may throw a SerialException
        if the port cannot be opened."""
        if self._port is None:
            raise SerialException("Port must be configured before it can be used.")
        if self.is_open:
            raise SerialException("Port is already open.")
        self.fd = None
        # open
        try:
            self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
        except OSError as msg:
            self.fd = None
>           raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
E           serial.serialutil.SerialException: [Errno 6] could not open port /dev/ttyUSB0: [Errno 6] No such device or address: '/dev/ttyUSB0'

/usr/local/lib/python3.12/site-packages/serial/serialposix.py:325: SerialException

During handling of the above exception, another exception occurred:

args = ()
kwargs = {'_fixture_classes_and_options': ClassCliOptions(classes={'app': <class 'pytest_embedded_arduino.app.ArduinoApp'>, 'se...oApp object at 0x7ff8ef5cc380>, 'msg_queue': <AutoProxy[MessageQueue] object, typeid 'MessageQueue' at 0x7ff8ef66a570>}
_close_or_terminate = <function multi_dut_generator_fixture.<locals>.wrapper.<locals>._close_or_terminate at 0x7ff8ef5d0900>
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)
                      ^^^^^^^^^^^^^^^^^^^^^

/usr/local/lib/python3.12/site-packages/pytest_embedded/plugin.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/local/lib/python3.12/site-packages/pytest_embedded/plugin.py:1131: in serial
    return serial_gn(**locals())
           ^^^^^^^^^^^^^^^^^^^^^
/usr/local/lib/python3.12/site-packages/pytest_embedded/dut_factory.py:482: in serial_gn
    return cls(**_drop_none_kwargs(kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/local/lib/python3.12/site-packages/pytest_embedded_arduino/serial.py:25: in __init__
    super().__init__(
/usr/local/lib/python3.12/site-packages/pytest_embedded_serial_esp/serial.py:98: in __init__
    self.esp = esptool.get_default_connected_device(
/usr/local/lib/python3.12/site-packages/esptool/__init__.py:1157: in get_default_connected_device
    _esp = chip_class(each_port, initial_baud, trace)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <esptool.targets.esp32s2.ESP32S2ROM object at 0x7ff8ef5cc680>
port = '/dev/ttyUSB0', baud = 115200, trace_enabled = False

    def __init__(self, port=DEFAULT_PORT, baud=ESP_ROM_BAUD, trace_enabled=False):
        """Base constructor for ESPLoader bootloader interaction
    
        Don't call this constructor, either instantiate a specific
        ROM class directly, or use cmds.detect_chip(). You can use the with
        statement to ensure the serial port is closed when done.
    
        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().
    
        """
        # True if esptool detects the ROM is in Secure Download Mode
        self.secure_download_mode = False
        # True if esptool detects conditions which require the stub to be disabled
        self.stub_is_disabled = False
    
        # Device-and-runtime-specific cache
        self.cache = {
            "flash_id": None,
            "uart_no": None,
            "usb_pid": None,
            "security_info": None,
        }
    
        if isinstance(port, str):
            try:
                self._port = serial.serial_for_url(
                    port, exclusive=True, do_not_open=True
                )
                if sys.platform == "win32":
                    # When opening a port on Windows,
                    # the RTS/DTR (active low) lines
                    # need to be set to False (pulled high)
                    # to avoid unwanted chip reset
                    self._port.rts = False
                    self._port.dtr = False
                self._port.open()
            except serial.serialutil.SerialException as e:
                port_issues = [
                    [  # does not exist error
                        re.compile(r"Errno 2|FileNotFoundError", re.IGNORECASE),
                        "Check if the port is correct and ESP connected",
                    ],
                    [  # busy port error
                        re.compile(r"Access is denied", re.IGNORECASE),
                        "Check if the port is not used by another task",
                    ],
                ]
                if sys.platform.startswith("linux"):
                    port_issues.append(
                        [  # permission denied error
                            re.compile(r"Permission denied", re.IGNORECASE),
                            ("Try to add user into dialout or uucp group."),
                        ],
                    )
    
                hint_msg = ""
                for port_issue in port_issues:
                    if port_issue[0].search(str(e)):
                        hint_msg = f"\nHint: {port_issue[1]}\n"
                        break
    
>               raise FatalError(
                    f"Could not open {port}, the port is busy or doesn't exist."
                    f"\n({e})\n"
                    f"{hint_msg}"
                )
E               esptool.util.FatalError: Could not open /dev/ttyUSB0, the port is busy or doesn't exist.
E               ([Errno 6] could not open port /dev/ttyUSB0: [Errno 6] No such device or address: '/dev/ttyUSB0')

/usr/local/lib/python3.12/site-packages/esptool/loader.py:389: FatalError

Check failure on line 0 in hardware.missing_runner

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 3 runs with error: wifi1 (hardware.missing_runner)

./artifacts/test-results-hw/validation/wifi/esp32/wifi1.xml
./artifacts/test-results-hw/validation/wifi/esp32s2/wifi1.xml
./artifacts/test-results-hw/validation/wifi/esp32s3/wifi1.xml
Raw output
No available runner matches required tags: esp32s3 wifi_router (chip=esp32s3)
The hardware test could not be scheduled because no runner with the required tag combination is online/available.

Check failure on line 0 in hardware.missing_runner

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 2 runs with error: wifi (hardware.missing_runner)

./artifacts/test-results-hw/validation/wifi/esp32c3/wifi.xml
./artifacts/test-results-hw/validation/wifi/esp32c6/wifi.xml
Raw output
No available runner matches required tags: esp32c3 wifi_router (chip=esp32c3)
The hardware test could not be scheduled because no runner with the required tag combination is online/available.

Check failure on line 0 in hardware.missing_runner

See this annotation in the file changed.

@github-actions github-actions / Test Results

All 3 runs with error: wifi0 (hardware.missing_runner)

./artifacts/test-results-hw/validation/wifi/esp32/wifi0.xml
./artifacts/test-results-hw/validation/wifi/esp32s2/wifi0.xml
./artifacts/test-results-hw/validation/wifi/esp32s3/wifi0.xml
Raw output
No available runner matches required tags: esp32 wifi_router (chip=esp32)
The hardware test could not be scheduled because no runner with the required tag combination is online/available.

Check notice on line 0 in .github

See this annotation in the file changed.

@github-actions github-actions / Test Results

54 tests found

There are 54 tests, see "Raw output" for the full list of tests.
Raw output
auto_baudrate_test
basic_transmission_test
begin_when_running_test
change_baudrate_test
change_clock
change_cpu_frequency_test
change_pins_test
disabled_uart_calls_test
enabled_uart_calls_test
end_when_stopped_test
hardware.missing_runner ‑ wifi
hardware.missing_runner ‑ wifi0
hardware.missing_runner ‑ wifi1
hardware.missing_runner ‑ wifi2
performance.coremark.test_coremark ‑ test_coremark
performance.fibonacci.test_fibonacci ‑ test_fibonacci
performance.linpack_double.test_linpack_double ‑ test_linpack_double
performance.linpack_float.test_linpack_float ‑ test_linpack_float
performance.psramspeed.test_psramspeed ‑ test_psramspeed
performance.ramspeed.test_ramspeed ‑ test_ramspeed
performance.superpi.test_superpi ‑ test_superpi
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
test_touch_errors
test_touch_interrtupt
test_touch_read
timer_clock_select_test
timer_divider_test
timer_interrupt_test
timer_read_test
validation.democfg.test_democfg ‑ test_cfg
validation.gpio.test_gpio ‑ test_gpio
validation.hello_world.test_hello_world ‑ test_hello_world
validation.nvs.test_nvs ‑ test_nvs
validation.periman.test_periman ‑ test_periman
validation.wifi.test_wifi ‑ test_wifi