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 """