blob: d0bde8b153f3987fa4eca00ca41fcb1efbaae4c7 [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:
61 self.legacy_configure_ap_and_start()
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 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 """
150 net_id = self.dut.droid.wifiAddNetwork(self.wpa_5g)
151 asserts.assert_true(net_id != -1, "Add network %r failed" % self.wpa_5g)
152 self.dut.droid.wifiEnableNetwork(net_id, 0)
153 for count in range(self.stress_count):
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)
160 self.dut.droid.wifiDisconnect()
161 time.sleep(WAIT_BEFORE_CONNECTION)
162 if not result:
163 self.log.debug("Error occurred in iPerf traffic.")
164 raise signals.TestFailure("Error occurred in iPerf traffic. Current"
165 " WiFi state = %d" % self.dut.droid.wifiCheckState())
166
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]
214 for count in range(0,len(self.networks)):
215 self.log.debug("Forget network %s" % cur_ssid)
216 wutils.wifi_forget_network(self.dut, cur_ssid)
217 time.sleep(WAIT_FOR_AUTO_CONNECT)
218 cur_network = self.dut.droid.wifiGetConnectionInfo()
219 cur_ssid = cur_network[WifiEnums.SSID_KEY]
220 if count == len(self.networks) - 1:
221 break
222 if cur_ssid not in ssids:
223 raise signals.TestFailure("Device did not failover to the "
224 "expected network. SSID = %s" % cur_ssid)
225 network_config = self.dut.droid.wifiGetConfiguredNetworks()
226 if len(network_config):
227 raise signals.TestFailure("All the network configurations were not "
228 "removed. Configured networks = %s" % network_config)
229
Bindu Mahadev140431e2018-05-04 13:14:00 -0700230 @test_tracker_info(uuid="2c19e8d1-ac16-4d7e-b309-795144e6b956")
Bindu Mahadev9ef65492018-02-06 18:18:18 -0800231 def test_stress_softAP_startup_and_stop_5g(self):
232 """Test to bring up softAP and down for N times.
233
234 Steps:
235 1. Bring up softAP on 5G.
236 2. Check for softAP on teh client device.
237 3. Turn ON WiFi.
238 4. Verify softAP is turned down and WiFi is up.
239
240 """
241 ap_ssid = "softap_" + utils.rand_ascii_str(8)
242 ap_password = utils.rand_ascii_str(8)
243 self.dut.log.info("softap setup: %s %s", ap_ssid, ap_password)
244 config = {wutils.WifiEnums.SSID_KEY: ap_ssid}
245 config[wutils.WifiEnums.PWD_KEY] = ap_password
246 for count in range(self.stress_count):
247 initial_wifi_state = self.dut.droid.wifiCheckState()
248 wutils.start_wifi_tethering(self.dut,
249 ap_ssid,
250 ap_password,
251 WifiEnums.WIFI_CONFIG_APBAND_5G)
252 wutils.start_wifi_connection_scan_and_ensure_network_found(
253 self.dut_client, ap_ssid)
254 # Toggle WiFi ON, which inturn calls softAP teardown.
255 wutils.wifi_toggle_state(self.dut, True)
256 time.sleep(TIMEOUT)
257 asserts.assert_false(self.dut.droid.wifiIsApEnabled(),
258 "SoftAp failed to shutdown!")
259 time.sleep(TIMEOUT)
260 cur_wifi_state = self.dut.droid.wifiCheckState()
261 if initial_wifi_state != cur_wifi_state:
262 raise signals.TestFailure("Wifi state was %d before softAP and %d now!" %
263 (initial_wifi_state, cur_wifi_state))
Bindu Mahadev140431e2018-05-04 13:14:00 -0700264
265 @test_tracker_info(uuid="eb22e26b-95d1-4580-8c76-85dfe6a42a0f")
266 def test_stress_wifi_roaming(self):
267 AP1_network = self.reference_networks[0]["5g"]
268 AP2_network = self.reference_networks[1]["5g"]
269 wutils.set_attns(self.attenuators, "AP1_on_AP2_off")
270 wutils.wifi_connect(self.dut, AP1_network)
271 # Reduce iteration to half because each iteration does two roams.
272 for count in range(self.stress_count/2):
273 self.log.info("Roaming iteration %d, from %s to %s", count,
274 AP1_network, AP2_network)
275 wutils.trigger_roaming_and_validate(self.dut, self.attenuators,
276 "AP1_off_AP2_on", AP2_network)
277 self.log.info("Roaming iteration %d, from %s to %s", count,
278 AP2_network, AP1_network)
279 wutils.trigger_roaming_and_validate(self.dut, self.attenuators,
280 "AP1_on_AP2_off", AP1_network)
281