[PATCH v2 3/6] tests: refactor event waiting

Johannes Berg johannes at sipsolutions.net
Fri Sep 11 15:59:51 PDT 2026


From: Johannes Berg <johannes.berg at intel.com>

Quite a bit of code is duplicated here, refactor it.
One additional motivation is allowing async tests in
the future, which this will simplify.

Signed-off-by: Johannes Berg <johannes.berg at intel.com>
---
 tests/hwsim/hostapd.py       | 37 +++++-------------------------------
 tests/hwsim/run-tests.py     |  2 ++
 tests/hwsim/wpasupplicant.py | 26 ++++---------------------
 wpaspy/wpaspy.py             | 21 ++++++++++++++++++++
 4 files changed, 32 insertions(+), 54 deletions(-)

diff --git a/tests/hwsim/hostapd.py b/tests/hwsim/hostapd.py
index 9cfe5a2b61d0..a0a2340fdf36 100644
--- a/tests/hwsim/hostapd.py
+++ b/tests/hwsim/hostapd.py
@@ -81,21 +81,8 @@ class HostapdGlobal:
         return self.ctrl.request(cmd, timeout)
 
     def wait_event(self, events, timeout):
-        start = os.times()[4]
-        while True:
-            while self.mon.pending():
-                ev = self.mon.recv()
-                logger.debug(self.dbg + "(global): " + ev)
-                for event in events:
-                    if event in ev:
-                        return ev
-            now = os.times()[4]
-            remaining = start + timeout - now
-            if remaining <= 0:
-                break
-            if not self.mon.pending(timeout=remaining):
-                break
-        return None
+        return wpaspy.wait_event(self.mon, events, timeout,
+                                 log_prefix=self.dbg + "(global): ")
 
     def add(self, ifname, driver=None):
         cmd = "ADD " + ifname + " " + hapd_ctrl
@@ -303,23 +290,9 @@ class Hostapd:
             logger.debug(self.dbg + ": " + ev)
 
     def wait_event(self, events, timeout):
-        if not isinstance(events, list):
-            raise Exception("Hostapd.wait_event() called with incorrect events argument type")
-        start = os.times()[4]
-        while True:
-            while self.mon.pending():
-                ev = self.mon.recv()
-                logger.debug(self.dbg + ": " + ev)
-                for event in events:
-                    if event in ev:
-                        return ev
-            now = os.times()[4]
-            remaining = start + timeout - now
-            if remaining <= 0:
-                break
-            if not self.mon.pending(timeout=remaining):
-                break
-        return None
+        return wpaspy.wait_event(self.mon, events, timeout,
+                                 log_prefix=self.dbg + ": ")
+
 
     def wait_sta(self, addr=None, timeout=2, wait_4way_hs=False):
         ev = self.wait_event(["AP-STA-CONNECT"], timeout=timeout)
diff --git a/tests/hwsim/run-tests.py b/tests/hwsim/run-tests.py
index 52d64828c342..f113b8149347 100755
--- a/tests/hwsim/run-tests.py
+++ b/tests/hwsim/run-tests.py
@@ -12,6 +12,8 @@ import gc
 import sys
 import time
 import glob
+import asyncio
+import inspect
 from datetime import datetime
 import argparse
 import subprocess
diff --git a/tests/hwsim/wpasupplicant.py b/tests/hwsim/wpasupplicant.py
index b5e241a825ba..15178e2b817e 100644
--- a/tests/hwsim/wpasupplicant.py
+++ b/tests/hwsim/wpasupplicant.py
@@ -880,33 +880,15 @@ class WpaSupplicant:
             return self.group_form_result(ev, expect_failure, go_neg_res)
         raise Exception("P2P_CONNECT failed")
 
-    def _wait_event(self, mon, pfx, events, timeout):
-        if not isinstance(events, list):
-            raise Exception("WpaSupplicant._wait_event() called with incorrect events argument type")
-        start = os.times()[4]
-        while True:
-            while mon.pending():
-                ev = mon.recv()
-                logger.debug(self.dbg + pfx + ev)
-                for event in events:
-                    if event in ev:
-                        return ev
-            now = os.times()[4]
-            remaining = start + timeout - now
-            if remaining <= 0:
-                break
-            if not mon.pending(timeout=remaining):
-                break
-        return None
-
     def wait_event(self, events, timeout=10):
-        return self._wait_event(self.mon, ": ", events, timeout)
+        return wpaspy.wait_event(self.mon, events, timeout,
+                                 log_prefix=self.dbg + ": ")
 
     def wait_global_event(self, events, timeout):
         if self.global_iface is None:
             return self.wait_event(events, timeout)
-        return self._wait_event(self.global_mon, "(global): ",
-                                events, timeout)
+        return wpaspy.wait_event(self.global_mon, events, timeout,
+                                 log_prefix=self.dbg + "(global): ")
 
     def wait_group_event(self, events, timeout=10):
         if not isinstance(events, list):
diff --git a/wpaspy/wpaspy.py b/wpaspy/wpaspy.py
index 5b8140b7c99f..eb7f06ded838 100644
--- a/wpaspy/wpaspy.py
+++ b/wpaspy/wpaspy.py
@@ -10,6 +10,9 @@ import os
 import stat
 import socket
 import select
+import logging
+
+logger = logging.getLogger()
 
 counter = 0
 
@@ -147,3 +150,21 @@ class Ctrl:
         except UnicodeDecodeError as e:
             r = res
         return r
+
+def wait_event(sock, events, timeout=10, log_prefix=""):
+    assert isinstance(events, list), "'events' must be a list"
+    start = os.times()[4]
+    while True:
+        while sock.pending():
+            ev = sock.recv()
+            logger.debug(log_prefix + ev)
+            for event in events:
+                if event in ev:
+                    return ev
+        now = os.times()[4]
+        remaining = start + timeout - now
+        if remaining <= 0:
+            break
+        if not sock.pending(timeout=remaining):
+            break
+    return None
-- 
2.55.0




More information about the Hostap mailing list