tests: rfkill test cases
authorJouni Malinen <j@w1.fi>
Sun, 1 Jun 2014 13:17:33 +0000 (16:17 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 1 Jun 2014 13:17:33 +0000 (16:17 +0300)
Signed-off-by: Jouni Malinen <j@w1.fi>
tests/hwsim/test_rfkill.py [new file with mode: 0644]

diff --git a/tests/hwsim/test_rfkill.py b/tests/hwsim/test_rfkill.py
new file mode 100644 (file)
index 0000000..4b2a96b
--- /dev/null
@@ -0,0 +1,117 @@
+# rfkill tests
+# Copyright (c) 2014, Jouni Malinen <j@w1.fi>
+#
+# This software may be distributed under the terms of the BSD license.
+# See README for more details.
+
+import logging
+logger = logging.getLogger()
+import subprocess
+import time
+
+import hostapd
+import hwsim_utils
+
+def get_rfkill_id(dev):
+    try:
+        cmd = subprocess.Popen(["rfkill", "list"], stdout=subprocess.PIPE)
+    except Exception, e:
+        logger.info("No rfkill available: " + str(e))
+        return None
+    res = cmd.stdout.read()
+    cmd.stdout.close()
+    phy = dev.get_driver_status_field("phyname")
+    matches = [ line for line in res.splitlines() if phy + ':' in line ]
+    if len(matches) != 1:
+        return None
+    return matches[0].split(':')[0]
+
+def test_rfkill_open(dev, apdev):
+    """rfkill block/unblock during open mode connection"""
+    id = get_rfkill_id(dev[0])
+    if id is None:
+        return "skip"
+
+    hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
+    dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")
+    try:
+        logger.info("rfkill block")
+        subprocess.call(['sudo', 'rfkill', 'block', id])
+        ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=10)
+        if ev is None:
+            raise Exception("Missing disconnection event on rfkill block")
+
+        logger.info("rfkill unblock")
+        subprocess.call(['sudo', 'rfkill', 'unblock', id])
+        ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=10)
+        if ev is None:
+            raise Exception("Missing connection event on rfkill unblock")
+        hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
+    finally:
+        subprocess.call(['sudo', 'rfkill', 'unblock', id])
+
+def test_rfkill_wpa2_psk(dev, apdev):
+    """rfkill block/unblock during WPA2-PSK connection"""
+    id = get_rfkill_id(dev[0])
+    if id is None:
+        return "skip"
+
+    ssid = "test-wpa2-psk"
+    passphrase = 'qwertyuiop'
+    params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
+    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
+    dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
+    try:
+        logger.info("rfkill block")
+        subprocess.call(['sudo', 'rfkill', 'block', id])
+        ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=10)
+        if ev is None:
+            raise Exception("Missing disconnection event on rfkill block")
+
+        logger.info("rfkill unblock")
+        subprocess.call(['sudo', 'rfkill', 'unblock', id])
+        ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=10)
+        if ev is None:
+            raise Exception("Missing connection event on rfkill unblock")
+        hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
+    finally:
+        subprocess.call(['sudo', 'rfkill', 'unblock', id])
+
+def test_rfkill_autogo(dev, apdev):
+    """rfkill block/unblock for autonomous P2P GO"""
+    id0 = get_rfkill_id(dev[0])
+    if id0 is None:
+        return "skip"
+    id1 = get_rfkill_id(dev[1])
+    if id1 is None:
+        return "skip"
+
+    dev[0].p2p_start_go()
+    dev[1].request("SET p2p_no_group_iface 0")
+    dev[1].p2p_start_go()
+
+    try:
+        logger.info("rfkill block 0")
+        subprocess.call(['sudo', 'rfkill', 'block', id0])
+        ev = dev[0].wait_global_event(["P2P-GROUP-REMOVED"], timeout=10)
+        if ev is None:
+            raise Exception("Group removal not reported")
+        if "reason=UNAVAILABLE" not in ev:
+            raise Exception("Unexpected group removal reason: " + ev)
+
+        logger.info("rfkill block 1")
+        subprocess.call(['sudo', 'rfkill', 'block', id1])
+        ev = dev[1].wait_global_event(["P2P-GROUP-REMOVED"], timeout=10)
+        if ev is None:
+            raise Exception("Group removal not reported")
+        if "reason=UNAVAILABLE" not in ev:
+            raise Exception("Unexpected group removal reason: " + ev)
+
+        logger.info("rfkill unblock 0")
+        subprocess.call(['sudo', 'rfkill', 'unblock', id0])
+        logger.info("rfkill unblock 1")
+        subprocess.call(['sudo', 'rfkill', 'unblock', id1])
+        time.sleep(1)
+    finally:
+        subprocess.call(['sudo', 'rfkill', 'unblock', id0])
+        subprocess.call(['sudo', 'rfkill', 'unblock', id1])