1# 2# Copyright 2016 - The Android Open Source Project 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15 16from acts.test_decorators import test_tracker_info 17from acts_contrib.test_utils.wifi import wifi_test_utils as wutils 18from acts_contrib.test_utils.wifi.WifiBaseTest import WifiBaseTest 19 20WifiEnums = wutils.WifiEnums 21 22# EAP Macros 23EAP = WifiEnums.Eap 24EapPhase2 = WifiEnums.EapPhase2 25 26# Enterprise Config Macros 27Ent = WifiEnums.Enterprise 28 29 30class WifiEnterpriseRoamingTest(WifiBaseTest): 31 32 def __init__(self, configs): 33 super().__init__(configs) 34 self.enable_packet_log = True 35 36 def setup_class(self): 37 super().setup_class() 38 39 self.dut = self.android_devices[0] 40 req_params = ( 41 "roaming_attn", 42 # Expected time within which roaming should finish, in seconds. 43 "roam_interval", 44 "ca_cert", 45 "client_cert", 46 "client_key", 47 "eap_identity", 48 "eap_password", 49 "device_password", 50 "wifi6_models", 51 "radius_conf_2g", 52 "radius_conf_5g") 53 opt_param = ["domain_suffix_match"] 54 self.unpack_userparams(req_params, 55 opt_param) 56 if "AccessPoint" in self.user_params: 57 self.legacy_configure_ap_and_start( 58 mirror_ap=True, 59 ent_network=True, 60 ap_count=2, 61 radius_conf_2g=self.radius_conf_2g, 62 radius_conf_5g=self.radius_conf_5g,) 63 elif "OpenWrtAP" in self.user_params: 64 self.configure_openwrt_ap_and_start( 65 mirror_ap=True, 66 ent_network=True, 67 ap_count=2, 68 radius_conf_2g=self.radius_conf_2g, 69 radius_conf_5g=self.radius_conf_5g,) 70 self.ent_network_2g_a = self.ent_networks[0]["2g"] 71 self.ent_network_2g_b = self.ent_networks[1]["2g"] 72 self.ent_roaming_ssid = self.ent_network_2g_a[WifiEnums.SSID_KEY] 73 if "AccessPoint" in self.user_params: 74 self.bssid_a = self.ent_network_2g_a[WifiEnums.BSSID_KEY.lower()] 75 self.bssid_b = self.ent_network_2g_b[WifiEnums.BSSID_KEY.lower()] 76 elif "OpenWrtAP" in self.user_params: 77 self.bssid_a = self.bssid_map[0]["2g"][self.ent_roaming_ssid] 78 self.bssid_b = self.bssid_map[1]["2g"][self.ent_roaming_ssid] 79 80 self.config_peap = { 81 Ent.EAP: int(EAP.PEAP), 82 Ent.CA_CERT: self.ca_cert, 83 Ent.IDENTITY: self.eap_identity, 84 Ent.PASSWORD: self.eap_password, 85 Ent.PHASE2: int(EapPhase2.MSCHAPV2), 86 Ent.DOM_SUFFIX_MATCH: self.domain_suffix_match, 87 WifiEnums.SSID_KEY: self.ent_roaming_ssid 88 } 89 self.config_tls = { 90 Ent.EAP: int(EAP.TLS), 91 Ent.CA_CERT: self.ca_cert, 92 Ent.CLIENT_CERT: self.client_cert, 93 Ent.PRIVATE_KEY_ID: self.client_key, 94 Ent.IDENTITY: self.eap_identity, 95 Ent.DOM_SUFFIX_MATCH: self.domain_suffix_match, 96 WifiEnums.SSID_KEY: self.ent_roaming_ssid 97 } 98 self.config_ttls = { 99 Ent.EAP: int(EAP.TTLS), 100 Ent.CA_CERT: self.ca_cert, 101 Ent.IDENTITY: self.eap_identity, 102 Ent.PASSWORD: self.eap_password, 103 Ent.PHASE2: int(EapPhase2.MSCHAPV2), 104 Ent.DOM_SUFFIX_MATCH: self.domain_suffix_match, 105 WifiEnums.SSID_KEY: self.ent_roaming_ssid 106 } 107 self.config_sim = { 108 Ent.EAP: int(EAP.SIM), 109 WifiEnums.SSID_KEY: self.ent_roaming_ssid, 110 } 111 self.config_aka = { 112 Ent.EAP: int(EAP.AKA), 113 WifiEnums.SSID_KEY: self.ent_roaming_ssid, 114 } 115 self.config_aka_prime = { 116 Ent.EAP: int(EAP.AKA_PRIME), 117 WifiEnums.SSID_KEY: self.ent_roaming_ssid, 118 } 119 self.attn_a = self.attenuators[0] 120 self.attn_b = self.attenuators[2] 121 if "OpenWrtAP" in self.user_params: 122 self.attn_b = self.attenuators[1] 123 # Set screen lock password so ConfigStore is unlocked. 124 self.dut.droid.setDevicePassword(self.device_password) 125 wutils.set_attns(self.attenuators, "default") 126 127 def teardown_class(self): 128 wutils.reset_wifi(self.dut) 129 self.dut.droid.disableDevicePassword(self.device_password) 130 self.dut.ed.clear_all_events() 131 wutils.set_attns(self.attenuators, "default") 132 133 def setup_test(self): 134 super().setup_test() 135 self.dut.droid.wifiStartTrackingStateChange() 136 self.dut.droid.wakeLockAcquireBright() 137 self.dut.droid.wakeUpNow() 138 wutils.reset_wifi(self.dut) 139 self.dut.ed.clear_all_events() 140 141 def teardown_test(self): 142 super().teardown_test() 143 self.dut.droid.wakeLockRelease() 144 self.dut.droid.goToSleepNow() 145 self.dut.droid.wifiStopTrackingStateChange() 146 wutils.set_attns(self.attenuators, "default") 147 148 def trigger_roaming_and_validate(self, attn_val_name, expected_con): 149 """Sets attenuators to trigger roaming and validate the DUT connected 150 to the BSSID expected. 151 152 Args: 153 attn_val_name: Name of the attenuation value pair to use. 154 expected_con: The expected info of the network to we expect the DUT 155 to roam to. 156 """ 157 wutils.set_attns_steps( 158 self.attenuators, attn_val_name, self.roaming_attn) 159 self.log.info("Wait %ss for roaming to finish.", self.roam_interval) 160 try: 161 self.dut.droid.wakeLockAcquireBright() 162 self.dut.droid.wakeUpNow() 163 wutils.verify_wifi_connection_info(self.dut, expected_con) 164 expected_bssid = expected_con[WifiEnums.BSSID_KEY] 165 self.log.info("Roamed to %s successfully", expected_bssid) 166 finally: 167 self.dut.droid.wifiLockRelease() 168 self.dut.droid.goToSleepNow() 169 170 def roaming_between_a_and_b_logic(self, config): 171 """Test roaming between two enterprise APs. 172 173 Steps: 174 1. Make bssid_a visible, bssid_b not visible. 175 2. Connect to ent_roaming_ssid. Expect DUT to connect to bssid_a. 176 3. Make bssid_a not visible, bssid_b visible. 177 4. Expect DUT to roam to bssid_b. 178 5. Make bssid_a visible, bssid_b not visible. 179 6. Expect DUT to roam back to bssid_a. 180 """ 181 expected_con_to_a = { 182 WifiEnums.SSID_KEY: self.ent_roaming_ssid, 183 WifiEnums.BSSID_KEY: self.bssid_a, 184 } 185 expected_con_to_b = { 186 WifiEnums.SSID_KEY: self.ent_roaming_ssid, 187 WifiEnums.BSSID_KEY: self.bssid_b, 188 } 189 wutils.set_attns_steps( 190 self.attenuators, "AP1_on_AP2_off", self.roaming_attn) 191 wutils.connect_to_wifi_network(self.dut, config) 192 wutils.verify_11ax_wifi_connection( 193 self.dut, self.wifi6_models, "wifi6_ap" in self.user_params) 194 wutils.verify_wifi_connection_info(self.dut, expected_con_to_a) 195 self.log.info("Roaming from %s to %s", self.bssid_a, self.bssid_b) 196 self.trigger_roaming_and_validate("AP1_off_AP2_on", expected_con_to_b) 197 wutils.verify_11ax_wifi_connection( 198 self.dut, self.wifi6_models, "wifi6_ap" in self.user_params) 199 self.log.info("Roaming from %s to %s", self.bssid_b, self.bssid_a) 200 self.trigger_roaming_and_validate("AP1_on_AP2_off", expected_con_to_a) 201 wutils.verify_11ax_wifi_connection( 202 self.dut, self.wifi6_models, "wifi6_ap" in self.user_params) 203 204 """ Tests Begin """ 205 206 @test_tracker_info(uuid="b15e4b3f-841d-428d-87ac-272f29f06e14") 207 def test_roaming_with_config_tls(self): 208 self.roaming_between_a_and_b_logic(self.config_tls) 209 210 @test_tracker_info(uuid="d349cfec-b4af-48b2-88b7-744f5de25d43") 211 def test_roaming_with_config_ttls_none(self): 212 config = dict(self.config_ttls) 213 config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.NONE.value 214 self.roaming_between_a_and_b_logic(config) 215 216 @test_tracker_info(uuid="89b8161c-754e-4138-831d-5fe40f521ce4") 217 def test_roaming_with_config_ttls_pap(self): 218 config = dict(self.config_ttls) 219 config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.PAP.value 220 self.roaming_between_a_and_b_logic(config) 221 222 @test_tracker_info(uuid="d4925470-924b-4d03-8437-83e26b5f2df3") 223 def test_roaming_with_config_ttls_mschap(self): 224 config = dict(self.config_ttls) 225 config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAP.value 226 self.roaming_between_a_and_b_logic(config) 227 228 @test_tracker_info(uuid="206b1327-dd9c-4742-8717-e7bf2a04eed6") 229 def test_roaming_with_config_ttls_mschapv2(self): 230 config = dict(self.config_ttls) 231 config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value 232 self.roaming_between_a_and_b_logic(config) 233 234 @test_tracker_info(uuid="c2c0168b-2933-4954-af62-fb41f42dc45a") 235 def test_roaming_with_config_ttls_gtc(self): 236 config = dict(self.config_ttls) 237 config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.GTC.value 238 self.roaming_between_a_and_b_logic(config) 239 240 @test_tracker_info(uuid="481c4102-8f5b-4fcd-95cc-5e3285f47985") 241 def test_roaming_with_config_peap_mschapv2(self): 242 config = dict(self.config_peap) 243 config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value 244 self.roaming_between_a_and_b_logic(config) 245 246 @test_tracker_info(uuid="404155d4-33a7-42b3-b369-5f2d63d19f16") 247 def test_roaming_with_config_peap_gtc(self): 248 config = dict(self.config_peap) 249 config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.GTC.value 250 self.roaming_between_a_and_b_logic(config) 251 252 @test_tracker_info(uuid="e014fc94-a547-4aa7-953e-cff3bfe3f20c") 253 def test_roaming_with_config_sim(self): 254 self.roaming_between_a_and_b_logic(self.config_sim) 255 256 @test_tracker_info(uuid="2e45a59e-ec22-4bf4-811f-1a3a4b9bb330") 257 def test_roaming_with_config_aka(self): 258 self.roaming_between_a_and_b_logic(self.config_aka) 259 260 @test_tracker_info(uuid="63ebfdf5-e765-47ff-9754-f60e3f6e7409") 261 def test_roaming_with_config_aka_prime(self): 262 self.roaming_between_a_and_b_logic(self.config_aka_prime) 263 264 """ Tests End """