summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
)