auto-t: add reassociate test to FT-SAE-roam

This refactors to test both FT and reassociation.
This commit is contained in:
James Prestwood 2021-08-12 13:21:57 -07:00 committed by Denis Kenzior
parent 77d5b57e9e
commit 15236f30db
2 changed files with 48 additions and 66 deletions

View File

@ -0,0 +1,5 @@
[Security]
Passphrase=EasilyGuessedPassword
[Settings]
AutoConnect=False

View File

@ -8,37 +8,12 @@ import iwd
from iwd import IWD from iwd import IWD
from iwd import PSKAgent from iwd import PSKAgent
from iwd import NetworkType from iwd import NetworkType
from hwsim import Hwsim
from hostapd import HostapdCLI from hostapd import HostapdCLI
import testutil import testutil
from config import ctx from config import ctx
class Test(unittest.TestCase): class Test(unittest.TestCase):
def test_roam_success(self): def validate_connection(self, wd, ft=True):
hwsim = Hwsim()
rule0 = hwsim.rules.create()
rule0.source = self.bss_radio[0].addresses[0]
rule0.bidirectional = True
rule1 = hwsim.rules.create()
rule1.source = self.bss_radio[1].addresses[0]
rule1.bidirectional = True
rule2 = hwsim.rules.create()
rule2.source = self.bss_radio[2].addresses[0]
rule2.bidirectional = True
# Check that iwd selects BSS 0 first
rule0.signal = -2000
rule1.signal = -6900
rule2.signal = -7200
wd = IWD(True)
psk_agent = PSKAgent("EasilyGuessedPassword")
wd.register_psk_agent(psk_agent)
device = wd.list_devices(1)[0] device = wd.list_devices(1)[0]
condition = 'not obj.scanning' condition = 'not obj.scanning'
@ -52,18 +27,10 @@ class Test(unittest.TestCase):
condition = 'not obj.scanning' condition = 'not obj.scanning'
wd.wait_for_object_condition(device, condition) wd.wait_for_object_condition(device, condition)
ordered_network = device.get_ordered_network('TestFT')
self.assertEqual(ordered_network.type, NetworkType.psk)
self.assertEqual(ordered_network.signal_strength, -2000)
condition = 'not obj.connected'
wd.wait_for_object_condition(ordered_network.network_object, condition)
self.assertFalse(self.bss_hostapd[0].list_sta()) self.assertFalse(self.bss_hostapd[0].list_sta())
self.assertFalse(self.bss_hostapd[1].list_sta()) self.assertFalse(self.bss_hostapd[1].list_sta())
ordered_network.network_object.connect() device.connect_bssid(self.bss_hostapd[0].bssid)
condition = 'obj.state == DeviceState.connected' condition = 'obj.state == DeviceState.connected'
wd.wait_for_object_condition(device, condition) wd.wait_for_object_condition(device, condition)
@ -71,20 +38,12 @@ class Test(unittest.TestCase):
self.assertTrue(self.bss_hostapd[0].list_sta()) self.assertTrue(self.bss_hostapd[0].list_sta())
self.assertFalse(self.bss_hostapd[1].list_sta()) self.assertFalse(self.bss_hostapd[1].list_sta())
wd.unregister_psk_agent(psk_agent)
testutil.test_iface_operstate(device.name) testutil.test_iface_operstate(device.name)
testutil.test_ifaces_connected(self.bss_hostapd[0].ifname, device.name) testutil.test_ifaces_connected(self.bss_hostapd[0].ifname, device.name)
self.assertRaises(Exception, testutil.test_ifaces_connected, self.assertRaises(Exception, testutil.test_ifaces_connected,
(self.bss_hostapd[1].ifname, device.name)) (self.bss_hostapd[1].ifname, device.name, True, True))
# Check that iwd starts transition to BSS 1 in less than 10 seconds. device.roam(self.bss_hostapd[1].bssid)
# The 10 seconds is longer than needed to scan on just two channels
# but short enough that a full scan on the 2.4 + 5.8 bands supported
# by mac80211_hwsim will not finish. If this times out then, but
# device_roam_trigger_cb has happened, it probably means that
# Neighbor Reports are broken.
rule0.signal = -8000
condition = 'obj.state == DeviceState.roaming' condition = 'obj.state == DeviceState.roaming'
wd.wait_for_object_condition(device, condition) wd.wait_for_object_condition(device, condition)
@ -95,22 +54,17 @@ class Test(unittest.TestCase):
to_condition = 'obj.state == DeviceState.connected' to_condition = 'obj.state == DeviceState.connected'
wd.wait_for_object_change(device, from_condition, to_condition) wd.wait_for_object_change(device, from_condition, to_condition)
rule1.signal = -2000
# wait for IWD's signal levels to recover
wd.wait(5)
self.assertTrue(self.bss_hostapd[1].list_sta()) self.assertTrue(self.bss_hostapd[1].list_sta())
testutil.test_iface_operstate(device.name) testutil.test_iface_operstate(device.name)
testutil.test_ifaces_connected(self.bss_hostapd[1].ifname, device.name) testutil.test_ifaces_connected(self.bss_hostapd[1].ifname, device.name)
self.assertRaises(Exception, testutil.test_ifaces_connected, self.assertRaises(Exception, testutil.test_ifaces_connected,
(self.bss_hostapd[0].ifname, device.name)) (self.bss_hostapd[0].ifname, device.name, True, True))
# test FT-PSK after FT-SAE if not ft:
rule1.signal = -8000 return
rule0.signal = -8000
rule2.signal = -1000 device.roam(self.bss_hostapd[2].bssid)
condition = 'obj.state == DeviceState.roaming' condition = 'obj.state == DeviceState.roaming'
wd.wait_for_object_condition(device, condition) wd.wait_for_object_condition(device, condition)
@ -124,7 +78,37 @@ class Test(unittest.TestCase):
testutil.test_iface_operstate(device.name) testutil.test_iface_operstate(device.name)
testutil.test_ifaces_connected(self.bss_hostapd[2].ifname, device.name) testutil.test_ifaces_connected(self.bss_hostapd[2].ifname, device.name)
self.assertRaises(Exception, testutil.test_ifaces_connected, self.assertRaises(Exception, testutil.test_ifaces_connected,
(self.bss_hostapd[1].ifname, device.name)) (self.bss_hostapd[1].ifname, device.name, True, True))
def test_ft_roam_success(self):
wd = IWD(True)
self.bss_hostapd[0].set_value('wpa_key_mgmt', 'FT-SAE SAE')
self.bss_hostapd[0].reload()
self.bss_hostapd[0].wait_for_event("AP-ENABLED")
self.bss_hostapd[1].set_value('wpa_key_mgmt', 'FT-SAE SAE')
self.bss_hostapd[1].reload()
self.bss_hostapd[1].wait_for_event("AP-ENABLED")
self.bss_hostapd[2].set_value('wpa_key_mgmt', 'FT-PSK')
self.bss_hostapd[2].reload()
self.bss_hostapd[2].wait_for_event("AP-ENABLED")
self.validate_connection(wd, True)
def test_reassociate_roam_success(self):
wd = IWD(True)
self.bss_hostapd[0].set_value('wpa_key_mgmt', 'SAE')
self.bss_hostapd[0].reload()
self.bss_hostapd[0].wait_for_event("AP-ENABLED")
self.bss_hostapd[1].set_value('wpa_key_mgmt', 'SAE')
self.bss_hostapd[1].reload()
self.bss_hostapd[1].wait_for_event("AP-ENABLED")
self.bss_hostapd[2].set_value('wpa_key_mgmt', 'WPA-PSK')
self.bss_hostapd[2].reload()
self.bss_hostapd[2].wait_for_event("AP-ENABLED")
self.validate_connection(wd, False)
def tearDown(self): def tearDown(self):
os.system('ifconfig "' + self.bss_hostapd[0].ifname + '" down') os.system('ifconfig "' + self.bss_hostapd[0].ifname + '" down')
@ -134,20 +118,11 @@ class Test(unittest.TestCase):
os.system('ifconfig "' + self.bss_hostapd[1].ifname + '" up') os.system('ifconfig "' + self.bss_hostapd[1].ifname + '" up')
os.system('ifconfig "' + self.bss_hostapd[2].ifname + '" up') os.system('ifconfig "' + self.bss_hostapd[2].ifname + '" up')
hwsim = Hwsim()
for rule in list(hwsim.rules.keys()):
del hwsim.rules[rule]
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
hwsim = Hwsim()
cls.bss_hostapd = [ HostapdCLI(config='ft-sae-1.conf'), cls.bss_hostapd = [ HostapdCLI(config='ft-sae-1.conf'),
HostapdCLI(config='ft-sae-2.conf'), HostapdCLI(config='ft-sae-2.conf'),
HostapdCLI(config='ft-psk-3.conf') ] HostapdCLI(config='ft-psk-3.conf') ]
cls.bss_radio = [ hwsim.get_radio('rad0'),
hwsim.get_radio('rad1'),
hwsim.get_radio('rad2') ]
ctx.start_process(['ifconfig', cls.bss_hostapd[0].ifname, 'down', 'hw', \ ctx.start_process(['ifconfig', cls.bss_hostapd[0].ifname, 'down', 'hw', \
'ether', '12:00:00:00:00:01', 'up'], wait=True) 'ether', '12:00:00:00:00:01', 'up'], wait=True)
@ -184,11 +159,13 @@ class Test(unittest.TestCase):
cls.bss_hostapd[2].set_neighbor('12:00:00:00:00:02', 'TestFT', cls.bss_hostapd[2].set_neighbor('12:00:00:00:00:02', 'TestFT',
'1200000000028f0000005101060603000000') '1200000000028f0000005101060603000000')
IWD.copy_to_storage('TestFT.psk')
@classmethod @classmethod
def tearDownClass(cls): def tearDownClass(cls):
IWD.clear_storage() IWD.clear_storage()
cls.bss_hostapd = None cls.bss_hostapd = None
cls.bss_radio = None
if __name__ == '__main__': if __name__ == '__main__':
unittest.main(exit=True) unittest.main(exit=True)