blob: 1c26a90960f9d13277110b92d0ffc013eb83b667 [file] [log] [blame]
Qi Jiang8f9c7582017-09-06 21:00:14 +00001#!/usr/bin/env python3.4
2#
3# Copyright 2017 - The Android Open Source Project
4#
Qi Jiang0f280b02017-10-12 01:31:41 +00005# Licensed under the Apache License, Version 2.0 (the 'License');
Qi Jiang8f9c7582017-09-06 21:00:14 +00006# 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
Qi Jiang0f280b02017-10-12 01:31:41 +000012# distributed under the License is distributed on an 'AS IS' BASIS,
Qi Jiang8f9c7582017-09-06 21:00:14 +000013# 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 logging
18import os
19import time
20from acts import base_test
Qi Jiangc64e51b2018-02-09 04:02:47 +000021from acts import utils
Qi Jiang8f9c7582017-09-06 21:00:14 +000022from acts.controllers.ap_lib import hostapd_constants as hc
23from acts.test_decorators import test_tracker_info
24from acts.test_utils.wifi import wifi_test_utils as wutils
25from acts.test_utils.wifi import wifi_power_test_utils as wputils
26
Qi Jiang0f280b02017-10-12 01:31:41 +000027UNLOCK_SCREEN = 'input keyevent 82'
Qi Jiang8f9c7582017-09-06 21:00:14 +000028
29
30class PowerscanTest(base_test.BaseTestClass):
31 def __init__(self, controllers):
32
33 base_test.BaseTestClass.__init__(self, controllers)
Qi Jiang8f9c7582017-09-06 21:00:14 +000034
35 def setup_class(self):
36
37 self.log = logging.getLogger()
38 self.dut = self.android_devices[0]
39 self.access_point = self.access_points[0]
Qi Jiang9bbaee62018-03-23 00:03:18 +000040 req_params = ['scantest_params', 'custom_files']
Qi Jiang8f9c7582017-09-06 21:00:14 +000041 self.unpack_userparams(req_params)
42 self.unpack_testparams(self.scantest_params)
Qi Jiang0f280b02017-10-12 01:31:41 +000043 self.mon_data_path = os.path.join(self.log_path, 'Monsoon')
Qi Jiang8f9c7582017-09-06 21:00:14 +000044 self.mon = self.monsoons[0]
Qi Jiang8f9c7582017-09-06 21:00:14 +000045 self.mon.set_max_current(8.0)
Qi Jiang0f280b02017-10-12 01:31:41 +000046 self.mon.set_voltage(4.2)
Qi Jiang8f9c7582017-09-06 21:00:14 +000047 self.mon.attach_device(self.dut)
Qi Jiang0f280b02017-10-12 01:31:41 +000048 self.mon_info = wputils.create_monsoon_info(self)
Qi Jiang8f9c7582017-09-06 21:00:14 +000049 self.num_atten = self.attenuators[0].instrument.num_atten
Qi Jiang9bbaee62018-03-23 00:03:18 +000050 for file in self.custom_files:
Qi Jiang6441fb22018-04-19 20:26:27 +000051 if 'pass_fail_threshold' in file:
Qi Jiang9bbaee62018-03-23 00:03:18 +000052 self.threshold_file = file
53 elif 'attenuator_setting' in file:
54 self.attenuation_file = file
55 elif 'network_config' in file:
56 self.network_file = file
57 self.threshold = wputils.unpack_custom_file(self.threshold_file,
58 self.TAG)
59 self.atten_level = wputils.unpack_custom_file(self.attenuation_file,
60 self.TAG)
61 self.networks = wputils.unpack_custom_file(self.network_file)
62 self.main_network = self.networks['main_network']
Qi Jiang8f9c7582017-09-06 21:00:14 +000063
64 def unpack_testparams(self, bulk_params):
65 """Unpack all the test specific parameters.
66
67 Args:
68 bulk_params: dict with all test specific params in the config file
69 """
70 for key in bulk_params.keys():
71 setattr(self, key, bulk_params[key])
72
73 def setup_test(self):
74
75 self.SINGLE_SHOT_SCAN = (
Qi Jiang0f280b02017-10-12 01:31:41 +000076 'am instrument -w -r -e min_scan_count \"700\"'
77 ' -e WifiScanTest-testWifiSingleShotScan %d'
78 ' -e class com.google.android.platform.powertests.'
79 'WifiScanTest#testWifiSingleShotScan'
80 ' com.google.android.platform.powertests/'
81 'android.test.InstrumentationTestRunner > /dev/null &' %
Qi Jiang8f9c7582017-09-06 21:00:14 +000082 (self.mon_duration + self.mon_offset + 10))
83 self.BACKGROUND_SCAN = (
Qi Jiang0f280b02017-10-12 01:31:41 +000084 'am instrument -w -r -e min_scan_count \"1\" -e '
85 'WifiScanTest-testWifiBackgroundScan %d -e class '
86 'com.google.android.platform.powertests.WifiScan'
87 'Test#testWifiBackgroundScan com.google.android.'
88 'platform.powertests/android.test.Instrumentation'
89 'TestRunner > /dev/null &' %
Qi Jiang8f9c7582017-09-06 21:00:14 +000090 (self.mon_duration + self.mon_offset + 10))
91 self.WIFI_SCAN = (
Qi Jiang0f280b02017-10-12 01:31:41 +000092 'am instrument -w -r -e min_scan_count \"1\" -e '
93 'WifiScanTest-testWifiScan %d -e class '
94 'com.google.android.platform.powertests.WifiScanTest#'
95 'testWifiScan com.google.android.platform.powertests/'
96 'android.test.InstrumentationTestRunner > /dev/null &' %
Qi Jiang8f9c7582017-09-06 21:00:14 +000097 (self.mon_duration + self.mon_offset + 10))
98
Qi Jiangf1fbbf32017-11-08 08:47:50 +000099 def teardown_test(self):
100 """Tear down necessary objects after test case is finished.
101
Qi Jiang9279b9a2018-02-07 04:50:29 +0000102 Bring down the AP interface and connect device back online
Qi Jiangf1fbbf32017-11-08 08:47:50 +0000103 """
Qi Jiang9279b9a2018-02-07 04:50:29 +0000104 self.log.info('Tearing down the test case')
Qi Jiang7f6dc982018-02-24 01:29:29 +0000105 self.access_point.bridge.teardown(self.brconfigs)
Qi Jiangf1fbbf32017-11-08 08:47:50 +0000106 self.access_point.close()
Qi Jiang9279b9a2018-02-07 04:50:29 +0000107 self.mon.usb('on')
Qi Jiangf1fbbf32017-11-08 08:47:50 +0000108
Qi Jiang8f9c7582017-09-06 21:00:14 +0000109 def teardown_class(self):
110
Qi Jiang9279b9a2018-02-07 04:50:29 +0000111 self.log.info('Tearing down the test class')
112 self.access_point.close()
Qi Jiang0f280b02017-10-12 01:31:41 +0000113 self.mon.usb('on')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000114
Qi Jiang7f6dc982018-02-24 01:29:29 +0000115 def powrapk_scan_test_func(self, scan_command, band):
Qi Jiang8f9c7582017-09-06 21:00:14 +0000116 """Test function for power.apk triggered scans.
117 Args:
118 scan_command: the adb shell command to trigger scans
119
120 """
Qi Jiang7f6dc982018-02-24 01:29:29 +0000121 network = self.main_network[band]
122 self.brconfigs = wputils.ap_setup(self.access_point, network)
123 self.log.info('Set attenuation to get high RSSI at {}'.format(band))
124 [
125 self.attenuators[i].set_atten(
126 self.atten_level[self.current_test_name][i])
127 for i in range(self.num_atten)
128 ]
Qi Jiang0f280b02017-10-12 01:31:41 +0000129 self.mon_info['offset'] == 0
Qi Jiang8f9c7582017-09-06 21:00:14 +0000130 # Initialize the dut to rock-bottom state
131 wputils.dut_rockbottom(self.dut)
132 wutils.wifi_toggle_state(self.dut, True)
Qi Jiang0f280b02017-10-12 01:31:41 +0000133 self.log.info('Wait for {} seconds'.format(self.settle_wait_time))
Qi Jiang8f9c7582017-09-06 21:00:14 +0000134 time.sleep(self.settle_wait_time)
Qi Jiang0f280b02017-10-12 01:31:41 +0000135 self.log.info('Running power apk command to trigger scans')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000136 self.dut.adb.shell_nb(scan_command)
137 self.dut.droid.goToSleepNow()
138 # Collect power data and plot
Qi Jiangc64e51b2018-02-09 04:02:47 +0000139 begin_time = utils.get_current_epoch_time()
Qi Jiang8f9c7582017-09-06 21:00:14 +0000140 file_path, avg_current = wputils.monsoon_data_collect_save(
Qi Jiangc64e51b2018-02-09 04:02:47 +0000141 self.dut, self.mon_info, self.current_test_name)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000142 wputils.monsoon_data_plot(self.mon_info, file_path)
Qi Jiangc64e51b2018-02-09 04:02:47 +0000143 # Take Bugreport
144 if bool(self.bug_report) == True:
145 self.dut.take_bug_report(self.test_name, begin_time)
Qi Jianga4fcfdc2017-09-18 20:05:26 +0000146 # Path fail check
Qi Jiang8f9c7582017-09-06 21:00:14 +0000147 wputils.pass_fail_check(self, avg_current)
148
149 # Test cases
Qi Jiang0f280b02017-10-12 01:31:41 +0000150 @test_tracker_info(uuid='e5539b01-e208-43c6-bebf-6f1e73d8d8cb')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000151 def test_single_shot_scan_2g_highRSSI(self):
152
Qi Jiang7f6dc982018-02-24 01:29:29 +0000153 self.powrapk_scan_test_func(self.SINGLE_SHOT_SCAN, hc.BAND_2G)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000154
Qi Jiang0f280b02017-10-12 01:31:41 +0000155 @test_tracker_info(uuid='14c5a762-95bc-40ea-9fd4-27126df7d86c')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000156 def test_single_shot_scan_2g_lowRSSI(self):
157
Qi Jiang7f6dc982018-02-24 01:29:29 +0000158 self.powrapk_scan_test_func(self.SINGLE_SHOT_SCAN, hc.BAND_2G)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000159
Qi Jiang0f280b02017-10-12 01:31:41 +0000160 @test_tracker_info(uuid='a6506600-c567-43b5-9c25-86b505099b97')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000161 def test_single_shot_scan_2g_noAP(self):
162
Qi Jiang7f6dc982018-02-24 01:29:29 +0000163 self.powrapk_scan_test_func(self.SINGLE_SHOT_SCAN, hc.BAND_2G)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000164
Qi Jiang0f280b02017-10-12 01:31:41 +0000165 @test_tracker_info(uuid='1a458248-1159-4c8e-a39f-92fc9e69c4dd')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000166 def test_single_shot_scan_5g_highRSSI(self):
167
Qi Jiang7f6dc982018-02-24 01:29:29 +0000168 self.powrapk_scan_test_func(self.SINGLE_SHOT_SCAN, hc.BAND_5G)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000169
Qi Jiang0f280b02017-10-12 01:31:41 +0000170 @test_tracker_info(uuid='bd4da426-a621-4131-9f89-6e5a77f321d2')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000171 def test_single_shot_scan_5g_lowRSSI(self):
172
Qi Jiang7f6dc982018-02-24 01:29:29 +0000173 self.powrapk_scan_test_func(self.SINGLE_SHOT_SCAN, hc.BAND_5G)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000174
Qi Jiang0f280b02017-10-12 01:31:41 +0000175 @test_tracker_info(uuid='288b3add-8925-4803-81c0-53debf157ffc')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000176 def test_single_shot_scan_5g_noAP(self):
177
Qi Jiang7f6dc982018-02-24 01:29:29 +0000178 self.powrapk_scan_test_func(self.SINGLE_SHOT_SCAN, hc.BAND_5G)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000179
Qi Jiang0f280b02017-10-12 01:31:41 +0000180 @test_tracker_info(uuid='f401c66c-e515-4f51-8ef2-2a03470d8ff2')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000181 def test_background_scan(self):
182
Qi Jiang7f6dc982018-02-24 01:29:29 +0000183 self.powrapk_scan_test_func(self.BACKGROUND_SCAN, hc.BAND_5G)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000184
Qi Jiang0f280b02017-10-12 01:31:41 +0000185 @test_tracker_info(uuid='fe38c1c7-937c-42c0-9381-98356639df8f')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000186 def test_wifi_scan_2g(self):
187
Qi Jiang7f6dc982018-02-24 01:29:29 +0000188 self.powrapk_scan_test_func(self.WIFI_SCAN, hc.BAND_2G)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000189
Qi Jiang0f280b02017-10-12 01:31:41 +0000190 @test_tracker_info(uuid='8eedefd1-3a08-4ac2-ba55-5eb438def3d4')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000191 def test_wifi_scan_5g(self):
192
Qi Jiang7f6dc982018-02-24 01:29:29 +0000193 self.powrapk_scan_test_func(self.WIFI_SCAN, hc.BAND_5G)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000194
Qi Jiang0f280b02017-10-12 01:31:41 +0000195 @test_tracker_info(uuid='ff5ea952-ee31-4968-a190-82935ce7a8cb')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000196 def test_scan_wifidisconnected_turnonscreen(self):
197
198 # Initialize the dut to rock-bottom state
199 wputils.dut_rockbottom(self.dut)
200 wutils.wifi_toggle_state(self.dut, True)
201 self.dut.droid.goToSleepNow()
Qi Jiang0f280b02017-10-12 01:31:41 +0000202 self.log.info('Screen is OFF')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000203 time.sleep(5)
204 self.dut.droid.wakeUpNow()
Qi Jiang0f280b02017-10-12 01:31:41 +0000205 self.log.info('Now turn on screen to trigger scans')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000206 self.dut.adb.shell(UNLOCK_SCREEN)
Qi Jiangc64e51b2018-02-09 04:02:47 +0000207 begin_time = utils.get_current_epoch_time()
Qi Jiang8f9c7582017-09-06 21:00:14 +0000208 file_path, avg_current = wputils.monsoon_data_collect_save(
Qi Jiangc64e51b2018-02-09 04:02:47 +0000209 self.dut, self.mon_info, self.current_test_name)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000210 wputils.monsoon_data_plot(self.mon_info, file_path)
Qi Jiangc64e51b2018-02-09 04:02:47 +0000211 # Take Bugreport
212 if bool(self.bug_report) == True:
213 self.dut.take_bug_report(self.test_name, begin_time)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000214 wputils.pass_fail_check(self, avg_current)
215
Qi Jiang0f280b02017-10-12 01:31:41 +0000216 @test_tracker_info(uuid='9a836e5b-8128-4dd2-8e96-e79177810bdd')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000217 def test_scan_wificonnected_turnonscreen(self):
218
219 network = self.main_network[hc.BAND_2G]
Qi Jiang7f6dc982018-02-24 01:29:29 +0000220 self.brconfigs = wputils.ap_setup(self.access_point, network)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000221 # Initialize the dut to rock-bottom state
222 wputils.dut_rockbottom(self.dut)
223 wutils.wifi_toggle_state(self.dut, True)
224 # Set attenuators to connect main AP
225 [
226 self.attenuators[i].set_atten(
227 self.atten_level[self.current_test_name][i])
228 for i in range(self.num_atten)
229 ]
230 wutils.wifi_connect(self.dut, network)
231 time.sleep(10)
232 self.dut.droid.goToSleepNow()
Qi Jiang0f280b02017-10-12 01:31:41 +0000233 self.log.info('Screen is OFF')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000234 time.sleep(5)
235 self.dut.droid.wakeUpNow()
Qi Jiang0f280b02017-10-12 01:31:41 +0000236 self.log.info('Now turn on screen to trigger scans')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000237 self.dut.adb.shell(UNLOCK_SCREEN)
Qi Jiangc64e51b2018-02-09 04:02:47 +0000238 begin_time = utils.get_current_epoch_time()
Qi Jiang8f9c7582017-09-06 21:00:14 +0000239 file_path, avg_current = wputils.monsoon_data_collect_save(
Qi Jiangc64e51b2018-02-09 04:02:47 +0000240 self.dut, self.mon_info, self.current_test_name)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000241 wputils.monsoon_data_plot(self.mon_info, file_path)
Qi Jiangc64e51b2018-02-09 04:02:47 +0000242 # Take Bugreport
243 if bool(self.bug_report) == True:
244 self.dut.take_bug_report(self.test_name, begin_time)
Qi Jianga4fcfdc2017-09-18 20:05:26 +0000245 # Path fail check
Qi Jiang8f9c7582017-09-06 21:00:14 +0000246 wputils.pass_fail_check(self, avg_current)
247
Qi Jiang0f280b02017-10-12 01:31:41 +0000248 @test_tracker_info(uuid='51e3c4f1-742b-45af-afd5-ae3552a03272')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000249 def test_scan_screenoff_below_rssi_threshold(self):
250
251 network = self.main_network[hc.BAND_2G]
Qi Jiang7f6dc982018-02-24 01:29:29 +0000252 self.brconfigs = wputils.ap_setup(self.access_point, network)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000253 # Initialize the dut to rock-bottom state
254 wputils.dut_rockbottom(self.dut)
255 wutils.wifi_toggle_state(self.dut, True)
256 # Set attenuator and add main network to the phone
Qi Jiang0f280b02017-10-12 01:31:41 +0000257 self.log.info('Set attenuation so device connection has medium RSSI')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000258 [
Qi Jiang0f280b02017-10-12 01:31:41 +0000259 self.attenuators[i].set_atten(self.atten_level['zero_atten'][i])
Qi Jiang8f9c7582017-09-06 21:00:14 +0000260 for i in range(self.num_atten)
261 ]
262 wutils.wifi_connect(self.dut, network)
263 self.dut.droid.goToSleepNow()
264 time.sleep(20)
265 # Set attenuator to make RSSI below threshold
Qi Jiang0f280b02017-10-12 01:31:41 +0000266 self.log.info('Set attenuation to drop RSSI below threhold')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000267 [
268 self.attenuators[i].set_atten(
269 self.atten_level[self.current_test_name][i])
270 for i in range(self.num_atten)
271 ]
Qi Jiangc64e51b2018-02-09 04:02:47 +0000272 begin_time = utils.get_current_epoch_time()
Qi Jiang8f9c7582017-09-06 21:00:14 +0000273 file_path, avg_current = wputils.monsoon_data_collect_save(
Qi Jiangc64e51b2018-02-09 04:02:47 +0000274 self.dut, self.mon_info, self.current_test_name)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000275 wputils.monsoon_data_plot(self.mon_info, file_path)
Qi Jiangc64e51b2018-02-09 04:02:47 +0000276 # Take Bugreport
277 if bool(self.bug_report) == True:
278 self.dut.take_bug_report(self.test_name, begin_time)
Qi Jianga4fcfdc2017-09-18 20:05:26 +0000279 # Path fail check
Qi Jiang8f9c7582017-09-06 21:00:14 +0000280 wputils.pass_fail_check(self, avg_current)
281
Qi Jiang0f280b02017-10-12 01:31:41 +0000282 @test_tracker_info(uuid='a16ae337-326f-4d09-990f-42232c3c0dc4')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000283 def test_scan_screenoff_lost_wificonnection(self):
284
285 network = self.main_network[hc.BAND_5G]
Qi Jiang7f6dc982018-02-24 01:29:29 +0000286 self.brconfigs = wputils.ap_setup(self.access_point, network)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000287 # Initialize the dut to rock-bottom state
288 wputils.dut_rockbottom(self.dut)
289 wutils.wifi_toggle_state(self.dut, True)
290 # Set attenuator and add main network to the phone
Qi Jiang0f280b02017-10-12 01:31:41 +0000291 self.log.info('Set attenuation so device connection has medium RSSI')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000292 [
Qi Jiang0f280b02017-10-12 01:31:41 +0000293 self.attenuators[i].set_atten(self.atten_level['zero_atten'][i])
Qi Jiang8f9c7582017-09-06 21:00:14 +0000294 for i in range(self.num_atten)
295 ]
296 wutils.wifi_connect(self.dut, network)
297 self.dut.droid.goToSleepNow()
298 time.sleep(5)
299 # Set attenuator to make RSSI below threshold
Qi Jiang0f280b02017-10-12 01:31:41 +0000300 self.log.info('Set attenuation so device loses connection')
Qi Jiang8f9c7582017-09-06 21:00:14 +0000301 [
302 self.attenuators[i].set_atten(
303 self.atten_level[self.current_test_name][i])
304 for i in range(self.num_atten)
305 ]
Qi Jiangc64e51b2018-02-09 04:02:47 +0000306 begin_time = utils.get_current_epoch_time()
Qi Jiang8f9c7582017-09-06 21:00:14 +0000307 file_path, avg_current = wputils.monsoon_data_collect_save(
Qi Jiangc64e51b2018-02-09 04:02:47 +0000308 self.dut, self.mon_info, self.current_test_name)
Qi Jiang8f9c7582017-09-06 21:00:14 +0000309 wputils.monsoon_data_plot(self.mon_info, file_path)
Qi Jiangc64e51b2018-02-09 04:02:47 +0000310 # Take Bugreport
311 if bool(self.bug_report) == True:
312 self.dut.take_bug_report(self.test_name, begin_time)
Qi Jianga4fcfdc2017-09-18 20:05:26 +0000313 # Path fail check
Qi Jiang8f9c7582017-09-06 21:00:14 +0000314 wputils.pass_fail_check(self, avg_current)