GitHub Actions / Test Results
failed
Nov 17, 2025 in 0s.
View latest attempt.
1 fail, 37 pass in 16m 1s
76 files 76 suites 16m 1s ⏱️
38 tests 37 ✅ 0 💤 1 ❌
241 runs 239 ✅ 0 💤 2 ❌
Results for commit 35de665.
Annotations
Check warning on line 0 in validation.gpio.test_gpio
github-actions / Test Results
2 out of 7 runs failed: test_gpio (validation.gpio.test_gpio)
./artifacts/test-results-wokwi-esp32c6-validation/validation/gpio/esp32c6/gpio.xml [took 33s]
./artifacts/test-results-wokwi-esp32h2-validation/validation/gpio/esp32h2/gpio.xml [took 33s]
Raw output
pexpect.exceptions.TIMEOUT: Not found "2 CHANGE edge interrupt worked"
Bytes in current buffer (color code eliminated): ting interrupt with argument
Please check the full log here: /tmp/pytest-embedded/2025-11-17_11-18-35-162478/test_gpio/dut.log
self = <pytest_embedded_wokwi.dut.WokwiDut object at 0x7f897b464050>
pattern = '2 CHANGE edge interrupt worked', expect_all = False
not_matching = (), return_what_before_match = False, args = (), kwargs = {}
patterns = ['2 CHANGE edge interrupt worked'], res = []
debug_str = 'Not found "2 CHANGE edge interrupt worked"\nBytes in current buffer (color code eliminated): ting interrupt with argument\nPlease check the full log here: /tmp/pytest-embedded/2025-11-17_11-18-35-162478/test_gpio/dut.log'
@functools.wraps(func)
def wrapper(
self,
pattern,
*args,
expect_all: bool = False,
not_matching: list[str | re.Pattern] = (),
return_what_before_match: bool = False,
**kwargs,
) -> Match | AnyStr | list[Match | AnyStr]:
if return_what_before_match and expect_all:
raise ValueError('`return_what_before_match` and `expect_all` cannot be `True` at the same time.')
patterns = to_list(pattern)
res = []
while patterns:
try:
> index = func(self, pattern, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/dut.py:86:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/dut.py:170: in expect_exact
return self.pexpect_proc.expect_exact(pattern, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pexpect/spawnbase.py:432: in expect_exact
return exp.expect_loop(timeout)
^^^^^^^^^^^^^^^^^^^^^^^^
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pexpect/expect.py:181: in expect_loop
return self.timeout(e)
^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <pexpect.expect.Expecter object at 0x7f897b4198d0>
err = TIMEOUT("<pytest_embedded.log.PexpectProcess object at 0x7f897b464830>\nsearcher: searcher_string:\n 0: b'2 CHANGE edge interrupt worked'")
def timeout(self, err=None):
spawn = self.spawn
spawn.before = spawn._before.getvalue()
spawn.after = TIMEOUT
index = self.searcher.timeout_index
if index >= 0:
spawn.match = TIMEOUT
spawn.match_index = index
return index
else:
spawn.match = None
spawn.match_index = None
msg = str(spawn)
msg += '\nsearcher: %s' % self.searcher
if err is not None:
msg = str(err) + '\n' + msg
exc = TIMEOUT(msg)
exc.__cause__ = None # in Python 3.x we can use "raise exc from None"
> raise exc
E pexpect.exceptions.TIMEOUT: <pytest_embedded.log.PexpectProcess object at 0x7f897b464830>
E searcher: searcher_string:
E 0: b'2 CHANGE edge interrupt worked'
E <pytest_embedded.log.PexpectProcess object at 0x7f897b464830>
E searcher: searcher_string:
E 0: b'2 CHANGE edge interrupt worked'
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pexpect/expect.py:144: TIMEOUT
The above exception was the direct cause of the following exception:
dut = <pytest_embedded_wokwi.dut.WokwiDut object at 0x7f897b464050>
wokwi = <Wokwi: returncode: None args: []>
def test_gpio(dut: Dut, wokwi: Wokwi):
LOGGER = logging.getLogger(__name__)
def test_read_basic():
dut.expect_exact("BTN read as HIGH after pinMode INPUT_PULLUP")
wokwi.client.set_control("btn1", "pressed", 1)
wokwi.client.serial_write("OK\n") # Sync ack R1
dut.expect_exact("BTN read as LOW")
wokwi.client.set_control("btn1", "pressed", 0)
wokwi.client.serial_write("OK\n") # Sync ack R2
dut.expect_exact("BTN read as HIGH")
LOGGER.info("GPIO read basic test passed.")
def test_write_basic():
dut.expect_exact("GPIO LED set to OUTPUT")
assert wokwi.client.read_pin("led1", "A")["value"] == 0 # Anode pin
wokwi.client.serial_write("OK\n") # Sync ack W1
dut.expect_exact("LED set to HIGH")
assert wokwi.client.read_pin("led1", "A")["value"] == 1
wokwi.client.serial_write("OK\n") # Sync ack W2
dut.expect_exact("LED set to LOW")
assert wokwi.client.read_pin("led1", "A")["value"] == 0
LOGGER.info("GPIO write basic test passed.")
def test_interrupt_attach_detach():
dut.expect_exact("Interrupt attached - FALLING edge")
for i in range(1, 4):
wokwi.client.set_control("btn1", "pressed", 1)
wokwi.client.serial_write(f"OK:{i}\n")
dut.expect_exact(f"{i} interrupt triggered successfully")
wokwi.client.set_control("btn1", "pressed", 0)
dut.expect_exact("Interrupt detached")
wokwi.client.set_control("btn1", "pressed", 1)
sleep(0.1)
dut.expect_exact("No interrupt triggered after detach")
wokwi.client.set_control("btn1", "pressed", 0)
wokwi.client.serial_write("OK\n")
LOGGER.info("GPIO interrupt attach/detach test passed.")
def test_interrupt_falling():
dut.expect_exact("Testing FALLING edge interrupt")
for i in range(1, 4):
wokwi.client.set_control("btn1", "pressed", 1)
wokwi.client.serial_write(f"OK:{i}\n")
dut.expect_exact(f"{i} FALLING edge interrupt worked")
wokwi.client.set_control("btn1", "pressed", 0)
dut.expect_exact("Testing FALLING edge END")
wokwi.client.serial_write("OK\n")
LOGGER.info("GPIO interrupt falling test passed.")
def test_interrupt_rising():
dut.expect_exact("Testing RISING edge interrupt")
for i in range(1, 4):
wokwi.client.set_control("btn1", "pressed", 1)
wokwi.client.set_control("btn1", "pressed", 0)
wokwi.client.serial_write(f"OK:{i}\n")
dut.expect_exact(f"{i} RISING edge interrupt worked")
dut.expect_exact("Testing RISING edge END")
wokwi.client.serial_write("OK\n")
LOGGER.info("GPIO interrupt rising test passed.")
def test_interrupt_change():
dut.expect_exact("Testing CHANGE edge interrupt")
for i in range(1, 4):
wokwi.client.set_control("btn1", "pressed", 1)
wokwi.client.serial_write(f"OK:{i * 2 - 1}\n")
dut.expect_exact(f"{i * 2 - 1} CHANGE edge interrupt worked")
wokwi.client.set_control("btn1", "pressed", 0)
wokwi.client.serial_write(f"OK:{i * 2}\n")
dut.expect_exact(f"{i * 2} CHANGE edge interrupt worked")
dut.expect_exact("Testing CHANGE edge END")
wokwi.client.serial_write("OK\n")
LOGGER.info("GPIO interrupt change test passed.")
def test_interrupt_with_arg():
dut.expect_exact("Testing interrupt with argument")
for i in range(1, 4):
wokwi.client.set_control("btn1", "pressed", 1)
wokwi.client.serial_write(f"OK:{i}\n")
dut.expect_exact(f"{i} interrupt with argument worked, received arg: {42 + i - 1}")
wokwi.client.set_control("btn1", "pressed", 0)
dut.expect_exact("Testing interrupt with argument END")
wokwi.client.serial_write("OK\n")
LOGGER.info("GPIO interrupt with argument test passed.")
LOGGER.info("Waiting for GPIO test begin...")
dut.expect_exact("GPIO test START")
test_read_basic()
test_write_basic()
dut.expect_exact("GPIO interrupt START")
test_interrupt_attach_detach()
test_interrupt_falling()
test_interrupt_rising()
> test_interrupt_change()
tests/validation/gpio/test_gpio.py:112:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/validation/gpio/test_gpio.py:86: in test_interrupt_change
dut.expect_exact(f"{i * 2} CHANGE edge interrupt worked")
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <pytest_embedded_wokwi.dut.WokwiDut object at 0x7f897b464050>
pattern = '2 CHANGE edge interrupt worked', expect_all = False
not_matching = (), return_what_before_match = False, args = (), kwargs = {}
patterns = ['2 CHANGE edge interrupt worked'], res = []
debug_str = 'Not found "2 CHANGE edge interrupt worked"\nBytes in current buffer (color code eliminated): ting interrupt with argument\nPlease check the full log here: /tmp/pytest-embedded/2025-11-17_11-18-35-162478/test_gpio/dut.log'
@functools.wraps(func)
def wrapper(
self,
pattern,
*args,
expect_all: bool = False,
not_matching: list[str | re.Pattern] = (),
return_what_before_match: bool = False,
**kwargs,
) -> Match | AnyStr | list[Match | AnyStr]:
if return_what_before_match and expect_all:
raise ValueError('`return_what_before_match` and `expect_all` cannot be `True` at the same time.')
patterns = to_list(pattern)
res = []
while patterns:
try:
index = func(self, pattern, *args, **kwargs)
except (pexpect.EOF, pexpect.TIMEOUT) as e:
debug_str = (
f'Not found "{pattern!s}"\n'
f'Bytes in current buffer (color code eliminated): {self.pexpect_proc.buffer_debug_str}\n'
f'Please check the full log here: {self.logfile}'
)
> raise e.__class__(debug_str) from e
E pexpect.exceptions.TIMEOUT: Not found "2 CHANGE edge interrupt worked"
E Bytes in current buffer (color code eliminated): ting interrupt with argument
E Please check the full log here: /tmp/pytest-embedded/2025-11-17_11-18-35-162478/test_gpio/dut.log
/opt/hostedtoolcache/Python/3.14.0/x64/lib/python3.14/site-packages/pytest_embedded/dut.py:93: TIMEOUT
Check notice on line 0 in .github
github-actions / Test Results
38 tests found
There are 38 tests, see "Raw output" for the full list of tests.
Raw output
auto_baudrate_test
basic_transmission_test
begin_when_running_test
change_baudrate_test
change_clock
change_cpu_frequency_test
change_pins_test
disabled_uart_calls_test
enabled_uart_calls_test
end_when_stopped_test
periman_test
psram_found
resize_buffers_test
rtc_run_clock
rtc_set_time
scan_bus
scan_bus_with_wifi
swap_pins
test_api
test_calloc_success
test_fail
test_malloc_fail
test_malloc_success
test_memcpy
test_memset_all_ones
test_memset_all_zeroes
test_memset_alternating
test_memset_random
test_pass
test_realloc_success
timer_clock_select_test
timer_divider_test
timer_interrupt_test
timer_read_test
validation.gpio.test_gpio ‑ test_gpio
validation.hello_world.test_hello_world ‑ test_hello_world
validation.nvs.test_nvs ‑ test_nvs
validation.wifi.test_wifi ‑ test_wifi
Loading