Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python3.4 |
| 2 | # |
| 3 | # Copyright 2018 - The Android Open Source Project |
| 4 | # |
| 5 | # Licensed under the Apache License, Version 2.0 (the "License"); |
| 6 | # you may not use this file except in compliance with the License. |
| 7 | # You may obtain a copy of the License at |
| 8 | # |
| 9 | # http://www.apache.org/licenses/LICENSE-2.0 |
| 10 | # |
| 11 | # Unless required by applicable law or agreed to in writing, software |
| 12 | # distributed under the License is distributed on an "AS IS" BASIS, |
| 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 14 | # See the License for the specific language governing permissions and |
| 15 | # limitations under the License. |
| 16 | |
| 17 | import json |
| 18 | import logging |
| 19 | import math |
| 20 | import os |
| 21 | import re |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 22 | import statistics |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 23 | import time |
| 24 | from acts import asserts |
| 25 | from acts import base_test |
| 26 | from acts import utils |
| 27 | from acts.test_decorators import test_tracker_info |
| 28 | from acts.test_utils.wifi import wifi_power_test_utils as wputils |
| 29 | from acts.test_utils.wifi import wifi_retail_ap as retail_ap |
| 30 | from acts.test_utils.wifi import wifi_test_utils as wutils |
| 31 | |
| 32 | SHORT_SLEEP = 1 |
| 33 | MED_SLEEP = 6 |
| 34 | STATION_DUMP = "iw wlan0 station dump" |
| 35 | SCAN = "wpa_cli scan" |
| 36 | SCAN_RESULTS = "wpa_cli scan_results" |
| 37 | SIGNAL_POLL = "wpa_cli signal_poll" |
| 38 | CONST_3dB = 3.01029995664 |
| 39 | RSSI_ERROR_VAL = float("nan") |
| 40 | |
| 41 | |
| 42 | class 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) | 5660fed | 2018-04-26 21:03:41 -0700 | [diff] [blame] | 48 | req_params = ["rssi_test_params", "testbed_params", "main_network"] |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 49 | opt_params = ["RetailAccessPoints"] |
| 50 | self.unpack_userparams(req_params, opt_params) |
Omar El Ayach | 4232d89 | 2018-04-20 16:07:44 -0700 | [diff] [blame] | 51 | self.test_params = self.rssi_test_params |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 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 Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 65 | def pass_fail_check_rssi_stability(self, postprocessed_results): |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 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: |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 73 | postprocessed_results: compiled arrays of RSSI measurements |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 74 | """ |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 75 | test_failed = any([ |
| 76 | stdev > self.test_params["stdev_tolerance"] |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 77 | for stdev in postprocessed_results["signal_poll_rssi"]["stdev"] |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 78 | ]) |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 79 | 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 Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 83 | float("{:.2f}".format(x)) |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 84 | for x in postprocessed_results["signal_poll_rssi"]["stdev"] |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 85 | ], self.test_params["stdev_tolerance"], [ |
| 86 | float("{:.2f}".format(x)) |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 87 | for x in postprocessed_results["chain_0_rssi"]["stdev"] |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 88 | ], [ |
| 89 | float("{:.2f}".format(x)) |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 90 | for x in postprocessed_results["chain_1_rssi"]["stdev"] |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 91 | ])) |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 92 | if test_failed: |
| 93 | asserts.fail(test_message) |
| 94 | asserts.explicit_pass(test_message) |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 95 | |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 96 | def pass_fail_check_rssi_accuracy(self, postprocessed_results, |
| 97 | rssi_under_test, absolute_accuracy): |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 98 | """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 Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 107 | 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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 113 | """ |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 114 | test_failed = False |
| 115 | test_message = "" |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 116 | if absolute_accuracy: |
| 117 | error_type = "absolute" |
| 118 | else: |
| 119 | error_type = "centered" |
| 120 | |
| 121 | for key, val in postprocessed_results.items(): |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 122 | # Compute the error metrics ignoring invalid RSSI readings |
| 123 | # If all readings invalid, set error to RSSI_ERROR_VAL |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 124 | 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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 155 | |
| 156 | if test_failed: |
| 157 | asserts.fail(test_message) |
| 158 | asserts.explicit_pass(test_message) |
| 159 | |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 160 | def post_process_rssi_sweep(self, rssi_result): |
| 161 | """Postprocesses and saves JSON formatted results. |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 162 | |
| 163 | Args: |
| 164 | rssi_result: dict containing attenuation, rssi and other meta |
| 165 | data |
| 166 | Returns: |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 167 | postprocessed_results: compiled arrays of RSSI data used in |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 168 | pass/fail check |
| 169 | """ |
| 170 | # Save output as text file |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 171 | 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 Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 174 | json.dump(rssi_result, results_file, indent=4) |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 175 | # Compile results into arrays of RSSIs suitable for plotting |
| 176 | postprocessed_results = { |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 177 | "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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 184 | } |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 185 | 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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 244 | data_sets = [[ |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 245 | 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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 251 | ], [ |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 252 | 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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 257 | 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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 263 | fig_property = { |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 264 | "title": self.current_test_name, |
| 265 | "x_label": 'Attenuation (dB)', |
| 266 | "y_label": 'RSSI (dBm)', |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 267 | "linewidth": 3, |
| 268 | "markersize": 10 |
| 269 | } |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 270 | output_file_path = "{}/{}.html".format(self.log_path, |
| 271 | self.current_test_name) |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 272 | wputils.bokeh_plot( |
| 273 | data_sets, |
| 274 | legends, |
| 275 | fig_property, |
| 276 | shaded_region=None, |
| 277 | output_file_path=output_file_path) |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 278 | |
| 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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 347 | |
| 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 Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 356 | statistics of the scan RSSI for all BSSIDs in tracked_bssids |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 357 | """ |
| 358 | scan_rssi = {} |
| 359 | for bssid in tracked_bssids: |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 360 | scan_rssi[bssid] = {"data": [], "mean": None, "stdev": None} |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 361 | 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 Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 370 | scan_rssi[bssid]["data"].append(int(bssid_result[2])) |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 371 | else: |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 372 | scan_rssi[bssid]["data"].append(RSSI_ERROR_VAL) |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 373 | # 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 Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 377 | x for x in val["data"] if not math.isnan(x) |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 378 | ] |
| 379 | if filtered_rssi_values: |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 380 | scan_rssi[key]["mean"] = statistics.mean(filtered_rssi_values) |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 381 | 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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 386 | else: |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 387 | scan_rssi[key]["mean"] = RSSI_ERROR_VAL |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 388 | scan_rssi[key]["stdev"] = RSSI_ERROR_VAL |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 389 | 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 Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 402 | statistics |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 403 | """ |
| 404 | connected_rssi = { |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 405 | "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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 425 | } |
| 426 | for idx in range(num_measurements): |
Omar El Ayach | 4232d89 | 2018-04-20 16:07:44 -0700 | [diff] [blame] | 427 | measurement_start_time = time.time() |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 428 | # 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 Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 434 | connected_rssi["signal_poll_rssi"]["data"].append( |
| 435 | RSSI_ERROR_VAL) |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 436 | else: |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 437 | connected_rssi["signal_poll_rssi"]["data"].append( |
| 438 | temp_rssi) |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 439 | else: |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 440 | connected_rssi["signal_poll_rssi"]["data"].append( |
| 441 | RSSI_ERROR_VAL) |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 442 | match = re.search("AVG_RSSI=.*", signal_poll_output) |
| 443 | if match: |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 444 | connected_rssi["signal_poll_avg_rssi"]["data"].append( |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 445 | int(match.group(0).split("=")[1])) |
| 446 | else: |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 447 | connected_rssi["signal_poll_avg_rssi"]["data"].append( |
| 448 | RSSI_ERROR_VAL) |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 449 | # 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 Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 456 | 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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 460 | else: |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 461 | connected_rssi["chain_0_rssi"]["data"].append(RSSI_ERROR_VAL) |
| 462 | connected_rssi["chain_1_rssi"]["data"].append(RSSI_ERROR_VAL) |
Omar El Ayach | 4232d89 | 2018-04-20 16:07:44 -0700 | [diff] [blame] | 463 | measurement_elapsed_time = time.time() - measurement_start_time |
| 464 | time.sleep(max(0, polling_frequency - measurement_elapsed_time)) |
Omar El Ayach | ed1d24b | 2018-04-13 12:49:33 -0700 | [diff] [blame] | 465 | |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 466 | # 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 Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 469 | filtered_rssi_values = [ |
| 470 | x for x in val["data"] if not math.isnan(x) |
| 471 | ] |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 472 | if filtered_rssi_values: |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 473 | connected_rssi[key]["mean"] = statistics.mean( |
| 474 | filtered_rssi_values) |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 475 | if len(filtered_rssi_values) > 1: |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 476 | connected_rssi[key]["stdev"] = statistics.stdev( |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 477 | filtered_rssi_values) |
| 478 | else: |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 479 | connected_rssi[key]["stdev"] = 0 |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 480 | else: |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 481 | connected_rssi[key]["mean"] = RSSI_ERROR_VAL |
| 482 | connected_rssi[key]["stdev"] = RSSI_ERROR_VAL |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 483 | return connected_rssi |
| 484 | |
| 485 | def rssi_test(self, iperf_traffic, connected_measurements, |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 486 | scan_measurements, bssids, polling_frequency, |
| 487 | first_measurement_delay): |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 488 | """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) | 5660fed | 2018-04-26 21:03:41 -0700 | [diff] [blame] | 512 | self.testbed_params["iperf_server_address"], |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 513 | 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 Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 522 | time.sleep(first_measurement_delay) |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 523 | current_rssi = {} |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 524 | current_rssi = self.get_connected_rssi(connected_measurements, |
| 525 | polling_frequency) |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 526 | 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 Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 530 | atten, current_rssi["signal_poll_rssi"]["mean"])) |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 531 | # 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 Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 538 | def rssi_test_func(self, iperf_traffic, connected_measurements, |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 539 | scan_measurements, bssids, polling_frequency, |
| 540 | first_measurement_delay): |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 541 | """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 Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 550 | #Initialize test settings |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 551 | rssi_result = {} |
| 552 | # Configure AP |
| 553 | band = self.access_point.band_lookup_by_channel(self.channel) |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 554 | 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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 562 | 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 Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 576 | time.sleep(MED_SLEEP) |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 577 | # 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) | 5660fed | 2018-04-26 21:03:41 -0700 | [diff] [blame] | 582 | 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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 590 | "fixed_attenuation"][str(self.channel)] |
android-build-prod (mdb) | 198b891 | 2018-05-08 15:15:36 -0700 | [diff] [blame] | 591 | rssi_result["dut_front_end_loss"] = self.testbed_params[ |
| 592 | "dut_front_end_loss"][str(self.channel)] |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 593 | rssi_result["rssi_result"] = self.rssi_test( |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 594 | iperf_traffic, connected_measurements, scan_measurements, bssids, |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 595 | polling_frequency, first_measurement_delay) |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 596 | 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 Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 602 | 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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 604 | """ |
| 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 Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 610 | band = self.access_point.band_lookup_by_channel(self.channel) |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 611 | 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 Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 614 | self.rssi_atten_range = [ |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 615 | self.test_params["rssi_vs_atten_start"] + |
| 616 | x * self.test_params["rssi_vs_atten_step"] |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 617 | for x in range(0, num_atten_steps) |
| 618 | ] |
| 619 | rssi_result = self.rssi_test_func( |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 620 | 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) | 5660fed | 2018-04-26 21:03:41 -0700 | [diff] [blame] | 623 | [self.main_network[band]["BSSID"]], |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 624 | 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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 630 | |
| 631 | def _test_rssi_stability(self): |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 632 | """ Function that gets called for each test case of rssi_stability |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 633 | |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 634 | 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 Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 643 | self.rssi_atten_range = self.test_params["rssi_stability_atten"] |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 644 | connected_measurements = int( |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 645 | self.test_params["rssi_stability_duration"] / |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 646 | self.test_params["polling_frequency"]) |
| 647 | rssi_result = self.rssi_test_func( |
android-build-prod (mdb) | 5660fed | 2018-04-26 21:03:41 -0700 | [diff] [blame] | 648 | self.iperf_traffic, connected_measurements, 0, |
| 649 | [self.main_network[band]["BSSID"]], |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 650 | 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 Ayach | 19a5567 | 2018-03-09 00:53:12 +0000 | [diff] [blame] | 697 | |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 698 | @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) | 5660fed | 2018-04-26 21:03:41 -0700 | [diff] [blame] | 796 | self._test_rssi_stability() |
Omar El Ayach | 19a5567 | 2018-03-09 00:53:12 +0000 | [diff] [blame] | 797 | |
Omar El Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 798 | @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 Ayach | b880808 | 2018-03-04 01:05:39 +0000 | [diff] [blame] | 842 | @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 Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 897 | |
Omar El Ayach | cc951ee | 2018-06-07 14:21:16 -0700 | [diff] [blame^] | 898 | @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 Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 906 | |
| 907 | class 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 Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 911 | "test_rssi_vs_atten_ch1_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 912 | "test_rssi_stability_ch2_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 913 | "test_rssi_vs_atten_ch2_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 914 | "test_rssi_stability_ch3_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 915 | "test_rssi_vs_atten_ch3_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 916 | "test_rssi_stability_ch4_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 917 | "test_rssi_vs_atten_ch4_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 918 | "test_rssi_stability_ch5_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 919 | "test_rssi_vs_atten_ch5_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 920 | "test_rssi_stability_ch6_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 921 | "test_rssi_vs_atten_ch6_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 922 | "test_rssi_stability_ch7_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 923 | "test_rssi_vs_atten_ch7_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 924 | "test_rssi_stability_ch8_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 925 | "test_rssi_vs_atten_ch8_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 926 | "test_rssi_stability_ch9_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 927 | "test_rssi_vs_atten_ch9_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 928 | "test_rssi_stability_ch10_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 929 | "test_rssi_vs_atten_ch10_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 930 | "test_rssi_stability_ch11_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 931 | "test_rssi_vs_atten_ch11_VHT20_ActiveTraffic") |
| 932 | |
| 933 | |
| 934 | class 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 Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 938 | "test_rssi_vs_atten_ch36_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 939 | "test_rssi_stability_ch36_VHT40_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 940 | "test_rssi_vs_atten_ch36_VHT40_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 941 | "test_rssi_stability_ch36_VHT80_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 942 | "test_rssi_vs_atten_ch36_VHT80_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 943 | "test_rssi_stability_ch40_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 944 | "test_rssi_vs_atten_ch40_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 945 | "test_rssi_stability_ch44_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 946 | "test_rssi_vs_atten_ch44_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 947 | "test_rssi_stability_ch44_VHT40_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 948 | "test_rssi_vs_atten_ch44_VHT40_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 949 | "test_rssi_stability_ch48_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 950 | "test_rssi_vs_atten_ch48_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 951 | "test_rssi_stability_ch149_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 952 | "test_rssi_vs_atten_ch149_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 953 | "test_rssi_stability_ch149_VHT40_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 954 | "test_rssi_vs_atten_ch149_VHT40_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 955 | "test_rssi_stability_ch149_VHT80_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 956 | "test_rssi_vs_atten_ch149_VHT80_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 957 | "test_rssi_stability_ch153_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 958 | "test_rssi_vs_atten_ch153_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 959 | "test_rssi_stability_ch157_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 960 | "test_rssi_vs_atten_ch157_VHT20_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 961 | "test_rssi_stability_ch157_VHT40_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 962 | "test_rssi_vs_atten_ch157_VHT40_ActiveTraffic", |
Omar El Ayach | 9b84ee1 | 2018-03-23 00:01:57 +0000 | [diff] [blame] | 963 | "test_rssi_stability_ch161_VHT20_ActiveTraffic", |
Omar El Ayach | 432f461 | 2018-03-22 02:33:00 +0000 | [diff] [blame] | 964 | "test_rssi_vs_atten_ch161_VHT20_ActiveTraffic") |