blob: 17d6c75344d60cd352e86e1d490b259f6922a8bd [file] [log] [blame]
Bindu Mahadev9ef65492018-02-06 18:18:18 -08001#!/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
17import pprint
18import time
19
20import acts.base_test
21import acts.test_utils.wifi.wifi_test_utils as wutils
22import acts.utils
23
24from acts import asserts
25from acts import signals
26from acts import utils
27from acts.test_decorators import test_tracker_info
28from acts.test_utils.wifi.WifiBaseTest import WifiBaseTest
29WifiEnums = wutils.WifiEnums
30
31WAIT_FOR_AUTO_CONNECT = 40
32WAIT_BEFORE_CONNECTION = 30
33
34TIMEOUT = 1
35
36
37class 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 Mahadev6212a322018-05-10 22:05:57 -070061 self.legacy_configure_ap_and_start(ap_count=2)
Bindu Mahadev9ef65492018-02-06 18:18:18 -080062
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 Mahadev140431e2018-05-04 13:14:00 -0700126 @test_tracker_info(uuid="cd0016c6-58cf-4361-b551-821c0b8d2554")
Bindu Mahadev9ef65492018-02-06 18:18:18 -0800127 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 Mahadev140431e2018-05-04 13:14:00 -0700139 @test_tracker_info(uuid="49e3916a-9580-4bf7-a60d-a0f2545dcdde")
Bindu Mahadev9ef65492018-02-06 18:18:18 -0800140 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 Mahadev9ef65492018-02-06 18:18:18 -0800150 for count in range(self.stress_count):
Bindu Mahadev4c6c23e2018-05-09 17:57:15 -0700151 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 Mahadev9ef65492018-02-06 18:18:18 -0800154 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 Mahadev9ef65492018-02-06 18:18:18 -0800160 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 Mahadev4c6c23e2018-05-09 17:57:15 -0700164 wutils.wifi_forget_network(self.dut,self.wpa_5g[WifiEnums.SSID_KEY])
165 time.sleep(WAIT_BEFORE_CONNECTION)
Bindu Mahadev9ef65492018-02-06 18:18:18 -0800166
Bindu Mahadev140431e2018-05-04 13:14:00 -0700167 @test_tracker_info(uuid="e9827dff-0755-43ec-8b50-1f9756958460")
Bindu Mahadev9ef65492018-02-06 18:18:18 -0800168 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 Mahadev140431e2018-05-04 13:14:00 -0700191 @test_tracker_info(uuid="d367c83e-5b00-4028-9ed8-f7b875997d13")
Bindu Mahadev9ef65492018-02-06 18:18:18 -0800192 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 Mahadev4c6c23e2018-05-09 17:57:15 -0700214 self.log.debug("Cur_ssid = %s" % cur_ssid)
Bindu Mahadev9ef65492018-02-06 18:18:18 -0800215 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 Mahadev4c6c23e2018-05-09 17:57:15 -0700221 self.log.debug("Cur_ssid = %s" % cur_ssid)
Bindu Mahadev9ef65492018-02-06 18:18:18 -0800222 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 Mahadev4c6c23e2018-05-09 17:57:15 -0700228 self.log.debug("Network Config = %s" % network_config)
Bindu Mahadev9ef65492018-02-06 18:18:18 -0800229 if len(network_config):
230 raise signals.TestFailure("All the network configurations were not "
231 "removed. Configured networks = %s" % network_config)
232
Bindu Mahadev140431e2018-05-04 13:14:00 -0700233 @test_tracker_info(uuid="2c19e8d1-ac16-4d7e-b309-795144e6b956")
Bindu Mahadev9ef65492018-02-06 18:18:18 -0800234 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 Mahadev140431e2018-05-04 13:14:00 -0700267
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