• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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