summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAngus Gratton <angus@redyak.com.au>2024-11-13 17:40:02 +1100
committerAngus Gratton <gus@projectgus.com>2024-11-28 15:39:06 +1100
commit0e383a31b9560334b0c8d26b378deccc1c6af961 (patch)
tree8ad836a8f2298f33a77e423d80b19433d14aa82a
parent951a10e7078413d2dee2758fc2b7cb292e2b50b7 (diff)
tests: Add basic wlan test.
Includes adding some ESP8266 port output to the ignored output list for the multitest runner. This test passes on ESP8266 and various ESP32s (including talking to each other). Without the fix in the parent commit, ESP32 AP will fail if the station can report its channel (i.e. channel is wrong). Testing with a CYW43 (RPI_PICO_W) currently fails but I have some fixes to submit so it can pass as well. Signed-off-by: Angus Gratton <angus@redyak.com.au>
-rw-r--r--tests/multi_wlan/01_ap_sta.py117
-rw-r--r--tests/multi_wlan/01_ap_sta.py.exp13
-rwxr-xr-xtests/run-multitests.py11
3 files changed, 135 insertions, 6 deletions
diff --git a/tests/multi_wlan/01_ap_sta.py b/tests/multi_wlan/01_ap_sta.py
new file mode 100644
index 000000000..1a8e80cd3
--- /dev/null
+++ b/tests/multi_wlan/01_ap_sta.py
@@ -0,0 +1,117 @@
+# Basic Wi-Fi MAC layer test where one device creates an Access Point and the
+# other device connects to it as a Station. Also tests channel assignment (where
+# possible) and disconnection.
+
+try:
+ import network
+
+ network.WLAN
+except (ImportError, NameError):
+ print("SKIP")
+ raise SystemExit
+
+import os
+import sys
+import time
+
+CHANNEL = 8
+
+# Note that on slower Wi-Fi stacks this bumps up against the run-multitests.py
+# timeout which expects <10s between lines of output. We work around this by
+# logging something half way through the wait_for loop...
+CONNECT_TIMEOUT = 15000
+
+
+def wait_for(test_func):
+ has_printed = False
+ start = time.ticks_ms()
+ while not test_func():
+ time.sleep(0.1)
+ delta = time.ticks_diff(time.ticks_ms(), start)
+ if not has_printed and delta > CONNECT_TIMEOUT / 2:
+ print("...")
+ has_printed = True
+ elif delta > CONNECT_TIMEOUT:
+ break
+
+ if not has_printed:
+ print("...") # keep the output consistent
+
+ return test_func()
+
+
+# AP
+def instance0():
+ ap = network.WLAN(network.WLAN.IF_AP)
+ ssid = "MP-test-" + os.urandom(6).hex()
+ psk = "Secret-" + os.urandom(6).hex()
+
+ # stop any previous activity
+ network.WLAN(network.WLAN.IF_STA).active(False)
+ ap.active(False)
+
+ ap.active(True)
+ ap.config(ssid=ssid, key=psk, channel=CHANNEL, security=network.WLAN.SEC_WPA_WPA2)
+
+ # print("AP setup", ssid, psk)
+ print("AP started")
+
+ multitest.globals(SSID=ssid, PSK=psk)
+ multitest.next()
+
+ # Wait for station
+ if not wait_for(ap.isconnected):
+ raise RuntimeError("Timed out waiting for station, status ", ap.status())
+
+ print("AP got station")
+ time.sleep(
+ 3
+ ) # depending on port, may still need to negotiate DHCP lease for STA to see connection
+
+ print("AP disabling...")
+ ap.active(False)
+
+
+# STA
+def instance1():
+ sta = network.WLAN(network.WLAN.IF_STA)
+
+ # stop any previous activity
+ network.WLAN(network.WLAN.IF_AP).active(False)
+ sta.active(False)
+
+ multitest.next()
+ ssid = SSID
+ psk = PSK
+
+ # print("STA setup", ssid, psk)
+
+ sta.active(True)
+ sta.connect(ssid, psk)
+
+ print("STA connecting...")
+
+ if not wait_for(sta.isconnected):
+ raise RuntimeError("Timed out waiting to connect, status ", sta.status())
+
+ print("STA connected")
+
+ # Print the current channel, if the port support this
+ try:
+ print("channel", sta.config("channel"))
+ except OSError as e:
+ if "AP" in str(e):
+ # ESP8266 only supports reading channel on the AP interface, so fake this result
+ print("channel", CHANNEL)
+ else:
+ raise
+
+ print("STA waiting for disconnect...")
+
+ # Expect the AP to disconnect us immediately
+ if not wait_for(lambda: not sta.isconnected()):
+ raise RuntimeError("Timed out waiting for AP to disconnect us, status ", sta.status())
+
+ print("STA disconnected")
+
+ sta.active(False)
diff --git a/tests/multi_wlan/01_ap_sta.py.exp b/tests/multi_wlan/01_ap_sta.py.exp
new file mode 100644
index 000000000..8fc023a39
--- /dev/null
+++ b/tests/multi_wlan/01_ap_sta.py.exp
@@ -0,0 +1,13 @@
+--- instance0 ---
+AP started
+...
+AP got station
+AP disabling...
+--- instance1 ---
+STA connecting...
+...
+STA connected
+channel 8
+STA waiting for disconnect...
+...
+STA disconnected
diff --git a/tests/run-multitests.py b/tests/run-multitests.py
index 93a6d3844..387eec701 100755
--- a/tests/run-multitests.py
+++ b/tests/run-multitests.py
@@ -105,15 +105,14 @@ instance{}()
multitest.flush()
"""
-# The btstack implementation on Unix generates some spurious output that we
-# can't control. Also other platforms may output certain warnings/errors that
-# can be safely ignored.
+# Some ports generate output we can't control, and that can be safely ignored.
IGNORE_OUTPUT_MATCHES = (
- "libusb: error ", # It tries to open devices that it doesn't have access to (libusb prints unconditionally).
+ "libusb: error ", # unix btstack tries to open devices that it doesn't have access to (libusb prints unconditionally).
"hci_transport_h2_libusb.c", # Same issue. We enable LOG_ERROR in btstack.
- "USB Path: ", # Hardcoded in btstack's libusb transport.
- "hci_number_completed_packet", # Warning from btstack.
+ "USB Path: ", # Hardcoded in unix btstack's libusb transport.
+ "hci_number_completed_packet", # Warning from unix btstack.
"lld_pdu_get_tx_flush_nb HCI packet count mismatch (", # From ESP-IDF, see https://github.com/espressif/esp-idf/issues/5105
+ " ets_task(", # ESP8266 port debug output
)