auto-t: use connect_bssid/roam APIs in testFT-PSK-roam

This also adds FT-over-DS into this test, as well as a reassociation
test for good measure.
This commit is contained in:
James Prestwood 2021-08-12 13:22:04 -07:00 committed by Denis Kenzior
parent 49eb17973e
commit 20f7907436
2 changed files with 67 additions and 44 deletions

View File

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

View File

@ -13,31 +13,14 @@ from hostapd import HostapdCLI
import testutil
class Test(unittest.TestCase):
def test_roam_success(self):
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
# Check that iwd selects BSS 0 first
rule0.signal = -2000
rule1.signal = -2500
wd = IWD(True)
psk_agent = PSKAgent("EasilyGuessedPassword")
wd.register_psk_agent(psk_agent)
def validate_connection(self, wd, over_ds=False):
device = wd.list_devices(1)[0]
condition = 'not obj.scanning'
wd.wait_for_object_condition(device, condition)
# Scanning is unavoidable in this case since several hostapd
# configurations are tested and changed mid-test
device.scan()
condition = 'obj.scanning'
@ -49,7 +32,6 @@ class Test(unittest.TestCase):
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)
@ -57,28 +39,27 @@ class Test(unittest.TestCase):
self.assertFalse(self.bss_hostapd[0].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'
wd.wait_for_object_condition(device, condition)
self.assertTrue(self.bss_hostapd[0].list_sta())
self.assertFalse(self.bss_hostapd[1].list_sta())
wd.unregister_psk_agent(psk_agent)
# list_sta actually reports any authenticated stations. Due to the
# nature of FT-over-DS IWD should authenticate to all stations with
# the same mobility domain. This means both APs should show our station.
if over_ds:
self.assertTrue(self.bss_hostapd[1].list_sta())
else:
self.assertFalse(self.bss_hostapd[1].list_sta())
testutil.test_iface_operstate(device.name)
testutil.test_ifaces_connected(self.bss_hostapd[0].ifname, device.name)
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.
# 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
device.roam(self.bss_hostapd[1].bssid)
condition = 'obj.state == DeviceState.roaming'
wd.wait_for_object_condition(device, condition)
@ -94,10 +75,9 @@ class Test(unittest.TestCase):
testutil.test_iface_operstate(device.name)
testutil.test_ifaces_connected(self.bss_hostapd[1].ifname, device.name)
self.assertRaises(Exception, testutil.test_ifaces_connected,
(self.bss_hostapd[0].ifname, device.name))
(self.bss_hostapd[0].ifname, device.name, True, True))
rule0.signal = -2000
rule1.signal = -8000
device.roam(self.bss_hostapd[0].bssid)
condition = 'obj.state == DeviceState.roaming'
wd.wait_for_object_condition(device, condition)
@ -113,7 +93,52 @@ class Test(unittest.TestCase):
testutil.test_iface_operstate(device.name)
testutil.test_ifaces_connected(self.bss_hostapd[0].ifname, device.name)
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_psk(self):
wd = IWD(True)
self.bss_hostapd[0].set_value('wpa_key_mgmt', 'FT-PSK')
self.bss_hostapd[0].set_value('ft_over_ds', '0')
self.bss_hostapd[0].reload()
self.bss_hostapd[0].wait_for_event("AP-ENABLED")
self.bss_hostapd[1].set_value('wpa_key_mgmt', 'FT-PSK')
self.bss_hostapd[1].set_value('ft_over_ds', '0')
self.bss_hostapd[1].reload()
self.bss_hostapd[1].wait_for_event("AP-ENABLED")
self.validate_connection(wd)
def test_ft_psk_over_ds(self):
wd = IWD(True)
self.bss_hostapd[0].set_value('wpa_key_mgmt', 'FT-PSK')
self.bss_hostapd[0].set_value('ft_over_ds', '1')
self.bss_hostapd[0].reload()
self.bss_hostapd[0].wait_for_event("AP-ENABLED")
self.bss_hostapd[1].set_value('wpa_key_mgmt', 'FT-PSK')
self.bss_hostapd[1].set_value('ft_over_ds', '1')
self.bss_hostapd[1].reload()
self.bss_hostapd[1].wait_for_event("AP-ENABLED")
self.validate_connection(wd, over_ds=True)
def test_reassociate_psk(self):
wd = IWD(True)
self.bss_hostapd[0].set_value('wpa_key_mgmt', 'WPA-PSK')
self.bss_hostapd[0].set_value('ft_over_ds', '0')
self.bss_hostapd[0].reload()
self.bss_hostapd[0].wait_for_event("AP-ENABLED")
self.bss_hostapd[1].set_value('wpa_key_mgmt', 'WPA-PSK')
self.bss_hostapd[1].set_value('ft_over_ds', '0')
self.bss_hostapd[1].reload()
self.bss_hostapd[1].wait_for_event("AP-ENABLED")
self.validate_connection(wd)
def tearDown(self):
os.system('ifconfig "' + self.bss_hostapd[0].ifname + '" down')
@ -121,18 +146,12 @@ class Test(unittest.TestCase):
os.system('ifconfig "' + self.bss_hostapd[0].ifname + '" up')
os.system('ifconfig "' + self.bss_hostapd[1].ifname + '" up')
hwsim = Hwsim()
for rule in list(hwsim.rules.keys()):
del hwsim.rules[rule]
@classmethod
def setUpClass(cls):
hwsim = Hwsim()
IWD.copy_to_storage('TestFT.psk')
cls.bss_hostapd = [ HostapdCLI(config='ft-psk-ccmp-1.conf'),
HostapdCLI(config='ft-psk-ccmp-2.conf') ]
cls.bss_radio = [ hwsim.get_radio('rad0'),
hwsim.get_radio('rad1') ]
# Set interface addresses to those expected by hostapd config files
os.system('ifconfig "' + cls.bss_hostapd[0].ifname +
@ -159,7 +178,6 @@ class Test(unittest.TestCase):
def tearDownClass(cls):
IWD.clear_storage()
cls.bss_hostapd = None
cls.bss_radio = None
if __name__ == '__main__':
unittest.main(exit=True)