From 2d6ce4327a3863a9ff632e01090f092a8f7f12dd Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Sun, 1 Jun 2014 16:17:33 +0300 Subject: [PATCH] tests: rfkill test cases Signed-off-by: Jouni Malinen --- tests/hwsim/test_rfkill.py | 117 +++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 tests/hwsim/test_rfkill.py diff --git a/tests/hwsim/test_rfkill.py b/tests/hwsim/test_rfkill.py new file mode 100644 index 000000000..4b2a96b47 --- /dev/null +++ b/tests/hwsim/test_rfkill.py @@ -0,0 +1,117 @@ +# rfkill tests +# Copyright (c) 2014, Jouni Malinen +# +# 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])