blob: 42473442162db86ab2b889004206d447d88edb65 [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
34STATION_DUMP = "iw wlan0 station dump"
35SCAN = "wpa_cli scan"
36SCAN_RESULTS = "wpa_cli scan_results"
37SIGNAL_POLL = "wpa_cli signal_poll"
38CONST_3dB = 3.01029995664
39RSSI_ERROR_VAL = float("nan")
40
41
42class WifiRssiTest(base_test.BaseTestClass):
43 def __init__(self, controllers):
44 base_test.BaseTestClass.__init__(self, controllers)
45
46 def setup_class(self):
47 self.dut = self.android_devices[0]
android-build-prod (mdb)5660fed2018-04-26 21:03:41 -070048 req_params = ["rssi_test_params", "testbed_params", "main_network"]
Omar El Ayachb8808082018-03-04 01:05:39 +000049 opt_params = ["RetailAccessPoints"]
50 self.unpack_userparams(req_params, opt_params)
Omar El Ayach4232d892018-04-20 16:07:44 -070051 self.test_params = self.rssi_test_params
Omar El Ayachb8808082018-03-04 01:05:39 +000052 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 Ayachcc951ee2018-06-07 14:21:16 -070065 def pass_fail_check_rssi_stability(self, postprocessed_results):
Omar El Ayach432f4612018-03-22 02:33:00 +000066 """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:
Omar El Ayachcc951ee2018-06-07 14:21:16 -070073 postprocessed_results: compiled arrays of RSSI measurements
Omar El Ayach432f4612018-03-22 02:33:00 +000074 """
Omar El Ayach432f4612018-03-22 02:33:00 +000075 test_failed = any([
76 stdev > self.test_params["stdev_tolerance"]
Omar El Ayachcc951ee2018-06-07 14:21:16 -070077 for stdev in postprocessed_results["signal_poll_rssi"]["stdev"]
Omar El Ayach432f4612018-03-22 02:33:00 +000078 ])
Omar El Ayachcc951ee2018-06-07 14:21:16 -070079 test_message = (
80 "RSSI stability {0}. Standard deviation was {1} dB "
81 "(limit {2}), per chain standard deviation [{3}, {4}] dB".format(
82 "failed" * test_failed + "passed" * (not test_failed), [
Omar El Ayach432f4612018-03-22 02:33:00 +000083 float("{:.2f}".format(x))
Omar El Ayachcc951ee2018-06-07 14:21:16 -070084 for x in postprocessed_results["signal_poll_rssi"]["stdev"]
Omar El Ayach432f4612018-03-22 02:33:00 +000085 ], self.test_params["stdev_tolerance"], [
86 float("{:.2f}".format(x))
Omar El Ayachcc951ee2018-06-07 14:21:16 -070087 for x in postprocessed_results["chain_0_rssi"]["stdev"]
Omar El Ayach432f4612018-03-22 02:33:00 +000088 ], [
89 float("{:.2f}".format(x))
Omar El Ayachcc951ee2018-06-07 14:21:16 -070090 for x in postprocessed_results["chain_1_rssi"]["stdev"]
Omar El Ayach432f4612018-03-22 02:33:00 +000091 ]))
Omar El Ayachcc951ee2018-06-07 14:21:16 -070092 if test_failed:
93 asserts.fail(test_message)
94 asserts.explicit_pass(test_message)
Omar El Ayach432f4612018-03-22 02:33:00 +000095
Omar El Ayachcc951ee2018-06-07 14:21:16 -070096 def pass_fail_check_rssi_accuracy(self, postprocessed_results,
97 rssi_under_test, absolute_accuracy):
Omar El Ayachb8808082018-03-04 01:05:39 +000098 """Check the test result and decide if it passed or failed.
99
100 Checks the RSSI test result and compares and compute its deviation from
101 the predicted RSSI. This computation is done for all reported RSSI
102 values. The test fails if any of the RSSI values specified in
103 rssi_under_test have an average error beyond what is specified in the
104 configuration file.
105
106 Args:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700107 postprocessed_results: compiled arrays of RSSI measurements
108 rssi_under_test: list of RSSIs under test, i.e., can cause test to
109 fail
110 absolute_accuracy: boolean indicating whether to look at absolute
111 RSSI accuracy, or centered RSSI accuracy. Centered accuracy is
112 computed after systematic RSSI shifts are removed.
Omar El Ayachb8808082018-03-04 01:05:39 +0000113 """
Omar El Ayachb8808082018-03-04 01:05:39 +0000114 test_failed = False
115 test_message = ""
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700116 if absolute_accuracy:
117 error_type = "absolute"
118 else:
119 error_type = "centered"
120
121 for key, val in postprocessed_results.items():
Omar El Ayachb8808082018-03-04 01:05:39 +0000122 # Compute the error metrics ignoring invalid RSSI readings
123 # If all readings invalid, set error to RSSI_ERROR_VAL
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700124 if "rssi" in key and "predicted" not in key:
125 filtered_error = [x for x in val["error"] if not math.isnan(x)]
126 if filtered_error:
127 avg_shift = statistics.mean(filtered_error)
128 if absolute_accuracy:
129 avg_error = statistics.mean(
130 [abs(x) for x in filtered_error])
131 else:
132 avg_error = statistics.mean(
133 [abs(x - avg_shift) for x in filtered_error])
134 else:
135 avg_error = RSSI_ERROR_VAL
136 avg_shift = RSSI_ERROR_VAL
137 rssi_failure = (avg_error > self.test_params["abs_tolerance"]
138 ) or math.isnan(avg_error)
139 if rssi_failure and key in rssi_under_test:
140 test_message = test_message + (
141 "{} failed. Average {} error is {:.2f} dB. "
142 "Average shift is {:.2f} dB.\n").format(
143 key, error_type, avg_error, avg_shift)
144 test_failed = True
145 elif rssi_failure:
146 test_message = test_message + (
147 "{} failed (ignored). Average {} error is {:.2f} dB. "
148 "Average shift is {:.2f} dB.\n").format(
149 key, error_type, avg_error, avg_shift)
150 else:
151 test_message = test_message + (
152 "{} passed. Average {} error is {:.2f} dB. "
153 "Average shift is {:.2f} dB.\n").format(
154 key, error_type, avg_error, avg_shift)
Omar El Ayachb8808082018-03-04 01:05:39 +0000155
156 if test_failed:
157 asserts.fail(test_message)
158 asserts.explicit_pass(test_message)
159
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700160 def post_process_rssi_sweep(self, rssi_result):
161 """Postprocesses and saves JSON formatted results.
Omar El Ayachb8808082018-03-04 01:05:39 +0000162
163 Args:
164 rssi_result: dict containing attenuation, rssi and other meta
165 data
166 Returns:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700167 postprocessed_results: compiled arrays of RSSI data used in
Omar El Ayachb8808082018-03-04 01:05:39 +0000168 pass/fail check
169 """
170 # Save output as text file
Omar El Ayachb8808082018-03-04 01:05:39 +0000171 results_file_path = "{}/{}.json".format(self.log_path,
172 self.current_test_name)
173 with open(results_file_path, 'w') as results_file:
Omar El Ayach432f4612018-03-22 02:33:00 +0000174 json.dump(rssi_result, results_file, indent=4)
Omar El Ayachb8808082018-03-04 01:05:39 +0000175 # Compile results into arrays of RSSIs suitable for plotting
176 postprocessed_results = {
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700177 "signal_poll_rssi": {},
178 "signal_poll_avg_rssi": {},
179 "scan_rssi": {},
180 "chain_0_rssi": {},
181 "chain_1_rssi": {},
182 "total_attenuation": [],
183 "predicted_rssi": []
Omar El Ayachb8808082018-03-04 01:05:39 +0000184 }
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700185 for key, val in postprocessed_results.items():
186 if "scan_rssi" in key:
187 postprocessed_results[key]["data"] = [
188 x for data_point in rssi_result["rssi_result"] for x in
189 data_point[key][rssi_result["connected_bssid"]]["data"]
190 ]
191 postprocessed_results[key]["mean"] = [
192 x[key][rssi_result["connected_bssid"]]["mean"]
193 for x in rssi_result["rssi_result"]
194 ]
195 postprocessed_results[key]["stdev"] = [
196 x[key][rssi_result["connected_bssid"]]["stdev"]
197 for x in rssi_result["rssi_result"]
198 ]
199 elif "predicted_rssi" in key:
200 postprocessed_results["total_attenuation"] = [
201 att + rssi_result["fixed_attenuation"] +
202 rssi_result["dut_front_end_loss"]
203 for att in rssi_result["attenuation"]
204 ]
205 postprocessed_results["predicted_rssi"] = [
206 rssi_result["ap_tx_power"] - att
207 for att in postprocessed_results["total_attenuation"]
208 ]
209 elif "rssi" in key:
210 postprocessed_results[key]["data"] = [
211 x for data_point in rssi_result["rssi_result"]
212 for x in data_point[key]["data"]
213 ]
214 postprocessed_results[key]["mean"] = [
215 x[key]["mean"] for x in rssi_result["rssi_result"]
216 ]
217 postprocessed_results[key]["stdev"] = [
218 x[key]["stdev"] for x in rssi_result["rssi_result"]
219 ]
220 # Compute RSSI errors
221 for key, val in postprocessed_results.items():
222 if "chain" in key:
223 postprocessed_results[key]["error"] = [
224 postprocessed_results[key]["mean"][idx] + CONST_3dB -
225 postprocessed_results["predicted_rssi"][idx]
226 for idx in range(
227 len(postprocessed_results["predicted_rssi"]))
228 ]
229 elif "rssi" in key and "predicted" not in key:
230 postprocessed_results[key]["error"] = [
231 postprocessed_results[key]["mean"][idx] -
232 postprocessed_results["predicted_rssi"][idx]
233 for idx in range(
234 len(postprocessed_results["predicted_rssi"]))
235 ]
236 return postprocessed_results
237
238 def plot_rssi_vs_attenuation(self, postprocessed_results):
239 """Function to plot RSSI vs attenuation sweeps
240
241 Args:
242 postprocessed_results: compiled arrays of RSSI data.
243 """
Omar El Ayachb8808082018-03-04 01:05:39 +0000244 data_sets = [[
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700245 postprocessed_results["total_attenuation"],
246 postprocessed_results["total_attenuation"],
247 postprocessed_results["total_attenuation"],
248 postprocessed_results["total_attenuation"],
249 postprocessed_results["total_attenuation"],
250 postprocessed_results["total_attenuation"]
Omar El Ayachb8808082018-03-04 01:05:39 +0000251 ], [
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700252 postprocessed_results["signal_poll_rssi"]["mean"],
253 postprocessed_results["signal_poll_avg_rssi"]["mean"],
254 postprocessed_results["scan_rssi"]["mean"],
255 postprocessed_results["chain_0_rssi"]["mean"],
256 postprocessed_results["chain_1_rssi"]["mean"],
Omar El Ayachb8808082018-03-04 01:05:39 +0000257 postprocessed_results["predicted_rssi"]
258 ]]
259 legends = [
260 "Signal Poll RSSI", "Signal Poll AVG_RSSI", "Scan RSSI",
261 "Chain 0 RSSI", "Chain 1 RSSI", "Predicted RSSI"
262 ]
Omar El Ayachb8808082018-03-04 01:05:39 +0000263 fig_property = {
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700264 "title": self.current_test_name,
265 "x_label": 'Attenuation (dB)',
266 "y_label": 'RSSI (dBm)',
Omar El Ayachb8808082018-03-04 01:05:39 +0000267 "linewidth": 3,
268 "markersize": 10
269 }
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700270 output_file_path = "{}/{}.html".format(self.log_path,
271 self.current_test_name)
Omar El Ayachb8808082018-03-04 01:05:39 +0000272 wputils.bokeh_plot(
273 data_sets,
274 legends,
275 fig_property,
276 shaded_region=None,
277 output_file_path=output_file_path)
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700278
279 def plot_rssi_vs_time(self, rssi_result, postprocessed_results,
280 center_curves):
281 """Function to plot RSSI vs time.
282
283 Args:
284 rssi_result: dict containing raw RSSI data
285 postprocessed_results: compiled arrays of RSSI data
286 center_curvers: boolean indicating whether to shift curves to align
287 them with predicted RSSIs
288 """
289 x_data = []
290 y_data = []
291 legends = []
292 rssi_time_series = {
293 "signal_poll_rssi": [],
294 "signal_poll_avg_rssi": [],
295 "scan_rssi": [],
296 "chain_0_rssi": [],
297 "chain_1_rssi": [],
298 "predicted_rssi": []
299 }
300 for key, val in rssi_time_series.items():
301 if "predicted_rssi" in key:
302 rssi_time_series[key] = [
303 x for x in postprocessed_results[key] for copies in range(
304 len(rssi_result["rssi_result"][0]["signal_poll_rssi"][
305 "data"]))
306 ]
307 elif "rssi" in key:
308 if center_curves:
309 filtered_error = [
310 x for x in postprocessed_results[key]["error"]
311 if not math.isnan(x)
312 ]
313 if filtered_error:
314 avg_shift = statistics.mean(filtered_error)
315 else:
316 avg_shift = 0
317 rssi_time_series[key] = [
318 x - avg_shift
319 for x in postprocessed_results[key]["data"]
320 ]
321 else:
322 rssi_time_series[key] = postprocessed_results[key]["data"]
323 time = [
324 self.test_params["polling_frequency"] * x
325 for x in range(len(rssi_time_series[key]))
326 ]
327 if len(rssi_time_series[key]) > 0:
328 x_data.append(time)
329 y_data.append(rssi_time_series[key])
330 legends.append(key)
331 data_sets = [x_data, y_data]
332 fig_property = {
333 "title": self.current_test_name,
334 "x_label": 'Time (s)',
335 "y_label": center_curves * 'Centered' + 'RSSI (dBm)',
336 "linewidth": 3,
337 "markersize": 0
338 }
339 output_file_path = "{}/{}.html".format(self.log_path,
340 self.current_test_name)
341 wputils.bokeh_plot(
342 data_sets,
343 legends,
344 fig_property,
345 shaded_region=None,
346 output_file_path=output_file_path)
Omar El Ayachb8808082018-03-04 01:05:39 +0000347
348 def get_scan_rssi(self, tracked_bssids, num_measurements=1):
349 """Gets scan RSSI for specified BSSIDs.
350
351 Args:
352 tracked_bssids: array of BSSIDs to gather RSSI data for
353 num_measurements: number of scans done, and RSSIs collected
354 Returns:
355 scan_rssi: dict containing the measurement results as well as the
Omar El Ayach432f4612018-03-22 02:33:00 +0000356 statistics of the scan RSSI for all BSSIDs in tracked_bssids
Omar El Ayachb8808082018-03-04 01:05:39 +0000357 """
358 scan_rssi = {}
359 for bssid in tracked_bssids:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700360 scan_rssi[bssid] = {"data": [], "mean": None, "stdev": None}
Omar El Ayachb8808082018-03-04 01:05:39 +0000361 for idx in range(num_measurements):
362 scan_output = self.dut.adb.shell(SCAN)
363 time.sleep(MED_SLEEP)
364 scan_output = self.dut.adb.shell(SCAN_RESULTS)
365 for bssid in tracked_bssids:
366 bssid_result = re.search(
367 bssid + ".*", scan_output, flags=re.IGNORECASE)
368 if bssid_result:
369 bssid_result = bssid_result.group(0).split("\t")
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700370 scan_rssi[bssid]["data"].append(int(bssid_result[2]))
Omar El Ayachb8808082018-03-04 01:05:39 +0000371 else:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700372 scan_rssi[bssid]["data"].append(RSSI_ERROR_VAL)
Omar El Ayachb8808082018-03-04 01:05:39 +0000373 # Compute mean RSSIs. Only average valid readings.
374 # Output RSSI_ERROR_VAL if no readings found.
375 for key, val in scan_rssi.items():
376 filtered_rssi_values = [
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700377 x for x in val["data"] if not math.isnan(x)
Omar El Ayachb8808082018-03-04 01:05:39 +0000378 ]
379 if filtered_rssi_values:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700380 scan_rssi[key]["mean"] = statistics.mean(filtered_rssi_values)
Omar El Ayach432f4612018-03-22 02:33:00 +0000381 if len(filtered_rssi_values) > 1:
382 scan_rssi[key]["stdev"] = statistics.stdev(
383 filtered_rssi_values)
384 else:
385 scan_rssi[key]["stdev"] = 0
Omar El Ayachb8808082018-03-04 01:05:39 +0000386 else:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700387 scan_rssi[key]["mean"] = RSSI_ERROR_VAL
Omar El Ayach432f4612018-03-22 02:33:00 +0000388 scan_rssi[key]["stdev"] = RSSI_ERROR_VAL
Omar El Ayachb8808082018-03-04 01:05:39 +0000389 return scan_rssi
390
391 def get_connected_rssi(self,
392 num_measurements=1,
393 polling_frequency=SHORT_SLEEP):
394 """Gets all RSSI values reported for the connected access point/BSSID.
395
396 Args:
397 num_measurements: number of scans done, and RSSIs collected
398 polling_frequency: time to wait between RSSI measurements
399 Returns:
400 connected_rssi: dict containing the measurements results for
401 all reported RSSI values (signal_poll, per chain, etc.) and their
Omar El Ayach432f4612018-03-22 02:33:00 +0000402 statistics
Omar El Ayachb8808082018-03-04 01:05:39 +0000403 """
404 connected_rssi = {
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700405 "signal_poll_rssi": {
406 "data": [],
407 "mean": None,
408 "stdev": None
409 },
410 "signal_poll_avg_rssi": {
411 "data": [],
412 "mean": None,
413 "stdev": None
414 },
415 "chain_0_rssi": {
416 "data": [],
417 "mean": None,
418 "stdev": None
419 },
420 "chain_1_rssi": {
421 "data": [],
422 "mean": None,
423 "stdev": None
424 }
Omar El Ayachb8808082018-03-04 01:05:39 +0000425 }
426 for idx in range(num_measurements):
Omar El Ayach4232d892018-04-20 16:07:44 -0700427 measurement_start_time = time.time()
Omar El Ayachb8808082018-03-04 01:05:39 +0000428 # Get signal poll RSSI
429 signal_poll_output = self.dut.adb.shell(SIGNAL_POLL)
430 match = re.search("RSSI=.*", signal_poll_output)
431 if match:
432 temp_rssi = int(match.group(0).split("=")[1])
433 if temp_rssi == -9999:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700434 connected_rssi["signal_poll_rssi"]["data"].append(
435 RSSI_ERROR_VAL)
Omar El Ayachb8808082018-03-04 01:05:39 +0000436 else:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700437 connected_rssi["signal_poll_rssi"]["data"].append(
438 temp_rssi)
Omar El Ayachb8808082018-03-04 01:05:39 +0000439 else:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700440 connected_rssi["signal_poll_rssi"]["data"].append(
441 RSSI_ERROR_VAL)
Omar El Ayachb8808082018-03-04 01:05:39 +0000442 match = re.search("AVG_RSSI=.*", signal_poll_output)
443 if match:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700444 connected_rssi["signal_poll_avg_rssi"]["data"].append(
Omar El Ayachb8808082018-03-04 01:05:39 +0000445 int(match.group(0).split("=")[1]))
446 else:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700447 connected_rssi["signal_poll_avg_rssi"]["data"].append(
448 RSSI_ERROR_VAL)
Omar El Ayachb8808082018-03-04 01:05:39 +0000449 # Get per chain RSSI
450 per_chain_rssi = self.dut.adb.shell(STATION_DUMP)
451 match = re.search(".*signal avg:.*", per_chain_rssi)
452 if match:
453 per_chain_rssi = per_chain_rssi[per_chain_rssi.find("[") + 1:
454 per_chain_rssi.find("]")]
455 per_chain_rssi = per_chain_rssi.split(", ")
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700456 connected_rssi["chain_0_rssi"]["data"].append(
457 int(per_chain_rssi[0]))
458 connected_rssi["chain_1_rssi"]["data"].append(
459 int(per_chain_rssi[1]))
Omar El Ayachb8808082018-03-04 01:05:39 +0000460 else:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700461 connected_rssi["chain_0_rssi"]["data"].append(RSSI_ERROR_VAL)
462 connected_rssi["chain_1_rssi"]["data"].append(RSSI_ERROR_VAL)
Omar El Ayach4232d892018-04-20 16:07:44 -0700463 measurement_elapsed_time = time.time() - measurement_start_time
464 time.sleep(max(0, polling_frequency - measurement_elapsed_time))
Omar El Ayached1d24b2018-04-13 12:49:33 -0700465
Omar El Ayachb8808082018-03-04 01:05:39 +0000466 # Compute mean RSSIs. Only average valid readings.
467 # Output RSSI_ERROR_VAL if no valid connected readings found.
468 for key, val in connected_rssi.copy().items():
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700469 filtered_rssi_values = [
470 x for x in val["data"] if not math.isnan(x)
471 ]
Omar El Ayachb8808082018-03-04 01:05:39 +0000472 if filtered_rssi_values:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700473 connected_rssi[key]["mean"] = statistics.mean(
474 filtered_rssi_values)
Omar El Ayach432f4612018-03-22 02:33:00 +0000475 if len(filtered_rssi_values) > 1:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700476 connected_rssi[key]["stdev"] = statistics.stdev(
Omar El Ayach432f4612018-03-22 02:33:00 +0000477 filtered_rssi_values)
478 else:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700479 connected_rssi[key]["stdev"] = 0
Omar El Ayachb8808082018-03-04 01:05:39 +0000480 else:
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700481 connected_rssi[key]["mean"] = RSSI_ERROR_VAL
482 connected_rssi[key]["stdev"] = RSSI_ERROR_VAL
Omar El Ayachb8808082018-03-04 01:05:39 +0000483 return connected_rssi
484
485 def rssi_test(self, iperf_traffic, connected_measurements,
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700486 scan_measurements, bssids, polling_frequency,
487 first_measurement_delay):
Omar El Ayachb8808082018-03-04 01:05:39 +0000488 """Test function to run RSSI tests.
489
490 The function runs an RSSI test in the current device/AP configuration.
491 Function is called from another wrapper function that sets up the
492 testbed for the RvR test
493
494 Args:
495 iperf_traffic: boolean specifying whether or not to run traffic
496 during RSSI tests
497 connected_measurements: number of RSSI measurements to make for the
498 connected AP per attenuation point
499 scan_measurements: number of scans and scan RSSIs to make per
500 attenuation point
501 bssids: list of BSSIDs to monitor in scans
502 polling_frequency: time between connected AP measurements
503 Returns:
504 rssi_result: dict containing rssi_result and meta data
505 """
506 self.log.info("Start running RSSI test.")
507 rssi_result = []
508 # Start iperf traffic if required by test
509 if self.iperf_traffic:
510 self.iperf_server.start(tag=0)
511 self.dut.run_iperf_client_nb(
android-build-prod (mdb)5660fed2018-04-26 21:03:41 -0700512 self.testbed_params["iperf_server_address"],
Omar El Ayachb8808082018-03-04 01:05:39 +0000513 self.iperf_args,
514 timeout=3600)
515 for atten in self.rssi_atten_range:
516 # Set Attenuation
517 self.log.info("Setting attenuation to {} dB".format(atten))
518 [
519 self.attenuators[i].set_atten(atten)
520 for i in range(self.num_atten)
521 ]
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700522 time.sleep(first_measurement_delay)
Omar El Ayachb8808082018-03-04 01:05:39 +0000523 current_rssi = {}
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700524 current_rssi = self.get_connected_rssi(connected_measurements,
525 polling_frequency)
Omar El Ayachb8808082018-03-04 01:05:39 +0000526 current_rssi["scan_rssi"] = self.get_scan_rssi(
527 bssids, scan_measurements)
528 rssi_result.append(current_rssi)
529 self.log.info("Connected RSSI at {0:.2f} dB is {1:.2f} dB".format(
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700530 atten, current_rssi["signal_poll_rssi"]["mean"]))
Omar El Ayachb8808082018-03-04 01:05:39 +0000531 # Stop iperf traffic if needed
532 if self.iperf_traffic:
533 self.iperf_server.stop()
534 self.dut.adb.shell("pkill iperf3")
535 [self.attenuators[i].set_atten(0) for i in range(self.num_atten)]
536 return rssi_result
537
Omar El Ayach432f4612018-03-22 02:33:00 +0000538 def rssi_test_func(self, iperf_traffic, connected_measurements,
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700539 scan_measurements, bssids, polling_frequency,
540 first_measurement_delay):
Omar El Ayachb8808082018-03-04 01:05:39 +0000541 """Main function to test RSSI.
542
543 The function sets up the AP in the correct channel and mode
544 configuration and called rssi_test to sweep attenuation and measure
545 RSSI
546
547 Returns:
548 rssi_result: dict containing rssi_results and meta data
549 """
Omar El Ayach432f4612018-03-22 02:33:00 +0000550 #Initialize test settings
Omar El Ayachb8808082018-03-04 01:05:39 +0000551 rssi_result = {}
552 # Configure AP
553 band = self.access_point.band_lookup_by_channel(self.channel)
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700554 if "2G" in band:
555 frequency = wutils.WifiEnums.channel_2G_to_freq[self.channel]
556 else:
557 frequency = wutils.WifiEnums.channel_5G_to_freq[self.channel]
558 if frequency in wutils.WifiEnums.DFS_5G_FREQUENCIES:
559 self.access_point.set_region(self.testbed_params["DFS_region"])
560 else:
561 self.access_point.set_region(self.testbed_params["default_region"])
Omar El Ayachb8808082018-03-04 01:05:39 +0000562 self.access_point.set_channel(band, self.channel)
563 self.access_point.set_bandwidth(band, self.mode)
564 self.log.info("Access Point Configuration: {}".format(
565 self.access_point.ap_settings))
566 # Set attenuator to starting attenuation
567 [
568 self.attenuators[i].set_atten(self.rssi_atten_range[0])
569 for i in range(self.num_atten)
570 ]
571 # Connect DUT to Network
572 wutils.wifi_toggle_state(self.dut, True)
573 wutils.reset_wifi(self.dut)
574 self.main_network[band]["channel"] = self.channel
575 wutils.wifi_connect(self.dut, self.main_network[band], num_of_tries=5)
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700576 time.sleep(MED_SLEEP)
Omar El Ayachb8808082018-03-04 01:05:39 +0000577 # Run RvR and log result
578 rssi_result["test_name"] = self.current_test_name
579 rssi_result["ap_settings"] = self.access_point.ap_settings.copy()
580 rssi_result["attenuation"] = list(self.rssi_atten_range)
581 rssi_result["connected_bssid"] = self.main_network[band]["BSSID"]
android-build-prod (mdb)5660fed2018-04-26 21:03:41 -0700582 if "{}_{}".format(str(self.channel),
583 self.mode) in self.testbed_params["ap_tx_power"]:
584 rssi_result["ap_tx_power"] = self.testbed_params["ap_tx_power"][
585 "{}_{}".format(str(self.channel), self.mode)]
586 else:
587 rssi_result["ap_tx_power"] = self.testbed_params["ap_tx_power"][
588 str(self.channel)]
589 rssi_result["fixed_attenuation"] = self.testbed_params[
Omar El Ayachb8808082018-03-04 01:05:39 +0000590 "fixed_attenuation"][str(self.channel)]
android-build-prod (mdb)198b8912018-05-08 15:15:36 -0700591 rssi_result["dut_front_end_loss"] = self.testbed_params[
592 "dut_front_end_loss"][str(self.channel)]
Omar El Ayachb8808082018-03-04 01:05:39 +0000593 rssi_result["rssi_result"] = self.rssi_test(
Omar El Ayach432f4612018-03-22 02:33:00 +0000594 iperf_traffic, connected_measurements, scan_measurements, bssids,
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700595 polling_frequency, first_measurement_delay)
Omar El Ayachb8808082018-03-04 01:05:39 +0000596 self.testclass_results.append(rssi_result)
597 return rssi_result
598
599 def _test_rssi_vs_atten(self):
600 """ Function that gets called for each test case of rssi_vs_atten
601
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700602 The function gets called in each rssi test case. The function
603 customizes the test based on the test name of the test that called it
Omar El Ayachb8808082018-03-04 01:05:39 +0000604 """
605 test_params = self.current_test_name.split("_")
606 self.channel = int(test_params[4][2:])
607 self.mode = test_params[5]
608 self.iperf_traffic = "ActiveTraffic" in test_params[6]
609 self.iperf_args = '-i 1 -t 3600 -J -R'
Omar El Ayach432f4612018-03-22 02:33:00 +0000610 band = self.access_point.band_lookup_by_channel(self.channel)
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700611 num_atten_steps = int((self.test_params["rssi_vs_atten_stop"] -
612 self.test_params["rssi_vs_atten_start"]) /
613 self.test_params["rssi_vs_atten_step"])
Omar El Ayach432f4612018-03-22 02:33:00 +0000614 self.rssi_atten_range = [
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700615 self.test_params["rssi_vs_atten_start"] +
616 x * self.test_params["rssi_vs_atten_step"]
Omar El Ayach432f4612018-03-22 02:33:00 +0000617 for x in range(0, num_atten_steps)
618 ]
619 rssi_result = self.rssi_test_func(
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700620 self.iperf_traffic,
621 self.test_params["rssi_vs_atten_connected_measurements"],
622 self.test_params["rssi_vs_atten_scan_measurements"],
android-build-prod (mdb)5660fed2018-04-26 21:03:41 -0700623 [self.main_network[band]["BSSID"]],
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700624 self.test_params["polling_frequency"], MED_SLEEP)
625 postprocessed_results = self.post_process_rssi_sweep(rssi_result)
626 self.plot_rssi_vs_attenuation(postprocessed_results)
627 self.pass_fail_check_rssi_accuracy(
628 postprocessed_results, self.test_params["rssi_vs_atten_metrics"],
629 1)
Omar El Ayachb8808082018-03-04 01:05:39 +0000630
631 def _test_rssi_stability(self):
Omar El Ayach432f4612018-03-22 02:33:00 +0000632 """ Function that gets called for each test case of rssi_stability
Omar El Ayachb8808082018-03-04 01:05:39 +0000633
Omar El Ayach432f4612018-03-22 02:33:00 +0000634 The function gets called in each stability test case. The function
635 customizes test based on the test name of the test that called it
636 """
637 test_params = self.current_test_name.split("_")
638 self.channel = int(test_params[3][2:])
639 self.mode = test_params[4]
640 self.iperf_traffic = "ActiveTraffic" in test_params[5]
641 self.iperf_args = '-i 1 -t 3600 -J -R'
642 band = self.access_point.band_lookup_by_channel(self.channel)
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700643 self.rssi_atten_range = self.test_params["rssi_stability_atten"]
Omar El Ayach432f4612018-03-22 02:33:00 +0000644 connected_measurements = int(
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700645 self.test_params["rssi_stability_duration"] /
Omar El Ayach432f4612018-03-22 02:33:00 +0000646 self.test_params["polling_frequency"])
647 rssi_result = self.rssi_test_func(
android-build-prod (mdb)5660fed2018-04-26 21:03:41 -0700648 self.iperf_traffic, connected_measurements, 0,
649 [self.main_network[band]["BSSID"]],
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700650 self.test_params["polling_frequency"], MED_SLEEP)
651 postprocessed_results = self.post_process_rssi_sweep(rssi_result)
652 self.plot_rssi_vs_time(rssi_result, postprocessed_results, 1)
653 self.pass_fail_check_rssi_stability(postprocessed_results)
654
655 def _test_rssi_tracking(self):
656 """ Function that gets called for each test case of rssi_tracking
657
658 The function gets called in each rssi test case. The function
659 customizes the test based on the test name of the test that called it
660 """
661 test_params = self.current_test_name.split("_")
662 self.channel = int(test_params[3][2:])
663 self.mode = test_params[4]
664 self.iperf_traffic = "ActiveTraffic" in test_params[5]
665 self.iperf_args = '-i 1 -t 3600 -J -R'
666 band = self.access_point.band_lookup_by_channel(self.channel)
667 self.rssi_atten_range = []
668 for waveform in self.test_params["rssi_tracking_waveforms"]:
669 waveform_vector = []
670 for section in range(len(waveform["atten_levels"]) - 1):
671 section_limits = waveform["atten_levels"][section:section + 2]
672 if section_limits[0] < section_limits[1]:
673 waveform_vector = waveform_vector + sorted(
674 list(
675 range(section_limits[0], section_limits[1],
676 waveform["step_size"])) *
677 waveform["step_duration"])
678 else:
679 waveform_vector = waveform_vector + list(
680 reversed(
681 sorted(
682 list(
683 range(section_limits[1], section_limits[0],
684 waveform["step_size"])) *
685 waveform["step_duration"])))
686 waveform_vector = waveform_vector * waveform["repetitions"]
687 self.rssi_atten_range = self.rssi_atten_range + waveform_vector
688 connected_measurements = int(1 / self.test_params["polling_frequency"])
689 rssi_result = self.rssi_test_func(
690 self.iperf_traffic, connected_measurements, 0,
691 [self.main_network[band]["BSSID"]],
692 self.test_params["polling_frequency"], 0)
693 postprocessed_results = self.post_process_rssi_sweep(rssi_result)
694 self.plot_rssi_vs_time(rssi_result, postprocessed_results, 1)
695 self.pass_fail_check_rssi_accuracy(postprocessed_results,
696 ["signal_poll_rssi"], 0)
Omar El Ayach19a55672018-03-09 00:53:12 +0000697
Omar El Ayach432f4612018-03-22 02:33:00 +0000698 @test_tracker_info(uuid='519689b8-0a3c-4fd9-9227-fd7962d0f1a0')
699 def test_rssi_stability_ch1_VHT20_ActiveTraffic(self):
700 self._test_rssi_stability()
701
702 @test_tracker_info(uuid='23eca2ab-d0b4-4730-9f32-ec2d901ae493')
703 def test_rssi_stability_ch2_VHT20_ActiveTraffic(self):
704 self._test_rssi_stability()
705
706 @test_tracker_info(uuid='63d340c0-dcf9-4e14-87bd-a068a59836b2')
707 def test_rssi_stability_ch3_VHT20_ActiveTraffic(self):
708 self._test_rssi_stability()
709
710 @test_tracker_info(uuid='ddbe88d8-be20-40eb-8f29-55049e3fef28')
711 def test_rssi_stability_ch4_VHT20_ActiveTraffic(self):
712 self._test_rssi_stability()
713
714 @test_tracker_info(uuid='9c06304e-2b60-4619-8fb3-73fd2cb4b854')
715 def test_rssi_stability_ch5_VHT20_ActiveTraffic(self):
716 self._test_rssi_stability()
717
718 @test_tracker_info(uuid='74b656ca-132e-4d66-9584-560287081607')
719 def test_rssi_stability_ch6_VHT20_ActiveTraffic(self):
720 self._test_rssi_stability()
721
722 @test_tracker_info(uuid='23b5f19a-539b-4908-a197-06ce505d3d23')
723 def test_rssi_stability_ch7_VHT20_ActiveTraffic(self):
724 self._test_rssi_stability()
725
726 @test_tracker_info(uuid='e7b85167-f4c4-4adb-a111-04d8a5f10e1a')
727 def test_rssi_stability_ch8_VHT20_ActiveTraffic(self):
728 self._test_rssi_stability()
729
730 @test_tracker_info(uuid='2a0a9393-4b68-4c08-8787-3f35d1a8458b')
731 def test_rssi_stability_ch9_VHT20_ActiveTraffic(self):
732 self._test_rssi_stability()
733
734 @test_tracker_info(uuid='069c7acf-3e7e-4298-91cb-d292c6025ae1')
735 def test_rssi_stability_ch10_VHT20_ActiveTraffic(self):
736 self._test_rssi_stability()
737
738 @test_tracker_info(uuid='95c5a27c-1dea-47a4-a1c5-edf955545f12')
739 def test_rssi_stability_ch11_VHT20_ActiveTraffic(self):
740 self._test_rssi_stability()
741
742 @test_tracker_info(uuid='8aeab023-a096-4fbe-80dd-fd01466f9fac')
743 def test_rssi_stability_ch36_VHT20_ActiveTraffic(self):
744 self._test_rssi_stability()
745
746 @test_tracker_info(uuid='872fed9f-d0bb-4a7b-a2a7-bf8df7740b2d')
747 def test_rssi_stability_ch36_VHT40_ActiveTraffic(self):
748 self._test_rssi_stability()
749
750 @test_tracker_info(uuid='27395fd1-e286-473a-b98e-5a50db2a598a')
751 def test_rssi_stability_ch36_VHT80_ActiveTraffic(self):
752 self._test_rssi_stability()
753
754 @test_tracker_info(uuid='6f6b25e3-1a1e-4a61-930a-1d0aa25ba900')
755 def test_rssi_stability_ch40_VHT20_ActiveTraffic(self):
756 self._test_rssi_stability()
757
758 @test_tracker_info(uuid='c6717da7-855c-4c6e-a6e2-ee42b8feaaab')
759 def test_rssi_stability_ch44_VHT20_ActiveTraffic(self):
760 self._test_rssi_stability()
761
762 @test_tracker_info(uuid='2e34f735-079c-4619-9e74-b96dc8d0597f')
763 def test_rssi_stability_ch44_VHT40_ActiveTraffic(self):
764 self._test_rssi_stability()
765
766 @test_tracker_info(uuid='d543c019-1ff5-41d4-9b37-ccdc593f3edd')
767 def test_rssi_stability_ch48_VHT20_ActiveTraffic(self):
768 self._test_rssi_stability()
769
770 @test_tracker_info(uuid='2bb08914-36b2-4f58-9b3e-c3f3f4fac8ab')
771 def test_rssi_stability_ch149_VHT20_ActiveTraffic(self):
772 self._test_rssi_stability()
773
774 @test_tracker_info(uuid='e2f585f5-7811-4570-b987-23da301eb75d')
775 def test_rssi_stability_ch149_VHT40_ActiveTraffic(self):
776 self._test_rssi_stability()
777
778 @test_tracker_info(uuid='f3e74d5b-73f6-4723-abf3-c9c147db08e3')
779 def test_rssi_stability_ch149_VHT80_ActiveTraffic(self):
780 self._test_rssi_stability()
781
782 @test_tracker_info(uuid='06503ed0-baf3-4cd1-ac5e-4124e3c7f52f')
783 def test_rssi_stability_ch153_VHT20_ActiveTraffic(self):
784 self._test_rssi_stability()
785
786 @test_tracker_info(uuid='0cf8286f-a919-4e29-a9f2-e7738a4afe8f')
787 def test_rssi_stability_ch157_VHT20_ActiveTraffic(self):
788 self._test_rssi_stability()
789
790 @test_tracker_info(uuid='f9a0165c-468b-4096-8f4b-cc80bae564a0')
791 def test_rssi_stability_ch157_VHT40_ActiveTraffic(self):
792 self._test_rssi_stability()
793
794 @test_tracker_info(uuid='4b74dd46-4190-4556-8ad8-c55808e9e847')
795 def test_rssi_stability_ch161_VHT20_ActiveTraffic(self):
android-build-prod (mdb)5660fed2018-04-26 21:03:41 -0700796 self._test_rssi_stability()
Omar El Ayach19a55672018-03-09 00:53:12 +0000797
Omar El Ayachb8808082018-03-04 01:05:39 +0000798 @test_tracker_info(uuid='ae54b7cc-d76d-4460-8dcc-2c439265c7c9')
799 def test_rssi_vs_atten_ch1_VHT20_ActiveTraffic(self):
800 self._test_rssi_vs_atten()
801
802 @test_tracker_info(uuid='07fe7899-886d-45ba-9c1d-7daaf9844c9c')
803 def test_rssi_vs_atten_ch2_VHT20_ActiveTraffic(self):
804 self._test_rssi_vs_atten()
805
806 @test_tracker_info(uuid='9e86578b-a6cd-4de9-a79d-eabac5bd5f4e')
807 def test_rssi_vs_atten_ch3_VHT20_ActiveTraffic(self):
808 self._test_rssi_vs_atten()
809
810 @test_tracker_info(uuid='e9d258ca-8e70-408e-b704-782fce7a07c5')
811 def test_rssi_vs_atten_ch4_VHT20_ActiveTraffic(self):
812 self._test_rssi_vs_atten()
813
814 @test_tracker_info(uuid='1c5d71a0-7532-49e4-98a9-1c2d9d8d58d2')
815 def test_rssi_vs_atten_ch5_VHT20_ActiveTraffic(self):
816 self._test_rssi_vs_atten()
817
818 @test_tracker_info(uuid='107f01f3-b6b9-470b-9895-6345edfc9599')
819 def test_rssi_vs_atten_ch6_VHT20_ActiveTraffic(self):
820 self._test_rssi_vs_atten()
821
822 @test_tracker_info(uuid='88cb18b2-30bf-4c01-ac28-15451289e7cd')
823 def test_rssi_vs_atten_ch7_VHT20_ActiveTraffic(self):
824 self._test_rssi_vs_atten()
825
826 @test_tracker_info(uuid='c07a7442-bd1d-40c7-80ed-167e30b8cfaf')
827 def test_rssi_vs_atten_ch8_VHT20_ActiveTraffic(self):
828 self._test_rssi_vs_atten()
829
830 @test_tracker_info(uuid='b8946280-88d5-400d-a417-2bdc9d7e054a')
831 def test_rssi_vs_atten_ch9_VHT20_ActiveTraffic(self):
832 self._test_rssi_vs_atten()
833
834 @test_tracker_info(uuid='a05db91b-740d-4984-a447-79ab438034f0')
835 def test_rssi_vs_atten_ch10_VHT20_ActiveTraffic(self):
836 self._test_rssi_vs_atten()
837
838 @test_tracker_info(uuid='f4d565f8-f060-462c-9b3c-cd1f7d27b3ea')
839 def test_rssi_vs_atten_ch11_VHT20_ActiveTraffic(self):
840 self._test_rssi_vs_atten()
841
Omar El Ayachb8808082018-03-04 01:05:39 +0000842 @test_tracker_info(uuid='a33a93ac-604a-414f-ae96-42dffbe59a93')
843 def test_rssi_vs_atten_ch36_VHT20_ActiveTraffic(self):
844 self._test_rssi_vs_atten()
845
846 @test_tracker_info(uuid='39875ab0-e0e9-464b-8a47-4dedd65f066e')
847 def test_rssi_vs_atten_ch36_VHT40_ActiveTraffic(self):
848 self._test_rssi_vs_atten()
849
850 @test_tracker_info(uuid='c6ff8768-f124-4190-baf2-bbf14b612de3')
851 def test_rssi_vs_atten_ch36_VHT80_ActiveTraffic(self):
852 self._test_rssi_vs_atten()
853
854 @test_tracker_info(uuid='ed4705af-e202-4737-b410-8bab0515e79f')
855 def test_rssi_vs_atten_ch40_VHT20_ActiveTraffic(self):
856 self._test_rssi_vs_atten()
857
858 @test_tracker_info(uuid='1388df99-ecbf-4412-9ded-d66552f37ec5')
859 def test_rssi_vs_atten_ch44_VHT20_ActiveTraffic(self):
860 self._test_rssi_vs_atten()
861
862 @test_tracker_info(uuid='06868677-ad3c-4f50-9b9e-ae8d9455ae4d')
863 def test_rssi_vs_atten_ch44_VHT40_ActiveTraffic(self):
864 self._test_rssi_vs_atten()
865
866 @test_tracker_info(uuid='9b6676de-c736-4603-a9b3-97670bea8f25')
867 def test_rssi_vs_atten_ch48_VHT20_ActiveTraffic(self):
868 self._test_rssi_vs_atten()
869
870 @test_tracker_info(uuid='2641c4b8-0092-4e29-9139-fdb3b3f04d05')
871 def test_rssi_vs_atten_ch149_VHT20_ActiveTraffic(self):
872 self._test_rssi_vs_atten()
873
874 @test_tracker_info(uuid='c8bc3f7d-b459-4e40-9c73-b0bf534c6c08')
875 def test_rssi_vs_atten_ch149_VHT40_ActiveTraffic(self):
876 self._test_rssi_vs_atten()
877
878 @test_tracker_info(uuid='3e08f5b6-9f3c-4905-8b10-82e1ca830cc9')
879 def test_rssi_vs_atten_ch149_VHT80_ActiveTraffic(self):
880 self._test_rssi_vs_atten()
881
882 @test_tracker_info(uuid='2343efe3-fdda-4180-add7-4786d35e29bb')
883 def test_rssi_vs_atten_ch153_VHT20_ActiveTraffic(self):
884 self._test_rssi_vs_atten()
885
886 @test_tracker_info(uuid='89a16974-2399-4356-b720-17b765ff1c3a')
887 def test_rssi_vs_atten_ch157_VHT20_ActiveTraffic(self):
888 self._test_rssi_vs_atten()
889
890 @test_tracker_info(uuid='c8e0e44a-b962-4e71-ba8f-068f268c8823')
891 def test_rssi_vs_atten_ch157_VHT40_ActiveTraffic(self):
892 self._test_rssi_vs_atten()
893
894 @test_tracker_info(uuid='581b5794-239e-4d1c-b0ce-7c6dc5bd373f')
895 def test_rssi_vs_atten_ch161_VHT20_ActiveTraffic(self):
896 self._test_rssi_vs_atten()
Omar El Ayach432f4612018-03-22 02:33:00 +0000897
Omar El Ayachcc951ee2018-06-07 14:21:16 -0700898 @test_tracker_info(uuid='')
899 def test_rssi_tracking_ch161_VHT20_ActiveTraffic(self):
900 self._test_rssi_tracking()
901
902 @test_tracker_info(uuid='')
903 def test_rssi_tracking_ch161_VHT20_NoTraffic(self):
904 self._test_rssi_tracking()
905
Omar El Ayach432f4612018-03-22 02:33:00 +0000906
907class WifiRssi_2GHz_ActiveTraffic_Test(WifiRssiTest):
908 def __init__(self, controllers):
909 base_test.BaseTestClass.__init__(self, controllers)
910 self.tests = ("test_rssi_stability_ch1_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000911 "test_rssi_vs_atten_ch1_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000912 "test_rssi_stability_ch2_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000913 "test_rssi_vs_atten_ch2_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000914 "test_rssi_stability_ch3_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000915 "test_rssi_vs_atten_ch3_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000916 "test_rssi_stability_ch4_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000917 "test_rssi_vs_atten_ch4_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000918 "test_rssi_stability_ch5_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000919 "test_rssi_vs_atten_ch5_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000920 "test_rssi_stability_ch6_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000921 "test_rssi_vs_atten_ch6_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000922 "test_rssi_stability_ch7_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000923 "test_rssi_vs_atten_ch7_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000924 "test_rssi_stability_ch8_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000925 "test_rssi_vs_atten_ch8_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000926 "test_rssi_stability_ch9_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000927 "test_rssi_vs_atten_ch9_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000928 "test_rssi_stability_ch10_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000929 "test_rssi_vs_atten_ch10_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000930 "test_rssi_stability_ch11_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000931 "test_rssi_vs_atten_ch11_VHT20_ActiveTraffic")
932
933
934class WifiRssi_5GHz_ActiveTraffic_Test(WifiRssiTest):
935 def __init__(self, controllers):
936 base_test.BaseTestClass.__init__(self, controllers)
937 self.tests = ("test_rssi_stability_ch36_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000938 "test_rssi_vs_atten_ch36_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000939 "test_rssi_stability_ch36_VHT40_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000940 "test_rssi_vs_atten_ch36_VHT40_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000941 "test_rssi_stability_ch36_VHT80_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000942 "test_rssi_vs_atten_ch36_VHT80_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000943 "test_rssi_stability_ch40_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000944 "test_rssi_vs_atten_ch40_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000945 "test_rssi_stability_ch44_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000946 "test_rssi_vs_atten_ch44_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000947 "test_rssi_stability_ch44_VHT40_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000948 "test_rssi_vs_atten_ch44_VHT40_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000949 "test_rssi_stability_ch48_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000950 "test_rssi_vs_atten_ch48_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000951 "test_rssi_stability_ch149_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000952 "test_rssi_vs_atten_ch149_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000953 "test_rssi_stability_ch149_VHT40_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000954 "test_rssi_vs_atten_ch149_VHT40_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000955 "test_rssi_stability_ch149_VHT80_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000956 "test_rssi_vs_atten_ch149_VHT80_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000957 "test_rssi_stability_ch153_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000958 "test_rssi_vs_atten_ch153_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000959 "test_rssi_stability_ch157_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000960 "test_rssi_vs_atten_ch157_VHT20_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000961 "test_rssi_stability_ch157_VHT40_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000962 "test_rssi_vs_atten_ch157_VHT40_ActiveTraffic",
Omar El Ayach9b84ee12018-03-23 00:01:57 +0000963 "test_rssi_stability_ch161_VHT20_ActiveTraffic",
Omar El Ayach432f4612018-03-22 02:33:00 +0000964 "test_rssi_vs_atten_ch161_VHT20_ActiveTraffic")