blob: 167343debd6e8d03c26dc4a334bf3a3beb8a9223 [file] [log] [blame]
Omar El Ayachb8808082018-03-04 01:05:39 +00001#!/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 json
18import logging
19import math
20import os
21import re
Omar El Ayach432f4612018-03-22 02:33:00 +000022import statistics
Omar El Ayachb8808082018-03-04 01:05:39 +000023import time
24from acts import asserts
25from acts import base_test
26from acts import utils
27from acts.test_decorators import test_tracker_info
28from acts.test_utils.wifi import wifi_power_test_utils as wputils
29from acts.test_utils.wifi import wifi_retail_ap as retail_ap
30from acts.test_utils.wifi import wifi_test_utils as wutils
31
32SHORT_SLEEP = 1
33MED_SLEEP = 6
Omar El Ayached1d24b2018-04-13 12:49:33 -070034TIME_TO_POLL = 0.13
Omar El Ayachb8808082018-03-04 01:05:39 +000035STATION_DUMP = "iw wlan0 station dump"
36SCAN = "wpa_cli scan"
37SCAN_RESULTS = "wpa_cli scan_results"
38SIGNAL_POLL = "wpa_cli signal_poll"
39CONST_3dB = 3.01029995664
40RSSI_ERROR_VAL = float("nan")
41
42
43class WifiRssiTest(base_test.BaseTestClass):
44 def __init__(self, controllers):
45 base_test.BaseTestClass.__init__(self, controllers)
46
47 def setup_class(self):
48 self.dut = self.android_devices[0]
49 req_params = ["test_params", "main_network"]
50 opt_params = ["RetailAccessPoints"]
51 self.unpack_userparams(req_params, opt_params)
52 self.num_atten = self.attenuators[0].instrument.num_atten
53 self.iperf_server = self.iperf_servers[0]
54 self.access_points = retail_ap.create(self.RetailAccessPoints)
55 self.access_point = self.access_points[0]
56 self.log_path = os.path.join(logging.log_path, "results")
57 utils.create_dir(self.log_path)
58 self.log.info("Access Point Configuration: {}".format(
59 self.access_point.ap_settings))
60 self.testclass_results = []
61
62 def teardown_test(self):
63 self.iperf_server.stop()
64
Omar El Ayach432f4612018-03-22 02:33:00 +000065 def pass_fail_check_rssi_stability(self, rssi_result):
66 """Check the test result and decide if it passed or failed.
67
68 Checks the RSSI test result and fails the test if the standard
69 deviation of signal_poll_rssi is beyond the threshold defined in the
70 config file.
71
72 Args:
73 rssi_result: dict containing attenuation, rssi, and other meta
74 data. This dict is the output of self.post_process_results
75 """
76 # Save output as text file
77 test_name = self.current_test_name
78 results_file_path = "{}/{}.json".format(self.log_path,
79 self.current_test_name)
80 with open(results_file_path, 'w') as results_file:
81 json.dump(rssi_result, results_file, indent=4)
82
83 x_data = []
84 y_data = []
85 legends = []
86 std_deviations = {
87 "signal_poll_rssi": [],
88 "signal_poll_avg_rssi": [],
89 "chain_0_rssi": [],
90 "chain_1_rssi": [],
91 }
92 for data_point in rssi_result["rssi_result"]:
93 for key, val in data_point["connected_rssi"].items():
94 if type(val) == list:
95 x_data.append([
96 x * self.test_params["polling_frequency"]
97 for x in range(len(val))
98 ])
99 y_data.append(val)
100 legends.append(key)
101 std_deviations[key].append(
102 data_point["connected_rssi"]["stdev_" + key])
103 data_sets = [x_data, y_data]
104 x_label = 'Time (s)'
105 y_label = 'RSSI (dBm)'
106 fig_property = {
107 "title": test_name,
108 "x_label": x_label,
109 "y_label": y_label,
110 "linewidth": 3,
111 "markersize": 0
112 }
113 output_file_path = "{}/{}.html".format(self.log_path, test_name)
114 wputils.bokeh_plot(
115 data_sets,
116 legends,
117 fig_property,
118 shaded_region=None,
119 output_file_path=output_file_path)
120
121 test_failed = any([
122 stdev > self.test_params["stdev_tolerance"]
123 for stdev in std_deviations["signal_poll_rssi"]
124 ])
125 if test_failed:
126 asserts.fail(
127 "RSSI stability failed. Standard deviations were {0} dB "
128 "(limit {1}), per chain standard deviation [{2}, {3}] dB".
129 format([
130 float("{:.2f}".format(x))
131 for x in std_deviations["signal_poll_rssi"]
132 ], self.test_params["stdev_tolerance"], [
133 float("{:.2f}".format(x))
134 for x in std_deviations["chain_0_rssi"]
135 ], [
136 float("{:.2f}".format(x))
137 for x in std_deviations["chain_1_rssi"]
138 ]))
139 asserts.explicit_pass(
140 "RSSI stability passed. Standard deviations were {0} dB "
141 "(limit {1}), per chain standard deviation [{2}, {3}] dB".format([
142 float("{:.2f}".format(x))
143 for x in std_deviations["signal_poll_rssi"]
144 ], self.test_params["stdev_tolerance"], [
145 float("{:.2f}".format(x))
146 for x in std_deviations["chain_0_rssi"]
147 ], [
148 float("{:.2f}".format(x))
149 for x in std_deviations["chain_1_rssi"]
150 ]))
151
Omar El Ayachb8808082018-03-04 01:05:39 +0000152 def pass_fail_check_rssi_vs_attenuation(self, postprocessed_results):
153 """Check the test result and decide if it passed or failed.
154
155 Checks the RSSI test result and compares and compute its deviation from
156 the predicted RSSI. This computation is done for all reported RSSI
157 values. The test fails if any of the RSSI values specified in
158 rssi_under_test have an average error beyond what is specified in the
159 configuration file.
160
161 Args:
162 result: dict containing attenuation, rssi, and other meta
163 data. This dict is the output of self.post_process_results
164 """
165
166 error_data = {
167 "signal_poll_rssi": [
168 postprocessed_results["mean_signal_poll_rssi"][idx] -
169 postprocessed_results["predicted_rssi"][idx]
170 for idx in range(len(postprocessed_results["predicted_rssi"]))
171 ],
172 "signal_poll_avg_rssi": [
173 postprocessed_results["mean_signal_poll_avg_rssi"][idx] -
174 postprocessed_results["predicted_rssi"][idx]
175 for idx in range(len(postprocessed_results["predicted_rssi"]))
176 ],
177 "scan_rssi": [
178 postprocessed_results["mean_scan_rssi"][idx] -
179 postprocessed_results["predicted_rssi"][idx]
180 for idx in range(len(postprocessed_results["predicted_rssi"]))
181 ],
182 "chain_0_rssi": [
183 postprocessed_results["mean_chain_0_rssi"][idx] + CONST_3dB -
184 postprocessed_results["predicted_rssi"][idx]
185 for idx in range(len(postprocessed_results["predicted_rssi"]))
186 ],
187 "chain_1_rssi": [
188 postprocessed_results["mean_chain_1_rssi"][idx] + CONST_3dB -
189 postprocessed_results["predicted_rssi"][idx]
190 for idx in range(len(postprocessed_results["predicted_rssi"]))
191 ]
192 }
193
194 test_failed = False
195 test_message = ""
196 for key, val in error_data.items():
197 # Compute the error metrics ignoring invalid RSSI readings
198 # If all readings invalid, set error to RSSI_ERROR_VAL
199 filtered_errors = [x for x in val if not math.isnan(x)]
200 if filtered_errors:
201 avg_error = sum([abs(x) for x in filtered_errors
202 ]) / len(filtered_errors)
203 avg_shift = sum(filtered_errors) / len(filtered_errors)
204 else:
205 avg_error = RSSI_ERROR_VAL
206 rssi_failure = (avg_error > self.test_params["abs_tolerance"]
207 ) or math.isnan(avg_error)
208 if rssi_failure and key in self.test_params["rssi_under_test"]:
209 test_message = test_message + (
210 "{} failed. Average error is {:.2f} dB. "
211 "Average shift is {:.2f} dB.\n").format(
212 key, avg_error, avg_shift)
213 test_failed = True
214 elif rssi_failure:
215 test_message = test_message + (
216 "{} failed (ignored). Average error is {:.2f} dB. "
217 "Average shift is {:.2f} dB.\n").format(
218 key, avg_error, avg_shift)
219 else:
220 test_message = test_message + (
221 "{} passed. Average error is {:.2f} dB. "
222 "Average shift is {:.2f} dB.\n").format(
223 key, avg_error, avg_shift)
224
225 if test_failed:
226 asserts.fail(test_message)
227 asserts.explicit_pass(test_message)
228
Omar El Ayach432f4612018-03-22 02:33:00 +0000229 def post_process_rssi_vs_attenuation(self, rssi_result):
Omar El Ayachb8808082018-03-04 01:05:39 +0000230 """Saves plots and JSON formatted results.
231
232 Args:
233 rssi_result: dict containing attenuation, rssi and other meta
234 data
235 Returns:
236 postprocessed_results: compiled arrays of RSSI measurements used in
237 pass/fail check
238 """
239 # Save output as text file
240 test_name = self.current_test_name
241 results_file_path = "{}/{}.json".format(self.log_path,
242 self.current_test_name)
243 with open(results_file_path, 'w') as results_file:
Omar El Ayach432f4612018-03-22 02:33:00 +0000244 json.dump(rssi_result, results_file, indent=4)
Omar El Ayachb8808082018-03-04 01:05:39 +0000245 # Plot and save
246 total_attenuation = [
247 att + rssi_result["fixed_attenuation"]
248 for att in rssi_result["attenuation"]
249 ]
250 # Compile results into arrays of RSSIs suitable for plotting
251 postprocessed_results = {
252 "total_attenuation":
253 total_attenuation,
254 "mean_signal_poll_rssi": [
255 x["connected_rssi"]["mean_signal_poll_rssi"]
256 for x in rssi_result["rssi_result"]
257 ],
258 "mean_signal_poll_avg_rssi": [
259 x["connected_rssi"]["mean_signal_poll_avg_rssi"]
260 for x in rssi_result["rssi_result"]
261 ],
262 "mean_scan_rssi": [
263 x["scan_rssi"][rssi_result["connected_bssid"]]["avg_rssi"]
264 for x in rssi_result["rssi_result"]
265 ],
266 "mean_chain_0_rssi": [
267 x["connected_rssi"]["mean_chain_0_rssi"]
268 for x in rssi_result["rssi_result"]
269 ],
270 "mean_chain_1_rssi": [
271 x["connected_rssi"]["mean_chain_1_rssi"]
272 for x in rssi_result["rssi_result"]
273 ],
274 "predicted_rssi":
275 [rssi_result["ap_tx_power"] - att for att in total_attenuation]
276 }
277 data_sets = [[
278 total_attenuation, total_attenuation, total_attenuation,
279 total_attenuation, total_attenuation, total_attenuation
280 ], [
281 postprocessed_results["mean_signal_poll_rssi"],
282 postprocessed_results["mean_signal_poll_avg_rssi"],
283 postprocessed_results["mean_scan_rssi"],
284 postprocessed_results["mean_chain_0_rssi"],
285 postprocessed_results["mean_chain_1_rssi"],
286 postprocessed_results["predicted_rssi"]
287 ]]
288 legends = [
289 "Signal Poll RSSI", "Signal Poll AVG_RSSI", "Scan RSSI",
290 "Chain 0 RSSI", "Chain 1 RSSI", "Predicted RSSI"
291 ]
292 x_label = 'Attenuation (dB)'
293 y_label = 'RSSI (dBm)'
294 fig_property = {
295 "title": test_name,
296 "x_label": x_label,
297 "y_label": y_label,
298 "linewidth": 3,
299 "markersize": 10
300 }
301 output_file_path = "{}/{}.html".format(self.log_path, test_name)
302 wputils.bokeh_plot(
303 data_sets,
304 legends,
305 fig_property,
306 shaded_region=None,
307 output_file_path=output_file_path)
308 return postprocessed_results
309
310 def get_scan_rssi(self, tracked_bssids, num_measurements=1):
311 """Gets scan RSSI for specified BSSIDs.
312
313 Args:
314 tracked_bssids: array of BSSIDs to gather RSSI data for
315 num_measurements: number of scans done, and RSSIs collected
316 Returns:
317 scan_rssi: dict containing the measurement results as well as the
Omar El Ayach432f4612018-03-22 02:33:00 +0000318 statistics of the scan RSSI for all BSSIDs in tracked_bssids
Omar El Ayachb8808082018-03-04 01:05:39 +0000319 """
320 scan_rssi = {}
321 for bssid in tracked_bssids:
322 scan_rssi[bssid] = {"rssi": [], "avg_rssi": None}
323 for idx in range(num_measurements):
324 scan_output = self.dut.adb.shell(SCAN)
325 time.sleep(MED_SLEEP)
326 scan_output = self.dut.adb.shell(SCAN_RESULTS)
327 for bssid in tracked_bssids:
328 bssid_result = re.search(
329 bssid + ".*", scan_output, flags=re.IGNORECASE)
330 if bssid_result:
331 bssid_result = bssid_result.group(0).split("\t")
332 scan_rssi[bssid]["rssi"].append(int(bssid_result[2]))
333 else:
334 scan_rssi[bssid]["rssi"].append(RSSI_ERROR_VAL)
335 # Compute mean RSSIs. Only average valid readings.
336 # Output RSSI_ERROR_VAL if no readings found.
337 for key, val in scan_rssi.items():
338 filtered_rssi_values = [
339 x for x in val["rssi"] if not math.isnan(x)
340 ]
341 if filtered_rssi_values:
342 scan_rssi[key]["avg_rssi"] = sum(filtered_rssi_values) / len(
343 filtered_rssi_values)
Omar El Ayach432f4612018-03-22 02:33:00 +0000344 if len(filtered_rssi_values) > 1:
345 scan_rssi[key]["stdev"] = statistics.stdev(
346 filtered_rssi_values)
347 else:
348 scan_rssi[key]["stdev"] = 0
Omar El Ayachb8808082018-03-04 01:05:39 +0000349 else:
350 scan_rssi[key]["avg_rssi"] = RSSI_ERROR_VAL
Omar El Ayach432f4612018-03-22 02:33:00 +0000351 scan_rssi[key]["stdev"] = RSSI_ERROR_VAL
Omar El Ayachb8808082018-03-04 01:05:39 +0000352 return scan_rssi
353
354 def get_connected_rssi(self,
355 num_measurements=1,
356 polling_frequency=SHORT_SLEEP):
357 """Gets all RSSI values reported for the connected access point/BSSID.
358
359 Args:
360 num_measurements: number of scans done, and RSSIs collected
361 polling_frequency: time to wait between RSSI measurements
362 Returns:
363 connected_rssi: dict containing the measurements results for
364 all reported RSSI values (signal_poll, per chain, etc.) and their
Omar El Ayach432f4612018-03-22 02:33:00 +0000365 statistics
Omar El Ayachb8808082018-03-04 01:05:39 +0000366 """
367 connected_rssi = {
368 "signal_poll_rssi": [],
369 "signal_poll_avg_rssi": [],
370 "chain_0_rssi": [],
371 "chain_1_rssi": []
372 }
373 for idx in range(num_measurements):
374 # Get signal poll RSSI
375 signal_poll_output = self.dut.adb.shell(SIGNAL_POLL)
376 match = re.search("RSSI=.*", signal_poll_output)
377 if match:
378 temp_rssi = int(match.group(0).split("=")[1])
379 if temp_rssi == -9999:
380 connected_rssi["signal_poll_rssi"].append(RSSI_ERROR_VAL)
381 else:
382 connected_rssi["signal_poll_rssi"].append(temp_rssi)
383 else:
384 connected_rssi["signal_poll_rssi"].append(RSSI_ERROR_VAL)
385 match = re.search("AVG_RSSI=.*", signal_poll_output)
386 if match:
387 connected_rssi["signal_poll_avg_rssi"].append(
388 int(match.group(0).split("=")[1]))
389 else:
390 connected_rssi["signal_poll_avg_rssi"].append(RSSI_ERROR_VAL)
391 # Get per chain RSSI
392 per_chain_rssi = self.dut.adb.shell(STATION_DUMP)
393 match = re.search(".*signal avg:.*", per_chain_rssi)
394 if match:
395 per_chain_rssi = per_chain_rssi[per_chain_rssi.find("[") + 1:
396 per_chain_rssi.find("]")]
397 per_chain_rssi = per_chain_rssi.split(", ")
398 connected_rssi["chain_0_rssi"].append(int(per_chain_rssi[0]))
399 connected_rssi["chain_1_rssi"].append(int(per_chain_rssi[1]))
400 else:
401 connected_rssi["chain_0_rssi"].append(RSSI_ERROR_VAL)
402 connected_rssi["chain_1_rssi"].append(RSSI_ERROR_VAL)
Omar El Ayached1d24b2018-04-13 12:49:33 -0700403 time.sleep(max(0, polling_frequency - TIME_TO_POLL))
404
Omar El Ayachb8808082018-03-04 01:05:39 +0000405 # Compute mean RSSIs. Only average valid readings.
406 # Output RSSI_ERROR_VAL if no valid connected readings found.
407 for key, val in connected_rssi.copy().items():
408 filtered_rssi_values = [x for x in val if not math.isnan(x)]
409 if filtered_rssi_values:
410 connected_rssi["mean_{}".format(key)] = sum(
411 filtered_rssi_values) / len(filtered_rssi_values)
Omar El Ayach432f4612018-03-22 02:33:00 +0000412 if len(filtered_rssi_values) > 1:
413 connected_rssi["stdev_{}".format(key)] = statistics.stdev(
414 filtered_rssi_values)
415 else:
416 connected_rssi["stdev_{}".format(key)] = 0
Omar El Ayachb8808082018-03-04 01:05:39 +0000417 else:
418 connected_rssi["mean_{}".format(key)] = RSSI_ERROR_VAL
Omar El Ayach432f4612018-03-22 02:33:00 +0000419 connected_rssi["stdev_{}".format(key)] = RSSI_ERROR_VAL
Omar El Ayachb8808082018-03-04 01:05:39 +0000420 return connected_rssi
421
422 def rssi_test(self, iperf_traffic, connected_measurements,
423 scan_measurements, bssids, polling_frequency):
424 """Test function to run RSSI tests.
425
426 The function runs an RSSI test in the current device/AP configuration.
427 Function is called from another wrapper function that sets up the
428 testbed for the RvR test
429
430 Args:
431 iperf_traffic: boolean specifying whether or not to run traffic
432 during RSSI tests
433 connected_measurements: number of RSSI measurements to make for the
434 connected AP per attenuation point
435 scan_measurements: number of scans and scan RSSIs to make per
436 attenuation point
437 bssids: list of BSSIDs to monitor in scans
438 polling_frequency: time between connected AP measurements
439 Returns:
440 rssi_result: dict containing rssi_result and meta data
441 """
442 self.log.info("Start running RSSI test.")
443 rssi_result = []
444 # Start iperf traffic if required by test
445 if self.iperf_traffic:
446 self.iperf_server.start(tag=0)
447 self.dut.run_iperf_client_nb(
448 self.test_params["iperf_server_address"],
449 self.iperf_args,
450 timeout=3600)
451 for atten in self.rssi_atten_range:
452 # Set Attenuation
453 self.log.info("Setting attenuation to {} dB".format(atten))
454 [
455 self.attenuators[i].set_atten(atten)
456 for i in range(self.num_atten)
457 ]
458 time.sleep(MED_SLEEP)
459 current_rssi = {}
460 current_rssi["connected_rssi"] = self.get_connected_rssi(
461 connected_measurements, polling_frequency)
462 current_rssi["scan_rssi"] = self.get_scan_rssi(
463 bssids, scan_measurements)
464 rssi_result.append(current_rssi)
465 self.log.info("Connected RSSI at {0:.2f} dB is {1:.2f} dB".format(
466 atten, current_rssi["connected_rssi"][
467 "mean_signal_poll_rssi"]))
468 # Stop iperf traffic if needed
469 if self.iperf_traffic:
470 self.iperf_server.stop()
471 self.dut.adb.shell("pkill iperf3")
472 [self.attenuators[i].set_atten(0) for i in range(self.num_atten)]
473 return rssi_result
474
Omar El Ayach432f4612018-03-22 02:33:00 +0000475 def rssi_test_func(self, iperf_traffic, connected_measurements,
476 scan_measurements, bssids, polling_frequency):
Omar El Ayachb8808082018-03-04 01:05:39 +0000477 """Main function to test RSSI.
478
479 The function sets up the AP in the correct channel and mode
480 configuration and called rssi_test to sweep attenuation and measure
481 RSSI
482
483 Returns:
484 rssi_result: dict containing rssi_results and meta data
485 """
Omar El Ayach432f4612018-03-22 02:33:00 +0000486 #Initialize test settings
Omar El Ayachb8808082018-03-04 01:05:39 +0000487 rssi_result = {}
488 # Configure AP
489 band = self.access_point.band_lookup_by_channel(self.channel)
490 self.access_point.set_channel(band, self.channel)
491 self.access_point.set_bandwidth(band, self.mode)
492 self.log.info("Access Point Configuration: {}".format(
493 self.access_point.ap_settings))
494 # Set attenuator to starting attenuation
495 [
496 self.attenuators[i].set_atten(self.rssi_atten_range[0])
497 for i in range(self.num_atten)
498 ]
499 # Connect DUT to Network
500 wutils.wifi_toggle_state(self.dut, True)
501 wutils.reset_wifi(self.dut)
502 self.main_network[band]["channel"] = self.channel
503 wutils.wifi_connect(self.dut, self.main_network[band], num_of_tries=5)
504 time.sleep(5)
505 # Run RvR and log result
506 rssi_result["test_name"] = self.current_test_name
507 rssi_result["ap_settings"] = self.access_point.ap_settings.copy()
508 rssi_result["attenuation"] = list(self.rssi_atten_range)
509 rssi_result["connected_bssid"] = self.main_network[band]["BSSID"]
510 rssi_result["ap_tx_power"] = self.test_params["ap_tx_power"][str(
511 self.channel)]
512 rssi_result["fixed_attenuation"] = self.test_params[
513 "fixed_attenuation"][str(self.channel)]
514 rssi_result["rssi_result"] = self.rssi_test(
Omar El Ayach432f4612018-03-22 02:33:00 +0000515 iperf_traffic, connected_measurements, scan_measurements, bssids,
516 polling_frequency)
Omar El Ayachb8808082018-03-04 01:05:39 +0000517 self.testclass_results.append(rssi_result)
518 return rssi_result
519
520 def _test_rssi_vs_atten(self):
521 """ Function that gets called for each test case of rssi_vs_atten
522
523 The function gets called in each rvr test case. The function customizes
Omar El Ayach432f4612018-03-22 02:33:00 +0000524 the test based on the test name of the test that called it
Omar El Ayachb8808082018-03-04 01:05:39 +0000525 """
526 test_params = self.current_test_name.split("_")
527 self.channel = int(test_params[4][2:])
528 self.mode = test_params[5]
529 self.iperf_traffic = "ActiveTraffic" in test_params[6]
530 self.iperf_args = '-i 1 -t 3600 -J -R'
Omar El Ayach432f4612018-03-22 02:33:00 +0000531 band = self.access_point.band_lookup_by_channel(self.channel)
532 num_atten_steps = int((self.test_params["rssi_atten_stop"] -
533 self.test_params["rssi_atten_start"]) /
534 self.test_params["rssi_atten_step"])
535 self.rssi_atten_range = [
536 self.test_params["rssi_atten_start"] +
537 x * self.test_params["rssi_atten_step"]
538 for x in range(0, num_atten_steps)
539 ]
540 rssi_result = self.rssi_test_func(
541 self.iperf_traffic, self.test_params["connected_measurements"],
542 self.test_params["scan_measurements"], [
543 self.main_network[band]["BSSID"]
544 ], self.test_params["polling_frequency"])
545 postprocessed_results = self.post_process_rssi_vs_attenuation(
546 rssi_result)
Omar El Ayachb8808082018-03-04 01:05:39 +0000547 self.pass_fail_check_rssi_vs_attenuation(postprocessed_results)
548
549 def _test_rssi_stability(self):
Omar El Ayach432f4612018-03-22 02:33:00 +0000550 """ Function that gets called for each test case of rssi_stability
Omar El Ayachb8808082018-03-04 01:05:39 +0000551
Omar El Ayach432f4612018-03-22 02:33:00 +0000552 The function gets called in each stability test case. The function
553 customizes test based on the test name of the test that called it
554 """
555 test_params = self.current_test_name.split("_")
556 self.channel = int(test_params[3][2:])
557 self.mode = test_params[4]
558 self.iperf_traffic = "ActiveTraffic" in test_params[5]
559 self.iperf_args = '-i 1 -t 3600 -J -R'
560 band = self.access_point.band_lookup_by_channel(self.channel)
561 self.rssi_atten_range = self.test_params["stability_test_atten"]
562 connected_measurements = int(
563 self.test_params["stability_test_duration"] /
564 self.test_params["polling_frequency"])
565 rssi_result = self.rssi_test_func(
566 self.iperf_traffic, connected_measurements, 0, [
567 self.main_network[band]["BSSID"]
568 ], self.test_params["polling_frequency"])
569 self.pass_fail_check_rssi_stability(rssi_result)
Omar El Ayach19a55672018-03-09 00:53:12 +0000570
Omar El Ayach432f4612018-03-22 02:33:00 +0000571 @test_tracker_info(uuid='519689b8-0a3c-4fd9-9227-fd7962d0f1a0')
572 def test_rssi_stability_ch1_VHT20_ActiveTraffic(self):
573 self._test_rssi_stability()
574
575 @test_tracker_info(uuid='23eca2ab-d0b4-4730-9f32-ec2d901ae493')
576 def test_rssi_stability_ch2_VHT20_ActiveTraffic(self):
577 self._test_rssi_stability()
578
579 @test_tracker_info(uuid='63d340c0-dcf9-4e14-87bd-a068a59836b2')
580 def test_rssi_stability_ch3_VHT20_ActiveTraffic(self):
581 self._test_rssi_stability()
582
583 @test_tracker_info(uuid='ddbe88d8-be20-40eb-8f29-55049e3fef28')
584 def test_rssi_stability_ch4_VHT20_ActiveTraffic(self):
585 self._test_rssi_stability()
586
587 @test_tracker_info(uuid='9c06304e-2b60-4619-8fb3-73fd2cb4b854')
588 def test_rssi_stability_ch5_VHT20_ActiveTraffic(self):
589 self._test_rssi_stability()
590
591 @test_tracker_info(uuid='74b656ca-132e-4d66-9584-560287081607')
592 def test_rssi_stability_ch6_VHT20_ActiveTraffic(self):
593 self._test_rssi_stability()
594
595 @test_tracker_info(uuid='23b5f19a-539b-4908-a197-06ce505d3d23')
596 def test_rssi_stability_ch7_VHT20_ActiveTraffic(self):
597 self._test_rssi_stability()
598
599 @test_tracker_info(uuid='e7b85167-f4c4-4adb-a111-04d8a5f10e1a')
600 def test_rssi_stability_ch8_VHT20_ActiveTraffic(self):
601 self._test_rssi_stability()
602
603 @test_tracker_info(uuid='2a0a9393-4b68-4c08-8787-3f35d1a8458b')
604 def test_rssi_stability_ch9_VHT20_ActiveTraffic(self):
605 self._test_rssi_stability()
606
607 @test_tracker_info(uuid='069c7acf-3e7e-4298-91cb-d292c6025ae1')
608 def test_rssi_stability_ch10_VHT20_ActiveTraffic(self):
609 self._test_rssi_stability()
610
611 @test_tracker_info(uuid='95c5a27c-1dea-47a4-a1c5-edf955545f12')
612 def test_rssi_stability_ch11_VHT20_ActiveTraffic(self):
613 self._test_rssi_stability()
614
615 @test_tracker_info(uuid='8aeab023-a096-4fbe-80dd-fd01466f9fac')
616 def test_rssi_stability_ch36_VHT20_ActiveTraffic(self):
617 self._test_rssi_stability()
618
619 @test_tracker_info(uuid='872fed9f-d0bb-4a7b-a2a7-bf8df7740b2d')
620 def test_rssi_stability_ch36_VHT40_ActiveTraffic(self):
621 self._test_rssi_stability()
622
623 @test_tracker_info(uuid='27395fd1-e286-473a-b98e-5a50db2a598a')
624 def test_rssi_stability_ch36_VHT80_ActiveTraffic(self):
625 self._test_rssi_stability()
626
627 @test_tracker_info(uuid='6f6b25e3-1a1e-4a61-930a-1d0aa25ba900')
628 def test_rssi_stability_ch40_VHT20_ActiveTraffic(self):
629 self._test_rssi_stability()
630
631 @test_tracker_info(uuid='c6717da7-855c-4c6e-a6e2-ee42b8feaaab')
632 def test_rssi_stability_ch44_VHT20_ActiveTraffic(self):
633 self._test_rssi_stability()
634
635 @test_tracker_info(uuid='2e34f735-079c-4619-9e74-b96dc8d0597f')
636 def test_rssi_stability_ch44_VHT40_ActiveTraffic(self):
637 self._test_rssi_stability()
638
639 @test_tracker_info(uuid='d543c019-1ff5-41d4-9b37-ccdc593f3edd')
640 def test_rssi_stability_ch48_VHT20_ActiveTraffic(self):
641 self._test_rssi_stability()
642
643 @test_tracker_info(uuid='2bb08914-36b2-4f58-9b3e-c3f3f4fac8ab')
644 def test_rssi_stability_ch149_VHT20_ActiveTraffic(self):
645 self._test_rssi_stability()
646
647 @test_tracker_info(uuid='e2f585f5-7811-4570-b987-23da301eb75d')
648 def test_rssi_stability_ch149_VHT40_ActiveTraffic(self):
649 self._test_rssi_stability()
650
651 @test_tracker_info(uuid='f3e74d5b-73f6-4723-abf3-c9c147db08e3')
652 def test_rssi_stability_ch149_VHT80_ActiveTraffic(self):
653 self._test_rssi_stability()
654
655 @test_tracker_info(uuid='06503ed0-baf3-4cd1-ac5e-4124e3c7f52f')
656 def test_rssi_stability_ch153_VHT20_ActiveTraffic(self):
657 self._test_rssi_stability()
658
659 @test_tracker_info(uuid='0cf8286f-a919-4e29-a9f2-e7738a4afe8f')
660 def test_rssi_stability_ch157_VHT20_ActiveTraffic(self):
661 self._test_rssi_stability()
662
663 @test_tracker_info(uuid='f9a0165c-468b-4096-8f4b-cc80bae564a0')
664 def test_rssi_stability_ch157_VHT40_ActiveTraffic(self):
665 self._test_rssi_stability()
666
667 @test_tracker_info(uuid='4b74dd46-4190-4556-8ad8-c55808e9e847')
668 def test_rssi_stability_ch161_VHT20_ActiveTraffic(self):
669 self._test_rssi_vs_atten()
Omar El Ayach19a55672018-03-09 00:53:12 +0000670
Omar El Ayachb8808082018-03-04 01:05:39 +0000671 @test_tracker_info(uuid='ae54b7cc-d76d-4460-8dcc-2c439265c7c9')
672 def test_rssi_vs_atten_ch1_VHT20_ActiveTraffic(self):
673 self._test_rssi_vs_atten()
674
675 @test_tracker_info(uuid='07fe7899-886d-45ba-9c1d-7daaf9844c9c')
676 def test_rssi_vs_atten_ch2_VHT20_ActiveTraffic(self):
677 self._test_rssi_vs_atten()
678
679 @test_tracker_info(uuid='9e86578b-a6cd-4de9-a79d-eabac5bd5f4e')
680 def test_rssi_vs_atten_ch3_VHT20_ActiveTraffic(self):
681 self._test_rssi_vs_atten()
682
683 @test_tracker_info(uuid='e9d258ca-8e70-408e-b704-782fce7a07c5')
684 def test_rssi_vs_atten_ch4_VHT20_ActiveTraffic(self):
685 self._test_rssi_vs_atten()
686
687 @test_tracker_info(uuid='1c5d71a0-7532-49e4-98a9-1c2d9d8d58d2')
688 def test_rssi_vs_atten_ch5_VHT20_ActiveTraffic(self):
689 self._test_rssi_vs_atten()
690
691 @test_tracker_info(uuid='107f01f3-b6b9-470b-9895-6345edfc9599')
692 def test_rssi_vs_atten_ch6_VHT20_ActiveTraffic(self):
693 self._test_rssi_vs_atten()
694
695 @test_tracker_info(uuid='88cb18b2-30bf-4c01-ac28-15451289e7cd')
696 def test_rssi_vs_atten_ch7_VHT20_ActiveTraffic(self):
697 self._test_rssi_vs_atten()
698
699 @test_tracker_info(uuid='c07a7442-bd1d-40c7-80ed-167e30b8cfaf')
700 def test_rssi_vs_atten_ch8_VHT20_ActiveTraffic(self):
701 self._test_rssi_vs_atten()
702
703 @test_tracker_info(uuid='b8946280-88d5-400d-a417-2bdc9d7e054a')
704 def test_rssi_vs_atten_ch9_VHT20_ActiveTraffic(self):
705 self._test_rssi_vs_atten()
706
707 @test_tracker_info(uuid='a05db91b-740d-4984-a447-79ab438034f0')
708 def test_rssi_vs_atten_ch10_VHT20_ActiveTraffic(self):
709 self._test_rssi_vs_atten()
710
711 @test_tracker_info(uuid='f4d565f8-f060-462c-9b3c-cd1f7d27b3ea')
712 def test_rssi_vs_atten_ch11_VHT20_ActiveTraffic(self):
713 self._test_rssi_vs_atten()
714
Omar El Ayachb8808082018-03-04 01:05:39 +0000715 @test_tracker_info(uuid='a33a93ac-604a-414f-ae96-42dffbe59a93')
716 def test_rssi_vs_atten_ch36_VHT20_ActiveTraffic(self):
717 self._test_rssi_vs_atten()
718
719 @test_tracker_info(uuid='39875ab0-e0e9-464b-8a47-4dedd65f066e')
720 def test_rssi_vs_atten_ch36_VHT40_ActiveTraffic(self):
721 self._test_rssi_vs_atten()
722
723 @test_tracker_info(uuid='c6ff8768-f124-4190-baf2-bbf14b612de3')
724 def test_rssi_vs_atten_ch36_VHT80_ActiveTraffic(self):
725 self._test_rssi_vs_atten()
726
727 @test_tracker_info(uuid='ed4705af-e202-4737-b410-8bab0515e79f')
728 def test_rssi_vs_atten_ch40_VHT20_ActiveTraffic(self):
729 self._test_rssi_vs_atten()
730
731 @test_tracker_info(uuid='1388df99-ecbf-4412-9ded-d66552f37ec5')
732 def test_rssi_vs_atten_ch44_VHT20_ActiveTraffic(self):
733 self._test_rssi_vs_atten()
734
735 @test_tracker_info(uuid='06868677-ad3c-4f50-9b9e-ae8d9455ae4d')
736 def test_rssi_vs_atten_ch44_VHT40_ActiveTraffic(self):
737 self._test_rssi_vs_atten()
738
739 @test_tracker_info(uuid='9b6676de-c736-4603-a9b3-97670bea8f25')
740 def test_rssi_vs_atten_ch48_VHT20_ActiveTraffic(self):
741 self._test_rssi_vs_atten()
742
743 @test_tracker_info(uuid='2641c4b8-0092-4e29-9139-fdb3b3f04d05')
744 def test_rssi_vs_atten_ch149_VHT20_ActiveTraffic(self):
745 self._test_rssi_vs_atten()
746
747 @test_tracker_info(uuid='c8bc3f7d-b459-4e40-9c73-b0bf534c6c08')
748 def test_rssi_vs_atten_ch149_VHT40_ActiveTraffic(self):
749 self._test_rssi_vs_atten()
750
751 @test_tracker_info(uuid='3e08f5b6-9f3c-4905-8b10-82e1ca830cc9')
752 def test_rssi_vs_atten_ch149_VHT80_ActiveTraffic(self):
753 self._test_rssi_vs_atten()
754
755 @test_tracker_info(uuid='2343efe3-fdda-4180-add7-4786d35e29bb')
756 def test_rssi_vs_atten_ch153_VHT20_ActiveTraffic(self):
757 self._test_rssi_vs_atten()
758
759 @test_tracker_info(uuid='89a16974-2399-4356-b720-17b765ff1c3a')
760 def test_rssi_vs_atten_ch157_VHT20_ActiveTraffic(self):
761 self._test_rssi_vs_atten()
762
763 @test_tracker_info(uuid='c8e0e44a-b962-4e71-ba8f-068f268c8823')
764 def test_rssi_vs_atten_ch157_VHT40_ActiveTraffic(self):
765 self._test_rssi_vs_atten()
766
767 @test_tracker_info(uuid='581b5794-239e-4d1c-b0ce-7c6dc5bd373f')
768 def test_rssi_vs_atten_ch161_VHT20_ActiveTraffic(self):
769 self._test_rssi_vs_atten()
Omar El Ayach432f4612018-03-22 02:33:00 +0000770
771
772class WifiRssi_2GHz_ActiveTraffic_Test(WifiRssiTest):
773 def __init__(self, controllers):
774 base_test.BaseTestClass.__init__(self, controllers)
775 self.tests = ("test_rssi_stability_ch1_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000776 "test_rssi_vs_atten_ch1_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000777 "test_rssi_stability_ch2_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000778 "test_rssi_vs_atten_ch2_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000779 "test_rssi_stability_ch3_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000780 "test_rssi_vs_atten_ch3_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000781 "test_rssi_stability_ch4_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000782 "test_rssi_vs_atten_ch4_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000783 "test_rssi_stability_ch5_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000784 "test_rssi_vs_atten_ch5_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000785 "test_rssi_stability_ch6_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000786 "test_rssi_vs_atten_ch6_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000787 "test_rssi_stability_ch7_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000788 "test_rssi_vs_atten_ch7_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000789 "test_rssi_stability_ch8_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000790 "test_rssi_vs_atten_ch8_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000791 "test_rssi_stability_ch9_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000792 "test_rssi_vs_atten_ch9_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000793 "test_rssi_stability_ch10_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000794 "test_rssi_vs_atten_ch10_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000795 "test_rssi_stability_ch11_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000796 "test_rssi_vs_atten_ch11_VHT20_ActiveTraffic")
797
798
799class WifiRssi_5GHz_ActiveTraffic_Test(WifiRssiTest):
800 def __init__(self, controllers):
801 base_test.BaseTestClass.__init__(self, controllers)
802 self.tests = ("test_rssi_stability_ch36_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000803 "test_rssi_vs_atten_ch36_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000804 "test_rssi_stability_ch36_VHT40_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000805 "test_rssi_vs_atten_ch36_VHT40_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000806 "test_rssi_stability_ch36_VHT80_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000807 "test_rssi_vs_atten_ch36_VHT80_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000808 "test_rssi_stability_ch40_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000809 "test_rssi_vs_atten_ch40_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000810 "test_rssi_stability_ch44_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000811 "test_rssi_vs_atten_ch44_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000812 "test_rssi_stability_ch44_VHT40_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000813 "test_rssi_vs_atten_ch44_VHT40_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000814 "test_rssi_stability_ch48_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000815 "test_rssi_vs_atten_ch48_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000816 "test_rssi_stability_ch149_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000817 "test_rssi_vs_atten_ch149_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000818 "test_rssi_stability_ch149_VHT40_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000819 "test_rssi_vs_atten_ch149_VHT40_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000820 "test_rssi_stability_ch149_VHT80_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000821 "test_rssi_vs_atten_ch149_VHT80_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000822 "test_rssi_stability_ch153_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000823 "test_rssi_vs_atten_ch153_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000824 "test_rssi_stability_ch157_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000825 "test_rssi_vs_atten_ch157_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000826 "test_rssi_stability_ch157_VHT40_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000827 "test_rssi_vs_atten_ch157_VHT40_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000828 "test_rssi_stability_ch161_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000829 "test_rssi_vs_atten_ch161_VHT20_ActiveTraffic")