1#!/usr/bin/env python3.4 2# 3# Copyright 2016 - 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 math 18import os 19from acts.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest 20from acts.test_utils.tel.tel_defines import WFC_MODE_WIFI_PREFERRED 21from acts.test_utils.tel.tel_test_utils import call_setup_teardown 22from acts.test_utils.tel.tel_test_utils import ensure_phone_default_state 23from acts.test_utils.tel.tel_test_utils import ensure_phones_idle 24from acts.test_utils.tel.tel_test_utils import ensure_wifi_connected 25from acts.test_utils.tel.tel_test_utils import is_wfc_enabled 26from acts.test_utils.tel.tel_test_utils import set_phone_screen_on 27from acts.test_utils.tel.tel_test_utils import toggle_airplane_mode 28from acts.test_utils.tel.tel_test_utils import verify_incall_state 29from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_3g 30from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_iwlan 31from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_volte 32from acts.test_utils.tel.tel_voice_utils import phone_idle_3g 33from acts.test_utils.tel.tel_voice_utils import phone_idle_iwlan 34from acts.test_utils.tel.tel_voice_utils import phone_idle_volte 35from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_3g 36from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_2g 37from acts.test_utils.tel.tel_voice_utils import phone_setup_csfb 38from acts.test_utils.tel.tel_voice_utils import phone_setup_iwlan 39from acts.test_utils.tel.tel_voice_utils import phone_setup_volte 40from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_general 41from acts.utils import create_dir 42from acts.utils import disable_doze 43from acts.utils import get_current_human_time 44from acts.utils import set_adaptive_brightness 45from acts.utils import set_ambient_display 46from acts.utils import set_auto_rotate 47from acts.utils import set_location_service 48from acts.utils import set_mobile_data_always_on 49 50# Monsoon output Voltage in V 51MONSOON_OUTPUT_VOLTAGE = 4.2 52# Monsoon output max current in A 53MONSOON_MAX_CURRENT = 7.8 54 55# Default power test pass criteria 56DEFAULT_POWER_PASS_CRITERIA = 999 57 58# Sampling rate in Hz 59ACTIVE_CALL_TEST_SAMPLING_RATE = 100 60# Sample duration in seconds 61ACTIVE_CALL_TEST_SAMPLE_TIME = 300 62# Offset time in seconds 63ACTIVE_CALL_TEST_OFFSET_TIME = 180 64 65# Sampling rate in Hz 66IDLE_TEST_SAMPLING_RATE = 100 67# Sample duration in seconds 68IDLE_TEST_SAMPLE_TIME = 2400 69# Offset time in seconds 70IDLE_TEST_OFFSET_TIME = 360 71 72# For wakeup ping test, the frequency to wakeup. In unit of second. 73WAKEUP_PING_TEST_WAKEUP_FREQ = 60 74 75WAKEUP_PING_TEST_NUMBER_OF_ALARM = math.ceil( 76 (IDLE_TEST_SAMPLE_TIME * 60 + IDLE_TEST_OFFSET_TIME) / 77 WAKEUP_PING_TEST_WAKEUP_FREQ) 78 79 80class TelPowerTest(TelephonyBaseTest): 81 def __init__(self, controllers): 82 TelephonyBaseTest.__init__(self, controllers) 83 self.tests = ( 84 # Note: For all these power tests, please do environment calibration 85 # and baseline for pass criteria. 86 # All pass criteria information should be included in test config file. 87 # The test result will be meaning less if pass criteria is not correct. 88 "test_power_active_call_3g", 89 "test_power_active_call_volte", 90 "test_power_active_call_wfc_2g_apm", 91 "test_power_active_call_wfc_2g_lte_volte_on", 92 "test_power_active_call_wfc_5g_apm", 93 "test_power_active_call_wfc_5g_lte_volte_on", 94 "test_power_idle_baseline", 95 "test_power_idle_baseline_wifi_connected", 96 "test_power_idle_wfc_2g_apm", 97 "test_power_idle_wfc_2g_lte", 98 "test_power_idle_lte_volte_enabled", 99 "test_power_idle_lte_volte_disabled", 100 "test_power_idle_3g", 101 "test_power_idle_lte_volte_enabled_wakeup_ping", 102 "test_power_idle_lte_volte_disabled_wakeup_ping", 103 "test_power_idle_3g_wakeup_ping", 104 105 # Mobile Data Always On 106 "test_power_mobile_data_always_on_lte", 107 "test_power_mobile_data_always_on_wcdma", 108 "test_power_mobile_data_always_on_gsm", 109 "test_power_mobile_data_always_on_1x", 110 "test_power_mobile_data_always_on_lte_wifi_on", 111 "test_power_mobile_data_always_on_wcdma_wifi_on", 112 "test_power_mobile_data_always_on_gsm_wifi_on", 113 "test_power_mobile_data_always_on_1x_wifi_on" 114 ) 115 116 def setup_class(self): 117 super().setup_class() 118 self.mon = self.monsoons[0] 119 self.mon.set_voltage(MONSOON_OUTPUT_VOLTAGE) 120 self.mon.set_max_current(MONSOON_MAX_CURRENT) 121 # Monsoon phone 122 self.mon.dut = self.ad = self.android_devices[0] 123 set_adaptive_brightness(self.ad, False) 124 set_ambient_display(self.ad, False) 125 set_auto_rotate(self.ad, False) 126 set_location_service(self.ad, False) 127 # This is not needed for AOSP build 128 disable_doze(self.ad) 129 set_phone_screen_on(self.log, self.ad, 15) 130 131 self.wifi_network_ssid_2g = self.user_params["wifi_network_ssid_2g"] 132 self.wifi_network_pass_2g = self.user_params["wifi_network_pass_2g"] 133 self.wifi_network_ssid_5g = self.user_params["wifi_network_ssid_5g"] 134 self.wifi_network_pass_5g = self.user_params["wifi_network_pass_5g"] 135 136 self.monsoon_log_path = os.path.join(self.log_path, "MonsoonLog") 137 create_dir(self.monsoon_log_path) 138 return True 139 140 def _save_logs_for_power_test(self, test_name, monsoon_result): 141 current_time = get_current_human_time() 142 file_name = "{}_{}".format(test_name, current_time) 143 if "monsoon_log_for_power_test" in self.user_params: 144 monsoon_result.save_to_text_file( 145 [monsoon_result], 146 os.path.join(self.monsoon_log_path, file_name)) 147 if "bug_report_for_power_test" in self.user_params: 148 self.android_devices[0].take_bug_report(test_name, current_time) 149 150 def _test_power_active_call(self, 151 test_name, 152 test_setup_func, 153 pass_criteria=DEFAULT_POWER_PASS_CRITERIA, 154 phone_check_func_after_power_test=None, 155 *args, 156 **kwargs): 157 average_current = 0 158 try: 159 ensure_phone_default_state(self.log, self.android_devices[0]) 160 ensure_phone_default_state(self.log, self.android_devices[1]) 161 if not phone_setup_voice_general(self.log, 162 self.android_devices[1]): 163 self.log.error("PhoneB Failed to Set Up Properly.") 164 return False 165 if not test_setup_func(self.android_devices[0], *args, **kwargs): 166 self.log.error("DUT Failed to Set Up Properly.") 167 return False 168 result = self.mon.measure_power( 169 ACTIVE_CALL_TEST_SAMPLING_RATE, 170 ACTIVE_CALL_TEST_SAMPLE_TIME, 171 test_name, 172 ACTIVE_CALL_TEST_OFFSET_TIME 173 ) 174 self._save_logs_for_power_test(test_name, result) 175 average_current = result.average_current 176 if not verify_incall_state(self.log, [self.android_devices[0], 177 self.android_devices[1]], 178 True): 179 self.log.error("Call drop during power test.") 180 return False 181 if ((phone_check_func_after_power_test is not None) and 182 (not phone_check_func_after_power_test( 183 self.log, self.android_devices[0]))): 184 self.log.error( 185 "Phone is not in correct status after power test.") 186 return False 187 return (average_current <= pass_criteria) 188 finally: 189 self.android_devices[1].droid.telecomEndCall() 190 self.log.info("Result: {} mA, pass criteria: {} mA".format( 191 average_current, pass_criteria)) 192 193 def _test_power_idle(self, 194 test_name, 195 test_setup_func, 196 pass_criteria=DEFAULT_POWER_PASS_CRITERIA, 197 phone_check_func_after_power_test=None, 198 *args, 199 **kwargs): 200 average_current = 0 201 try: 202 ensure_phone_default_state(self.log, self.android_devices[0]) 203 if not test_setup_func(self.android_devices[0], *args, **kwargs): 204 self.log.error("DUT Failed to Set Up Properly.") 205 return False 206 result = self.mon.measure_power( 207 IDLE_TEST_SAMPLING_RATE, 208 IDLE_TEST_SAMPLE_TIME, 209 test_name, 210 IDLE_TEST_OFFSET_TIME 211 ) 212 self._save_logs_for_power_test(test_name, result) 213 average_current = result.average_current 214 if ((phone_check_func_after_power_test is not None) and 215 (not phone_check_func_after_power_test( 216 self.log, self.android_devices[0]))): 217 self.log.error( 218 "Phone is not in correct status after power test.") 219 return False 220 return (average_current <= pass_criteria) 221 finally: 222 self.log.info("Result: {} mA, pass criteria: {} mA".format( 223 average_current, pass_criteria)) 224 225 def _start_alarm(self): 226 alarm_id = self.ad.droid.phoneStartRecurringAlarm( 227 WAKEUP_PING_TEST_NUMBER_OF_ALARM, 228 1000 * WAKEUP_PING_TEST_WAKEUP_FREQ, "PING_GOOGLE", None) 229 if alarm_id is None: 230 self.log.error("Start alarm failed.") 231 return False 232 return True 233 234 def _setup_phone_idle_and_wakeup_ping(self, ad, phone_setup_func): 235 if not phone_setup_func(self.log, ad): 236 self.log.error("Phone failed to setup {}.".format( 237 phone_setup_func.__name__)) 238 return False 239 if not self._start_alarm(): 240 return False 241 ad.droid.goToSleepNow() 242 return True 243 244 def _setup_phone_mobile_data_always_on(self, ad, phone_setup_func, 245 connect_wifi, 246 wifi_ssid=None, 247 wifi_password=None, 248 mobile_data_always_on=True): 249 set_mobile_data_always_on(ad, mobile_data_always_on) 250 if not phone_setup_func(self.log, ad): 251 self.log.error("Phone failed to setup {}.".format( 252 phone_setup_func.__name__)) 253 return False 254 if (connect_wifi and 255 not ensure_wifi_connected(self.log, ad, wifi_ssid, wifi_password)): 256 self.log.error("WiFi connect failed") 257 return False 258 # simulate normal user behavior -- wake up every 1 minutes and do ping 259 # (transmit data) 260 if not self._start_alarm(): 261 return False 262 ad.droid.goToSleepNow() 263 return True 264 265 def _setup_phone_active_call(self, ad, phone_setup_func, 266 phone_idle_check_func, 267 phone_in_call_check_func): 268 if not phone_setup_func(self.log, ad): 269 self.log.error("DUT Failed to Set Up Properly: {}".format( 270 phone_setup_func.__name__)) 271 return False 272 ensure_phones_idle(self.log, [ad, self.android_devices[1]]) 273 if not phone_idle_check_func(self.log, ad): 274 self.log.error("DUT not in correct idle state: {}".format( 275 phone_idle_check_func.__name__)) 276 return False 277 if not call_setup_teardown( 278 self.log, 279 ad, 280 self.android_devices[1], 281 ad_hangup=None, 282 verify_caller_func=phone_in_call_check_func): 283 self.log.error("Setup Call failed.") 284 return False 285 ad.droid.goToSleepNow() 286 return True 287 288 def _setup_phone_active_call_wfc(self, 289 ad, 290 ssid, 291 password, 292 airplane_mode, 293 wfc_mode, 294 setup_volte=False): 295 if setup_volte and (not phone_setup_volte(self.log, ad)): 296 self.log.error("Phone failed to setup VoLTE.") 297 return False 298 if not phone_setup_iwlan(self.log, ad, airplane_mode, wfc_mode, ssid, 299 password): 300 self.log.error("DUT Failed to Set Up WiFi Calling") 301 return False 302 ensure_phones_idle(self.log, [ad, self.android_devices[1]]) 303 if not phone_idle_iwlan(self.log, ad): 304 self.log.error("DUT not in WFC enabled state.") 305 return False 306 if not call_setup_teardown(self.log, 307 ad, 308 self.android_devices[1], 309 ad_hangup=None, 310 verify_caller_func=is_phone_in_call_iwlan): 311 self.log.error("Setup Call failed.") 312 return False 313 ad.droid.goToSleepNow() 314 return True 315 316 @TelephonyBaseTest.tel_test_wrap 317 def test_power_active_call_3g(self): 318 """Power measurement test for active CS(3G) call. 319 320 Steps: 321 1. DUT idle, in 3G mode. 322 2. Make a phone Call from DUT to PhoneB. Answer on PhoneB. 323 Make sure DUT is in CS(3G) call. 324 3. Turn off screen and wait for 3 minutes. 325 Then measure power consumption for 5 minutes and get average. 326 327 Expected Results: 328 Average power consumption should be within pre-defined limit. 329 330 Returns: 331 True if Pass, False if Fail. 332 333 Note: Please calibrate your test environment and baseline pass criteria. 334 Pass criteria info should be in test config file. 335 """ 336 try: 337 PASS_CRITERIA = int(self.user_params["pass_criteria_call_3g"][ 338 "pass_criteria"]) 339 except KeyError: 340 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 341 342 return self._test_power_active_call( 343 "test_power_active_call_3g", 344 self._setup_phone_active_call, 345 PASS_CRITERIA, 346 phone_check_func_after_power_test=is_phone_in_call_3g, 347 phone_setup_func=phone_setup_voice_3g, 348 phone_idle_check_func=phone_idle_3g, 349 phone_in_call_check_func=is_phone_in_call_3g) 350 351 @TelephonyBaseTest.tel_test_wrap 352 def test_power_active_call_volte(self): 353 """Power measurement test for active VoLTE call. 354 355 Steps: 356 1. DUT idle, in LTE mode, VoLTE enabled. 357 2. Make a phone Call from DUT to PhoneB. Answer on PhoneB. 358 Make sure DUT is in VoLTE call. 359 3. Turn off screen and wait for 3 minutes. 360 Then measure power consumption for 5 minutes and get average. 361 362 Expected Results: 363 Average power consumption should be within pre-defined limit. 364 365 Returns: 366 True if Pass, False if Fail. 367 368 Note: Please calibrate your test environment and baseline pass criteria. 369 Pass criteria info should be in test config file. 370 """ 371 try: 372 PASS_CRITERIA = int(self.user_params["pass_criteria_call_volte"][ 373 "pass_criteria"]) 374 except KeyError: 375 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 376 377 return self._test_power_active_call( 378 "test_power_active_call_volte", 379 self._setup_phone_active_call, 380 PASS_CRITERIA, 381 phone_check_func_after_power_test=is_phone_in_call_volte, 382 phone_setup_func=phone_setup_volte, 383 phone_idle_check_func=phone_idle_volte, 384 phone_in_call_check_func=is_phone_in_call_volte) 385 386 @TelephonyBaseTest.tel_test_wrap 387 def test_power_active_call_wfc_2g_apm(self): 388 """Power measurement test for active WiFi call. 389 390 Steps: 391 1. DUT idle, in Airplane mode, connect to 2G WiFi, 392 WiFi Calling enabled (WiFi-preferred mode). 393 2. Make a phone Call from DUT to PhoneB. Answer on PhoneB. 394 Make sure DUT is in WFC call. 395 3. Turn off screen and wait for 3 minutes. 396 Then measure power consumption for 5 minutes and get average. 397 398 Expected Results: 399 Average power consumption should be within pre-defined limit. 400 401 Returns: 402 True if Pass, False if Fail. 403 404 Note: Please calibrate your test environment and baseline pass criteria. 405 Pass criteria info should be in test config file. 406 """ 407 try: 408 PASS_CRITERIA = int(self.user_params[ 409 "pass_criteria_call_wfc_2g_apm"]["pass_criteria"]) 410 except KeyError: 411 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 412 413 return self._test_power_active_call( 414 "test_power_active_call_wfc_2g_apm", 415 self._setup_phone_active_call_wfc, 416 PASS_CRITERIA, 417 phone_check_func_after_power_test=is_phone_in_call_iwlan, 418 ssid=self.wifi_network_ssid_2g, 419 password=self.wifi_network_pass_2g, 420 airplane_mode=True, 421 wfc_mode=WFC_MODE_WIFI_PREFERRED, 422 setup_volte=False) 423 424 @TelephonyBaseTest.tel_test_wrap 425 def test_power_active_call_wfc_2g_lte_volte_on(self): 426 """Power measurement test for active WiFi call. 427 428 Steps: 429 1. DUT idle, LTE cellular data network, VoLTE is On, connect to 2G WiFi, 430 WiFi Calling enabled (WiFi-preferred). 431 2. Make a phone Call from DUT to PhoneB. Answer on PhoneB. 432 Make sure DUT is in WFC call. 433 3. Turn off screen and wait for 3 minutes. 434 Then measure power consumption for 5 minutes and get average. 435 436 Expected Results: 437 Average power consumption should be within pre-defined limit. 438 439 Returns: 440 True if Pass, False if Fail. 441 442 Note: Please calibrate your test environment and baseline pass criteria. 443 Pass criteria info should be in test config file. 444 """ 445 try: 446 PASS_CRITERIA = int(self.user_params[ 447 "pass_criteria_call_wfc_2g_lte_volte_on"]["pass_criteria"]) 448 except KeyError: 449 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 450 451 return self._test_power_active_call( 452 "test_power_active_call_wfc_2g_lte_volte_on", 453 self._setup_phone_active_call_wfc, 454 PASS_CRITERIA, 455 phone_check_func_after_power_test=is_phone_in_call_iwlan, 456 ssid=self.wifi_network_ssid_2g, 457 password=self.wifi_network_pass_2g, 458 airplane_mode=False, 459 wfc_mode=WFC_MODE_WIFI_PREFERRED, 460 setup_volte=True) 461 462 @TelephonyBaseTest.tel_test_wrap 463 def test_power_active_call_wfc_5g_apm(self): 464 """Power measurement test for active WiFi call. 465 466 Steps: 467 1. DUT idle, in Airplane mode, connect to 5G WiFi, 468 WiFi Calling enabled (WiFi-preferred mode). 469 2. Make a phone Call from DUT to PhoneB. Answer on PhoneB. 470 Make sure DUT is in WFC call. 471 3. Turn off screen and wait for 3 minutes. 472 Then measure power consumption for 5 minutes and get average. 473 474 Expected Results: 475 Average power consumption should be within pre-defined limit. 476 477 Returns: 478 True if Pass, False if Fail. 479 480 Note: Please calibrate your test environment and baseline pass criteria. 481 Pass criteria info should be in test config file. 482 """ 483 try: 484 PASS_CRITERIA = int(self.user_params[ 485 "pass_criteria_call_wfc_5g_apm"]["pass_criteria"]) 486 except KeyError: 487 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 488 489 return self._test_power_active_call( 490 "test_power_active_call_wfc_5g_apm", 491 self._setup_phone_active_call_wfc, 492 PASS_CRITERIA, 493 phone_check_func_after_power_test=is_phone_in_call_iwlan, 494 ssid=self.wifi_network_ssid_5g, 495 password=self.wifi_network_pass_5g, 496 airplane_mode=True, 497 wfc_mode=WFC_MODE_WIFI_PREFERRED, 498 setup_volte=False) 499 500 @TelephonyBaseTest.tel_test_wrap 501 def test_power_active_call_wfc_5g_lte_volte_on(self): 502 """Power measurement test for active WiFi call. 503 504 Steps: 505 1. DUT idle, LTE cellular data network, VoLTE is On, connect to 5G WiFi, 506 WiFi Calling enabled (WiFi-preferred). 507 2. Make a phone Call from DUT to PhoneB. Answer on PhoneB. 508 Make sure DUT is in WFC call. 509 3. Turn off screen and wait for 3 minutes. 510 Then measure power consumption for 5 minutes and get average. 511 512 Expected Results: 513 Average power consumption should be within pre-defined limit. 514 515 Returns: 516 True if Pass, False if Fail. 517 518 Note: Please calibrate your test environment and baseline pass criteria. 519 Pass criteria info should be in test config file. 520 """ 521 522 try: 523 PASS_CRITERIA = int(self.user_params[ 524 "pass_criteria_call_wfc_5g_lte_volte_on"]["pass_criteria"]) 525 except KeyError: 526 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 527 528 return self._test_power_active_call( 529 "test_power_active_call_wfc_5g_lte_volte_on", 530 self._setup_phone_active_call_wfc, 531 PASS_CRITERIA, 532 phone_check_func_after_power_test=is_phone_in_call_iwlan, 533 ssid=self.wifi_network_ssid_5g, 534 password=self.wifi_network_pass_5g, 535 airplane_mode=False, 536 wfc_mode=WFC_MODE_WIFI_PREFERRED, 537 setup_volte=True) 538 539 @TelephonyBaseTest.tel_test_wrap 540 def test_power_idle_baseline(self): 541 """Power measurement test for phone idle baseline. 542 543 Steps: 544 1. DUT idle, in Airplane mode. WiFi disabled, WiFi Calling disabled. 545 2. Turn off screen and wait for 6 minutes. Then measure power 546 consumption for 40 minutes and get average. 547 548 Expected Results: 549 Average power consumption should be within pre-defined limit. 550 551 Returns: 552 True if Pass, False if Fail. 553 554 Note: Please calibrate your test environment and baseline pass criteria. 555 Pass criteria info should be in test config file. 556 """ 557 try: 558 PASS_CRITERIA = int(self.user_params[ 559 "pass_criteria_idle_baseline"]["pass_criteria"]) 560 except KeyError: 561 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 562 563 def _idle_baseline(ad): 564 if not toggle_airplane_mode(self.log, ad, True): 565 self.log.error("Phone failed to turn on airplane mode.") 566 return False 567 ad.droid.goToSleepNow() 568 return True 569 570 return self._test_power_idle("test_power_idle_baseline", 571 _idle_baseline, PASS_CRITERIA) 572 573 @TelephonyBaseTest.tel_test_wrap 574 def test_power_idle_baseline_wifi_connected(self): 575 """Power measurement test for phone idle baseline (WiFi connected). 576 577 Steps: 578 1. DUT idle, in Airplane mode. WiFi connected to 2.4G WiFi, 579 WiFi Calling disabled. 580 2. Turn off screen and wait for 6 minutes. Then measure power 581 consumption for 40 minutes and get average. 582 583 Expected Results: 584 Average power consumption should be within pre-defined limit. 585 586 Returns: 587 True if Pass, False if Fail. 588 589 Note: Please calibrate your test environment and baseline pass criteria. 590 Pass criteria info should be in test config file. 591 """ 592 try: 593 PASS_CRITERIA = int(self.user_params[ 594 "pass_criteria_idle_baseline_wifi_connected"]["pass_criteria"]) 595 except KeyError: 596 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 597 598 def _idle_baseline_wifi_connected(ad): 599 if not toggle_airplane_mode(self.log, ad, True): 600 self.log.error("Phone failed to turn on airplane mode.") 601 return False 602 if not ensure_wifi_connected(self.log, ad, 603 self.wifi_network_ssid_2g, self.wifi_network_pass_2g): 604 self.log.error("WiFi connect failed") 605 return False 606 ad.droid.goToSleepNow() 607 return True 608 609 return self._test_power_idle("test_power_idle_baseline_wifi_connected", 610 _idle_baseline_wifi_connected, 611 PASS_CRITERIA) 612 613 @TelephonyBaseTest.tel_test_wrap 614 def test_power_idle_wfc_2g_apm(self): 615 """Power measurement test for phone idle WiFi Calling Airplane Mode. 616 617 Steps: 618 1. DUT idle, in Airplane mode. Connected to 2G WiFi, 619 WiFi Calling enabled (WiFi preferred). 620 2. Turn off screen and wait for 6 minutes. Then measure power 621 consumption for 40 minutes and get average. 622 623 Expected Results: 624 Average power consumption should be within pre-defined limit. 625 626 Returns: 627 True if Pass, False if Fail. 628 629 Note: Please calibrate your test environment and baseline pass criteria. 630 Pass criteria info should be in test config file. 631 """ 632 try: 633 PASS_CRITERIA = int(self.user_params[ 634 "pass_criteria_idle_wfc_2g_apm"]["pass_criteria"]) 635 except KeyError: 636 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 637 638 def _idle_wfc_2g_apm(ad): 639 if not phone_setup_iwlan( 640 self.log, ad, True, WFC_MODE_WIFI_PREFERRED, 641 self.wifi_network_ssid_2g, self.wifi_network_pass_2g): 642 self.log.error("Phone failed to setup WFC.") 643 return False 644 ad.droid.goToSleepNow() 645 return True 646 647 return self._test_power_idle("test_power_idle_wfc_2g_apm", 648 _idle_wfc_2g_apm, PASS_CRITERIA, 649 is_wfc_enabled) 650 651 @TelephonyBaseTest.tel_test_wrap 652 def test_power_idle_wfc_2g_lte(self): 653 """Power measurement test for phone idle WiFi Calling LTE VoLTE enabled. 654 655 Steps: 656 1. DUT idle, in LTE mode, VoLTE enabled. Connected to 2G WiFi, 657 WiFi Calling enabled (WiFi preferred). 658 2. Turn off screen and wait for 6 minutes. Then measure power 659 consumption for 40 minutes and get average. 660 661 Expected Results: 662 Average power consumption should be within pre-defined limit. 663 664 Returns: 665 True if Pass, False if Fail. 666 667 Note: Please calibrate your test environment and baseline pass criteria. 668 Pass criteria info should be in test config file. 669 """ 670 try: 671 PASS_CRITERIA = int(self.user_params[ 672 "pass_criteria_idle_wfc_2g_lte"]["pass_criteria"]) 673 except KeyError: 674 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 675 676 def _idle_wfc_2g_lte(ad): 677 if not phone_setup_volte(self.log, ad): 678 self.log.error("Phone failed to setup VoLTE.") 679 return False 680 if not phone_setup_iwlan( 681 self.log, ad, False, WFC_MODE_WIFI_PREFERRED, 682 self.wifi_network_ssid_2g, self.wifi_network_pass_2g): 683 self.log.error("Phone failed to setup WFC.") 684 return False 685 ad.droid.goToSleepNow() 686 return True 687 688 return self._test_power_idle("test_power_idle_wfc_2g_lte", 689 _idle_wfc_2g_lte, PASS_CRITERIA, 690 is_wfc_enabled) 691 692 @TelephonyBaseTest.tel_test_wrap 693 def test_power_idle_lte_volte_enabled(self): 694 """Power measurement test for phone idle LTE VoLTE enabled. 695 696 Steps: 697 1. DUT idle, in LTE mode, VoLTE enabled. WiFi disabled, 698 WiFi Calling disabled. 699 2. Turn off screen and wait for 6 minutes. Then measure power 700 consumption for 40 minutes and get average. 701 702 Expected Results: 703 Average power consumption should be within pre-defined limit. 704 705 Returns: 706 True if Pass, False if Fail. 707 708 Note: Please calibrate your test environment and baseline pass criteria. 709 Pass criteria info should be in test config file. 710 """ 711 try: 712 PASS_CRITERIA = int(self.user_params[ 713 "pass_criteria_idle_lte_volte_enabled"]["pass_criteria"]) 714 except KeyError: 715 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 716 717 def _idle_lte_volte_enabled(ad): 718 if not phone_setup_volte(self.log, ad): 719 self.log.error("Phone failed to setup VoLTE.") 720 return False 721 ad.droid.goToSleepNow() 722 return True 723 724 return self._test_power_idle("test_power_idle_lte_volte_enabled", 725 _idle_lte_volte_enabled, PASS_CRITERIA) 726 727 @TelephonyBaseTest.tel_test_wrap 728 def test_power_idle_lte_volte_disabled(self): 729 """Power measurement test for phone idle LTE VoLTE disabled. 730 731 Steps: 732 1. DUT idle, in LTE mode, VoLTE disabled. WiFi disabled, 733 WiFi Calling disabled. 734 2. Turn off screen and wait for 6 minutes. Then measure power 735 consumption for 40 minutes and get average. 736 737 Expected Results: 738 Average power consumption should be within pre-defined limit. 739 740 Returns: 741 True if Pass, False if Fail. 742 743 Note: Please calibrate your test environment and baseline pass criteria. 744 Pass criteria info should be in test config file. 745 """ 746 try: 747 PASS_CRITERIA = int(self.user_params[ 748 "pass_criteria_idle_lte_volte_disabled"]["pass_criteria"]) 749 except KeyError: 750 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 751 752 def _idle_lte_volte_disabled(ad): 753 if not phone_setup_csfb(self.log, ad): 754 self.log.error("Phone failed to setup CSFB.") 755 return False 756 ad.droid.goToSleepNow() 757 return True 758 759 return self._test_power_idle("test_power_idle_lte_volte_disabled", 760 _idle_lte_volte_disabled, PASS_CRITERIA) 761 762 @TelephonyBaseTest.tel_test_wrap 763 def test_power_idle_3g(self): 764 """Power measurement test for phone idle 3G. 765 766 Steps: 767 1. DUT idle, in 3G mode. WiFi disabled, WiFi Calling disabled. 768 2. Turn off screen and wait for 6 minutes. Then measure power 769 consumption for 40 minutes and get average. 770 771 Expected Results: 772 Average power consumption should be within pre-defined limit. 773 774 Returns: 775 True if Pass, False if Fail. 776 777 Note: Please calibrate your test environment and baseline pass criteria. 778 Pass criteria info should be in test config file. 779 """ 780 try: 781 PASS_CRITERIA = int(self.user_params["pass_criteria_idle_3g"][ 782 "pass_criteria"]) 783 except KeyError: 784 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 785 786 def _idle_3g(ad): 787 if not phone_setup_voice_3g(self.log, ad): 788 self.log.error("Phone failed to setup 3g.") 789 return False 790 ad.droid.goToSleepNow() 791 return True 792 793 return self._test_power_idle("test_power_idle_3g", _idle_3g, 794 PASS_CRITERIA) 795 796 # TODO: This one is not working right now. Requires SL4A API to start alarm. 797 @TelephonyBaseTest.tel_test_wrap 798 def test_power_idle_lte_volte_enabled_wakeup_ping(self): 799 """Power measurement test for phone LTE VoLTE enabled Wakeup Ping every 800 1 minute. 801 802 Steps: 803 1. DUT idle, in LTE mode, VoLTE enabled. WiFi disabled, 804 WiFi Calling disabled. 805 2. Start script to wake up AP every 1 minute, after wakeup, 806 DUT send http Request to Google.com then go to sleep. 807 3. Turn off screen and wait for 6 minutes. Then measure power 808 consumption for 40 minutes and get average. 809 810 Expected Results: 811 Average power consumption should be within pre-defined limit. 812 813 Returns: 814 True if Pass, False if Fail. 815 816 Note: Please calibrate your test environment and baseline pass criteria. 817 Pass criteria info should be in test config file. 818 """ 819 try: 820 PASS_CRITERIA = int(self.user_params[ 821 "pass_criteria_idle_lte_volte_enabled_wakeup_ping"][ 822 "pass_criteria"]) 823 except KeyError: 824 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 825 # TODO: b/26338146 need a SL4A API to clear all existing alarms. 826 827 result = self._test_power_idle( 828 "test_power_idle_lte_volte_enabled_wakeup_ping", 829 self._setup_phone_idle_and_wakeup_ping, 830 PASS_CRITERIA, 831 phone_setup_func=phone_setup_volte) 832 return result 833 834 # TODO: This one is not working right now. Requires SL4A API to start alarm. 835 @TelephonyBaseTest.tel_test_wrap 836 def test_power_idle_lte_volte_disabled_wakeup_ping(self): 837 """Power measurement test for phone LTE VoLTE disabled Wakeup Ping every 838 1 minute. 839 840 Steps: 841 1. DUT idle, in LTE mode, VoLTE disabled. WiFi disabled, 842 WiFi Calling disabled. 843 2. Start script to wake up AP every 1 minute, after wakeup, 844 DUT send http Request to Google.com then go to sleep. 845 3. Turn off screen and wait for 6 minutes. Then measure power 846 consumption for 40 minutes and get average. 847 848 Expected Results: 849 Average power consumption should be within pre-defined limit. 850 851 Returns: 852 True if Pass, False if Fail. 853 854 Note: Please calibrate your test environment and baseline pass criteria. 855 Pass criteria info should be in test config file. 856 """ 857 try: 858 PASS_CRITERIA = int(self.user_params[ 859 "pass_criteria_idle_lte_volte_disabled_wakeup_ping"][ 860 "pass_criteria"]) 861 except KeyError: 862 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 863 # TODO: b/26338146 need a SL4A API to clear all existing alarms. 864 865 result = self._test_power_idle( 866 "test_power_idle_lte_volte_disabled_wakeup_ping", 867 self._setup_phone_idle_and_wakeup_ping, 868 PASS_CRITERIA, 869 phone_setup_func=phone_setup_csfb) 870 return result 871 872 # TODO: This one is not working right now. Requires SL4A API to start alarm. 873 @TelephonyBaseTest.tel_test_wrap 874 def test_power_idle_3g_wakeup_ping(self): 875 """Power measurement test for phone 3G Wakeup Ping every 1 minute. 876 877 Steps: 878 1. DUT idle, in 3G mode. WiFi disabled, WiFi Calling disabled. 879 2. Start script to wake up AP every 1 minute, after wakeup, 880 DUT send http Request to Google.com then go to sleep. 881 3. Turn off screen and wait for 6 minutes. Then measure power 882 consumption for 40 minutes and get average. 883 884 Expected Results: 885 Average power consumption should be within pre-defined limit. 886 887 Returns: 888 True if Pass, False if Fail. 889 890 Note: Please calibrate your test environment and baseline pass criteria. 891 Pass criteria info should be in test config file. 892 """ 893 try: 894 PASS_CRITERIA = int(self.user_params[ 895 "pass_criteria_idle_3g_wakeup_ping"]["pass_criteria"]) 896 except KeyError: 897 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 898 # TODO: b/26338146 need a SL4A API to clear all existing alarms. 899 900 result = self._test_power_idle("test_power_idle_3g_wakeup_ping", 901 self._setup_phone_idle_and_wakeup_ping, 902 PASS_CRITERIA, 903 phone_setup_func=phone_setup_voice_3g) 904 return result 905 906 # TODO: This one is not working right now. Requires SL4A API to start alarm. 907 @TelephonyBaseTest.tel_test_wrap 908 def test_power_mobile_data_always_on_lte(self): 909 try: 910 PASS_CRITERIA = int(self.user_params[ 911 "pass_criteria_mobile_data_always_on_lte"]["pass_criteria"]) 912 except KeyError: 913 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 914 result = self._test_power_idle("test_power_mobile_data_always_on_lte", 915 self._setup_phone_mobile_data_always_on, 916 PASS_CRITERIA, 917 phone_setup_func=phone_setup_csfb, 918 connect_wifi=False) 919 set_mobile_data_always_on(self.ad, False) 920 return result 921 922 # TODO: This one is not working right now. Requires SL4A API to start alarm. 923 @TelephonyBaseTest.tel_test_wrap 924 def test_power_mobile_data_always_on_wcdma(self): 925 try: 926 PASS_CRITERIA = int(self.user_params[ 927 "pass_criteria_mobile_data_always_on_wcdma"]["pass_criteria"]) 928 except KeyError: 929 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 930 result = self._test_power_idle("test_power_mobile_data_always_on_wcdma", 931 self._setup_phone_mobile_data_always_on, 932 PASS_CRITERIA, 933 phone_setup_func=phone_setup_voice_3g, 934 connect_wifi=False) 935 set_mobile_data_always_on(self.ad, False) 936 return result 937 938 # TODO: This one is not working right now. Requires SL4A API to start alarm. 939 @TelephonyBaseTest.tel_test_wrap 940 def test_power_mobile_data_always_on_1xevdo(self): 941 try: 942 PASS_CRITERIA = int(self.user_params[ 943 "pass_criteria_mobile_data_always_on_1xevdo"]["pass_criteria"]) 944 except KeyError: 945 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 946 result = self._test_power_idle("test_power_mobile_data_always_on_1xevdo", 947 self._setup_phone_mobile_data_always_on, 948 PASS_CRITERIA, 949 phone_setup_func=phone_setup_voice_3g, 950 connect_wifi=False) 951 set_mobile_data_always_on(self.ad, False) 952 return result 953 954 # TODO: This one is not working right now. Requires SL4A API to start alarm. 955 @TelephonyBaseTest.tel_test_wrap 956 def test_power_mobile_data_always_on_gsm(self): 957 try: 958 PASS_CRITERIA = int(self.user_params[ 959 "pass_criteria_mobile_data_always_on_gsm"]["pass_criteria"]) 960 except KeyError: 961 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 962 result = self._test_power_idle("test_power_mobile_data_always_on_gsm", 963 self._setup_phone_mobile_data_always_on, 964 PASS_CRITERIA, 965 phone_setup_func=phone_setup_voice_2g, 966 connect_wifi=False) 967 set_mobile_data_always_on(self.ad, False) 968 return result 969 970 # TODO: This one is not working right now. Requires SL4A API to start alarm. 971 @TelephonyBaseTest.tel_test_wrap 972 def test_power_mobile_data_always_on_lte_wifi_on(self): 973 try: 974 PASS_CRITERIA = int(self.user_params[ 975 "pass_criteria_mobile_data_always_on_lte_wifi_on"][ 976 "pass_criteria"]) 977 except KeyError: 978 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 979 result = self._test_power_idle( 980 "test_power_mobile_data_always_on_lte_wifi_on", 981 self._setup_phone_mobile_data_always_on, 982 PASS_CRITERIA, 983 phone_setup_func=phone_setup_csfb, 984 connect_wifi=True, 985 wifi_ssid=self.wifi_network_ssid_2g, 986 wifi_password=self.wifi_network_pass_2g) 987 set_mobile_data_always_on(self.ad, False) 988 return result 989 990 # TODO: This one is not working right now. Requires SL4A API to start alarm. 991 @TelephonyBaseTest.tel_test_wrap 992 def test_power_mobile_data_always_on_wcdma_wifi_on(self): 993 try: 994 PASS_CRITERIA = int(self.user_params[ 995 "pass_criteria_mobile_data_always_on_wcdma_wifi_on"][ 996 "pass_criteria"]) 997 except KeyError: 998 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 999 result = self._test_power_idle( 1000 "test_power_mobile_data_always_on_wcdma_wifi_on", 1001 self._setup_phone_mobile_data_always_on, 1002 PASS_CRITERIA, 1003 phone_setup_func=phone_setup_voice_3g, 1004 connect_wifi=True, 1005 wifi_ssid=self.wifi_network_ssid_2g, 1006 wifi_password=self.wifi_network_pass_2g) 1007 set_mobile_data_always_on(self.ad, False) 1008 return result 1009 1010 # TODO: This one is not working right now. Requires SL4A API to start alarm. 1011 @TelephonyBaseTest.tel_test_wrap 1012 def test_power_mobile_data_always_on_1xevdo_wifi_on(self): 1013 try: 1014 PASS_CRITERIA = int(self.user_params[ 1015 "pass_criteria_mobile_data_always_on_1xevdo_wifi_on"][ 1016 "pass_criteria"]) 1017 except KeyError: 1018 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 1019 result = self._test_power_idle( 1020 "test_power_mobile_data_always_on_1xevdo_wifi_on", 1021 self._setup_phone_mobile_data_always_on, 1022 PASS_CRITERIA, 1023 phone_setup_func=phone_setup_voice_3g, 1024 connect_wifi=True, 1025 wifi_ssid=self.wifi_network_ssid_2g, 1026 wifi_password=self.wifi_network_pass_2g) 1027 set_mobile_data_always_on(self.ad, False) 1028 return result 1029 1030 # TODO: This one is not working right now. Requires SL4A API to start alarm. 1031 @TelephonyBaseTest.tel_test_wrap 1032 def test_power_mobile_data_always_on_gsm_wifi_on(self): 1033 try: 1034 PASS_CRITERIA = int(self.user_params[ 1035 "pass_criteria_mobile_data_always_on_gsm_wifi_on"][ 1036 "pass_criteria"]) 1037 except KeyError: 1038 PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA 1039 result = self._test_power_idle( 1040 "test_power_mobile_data_always_on_gsm_wifi_on", 1041 self._setup_phone_mobile_data_always_on, 1042 PASS_CRITERIA, 1043 phone_setup_func=phone_setup_voice_2g, 1044 connect_wifi=True, 1045 wifi_ssid=self.wifi_network_ssid_2g, 1046 wifi_password=self.wifi_network_pass_2g) 1047 set_mobile_data_always_on(self.ad, False) 1048 return result 1049