Bindu Mahadev | 9ef6549 | 2018-02-06 18:18:18 -0800 | [diff] [blame] | 1 | #!/usr/bin/env python3.4 |
| 2 | # |
| 3 | # Copyright 2018 - The Android Open Source Project |
| 4 | # |
| 5 | # Licensed under the Apache License, Version 2.0 (the "License"); |
| 6 | # you may not use this file except in compliance with the License. |
| 7 | # You may obtain a copy of the License at |
| 8 | # |
| 9 | # http://www.apache.org/licenses/LICENSE-2.0 |
| 10 | # |
| 11 | # Unless required by applicable law or agreed to in writing, software |
| 12 | # distributed under the License is distributed on an "AS IS" BASIS, |
| 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 14 | # See the License for the specific language governing permissions and |
| 15 | # limitations under the License. |
| 16 | |
| 17 | import pprint |
| 18 | import time |
| 19 | |
| 20 | import acts.base_test |
| 21 | import acts.test_utils.wifi.wifi_test_utils as wutils |
| 22 | import acts.utils |
| 23 | |
| 24 | from acts import asserts |
| 25 | from acts import signals |
| 26 | from acts import utils |
| 27 | from acts.test_decorators import test_tracker_info |
| 28 | from acts.test_utils.wifi.WifiBaseTest import WifiBaseTest |
| 29 | WifiEnums = wutils.WifiEnums |
| 30 | |
| 31 | WAIT_FOR_AUTO_CONNECT = 40 |
| 32 | WAIT_BEFORE_CONNECTION = 30 |
| 33 | |
| 34 | TIMEOUT = 1 |
| 35 | |
| 36 | |
| 37 | class WifiStressTest(WifiBaseTest): |
| 38 | """WiFi Stress test class. |
| 39 | |
| 40 | Test Bed Requirement: |
| 41 | * Two Android device |
| 42 | * Several Wi-Fi networks visible to the device, including an open Wi-Fi |
| 43 | network. |
| 44 | """ |
| 45 | |
| 46 | def __init__(self, controllers): |
| 47 | WifiBaseTest.__init__(self, controllers) |
| 48 | |
| 49 | def setup_class(self): |
| 50 | self.dut = self.android_devices[0] |
| 51 | self.dut_client = self.android_devices[1] |
| 52 | wutils.wifi_test_device_init(self.dut) |
| 53 | req_params = [] |
| 54 | opt_param = [ |
| 55 | "open_network", "reference_networks", "iperf_server_address", |
| 56 | "stress_count"] |
| 57 | self.unpack_userparams( |
| 58 | req_param_names=req_params, opt_param_names=opt_param) |
| 59 | |
| 60 | if "AccessPoint" in self.user_params: |
Bindu Mahadev | 6212a32 | 2018-05-10 22:05:57 -0700 | [diff] [blame^] | 61 | self.legacy_configure_ap_and_start(ap_count=2) |
Bindu Mahadev | 9ef6549 | 2018-02-06 18:18:18 -0800 | [diff] [blame] | 62 | |
| 63 | asserts.assert_true( |
| 64 | len(self.reference_networks) > 0, |
| 65 | "Need at least one reference network with psk.") |
| 66 | self.wpa_2g = self.reference_networks[0]["2g"] |
| 67 | self.wpa_5g = self.reference_networks[0]["5g"] |
| 68 | self.open_2g = self.open_network[0]["2g"] |
| 69 | self.open_5g = self.open_network[0]["5g"] |
| 70 | self.networks = [self.wpa_2g, self.wpa_5g, self.open_2g, self.open_5g] |
| 71 | if "iperf_server_address" in self.user_params: |
| 72 | self.iperf_server = self.iperf_servers[0] |
| 73 | if hasattr(self, 'iperf_server'): |
| 74 | self.iperf_server.start() |
| 75 | |
| 76 | def setup_test(self): |
| 77 | self.dut.droid.wakeLockAcquireBright() |
| 78 | self.dut.droid.wakeUpNow() |
| 79 | |
| 80 | def teardown_test(self): |
| 81 | self.dut.droid.wakeLockRelease() |
| 82 | self.dut.droid.goToSleepNow() |
| 83 | |
| 84 | def on_fail(self, test_name, begin_time): |
| 85 | self.dut.take_bug_report(test_name, begin_time) |
| 86 | self.dut.cat_adb_log(test_name, begin_time) |
| 87 | pass |
| 88 | |
| 89 | def teardown_class(self): |
| 90 | wutils.reset_wifi(self.dut) |
| 91 | if hasattr(self, 'iperf_server'): |
| 92 | self.iperf_server.stop() |
| 93 | if "AccessPoint" in self.user_params: |
| 94 | del self.user_params["reference_networks"] |
| 95 | del self.user_params["open_network"] |
| 96 | |
| 97 | """Helper Functions""" |
| 98 | |
| 99 | def scan_and_connect_by_ssid(self, network): |
| 100 | """Scan for network and connect using network information. |
| 101 | |
| 102 | Args: |
| 103 | network: A dictionary representing the network to connect to. |
| 104 | |
| 105 | """ |
| 106 | ssid = network[WifiEnums.SSID_KEY] |
| 107 | wutils.start_wifi_connection_scan_and_ensure_network_found(self.dut, |
| 108 | ssid) |
| 109 | wutils.wifi_connect(self.dut, network, num_of_tries=3) |
| 110 | |
| 111 | def scan_and_connect_by_id(self, network, net_id): |
| 112 | """Scan for network and connect using network id. |
| 113 | |
| 114 | Args: |
| 115 | net_id: Integer specifying the network id of the network. |
| 116 | |
| 117 | """ |
| 118 | ssid = network[WifiEnums.SSID_KEY] |
| 119 | wutils.start_wifi_connection_scan_and_ensure_network_found(self.dut, |
| 120 | ssid) |
| 121 | wutils.wifi_connect_by_id(self.dut, net_id) |
| 122 | |
| 123 | |
| 124 | """Tests""" |
| 125 | |
Bindu Mahadev | 140431e | 2018-05-04 13:14:00 -0700 | [diff] [blame] | 126 | @test_tracker_info(uuid="cd0016c6-58cf-4361-b551-821c0b8d2554") |
Bindu Mahadev | 9ef6549 | 2018-02-06 18:18:18 -0800 | [diff] [blame] | 127 | def test_stress_toggle_wifi_state(self): |
| 128 | """Toggle WiFi state ON and OFF for N times.""" |
| 129 | for count in range(self.stress_count): |
| 130 | """Test toggling wifi""" |
| 131 | self.log.debug("Going from on to off.") |
| 132 | wutils.wifi_toggle_state(self.dut, False) |
| 133 | self.log.debug("Going from off to on.") |
| 134 | startTime = time.time() |
| 135 | wutils.wifi_toggle_state(self.dut, True) |
| 136 | startup_time = time.time() - startTime |
| 137 | self.log.debug("WiFi was enabled on the device in %s s." % startup_time) |
| 138 | |
Bindu Mahadev | 140431e | 2018-05-04 13:14:00 -0700 | [diff] [blame] | 139 | @test_tracker_info(uuid="49e3916a-9580-4bf7-a60d-a0f2545dcdde") |
Bindu Mahadev | 9ef6549 | 2018-02-06 18:18:18 -0800 | [diff] [blame] | 140 | def test_stress_connect_traffic_disconnect_5g(self): |
| 141 | """Test to connect and disconnect from a network for N times. |
| 142 | |
| 143 | Steps: |
| 144 | 1. Scan and connect to a network. |
| 145 | 2. Run IPerf to upload data for few seconds. |
| 146 | 3. Disconnect. |
| 147 | 4. Repeat 1-3. |
| 148 | |
| 149 | """ |
Bindu Mahadev | 9ef6549 | 2018-02-06 18:18:18 -0800 | [diff] [blame] | 150 | for count in range(self.stress_count): |
Bindu Mahadev | 4c6c23e | 2018-05-09 17:57:15 -0700 | [diff] [blame] | 151 | net_id = self.dut.droid.wifiAddNetwork(self.wpa_5g) |
| 152 | asserts.assert_true(net_id != -1, "Add network %r failed" % self.wpa_5g) |
| 153 | self.dut.droid.wifiEnableNetwork(net_id, 0) |
Bindu Mahadev | 9ef6549 | 2018-02-06 18:18:18 -0800 | [diff] [blame] | 154 | self.scan_and_connect_by_id(self.wpa_5g, net_id) |
| 155 | # Start IPerf traffic from phone to server. |
| 156 | # Upload data for 10s. |
| 157 | args = "-p {} -t {}".format(self.iperf_server.port, 10) |
| 158 | self.log.info("Running iperf client {}".format(args)) |
| 159 | result, data = self.dut.run_iperf_client(self.iperf_server_address, args) |
Bindu Mahadev | 9ef6549 | 2018-02-06 18:18:18 -0800 | [diff] [blame] | 160 | if not result: |
| 161 | self.log.debug("Error occurred in iPerf traffic.") |
| 162 | raise signals.TestFailure("Error occurred in iPerf traffic. Current" |
| 163 | " WiFi state = %d" % self.dut.droid.wifiCheckState()) |
Bindu Mahadev | 4c6c23e | 2018-05-09 17:57:15 -0700 | [diff] [blame] | 164 | wutils.wifi_forget_network(self.dut,self.wpa_5g[WifiEnums.SSID_KEY]) |
| 165 | time.sleep(WAIT_BEFORE_CONNECTION) |
Bindu Mahadev | 9ef6549 | 2018-02-06 18:18:18 -0800 | [diff] [blame] | 166 | |
Bindu Mahadev | 140431e | 2018-05-04 13:14:00 -0700 | [diff] [blame] | 167 | @test_tracker_info(uuid="e9827dff-0755-43ec-8b50-1f9756958460") |
Bindu Mahadev | 9ef6549 | 2018-02-06 18:18:18 -0800 | [diff] [blame] | 168 | def test_stress_connect_long_traffic_5g(self): |
| 169 | """Test to connect to network and hold connection for few hours. |
| 170 | |
| 171 | Steps: |
| 172 | 1. Scan and connect to a network. |
| 173 | 2. Run IPerf to download data for few hours. |
| 174 | 3. Verify no WiFi disconnects/data interruption. |
| 175 | |
| 176 | """ |
| 177 | self.scan_and_connect_by_ssid(self.wpa_5g) |
| 178 | # Start IPerf traffic from server to phone. |
| 179 | # Download data for 5 hours. |
| 180 | sec = 5*60*60 |
| 181 | args = "-p {} -t {} -R".format(self.iperf_server.port, sec) |
| 182 | self.log.info("Running iperf client {}".format(args)) |
| 183 | result, data = self.dut.run_iperf_client(self.iperf_server_address, |
| 184 | args, timeout=sec+1) |
| 185 | self.dut.droid.wifiDisconnect() |
| 186 | if not result: |
| 187 | self.log.debug("Error occurred in iPerf traffic.") |
| 188 | raise signals.TestFailure("Error occurred in iPerf traffic. Current" |
| 189 | " WiFi state = %d" % self.dut.droid.wifiCheckState()) |
| 190 | |
Bindu Mahadev | 140431e | 2018-05-04 13:14:00 -0700 | [diff] [blame] | 191 | @test_tracker_info(uuid="d367c83e-5b00-4028-9ed8-f7b875997d13") |
Bindu Mahadev | 9ef6549 | 2018-02-06 18:18:18 -0800 | [diff] [blame] | 192 | def test_stress_wifi_failover(self): |
| 193 | """This test does aggressive failover to several networks in list. |
| 194 | |
| 195 | Steps: |
| 196 | 1. Add and enable few networks. |
| 197 | 2. Let device auto-connect. |
| 198 | 3. Remove the connected network. |
| 199 | 4. Repeat 2-3. |
| 200 | 5. Device should connect to a network until all networks are |
| 201 | exhausted. |
| 202 | |
| 203 | """ |
| 204 | for count in range(self.stress_count): |
| 205 | ssids = list() |
| 206 | for network in self.networks: |
| 207 | ssids.append(network[WifiEnums.SSID_KEY]) |
| 208 | ret = self.dut.droid.wifiAddNetwork(network) |
| 209 | asserts.assert_true(ret != -1, "Add network %r failed" % network) |
| 210 | self.dut.droid.wifiEnableNetwork(ret, 0) |
| 211 | time.sleep(WAIT_FOR_AUTO_CONNECT) |
| 212 | cur_network = self.dut.droid.wifiGetConnectionInfo() |
| 213 | cur_ssid = cur_network[WifiEnums.SSID_KEY] |
Bindu Mahadev | 4c6c23e | 2018-05-09 17:57:15 -0700 | [diff] [blame] | 214 | self.log.debug("Cur_ssid = %s" % cur_ssid) |
Bindu Mahadev | 9ef6549 | 2018-02-06 18:18:18 -0800 | [diff] [blame] | 215 | for count in range(0,len(self.networks)): |
| 216 | self.log.debug("Forget network %s" % cur_ssid) |
| 217 | wutils.wifi_forget_network(self.dut, cur_ssid) |
| 218 | time.sleep(WAIT_FOR_AUTO_CONNECT) |
| 219 | cur_network = self.dut.droid.wifiGetConnectionInfo() |
| 220 | cur_ssid = cur_network[WifiEnums.SSID_KEY] |
Bindu Mahadev | 4c6c23e | 2018-05-09 17:57:15 -0700 | [diff] [blame] | 221 | self.log.debug("Cur_ssid = %s" % cur_ssid) |
Bindu Mahadev | 9ef6549 | 2018-02-06 18:18:18 -0800 | [diff] [blame] | 222 | if count == len(self.networks) - 1: |
| 223 | break |
| 224 | if cur_ssid not in ssids: |
| 225 | raise signals.TestFailure("Device did not failover to the " |
| 226 | "expected network. SSID = %s" % cur_ssid) |
| 227 | network_config = self.dut.droid.wifiGetConfiguredNetworks() |
Bindu Mahadev | 4c6c23e | 2018-05-09 17:57:15 -0700 | [diff] [blame] | 228 | self.log.debug("Network Config = %s" % network_config) |
Bindu Mahadev | 9ef6549 | 2018-02-06 18:18:18 -0800 | [diff] [blame] | 229 | if len(network_config): |
| 230 | raise signals.TestFailure("All the network configurations were not " |
| 231 | "removed. Configured networks = %s" % network_config) |
| 232 | |
Bindu Mahadev | 140431e | 2018-05-04 13:14:00 -0700 | [diff] [blame] | 233 | @test_tracker_info(uuid="2c19e8d1-ac16-4d7e-b309-795144e6b956") |
Bindu Mahadev | 9ef6549 | 2018-02-06 18:18:18 -0800 | [diff] [blame] | 234 | def test_stress_softAP_startup_and_stop_5g(self): |
| 235 | """Test to bring up softAP and down for N times. |
| 236 | |
| 237 | Steps: |
| 238 | 1. Bring up softAP on 5G. |
| 239 | 2. Check for softAP on teh client device. |
| 240 | 3. Turn ON WiFi. |
| 241 | 4. Verify softAP is turned down and WiFi is up. |
| 242 | |
| 243 | """ |
| 244 | ap_ssid = "softap_" + utils.rand_ascii_str(8) |
| 245 | ap_password = utils.rand_ascii_str(8) |
| 246 | self.dut.log.info("softap setup: %s %s", ap_ssid, ap_password) |
| 247 | config = {wutils.WifiEnums.SSID_KEY: ap_ssid} |
| 248 | config[wutils.WifiEnums.PWD_KEY] = ap_password |
| 249 | for count in range(self.stress_count): |
| 250 | initial_wifi_state = self.dut.droid.wifiCheckState() |
| 251 | wutils.start_wifi_tethering(self.dut, |
| 252 | ap_ssid, |
| 253 | ap_password, |
| 254 | WifiEnums.WIFI_CONFIG_APBAND_5G) |
| 255 | wutils.start_wifi_connection_scan_and_ensure_network_found( |
| 256 | self.dut_client, ap_ssid) |
| 257 | # Toggle WiFi ON, which inturn calls softAP teardown. |
| 258 | wutils.wifi_toggle_state(self.dut, True) |
| 259 | time.sleep(TIMEOUT) |
| 260 | asserts.assert_false(self.dut.droid.wifiIsApEnabled(), |
| 261 | "SoftAp failed to shutdown!") |
| 262 | time.sleep(TIMEOUT) |
| 263 | cur_wifi_state = self.dut.droid.wifiCheckState() |
| 264 | if initial_wifi_state != cur_wifi_state: |
| 265 | raise signals.TestFailure("Wifi state was %d before softAP and %d now!" % |
| 266 | (initial_wifi_state, cur_wifi_state)) |
Bindu Mahadev | 140431e | 2018-05-04 13:14:00 -0700 | [diff] [blame] | 267 | |
| 268 | @test_tracker_info(uuid="eb22e26b-95d1-4580-8c76-85dfe6a42a0f") |
| 269 | def test_stress_wifi_roaming(self): |
| 270 | AP1_network = self.reference_networks[0]["5g"] |
| 271 | AP2_network = self.reference_networks[1]["5g"] |
| 272 | wutils.set_attns(self.attenuators, "AP1_on_AP2_off") |
| 273 | wutils.wifi_connect(self.dut, AP1_network) |
| 274 | # Reduce iteration to half because each iteration does two roams. |
| 275 | for count in range(self.stress_count/2): |
| 276 | self.log.info("Roaming iteration %d, from %s to %s", count, |
| 277 | AP1_network, AP2_network) |
| 278 | wutils.trigger_roaming_and_validate(self.dut, self.attenuators, |
| 279 | "AP1_off_AP2_on", AP2_network) |
| 280 | self.log.info("Roaming iteration %d, from %s to %s", count, |
| 281 | AP2_network, AP1_network) |
| 282 | wutils.trigger_roaming_and_validate(self.dut, self.attenuators, |
| 283 | "AP1_on_AP2_off", AP1_network) |
| 284 | |