#!/usr/bin/env python3.4 # # Copyright 2016 - The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import math import os from acts.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest from acts.test_utils.tel.tel_defines import WFC_MODE_WIFI_PREFERRED from acts.test_utils.tel.tel_test_utils import call_setup_teardown from acts.test_utils.tel.tel_test_utils import ensure_phone_default_state from acts.test_utils.tel.tel_test_utils import ensure_phones_idle from acts.test_utils.tel.tel_test_utils import ensure_wifi_connected from acts.test_utils.tel.tel_test_utils import is_wfc_enabled from acts.test_utils.tel.tel_test_utils import set_phone_screen_on from acts.test_utils.tel.tel_test_utils import toggle_airplane_mode from acts.test_utils.tel.tel_test_utils import verify_incall_state from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_3g from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_iwlan from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_volte from acts.test_utils.tel.tel_voice_utils import phone_idle_3g from acts.test_utils.tel.tel_voice_utils import phone_idle_iwlan from acts.test_utils.tel.tel_voice_utils import phone_idle_volte from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_3g from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_2g from acts.test_utils.tel.tel_voice_utils import phone_setup_csfb from acts.test_utils.tel.tel_voice_utils import phone_setup_iwlan from acts.test_utils.tel.tel_voice_utils import phone_setup_volte from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_general from acts.utils import create_dir from acts.utils import disable_doze from acts.utils import get_current_human_time from acts.utils import set_adaptive_brightness from acts.utils import set_ambient_display from acts.utils import set_auto_rotate from acts.utils import set_location_service from acts.utils import set_mobile_data_always_on # Monsoon output Voltage in V MONSOON_OUTPUT_VOLTAGE = 4.2 # Monsoon output max current in A MONSOON_MAX_CURRENT = 7.8 # Default power test pass criteria DEFAULT_POWER_PASS_CRITERIA = 999 # Sampling rate in Hz ACTIVE_CALL_TEST_SAMPLING_RATE = 100 # Sample duration in seconds ACTIVE_CALL_TEST_SAMPLE_TIME = 300 # Offset time in seconds ACTIVE_CALL_TEST_OFFSET_TIME = 180 # Sampling rate in Hz IDLE_TEST_SAMPLING_RATE = 100 # Sample duration in seconds IDLE_TEST_SAMPLE_TIME = 2400 # Offset time in seconds IDLE_TEST_OFFSET_TIME = 360 # For wakeup ping test, the frequency to wakeup. In unit of second. WAKEUP_PING_TEST_WAKEUP_FREQ = 60 WAKEUP_PING_TEST_NUMBER_OF_ALARM = math.ceil( (IDLE_TEST_SAMPLE_TIME * 60 + IDLE_TEST_OFFSET_TIME) / WAKEUP_PING_TEST_WAKEUP_FREQ) class TelPowerTest(TelephonyBaseTest): def __init__(self, controllers): TelephonyBaseTest.__init__(self, controllers) self.tests = ( # Note: For all these power tests, please do environment calibration # and baseline for pass criteria. # All pass criteria information should be included in test config file. # The test result will be meaning less if pass criteria is not correct. "test_power_active_call_3g", "test_power_active_call_volte", "test_power_active_call_wfc_2g_apm", "test_power_active_call_wfc_2g_lte_volte_on", "test_power_active_call_wfc_5g_apm", "test_power_active_call_wfc_5g_lte_volte_on", "test_power_idle_baseline", "test_power_idle_baseline_wifi_connected", "test_power_idle_wfc_2g_apm", "test_power_idle_wfc_2g_lte", "test_power_idle_lte_volte_enabled", "test_power_idle_lte_volte_disabled", "test_power_idle_3g", "test_power_idle_lte_volte_enabled_wakeup_ping", "test_power_idle_lte_volte_disabled_wakeup_ping", "test_power_idle_3g_wakeup_ping", # Mobile Data Always On "test_power_mobile_data_always_on_lte", "test_power_mobile_data_always_on_wcdma", "test_power_mobile_data_always_on_gsm", "test_power_mobile_data_always_on_1x", "test_power_mobile_data_always_on_lte_wifi_on", "test_power_mobile_data_always_on_wcdma_wifi_on", "test_power_mobile_data_always_on_gsm_wifi_on", "test_power_mobile_data_always_on_1x_wifi_on" ) def setup_class(self): super().setup_class() self.mon = self.monsoons[0] self.mon.set_voltage(MONSOON_OUTPUT_VOLTAGE) self.mon.set_max_current(MONSOON_MAX_CURRENT) # Monsoon phone self.mon.dut = self.ad = self.android_devices[0] set_adaptive_brightness(self.ad, False) set_ambient_display(self.ad, False) set_auto_rotate(self.ad, False) set_location_service(self.ad, False) # This is not needed for AOSP build disable_doze(self.ad) set_phone_screen_on(self.log, self.ad, 15) self.wifi_network_ssid_2g = self.user_params["wifi_network_ssid_2g"] self.wifi_network_pass_2g = self.user_params["wifi_network_pass_2g"] self.wifi_network_ssid_5g = self.user_params["wifi_network_ssid_5g"] self.wifi_network_pass_5g = self.user_params["wifi_network_pass_5g"] self.monsoon_log_path = os.path.join(self.log_path, "MonsoonLog") create_dir(self.monsoon_log_path) return True def _save_logs_for_power_test(self, test_name, monsoon_result): current_time = get_current_human_time() file_name = "{}_{}".format(test_name, current_time) if "monsoon_log_for_power_test" in self.user_params: monsoon_result.save_to_text_file( [monsoon_result], os.path.join(self.monsoon_log_path, file_name)) if "bug_report_for_power_test" in self.user_params: self.android_devices[0].take_bug_report(test_name, current_time) def _test_power_active_call(self, test_name, test_setup_func, pass_criteria=DEFAULT_POWER_PASS_CRITERIA, phone_check_func_after_power_test=None, *args, **kwargs): average_current = 0 try: ensure_phone_default_state(self.log, self.android_devices[0]) ensure_phone_default_state(self.log, self.android_devices[1]) if not phone_setup_voice_general(self.log, self.android_devices[1]): self.log.error("PhoneB Failed to Set Up Properly.") return False if not test_setup_func(self.android_devices[0], *args, **kwargs): self.log.error("DUT Failed to Set Up Properly.") return False result = self.mon.measure_power( ACTIVE_CALL_TEST_SAMPLING_RATE, ACTIVE_CALL_TEST_SAMPLE_TIME, test_name, ACTIVE_CALL_TEST_OFFSET_TIME ) self._save_logs_for_power_test(test_name, result) average_current = result.average_current if not verify_incall_state(self.log, [self.android_devices[0], self.android_devices[1]], True): self.log.error("Call drop during power test.") return False if ((phone_check_func_after_power_test is not None) and (not phone_check_func_after_power_test( self.log, self.android_devices[0]))): self.log.error( "Phone is not in correct status after power test.") return False return (average_current <= pass_criteria) finally: self.android_devices[1].droid.telecomEndCall() self.log.info("Result: {} mA, pass criteria: {} mA".format( average_current, pass_criteria)) def _test_power_idle(self, test_name, test_setup_func, pass_criteria=DEFAULT_POWER_PASS_CRITERIA, phone_check_func_after_power_test=None, *args, **kwargs): average_current = 0 try: ensure_phone_default_state(self.log, self.android_devices[0]) if not test_setup_func(self.android_devices[0], *args, **kwargs): self.log.error("DUT Failed to Set Up Properly.") return False result = self.mon.measure_power( IDLE_TEST_SAMPLING_RATE, IDLE_TEST_SAMPLE_TIME, test_name, IDLE_TEST_OFFSET_TIME ) self._save_logs_for_power_test(test_name, result) average_current = result.average_current if ((phone_check_func_after_power_test is not None) and (not phone_check_func_after_power_test( self.log, self.android_devices[0]))): self.log.error( "Phone is not in correct status after power test.") return False return (average_current <= pass_criteria) finally: self.log.info("Result: {} mA, pass criteria: {} mA".format( average_current, pass_criteria)) def _start_alarm(self): alarm_id = self.ad.droid.phoneStartRecurringAlarm( WAKEUP_PING_TEST_NUMBER_OF_ALARM, 1000 * WAKEUP_PING_TEST_WAKEUP_FREQ, "PING_GOOGLE", None) if alarm_id is None: self.log.error("Start alarm failed.") return False return True def _setup_phone_idle_and_wakeup_ping(self, ad, phone_setup_func): if not phone_setup_func(self.log, ad): self.log.error("Phone failed to setup {}.".format( phone_setup_func.__name__)) return False if not self._start_alarm(): return False ad.droid.goToSleepNow() return True def _setup_phone_mobile_data_always_on(self, ad, phone_setup_func, connect_wifi, wifi_ssid=None, wifi_password=None, mobile_data_always_on=True): set_mobile_data_always_on(ad, mobile_data_always_on) if not phone_setup_func(self.log, ad): self.log.error("Phone failed to setup {}.".format( phone_setup_func.__name__)) return False if (connect_wifi and not ensure_wifi_connected(self.log, ad, wifi_ssid, wifi_password)): self.log.error("WiFi connect failed") return False # simulate normal user behavior -- wake up every 1 minutes and do ping # (transmit data) if not self._start_alarm(): return False ad.droid.goToSleepNow() return True def _setup_phone_active_call(self, ad, phone_setup_func, phone_idle_check_func, phone_in_call_check_func): if not phone_setup_func(self.log, ad): self.log.error("DUT Failed to Set Up Properly: {}".format( phone_setup_func.__name__)) return False ensure_phones_idle(self.log, [ad, self.android_devices[1]]) if not phone_idle_check_func(self.log, ad): self.log.error("DUT not in correct idle state: {}".format( phone_idle_check_func.__name__)) return False if not call_setup_teardown( self.log, ad, self.android_devices[1], ad_hangup=None, verify_caller_func=phone_in_call_check_func): self.log.error("Setup Call failed.") return False ad.droid.goToSleepNow() return True def _setup_phone_active_call_wfc(self, ad, ssid, password, airplane_mode, wfc_mode, setup_volte=False): if setup_volte and (not phone_setup_volte(self.log, ad)): self.log.error("Phone failed to setup VoLTE.") return False if not phone_setup_iwlan(self.log, ad, airplane_mode, wfc_mode, ssid, password): self.log.error("DUT Failed to Set Up WiFi Calling") return False ensure_phones_idle(self.log, [ad, self.android_devices[1]]) if not phone_idle_iwlan(self.log, ad): self.log.error("DUT not in WFC enabled state.") return False if not call_setup_teardown(self.log, ad, self.android_devices[1], ad_hangup=None, verify_caller_func=is_phone_in_call_iwlan): self.log.error("Setup Call failed.") return False ad.droid.goToSleepNow() return True @TelephonyBaseTest.tel_test_wrap def test_power_active_call_3g(self): """Power measurement test for active CS(3G) call. Steps: 1. DUT idle, in 3G mode. 2. Make a phone Call from DUT to PhoneB. Answer on PhoneB. Make sure DUT is in CS(3G) call. 3. Turn off screen and wait for 3 minutes. Then measure power consumption for 5 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params["pass_criteria_call_3g"][ "pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA return self._test_power_active_call( "test_power_active_call_3g", self._setup_phone_active_call, PASS_CRITERIA, phone_check_func_after_power_test=is_phone_in_call_3g, phone_setup_func=phone_setup_voice_3g, phone_idle_check_func=phone_idle_3g, phone_in_call_check_func=is_phone_in_call_3g) @TelephonyBaseTest.tel_test_wrap def test_power_active_call_volte(self): """Power measurement test for active VoLTE call. Steps: 1. DUT idle, in LTE mode, VoLTE enabled. 2. Make a phone Call from DUT to PhoneB. Answer on PhoneB. Make sure DUT is in VoLTE call. 3. Turn off screen and wait for 3 minutes. Then measure power consumption for 5 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params["pass_criteria_call_volte"][ "pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA return self._test_power_active_call( "test_power_active_call_volte", self._setup_phone_active_call, PASS_CRITERIA, phone_check_func_after_power_test=is_phone_in_call_volte, phone_setup_func=phone_setup_volte, phone_idle_check_func=phone_idle_volte, phone_in_call_check_func=is_phone_in_call_volte) @TelephonyBaseTest.tel_test_wrap def test_power_active_call_wfc_2g_apm(self): """Power measurement test for active WiFi call. Steps: 1. DUT idle, in Airplane mode, connect to 2G WiFi, WiFi Calling enabled (WiFi-preferred mode). 2. Make a phone Call from DUT to PhoneB. Answer on PhoneB. Make sure DUT is in WFC call. 3. Turn off screen and wait for 3 minutes. Then measure power consumption for 5 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_call_wfc_2g_apm"]["pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA return self._test_power_active_call( "test_power_active_call_wfc_2g_apm", self._setup_phone_active_call_wfc, PASS_CRITERIA, phone_check_func_after_power_test=is_phone_in_call_iwlan, ssid=self.wifi_network_ssid_2g, password=self.wifi_network_pass_2g, airplane_mode=True, wfc_mode=WFC_MODE_WIFI_PREFERRED, setup_volte=False) @TelephonyBaseTest.tel_test_wrap def test_power_active_call_wfc_2g_lte_volte_on(self): """Power measurement test for active WiFi call. Steps: 1. DUT idle, LTE cellular data network, VoLTE is On, connect to 2G WiFi, WiFi Calling enabled (WiFi-preferred). 2. Make a phone Call from DUT to PhoneB. Answer on PhoneB. Make sure DUT is in WFC call. 3. Turn off screen and wait for 3 minutes. Then measure power consumption for 5 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_call_wfc_2g_lte_volte_on"]["pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA return self._test_power_active_call( "test_power_active_call_wfc_2g_lte_volte_on", self._setup_phone_active_call_wfc, PASS_CRITERIA, phone_check_func_after_power_test=is_phone_in_call_iwlan, ssid=self.wifi_network_ssid_2g, password=self.wifi_network_pass_2g, airplane_mode=False, wfc_mode=WFC_MODE_WIFI_PREFERRED, setup_volte=True) @TelephonyBaseTest.tel_test_wrap def test_power_active_call_wfc_5g_apm(self): """Power measurement test for active WiFi call. Steps: 1. DUT idle, in Airplane mode, connect to 5G WiFi, WiFi Calling enabled (WiFi-preferred mode). 2. Make a phone Call from DUT to PhoneB. Answer on PhoneB. Make sure DUT is in WFC call. 3. Turn off screen and wait for 3 minutes. Then measure power consumption for 5 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_call_wfc_5g_apm"]["pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA return self._test_power_active_call( "test_power_active_call_wfc_5g_apm", self._setup_phone_active_call_wfc, PASS_CRITERIA, phone_check_func_after_power_test=is_phone_in_call_iwlan, ssid=self.wifi_network_ssid_5g, password=self.wifi_network_pass_5g, airplane_mode=True, wfc_mode=WFC_MODE_WIFI_PREFERRED, setup_volte=False) @TelephonyBaseTest.tel_test_wrap def test_power_active_call_wfc_5g_lte_volte_on(self): """Power measurement test for active WiFi call. Steps: 1. DUT idle, LTE cellular data network, VoLTE is On, connect to 5G WiFi, WiFi Calling enabled (WiFi-preferred). 2. Make a phone Call from DUT to PhoneB. Answer on PhoneB. Make sure DUT is in WFC call. 3. Turn off screen and wait for 3 minutes. Then measure power consumption for 5 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_call_wfc_5g_lte_volte_on"]["pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA return self._test_power_active_call( "test_power_active_call_wfc_5g_lte_volte_on", self._setup_phone_active_call_wfc, PASS_CRITERIA, phone_check_func_after_power_test=is_phone_in_call_iwlan, ssid=self.wifi_network_ssid_5g, password=self.wifi_network_pass_5g, airplane_mode=False, wfc_mode=WFC_MODE_WIFI_PREFERRED, setup_volte=True) @TelephonyBaseTest.tel_test_wrap def test_power_idle_baseline(self): """Power measurement test for phone idle baseline. Steps: 1. DUT idle, in Airplane mode. WiFi disabled, WiFi Calling disabled. 2. Turn off screen and wait for 6 minutes. Then measure power consumption for 40 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_idle_baseline"]["pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA def _idle_baseline(ad): if not toggle_airplane_mode(self.log, ad, True): self.log.error("Phone failed to turn on airplane mode.") return False ad.droid.goToSleepNow() return True return self._test_power_idle("test_power_idle_baseline", _idle_baseline, PASS_CRITERIA) @TelephonyBaseTest.tel_test_wrap def test_power_idle_baseline_wifi_connected(self): """Power measurement test for phone idle baseline (WiFi connected). Steps: 1. DUT idle, in Airplane mode. WiFi connected to 2.4G WiFi, WiFi Calling disabled. 2. Turn off screen and wait for 6 minutes. Then measure power consumption for 40 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_idle_baseline_wifi_connected"]["pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA def _idle_baseline_wifi_connected(ad): if not toggle_airplane_mode(self.log, ad, True): self.log.error("Phone failed to turn on airplane mode.") return False if not ensure_wifi_connected(self.log, ad, self.wifi_network_ssid_2g, self.wifi_network_pass_2g): self.log.error("WiFi connect failed") return False ad.droid.goToSleepNow() return True return self._test_power_idle("test_power_idle_baseline_wifi_connected", _idle_baseline_wifi_connected, PASS_CRITERIA) @TelephonyBaseTest.tel_test_wrap def test_power_idle_wfc_2g_apm(self): """Power measurement test for phone idle WiFi Calling Airplane Mode. Steps: 1. DUT idle, in Airplane mode. Connected to 2G WiFi, WiFi Calling enabled (WiFi preferred). 2. Turn off screen and wait for 6 minutes. Then measure power consumption for 40 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_idle_wfc_2g_apm"]["pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA def _idle_wfc_2g_apm(ad): if not phone_setup_iwlan( self.log, ad, True, WFC_MODE_WIFI_PREFERRED, self.wifi_network_ssid_2g, self.wifi_network_pass_2g): self.log.error("Phone failed to setup WFC.") return False ad.droid.goToSleepNow() return True return self._test_power_idle("test_power_idle_wfc_2g_apm", _idle_wfc_2g_apm, PASS_CRITERIA, is_wfc_enabled) @TelephonyBaseTest.tel_test_wrap def test_power_idle_wfc_2g_lte(self): """Power measurement test for phone idle WiFi Calling LTE VoLTE enabled. Steps: 1. DUT idle, in LTE mode, VoLTE enabled. Connected to 2G WiFi, WiFi Calling enabled (WiFi preferred). 2. Turn off screen and wait for 6 minutes. Then measure power consumption for 40 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_idle_wfc_2g_lte"]["pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA def _idle_wfc_2g_lte(ad): if not phone_setup_volte(self.log, ad): self.log.error("Phone failed to setup VoLTE.") return False if not phone_setup_iwlan( self.log, ad, False, WFC_MODE_WIFI_PREFERRED, self.wifi_network_ssid_2g, self.wifi_network_pass_2g): self.log.error("Phone failed to setup WFC.") return False ad.droid.goToSleepNow() return True return self._test_power_idle("test_power_idle_wfc_2g_lte", _idle_wfc_2g_lte, PASS_CRITERIA, is_wfc_enabled) @TelephonyBaseTest.tel_test_wrap def test_power_idle_lte_volte_enabled(self): """Power measurement test for phone idle LTE VoLTE enabled. Steps: 1. DUT idle, in LTE mode, VoLTE enabled. WiFi disabled, WiFi Calling disabled. 2. Turn off screen and wait for 6 minutes. Then measure power consumption for 40 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_idle_lte_volte_enabled"]["pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA def _idle_lte_volte_enabled(ad): if not phone_setup_volte(self.log, ad): self.log.error("Phone failed to setup VoLTE.") return False ad.droid.goToSleepNow() return True return self._test_power_idle("test_power_idle_lte_volte_enabled", _idle_lte_volte_enabled, PASS_CRITERIA) @TelephonyBaseTest.tel_test_wrap def test_power_idle_lte_volte_disabled(self): """Power measurement test for phone idle LTE VoLTE disabled. Steps: 1. DUT idle, in LTE mode, VoLTE disabled. WiFi disabled, WiFi Calling disabled. 2. Turn off screen and wait for 6 minutes. Then measure power consumption for 40 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_idle_lte_volte_disabled"]["pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA def _idle_lte_volte_disabled(ad): if not phone_setup_csfb(self.log, ad): self.log.error("Phone failed to setup CSFB.") return False ad.droid.goToSleepNow() return True return self._test_power_idle("test_power_idle_lte_volte_disabled", _idle_lte_volte_disabled, PASS_CRITERIA) @TelephonyBaseTest.tel_test_wrap def test_power_idle_3g(self): """Power measurement test for phone idle 3G. Steps: 1. DUT idle, in 3G mode. WiFi disabled, WiFi Calling disabled. 2. Turn off screen and wait for 6 minutes. Then measure power consumption for 40 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params["pass_criteria_idle_3g"][ "pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA def _idle_3g(ad): if not phone_setup_voice_3g(self.log, ad): self.log.error("Phone failed to setup 3g.") return False ad.droid.goToSleepNow() return True return self._test_power_idle("test_power_idle_3g", _idle_3g, PASS_CRITERIA) # TODO: This one is not working right now. Requires SL4A API to start alarm. @TelephonyBaseTest.tel_test_wrap def test_power_idle_lte_volte_enabled_wakeup_ping(self): """Power measurement test for phone LTE VoLTE enabled Wakeup Ping every 1 minute. Steps: 1. DUT idle, in LTE mode, VoLTE enabled. WiFi disabled, WiFi Calling disabled. 2. Start script to wake up AP every 1 minute, after wakeup, DUT send http Request to Google.com then go to sleep. 3. Turn off screen and wait for 6 minutes. Then measure power consumption for 40 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_idle_lte_volte_enabled_wakeup_ping"][ "pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA # TODO: b/26338146 need a SL4A API to clear all existing alarms. result = self._test_power_idle( "test_power_idle_lte_volte_enabled_wakeup_ping", self._setup_phone_idle_and_wakeup_ping, PASS_CRITERIA, phone_setup_func=phone_setup_volte) return result # TODO: This one is not working right now. Requires SL4A API to start alarm. @TelephonyBaseTest.tel_test_wrap def test_power_idle_lte_volte_disabled_wakeup_ping(self): """Power measurement test for phone LTE VoLTE disabled Wakeup Ping every 1 minute. Steps: 1. DUT idle, in LTE mode, VoLTE disabled. WiFi disabled, WiFi Calling disabled. 2. Start script to wake up AP every 1 minute, after wakeup, DUT send http Request to Google.com then go to sleep. 3. Turn off screen and wait for 6 minutes. Then measure power consumption for 40 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_idle_lte_volte_disabled_wakeup_ping"][ "pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA # TODO: b/26338146 need a SL4A API to clear all existing alarms. result = self._test_power_idle( "test_power_idle_lte_volte_disabled_wakeup_ping", self._setup_phone_idle_and_wakeup_ping, PASS_CRITERIA, phone_setup_func=phone_setup_csfb) return result # TODO: This one is not working right now. Requires SL4A API to start alarm. @TelephonyBaseTest.tel_test_wrap def test_power_idle_3g_wakeup_ping(self): """Power measurement test for phone 3G Wakeup Ping every 1 minute. Steps: 1. DUT idle, in 3G mode. WiFi disabled, WiFi Calling disabled. 2. Start script to wake up AP every 1 minute, after wakeup, DUT send http Request to Google.com then go to sleep. 3. Turn off screen and wait for 6 minutes. Then measure power consumption for 40 minutes and get average. Expected Results: Average power consumption should be within pre-defined limit. Returns: True if Pass, False if Fail. Note: Please calibrate your test environment and baseline pass criteria. Pass criteria info should be in test config file. """ try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_idle_3g_wakeup_ping"]["pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA # TODO: b/26338146 need a SL4A API to clear all existing alarms. result = self._test_power_idle("test_power_idle_3g_wakeup_ping", self._setup_phone_idle_and_wakeup_ping, PASS_CRITERIA, phone_setup_func=phone_setup_voice_3g) return result # TODO: This one is not working right now. Requires SL4A API to start alarm. @TelephonyBaseTest.tel_test_wrap def test_power_mobile_data_always_on_lte(self): try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_mobile_data_always_on_lte"]["pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA result = self._test_power_idle("test_power_mobile_data_always_on_lte", self._setup_phone_mobile_data_always_on, PASS_CRITERIA, phone_setup_func=phone_setup_csfb, connect_wifi=False) set_mobile_data_always_on(self.ad, False) return result # TODO: This one is not working right now. Requires SL4A API to start alarm. @TelephonyBaseTest.tel_test_wrap def test_power_mobile_data_always_on_wcdma(self): try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_mobile_data_always_on_wcdma"]["pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA result = self._test_power_idle("test_power_mobile_data_always_on_wcdma", self._setup_phone_mobile_data_always_on, PASS_CRITERIA, phone_setup_func=phone_setup_voice_3g, connect_wifi=False) set_mobile_data_always_on(self.ad, False) return result # TODO: This one is not working right now. Requires SL4A API to start alarm. @TelephonyBaseTest.tel_test_wrap def test_power_mobile_data_always_on_1xevdo(self): try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_mobile_data_always_on_1xevdo"]["pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA result = self._test_power_idle("test_power_mobile_data_always_on_1xevdo", self._setup_phone_mobile_data_always_on, PASS_CRITERIA, phone_setup_func=phone_setup_voice_3g, connect_wifi=False) set_mobile_data_always_on(self.ad, False) return result # TODO: This one is not working right now. Requires SL4A API to start alarm. @TelephonyBaseTest.tel_test_wrap def test_power_mobile_data_always_on_gsm(self): try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_mobile_data_always_on_gsm"]["pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA result = self._test_power_idle("test_power_mobile_data_always_on_gsm", self._setup_phone_mobile_data_always_on, PASS_CRITERIA, phone_setup_func=phone_setup_voice_2g, connect_wifi=False) set_mobile_data_always_on(self.ad, False) return result # TODO: This one is not working right now. Requires SL4A API to start alarm. @TelephonyBaseTest.tel_test_wrap def test_power_mobile_data_always_on_lte_wifi_on(self): try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_mobile_data_always_on_lte_wifi_on"][ "pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA result = self._test_power_idle( "test_power_mobile_data_always_on_lte_wifi_on", self._setup_phone_mobile_data_always_on, PASS_CRITERIA, phone_setup_func=phone_setup_csfb, connect_wifi=True, wifi_ssid=self.wifi_network_ssid_2g, wifi_password=self.wifi_network_pass_2g) set_mobile_data_always_on(self.ad, False) return result # TODO: This one is not working right now. Requires SL4A API to start alarm. @TelephonyBaseTest.tel_test_wrap def test_power_mobile_data_always_on_wcdma_wifi_on(self): try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_mobile_data_always_on_wcdma_wifi_on"][ "pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA result = self._test_power_idle( "test_power_mobile_data_always_on_wcdma_wifi_on", self._setup_phone_mobile_data_always_on, PASS_CRITERIA, phone_setup_func=phone_setup_voice_3g, connect_wifi=True, wifi_ssid=self.wifi_network_ssid_2g, wifi_password=self.wifi_network_pass_2g) set_mobile_data_always_on(self.ad, False) return result # TODO: This one is not working right now. Requires SL4A API to start alarm. @TelephonyBaseTest.tel_test_wrap def test_power_mobile_data_always_on_1xevdo_wifi_on(self): try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_mobile_data_always_on_1xevdo_wifi_on"][ "pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA result = self._test_power_idle( "test_power_mobile_data_always_on_1xevdo_wifi_on", self._setup_phone_mobile_data_always_on, PASS_CRITERIA, phone_setup_func=phone_setup_voice_3g, connect_wifi=True, wifi_ssid=self.wifi_network_ssid_2g, wifi_password=self.wifi_network_pass_2g) set_mobile_data_always_on(self.ad, False) return result # TODO: This one is not working right now. Requires SL4A API to start alarm. @TelephonyBaseTest.tel_test_wrap def test_power_mobile_data_always_on_gsm_wifi_on(self): try: PASS_CRITERIA = int(self.user_params[ "pass_criteria_mobile_data_always_on_gsm_wifi_on"][ "pass_criteria"]) except KeyError: PASS_CRITERIA = DEFAULT_POWER_PASS_CRITERIA result = self._test_power_idle( "test_power_mobile_data_always_on_gsm_wifi_on", self._setup_phone_mobile_data_always_on, PASS_CRITERIA, phone_setup_func=phone_setup_voice_2g, connect_wifi=True, wifi_ssid=self.wifi_network_ssid_2g, wifi_password=self.wifi_network_pass_2g) set_mobile_data_always_on(self.ad, False) return result