• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python3.4
2#
3#   Copyright 2016 - Google
4#
5#   Licensed under the Apache License, Version 2.0 (the "License");
6#   you may not use this file except in compliance with the License.
7#   You may obtain a copy of the License at
8#
9#       http://www.apache.org/licenses/LICENSE-2.0
10#
11#   Unless required by applicable law or agreed to in writing, software
12#   distributed under the License is distributed on an "AS IS" BASIS,
13#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14#   See the License for the specific language governing permissions and
15#   limitations under the License.
16"""
17    Test Script for epdg RF shield box related tests.
18"""
19
20import time
21from queue import Empty
22from acts.test_decorators import test_tracker_info
23from acts.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
24from acts.test_utils.tel.tel_atten_utils import set_rssi
25from acts.test_utils.tel.tel_defines import CELL_STRONG_RSSI_VALUE
26from acts.test_utils.tel.tel_defines import CELL_WEAK_RSSI_VALUE
27from acts.test_utils.tel.tel_defines import DIRECTION_MOBILE_ORIGINATED
28from acts.test_utils.tel.tel_defines import DIRECTION_MOBILE_TERMINATED
29from acts.test_utils.tel.tel_defines import GEN_3G
30from acts.test_utils.tel.tel_defines import GEN_4G
31from acts.test_utils.tel.tel_defines import INVALID_WIFI_RSSI
32from acts.test_utils.tel.tel_defines import MAX_WAIT_TIME_CALL_DROP
33from acts.test_utils.tel.tel_defines import MAX_WAIT_TIME_NW_SELECTION
34from acts.test_utils.tel.tel_defines import MAX_RSSI_RESERVED_VALUE
35from acts.test_utils.tel.tel_defines import MIN_RSSI_RESERVED_VALUE
36from acts.test_utils.tel.tel_defines import NETWORK_SERVICE_DATA
37from acts.test_utils.tel.tel_defines import NETWORK_SERVICE_VOICE
38from acts.test_utils.tel.tel_defines import PRECISE_CALL_STATE_LISTEN_LEVEL_BACKGROUND
39from acts.test_utils.tel.tel_defines import PRECISE_CALL_STATE_LISTEN_LEVEL_FOREGROUND
40from acts.test_utils.tel.tel_defines import PRECISE_CALL_STATE_LISTEN_LEVEL_RINGING
41from acts.test_utils.tel.tel_defines import RAT_LTE
42from acts.test_utils.tel.tel_defines import RAT_IWLAN
43from acts.test_utils.tel.tel_defines import RAT_WCDMA
44from acts.test_utils.tel.tel_defines import WAIT_TIME_BETWEEN_REG_AND_CALL
45from acts.test_utils.tel.tel_defines import WAIT_TIME_IN_CALL
46from acts.test_utils.tel.tel_defines import WAIT_TIME_WIFI_RSSI_CALIBRATION_SCREEN_ON
47from acts.test_utils.tel.tel_defines import WAIT_TIME_WIFI_RSSI_CALIBRATION_WIFI_CONNECTED
48from acts.test_utils.tel.tel_defines import WFC_MODE_CELLULAR_PREFERRED
49from acts.test_utils.tel.tel_defines import WFC_MODE_DISABLED
50from acts.test_utils.tel.tel_defines import WFC_MODE_WIFI_ONLY
51from acts.test_utils.tel.tel_defines import WFC_MODE_WIFI_PREFERRED
52from acts.test_utils.tel.tel_defines import WIFI_WEAK_RSSI_VALUE
53from acts.test_utils.tel.tel_defines import EventNetworkCallback
54from acts.test_utils.tel.tel_defines import NetworkCallbackAvailable
55from acts.test_utils.tel.tel_defines import NetworkCallbackLost
56from acts.test_utils.tel.tel_defines import SignalStrengthContainer
57from acts.test_utils.tel.tel_test_utils import wifi_toggle_state
58from acts.test_utils.tel.tel_test_utils import ensure_network_generation
59from acts.test_utils.tel.tel_test_utils import ensure_phones_default_state
60from acts.test_utils.tel.tel_test_utils import ensure_wifi_connected
61from acts.test_utils.tel.tel_test_utils import get_network_rat
62from acts.test_utils.tel.tel_test_utils import get_phone_number
63from acts.test_utils.tel.tel_test_utils import hangup_call
64from acts.test_utils.tel.tel_test_utils import initiate_call
65from acts.test_utils.tel.tel_test_utils import is_network_call_back_event_match
66from acts.test_utils.tel.tel_test_utils import is_phone_in_call
67from acts.test_utils.tel.tel_test_utils import is_phone_not_in_call
68from acts.test_utils.tel.tel_test_utils import set_wfc_mode
69from acts.test_utils.tel.tel_test_utils import toggle_airplane_mode
70from acts.test_utils.tel.tel_test_utils import toggle_volte
71from acts.test_utils.tel.tel_test_utils import wait_and_answer_call
72from acts.test_utils.tel.tel_test_utils import wait_for_cell_data_connection
73from acts.test_utils.tel.tel_test_utils import wait_for_droid_not_in_call
74from acts.test_utils.tel.tel_test_utils import wait_for_wfc_disabled
75from acts.test_utils.tel.tel_test_utils import wait_for_wfc_enabled
76from acts.test_utils.tel.tel_test_utils import wait_for_wifi_data_connection
77from acts.test_utils.tel.tel_test_utils import verify_http_connection
78from acts.test_utils.tel.tel_test_utils import get_telephony_signal_strength
79from acts.test_utils.tel.tel_test_utils import get_wifi_signal_strength
80from acts.test_utils.tel.tel_test_utils import wait_for_state
81from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_3g
82from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_csfb
83from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_iwlan
84from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_not_iwlan
85from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_volte
86from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_general
87from acts.test_utils.tel.tel_voice_utils import phone_idle_3g
88from acts.test_utils.tel.tel_voice_utils import phone_idle_csfb
89from acts.test_utils.tel.tel_voice_utils import phone_idle_iwlan
90from acts.test_utils.tel.tel_voice_utils import phone_idle_not_iwlan
91from acts.test_utils.tel.tel_voice_utils import phone_idle_volte
92
93# Attenuator name
94ATTEN_NAME_FOR_WIFI_2G = 'wifi0'
95ATTEN_NAME_FOR_WIFI_5G = 'wifi1'
96ATTEN_NAME_FOR_CELL_3G = 'cell0'
97ATTEN_NAME_FOR_CELL_4G = 'cell1'
98
99# WiFi RSSI settings for ROVE_IN test
100WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN = -60
101WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_NOT_ROVE_IN = -70
102
103# WiFi RSSI settings for ROVE_OUT test
104WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_INITIAL_STATE = -60
105WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_NOT_ROVE_OUT = -70
106WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT = -90
107
108# WiFi RSSI settings for HAND_IN test
109WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_NOT_HAND_IN = -80
110WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN = -50
111
112# WiFi RSSI settings for HAND_OUT test
113WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_NOT_HAND_OUT = -60
114WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_HAND_OUT = -85
115
116
117class TelWifiVoiceTest(TelephonyBaseTest):
118    def __init__(self, controllers):
119        TelephonyBaseTest.__init__(self, controllers)
120        self.stress_test_number = self.get_stress_test_number()
121
122        self.attens = {}
123        for atten in self.attenuators:
124            self.attens[atten.path] = atten
125            atten.set_atten(atten.get_max_atten())  # Default all attens to max
126
127    def setup_class(self):
128
129        super().setup_class()
130
131        self.log.info("WFC phone: <{}> <{}>".format(
132            self.android_devices[0].serial,
133            get_phone_number(self.log, self.android_devices[0])))
134        self.android_devices[
135            0].droid.telephonyStartTrackingSignalStrengthChange()
136
137        for ad in self.android_devices:
138            if not wait_for_state(ad.droid.imsIsVolteProvisionedOnDevice,
139                                  True):
140                ad.log.info("VoLTE not Provisioned, Turning it ON")
141                ad.droid.imsSetVolteProvisioning(True)
142            else:
143                ad.log.info("VoLTE Provisioning is Enabled")
144
145        # Do WiFi RSSI calibration.
146        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G], 0,
147                 MAX_RSSI_RESERVED_VALUE)
148        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 0,
149                 MAX_RSSI_RESERVED_VALUE)
150        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 0,
151                 MAX_RSSI_RESERVED_VALUE)
152        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 0,
153                 MAX_RSSI_RESERVED_VALUE)
154
155        if not ensure_network_generation(
156                self.log,
157                self.android_devices[0],
158                GEN_4G,
159                voice_or_data=NETWORK_SERVICE_DATA,
160                toggle_apm_after_setting=True):
161            self.log.error("Setup_class: phone failed to select to LTE.")
162            return False
163        if not ensure_wifi_connected(self.log, self.android_devices[0],
164                                     self.wifi_network_ssid,
165                                     self.wifi_network_pass):
166            self.log.error("{} connect WiFI failed".format(
167                self.android_devices[0].serial))
168            return False
169        if (not wait_for_wifi_data_connection(self.log,
170                                              self.android_devices[0], True) or
171                not verify_http_connection(self.log, self.android_devices[0])):
172            self.log.error("No Data on Wifi")
173            return False
174
175        # Delay WAIT_TIME_WIFI_RSSI_CALIBRATION_WIFI_CONNECTED after WiFi
176        # Connected to make sure WiFi RSSI reported value is correct.
177        time.sleep(WAIT_TIME_WIFI_RSSI_CALIBRATION_WIFI_CONNECTED)
178        # Turn On Screen and delay WAIT_TIME_WIFI_RSSI_CALIBRATION_SCREEN_ON
179        # then get WiFi RSSI to avoid WiFi RSSI report -127(invalid value).
180        self.android_devices[0].droid.wakeUpNow()
181        time.sleep(WAIT_TIME_WIFI_RSSI_CALIBRATION_SCREEN_ON)
182
183        setattr(self, "wifi_rssi_with_no_atten",
184                self.android_devices[0].droid.wifiGetConnectionInfo()['rssi'])
185        if self.wifi_rssi_with_no_atten == INVALID_WIFI_RSSI:
186            self.log.error(
187                "Initial WiFi RSSI calibration value is wrong: -127.")
188            return False
189        self.log.info("WiFi RSSI calibration info: atten=0, RSSI={}".format(
190            self.wifi_rssi_with_no_atten))
191        ensure_phones_default_state(self.log, [self.android_devices[0]])
192
193        # Do Cellular RSSI calibration.
194        setattr(self, "cell_rssi_with_no_atten",
195                self.android_devices[0].droid.telephonyGetSignalStrength()[
196                    SignalStrengthContainer.SIGNAL_STRENGTH_LTE_DBM])
197        self.log.info(
198            "Cellular RSSI calibration info: atten=0, RSSI={}".format(
199                self.cell_rssi_with_no_atten))
200        return True
201
202    def teardown_class(self):
203
204        super().teardown_class()
205
206        self.android_devices[
207            0].droid.telephonyStopTrackingSignalStrengthChange()
208        return True
209
210    def teardown_test(self):
211
212        super().teardown_test()
213        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G], 0,
214                 MAX_RSSI_RESERVED_VALUE)
215        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 0,
216                 MAX_RSSI_RESERVED_VALUE)
217        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 0,
218                 MAX_RSSI_RESERVED_VALUE)
219        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 0,
220                 MAX_RSSI_RESERVED_VALUE)
221        return True
222
223    def _wfc_call_sequence(self, ads, mo_mt, initial_wifi_cellular_setup_func,
224                           wfc_phone_setup_func, verify_wfc_initial_idle_func,
225                           verify_wfc_in_call_state_func,
226                           incall_wifi_cellular_setting_check_func,
227                           expected_result):
228        """_wfc_call_sequence
229
230        Args:
231            ads: list of android devices. This list should have 2 ad.
232            mo_mt: indicating this call sequence is MO or MT.
233                Valid input: DIRECTION_MOBILE_ORIGINATED and
234                DIRECTION_MOBILE_TERMINATED.
235            initial_wifi_cellular_setup_func: Initial WiFI router and Attenuator
236                setup function before phone setup.
237            wfc_phone_setup_func: WFC phone setup function.
238            verify_wfc_initial_idle_func: Initial WFC phone idle check function.
239            verify_wfc_in_call_state_func: WFC phone in call state check function.
240            incall_wifi_cellular_setting_check_func: During call, WiFI router and Attenuator
241                change setting  and phone status check function.
242                (for test hand-in and hand-out)
243
244            expected_result: expected test result.
245                If expect call sequence finish, this value should be set to 'True'.
246                If expect call sequence not finish (eg. setup fail, call initial fail),
247                    this value should be set to "exception string"
248                    Current supported string include:
249                        "initial_wifi_cellular_setup_func fail."
250                        "wfc_phone_setup_func fail."
251                        "phone_setup_voice_general fail."
252                        "verify_wfc_initial_idle_func fail."
253                        "initiate_call fail."
254                        "wait_and_answer_call fail."
255                        "verify_wfc_in_call_state_func fail."
256                        "PhoneB not in call."
257                        "verify_wfc_in_call_state_func fail after 30 seconds."
258                        "PhoneB not in call after 30 seconds."
259                        "incall_wifi_cellular_setting_func fail."
260                        "incall_setting_check_func fail."
261                        "hangup_call fail."
262
263        Returns:
264            if expected_result is True,
265                Return True if call sequence finish without exception. Otherwise False.
266            if expected_result is string,
267                Return True if expected exception happened. Otherwise False.
268
269        """
270
271        class _WfcCallSequenceException(Exception):
272            pass
273
274        if (len(ads) != 2) or (mo_mt not in [
275                DIRECTION_MOBILE_ORIGINATED, DIRECTION_MOBILE_TERMINATED
276        ]):
277            self.log.error("Invalid parameters.")
278            return False
279
280        if mo_mt == DIRECTION_MOBILE_ORIGINATED:
281            ad_caller = ads[0]
282            ad_callee = ads[1]
283        else:
284            ad_caller = ads[1]
285            ad_callee = ads[0]
286        caller_number = get_phone_number(self.log, ad_caller)
287        callee_number = get_phone_number(self.log, ad_callee)
288
289        self.log.info("-->Begin wfc_call_sequence: {} to {}<--".format(
290            caller_number, callee_number))
291
292        try:
293            # initial setup wifi router and RF
294            if initial_wifi_cellular_setup_func and not initial_wifi_cellular_setup_func(
295            ):
296                raise _WfcCallSequenceException(
297                    "initial_wifi_cellular_setup_func fail.")
298
299            if wfc_phone_setup_func and not wfc_phone_setup_func():
300                raise _WfcCallSequenceException("wfc_phone_setup_func fail.")
301            if not phone_setup_voice_general(self.log, ads[1]):
302                raise _WfcCallSequenceException(
303                    "phone_setup_voice_general fail.")
304            time.sleep(WAIT_TIME_BETWEEN_REG_AND_CALL)
305
306            # Ensure idle status correct
307            if verify_wfc_initial_idle_func and not verify_wfc_initial_idle_func(
308            ):
309                raise _WfcCallSequenceException(
310                    "verify_wfc_initial_idle_func fail.")
311
312            # Make MO/MT call.
313            if not initiate_call(self.log, ad_caller, callee_number):
314                raise _WfcCallSequenceException("initiate_call fail.")
315            if not wait_and_answer_call(self.log, ad_callee, caller_number):
316                raise _WfcCallSequenceException("wait_and_answer_call fail.")
317            time.sleep(1)
318
319            # Check state, wait 30 seconds, check again.
320            if verify_wfc_in_call_state_func and not verify_wfc_in_call_state_func(
321            ):
322                raise _WfcCallSequenceException(
323                    "verify_wfc_in_call_state_func fail.")
324            if is_phone_not_in_call(self.log, ads[1]):
325                raise _WfcCallSequenceException("PhoneB not in call.")
326            time.sleep(WAIT_TIME_IN_CALL)
327            if verify_wfc_in_call_state_func and not verify_wfc_in_call_state_func(
328            ):
329                raise _WfcCallSequenceException(
330                    "verify_wfc_in_call_state_func fail after 30 seconds.")
331            if is_phone_not_in_call(self.log, ads[1]):
332                raise _WfcCallSequenceException(
333                    "PhoneB not in call after 30 seconds.")
334
335            # in call change setting and check
336            if incall_wifi_cellular_setting_check_func and not incall_wifi_cellular_setting_check_func(
337            ):
338                raise _WfcCallSequenceException(
339                    "incall_wifi_cellular_setting_check_func fail.")
340
341            if is_phone_in_call(self.log, ads[0]):
342                # hangup call
343                if not hangup_call(self.log, ads[0]):
344                    raise _WfcCallSequenceException("hangup_call fail.")
345            else:
346                # Call drop is unexpected if
347                # incall_wifi_cellular_setting_check_func is None
348                if incall_wifi_cellular_setting_check_func is None:
349                    raise _WfcCallSequenceException("Unexpected call drop.")
350
351        except _WfcCallSequenceException as e:
352            if str(e) == expected_result:
353                self.log.info(
354                    "Expected exception happened: <{}>, return True.".format(
355                        e))
356                get_telephony_signal_strength(self.android_devices[0])
357                get_wifi_signal_strength(self.android_devices[0])
358                return True
359            else:
360                self.log.info(
361                    "Unexpected exception happened: <{}>, return False.".
362                    format(e))
363                get_telephony_signal_strength(self.android_devices[0])
364                get_wifi_signal_strength(self.android_devices[0])
365                return False
366        finally:
367            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G], 0,
368                     MAX_RSSI_RESERVED_VALUE)
369            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 0,
370                     MAX_RSSI_RESERVED_VALUE)
371            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 0,
372                     MAX_RSSI_RESERVED_VALUE)
373            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 0,
374                     MAX_RSSI_RESERVED_VALUE)
375            ensure_phones_default_state(self.log, [ads[0], ads[1]])
376
377        self.log.info("wfc_call_sequence finished, return {}".format(
378            expected_result is True))
379        return (expected_result is True)
380
381    def _phone_idle_iwlan(self):
382        return phone_idle_iwlan(self.log, self.android_devices[0])
383
384    def _phone_idle_not_iwlan(self):
385        return phone_idle_not_iwlan(self.log, self.android_devices[0])
386
387    def _phone_idle_volte(self):
388        return phone_idle_volte(self.log, self.android_devices[0])
389
390    def _phone_idle_csfb(self):
391        return phone_idle_csfb(self.log, self.android_devices[0])
392
393    def _phone_idle_3g(self):
394        return phone_idle_3g(self.log, self.android_devices[0])
395
396    def _phone_wait_for_not_wfc(self):
397        result = wait_for_wfc_disabled(self.log, self.android_devices[0],
398                                       MAX_WAIT_TIME_NW_SELECTION)
399        self.log.info(
400            "_phone_wait_for_not_wfc: WFC_disabled is {}".format(result))
401        if not result:
402            return False
403        # TODO: b/26338343 Need to check Data RAT. Data RAT should not be iwlan.
404        return True
405
406    def _phone_wait_for_wfc(self):
407        result = wait_for_wfc_enabled(self.log, self.android_devices[0],
408                                      MAX_WAIT_TIME_NW_SELECTION)
409        self.log.info("_phone_wait_for_wfc: WFC_enabled is {}".format(result))
410        if not result:
411            return False
412        nw_type = get_network_rat(self.log, self.android_devices[0],
413                                  NETWORK_SERVICE_DATA)
414        if nw_type != RAT_IWLAN:
415            self.log.error(
416                "_phone_wait_for_wfc Data Rat is {}, expecting {}".format(
417                    nw_type, RAT_IWLAN))
418            return False
419        return True
420
421    def _phone_wait_for_call_drop(self):
422        if not wait_for_droid_not_in_call(self.log, self.android_devices[0],
423                                          MAX_WAIT_TIME_CALL_DROP):
424            self.log.info("_phone_wait_for_call_drop: Call not drop.")
425            return False
426        return True
427
428    def _is_phone_in_call_iwlan(self):
429        return is_phone_in_call_iwlan(self.log, self.android_devices[0])
430
431    def _is_phone_in_call_not_iwlan(self):
432        return is_phone_in_call_not_iwlan(self.log, self.android_devices[0])
433
434    def _is_phone_not_in_call(self):
435        if is_phone_in_call(self.log, self.android_devices[0]):
436            self.log.info("{} in call.".format(self.android_devices[0].serial))
437            return False
438        self.log.info("{} not in call.".format(self.android_devices[0].serial))
439        return True
440
441    def _is_phone_in_call_volte(self):
442        return is_phone_in_call_volte(self.log, self.android_devices[0])
443
444    def _is_phone_in_call_3g(self):
445        return is_phone_in_call_3g(self.log, self.android_devices[0])
446
447    def _is_phone_in_call_csfb(self):
448        return is_phone_in_call_csfb(self.log, self.android_devices[0])
449
450    def _wfc_phone_setup(self, is_airplane_mode, wfc_mode, volte_mode=True):
451        toggle_airplane_mode(self.log, self.android_devices[0], False)
452        toggle_volte(self.log, self.android_devices[0], volte_mode)
453        if not ensure_network_generation(
454                self.log,
455                self.android_devices[0],
456                GEN_4G,
457                voice_or_data=NETWORK_SERVICE_DATA):
458            return False
459
460        if not set_wfc_mode(self.log, self.android_devices[0], wfc_mode):
461            self.log.error("{} set WFC mode failed.".format(
462                self.android_devices[0].serial))
463            return False
464
465        toggle_airplane_mode(self.log, self.android_devices[0],
466                             is_airplane_mode)
467
468        if not ensure_wifi_connected(self.log, self.android_devices[0],
469                                     self.wifi_network_ssid,
470                                     self.wifi_network_pass):
471            self.log.error("{} connect WiFI failed".format(
472                self.android_devices[0].serial))
473            return False
474        return True
475
476    def _wfc_phone_setup_cellular_absent(self, wfc_mode):
477        is_exception_happened = False
478        time.sleep(90)
479        try:
480            if not toggle_airplane_mode(self.log, self.android_devices[0],
481                                        False):
482                raise Exception("Toggle APM failed.")
483            if not ensure_network_generation(
484                    self.log,
485                    self.android_devices[0],
486                    GEN_4G,
487                    voice_or_data=NETWORK_SERVICE_DATA):
488                raise Exception("Ensure LTE failed.")
489        except Exception:
490            is_exception_happened = True
491
492        if not is_exception_happened:
493            self.log.error(
494                "_wfc_phone_setup_cellular_absent error:"
495                "Phone on LTE, expected Phone have no cellular signal")
496            return False
497        if not toggle_volte(self.log, self.android_devices[0], True):
498            self.log.error(
499                "_wfc_phone_setup_cellular_absent: toggle VoLTE fail.")
500            raise False
501
502        if not set_wfc_mode(self.log, self.android_devices[0], wfc_mode):
503            self.log.error("{} set WFC mode failed.".format(
504                self.android_devices[0].serial))
505            return False
506
507        if not ensure_wifi_connected(self.log, self.android_devices[0],
508                                     self.wifi_network_ssid,
509                                     self.wifi_network_pass):
510            self.log.error("{} connect WiFI failed".format(
511                self.android_devices[0].serial))
512            return False
513        return True
514
515    def _wfc_phone_setup_apm_wifi_only(self):
516        return self._wfc_phone_setup(True, WFC_MODE_WIFI_ONLY)
517
518    def _wfc_phone_setup_apm_wifi_preferred(self):
519        return self._wfc_phone_setup(True, WFC_MODE_WIFI_PREFERRED)
520
521    def _wfc_phone_setup_apm_cellular_preferred(self):
522        return self._wfc_phone_setup(True, WFC_MODE_CELLULAR_PREFERRED)
523
524    def _wfc_phone_setup_apm_wfc_disabled(self):
525        return self._wfc_phone_setup(True, WFC_MODE_DISABLED)
526
527    def _wfc_phone_setup_wifi_only(self):
528        return self._wfc_phone_setup(False, WFC_MODE_WIFI_ONLY)
529
530    def _wfc_phone_setup_wifi_preferred(self):
531        return self._wfc_phone_setup(False, WFC_MODE_WIFI_PREFERRED)
532
533    def _wfc_phone_setup_cellular_preferred(self):
534        return self._wfc_phone_setup(False, WFC_MODE_CELLULAR_PREFERRED)
535
536    def _wfc_phone_setup_wfc_disabled(self):
537        return self._wfc_phone_setup(False, WFC_MODE_DISABLED)
538
539    def _wfc_phone_setup_cellular_absent_wifi_only(self):
540        return self._wfc_phone_setup_cellular_absent(WFC_MODE_WIFI_ONLY)
541
542    def _wfc_phone_setup_cellular_absent_wifi_preferred(self):
543        return self._wfc_phone_setup_cellular_absent(WFC_MODE_WIFI_PREFERRED)
544
545    def _wfc_phone_setup_cellular_absent_cellular_preferred(self):
546        return self._wfc_phone_setup_cellular_absent(
547            WFC_MODE_CELLULAR_PREFERRED)
548
549    def _wfc_phone_setup_cellular_absent_wfc_disabled(self):
550        return self._wfc_phone_setup_cellular_absent(WFC_MODE_DISABLED)
551
552    def _wfc_phone_setup_wifi_preferred_e4g_disabled(self):
553        return self._wfc_phone_setup(False, WFC_MODE_WIFI_PREFERRED, False)
554
555    def _wfc_phone_setup_wifi_absent(self,
556                                     is_airplane_mode,
557                                     wfc_mode,
558                                     volte_mode=True):
559        toggle_airplane_mode(self.log, self.android_devices[0], False)
560        toggle_volte(self.log, self.android_devices[0], volte_mode)
561        if not ensure_network_generation(
562                self.log,
563                self.android_devices[0],
564                GEN_4G,
565                voice_or_data=NETWORK_SERVICE_DATA):
566            return False
567
568        if not set_wfc_mode(self.log, self.android_devices[0], wfc_mode):
569            self.log.error("{} set WFC mode failed.".format(
570                self.android_devices[0].serial))
571            return False
572
573        toggle_airplane_mode(self.log, self.android_devices[0],
574                             is_airplane_mode)
575
576        if ensure_wifi_connected(self.log, self.android_devices[0],
577                                 self.wifi_network_ssid,
578                                 self.wifi_network_pass, 1):
579            self.log.error(
580                "{} connect WiFI succeed, expected not succeed".format(
581                    self.android_devices[0].serial))
582            return False
583        return True
584
585    def _wfc_phone_setup_cellular_absent_wifi_absent(self, wfc_mode):
586        is_exception_happened = False
587        time.sleep(60)
588        try:
589            if not toggle_airplane_mode(self.log, self.android_devices[0],
590                                        False):
591                raise Exception("Toggle APM failed.")
592            if not ensure_network_generation(
593                    self.log,
594                    self.android_devices[0],
595                    GEN_4G,
596                    voice_or_data=NETWORK_SERVICE_DATA):
597                raise Exception("Ensure LTE failed.")
598        except Exception:
599            is_exception_happened = True
600
601        if not is_exception_happened:
602            self.log.error(
603                "_wfc_phone_setup_cellular_absent_wifi_absent error:"
604                "Phone on LTE, expected Phone have no cellular signal")
605            return False
606        if not toggle_volte(self.log, self.android_devices[0], True):
607            self.log.error(
608                "_wfc_phone_setup_cellular_absent: toggle VoLTE fail.")
609            raise False
610
611        if not set_wfc_mode(self.log, self.android_devices[0], wfc_mode):
612            self.log.error("{} set WFC mode failed.".format(
613                self.android_devices[0].serial))
614            return False
615
616        if ensure_wifi_connected(self.log, self.android_devices[0],
617                                 self.wifi_network_ssid,
618                                 self.wifi_network_pass, 1):
619            self.log.error(
620                "{} connect WiFI succeed, expected not succeed".format(
621                    self.android_devices[0].serial))
622            return False
623        return True
624
625    def _wfc_phone_setup_apm_wifi_absent_wifi_only(self):
626        return self._wfc_phone_setup_wifi_absent(True, WFC_MODE_WIFI_ONLY)
627
628    def _wfc_phone_setup_apm_wifi_absent_wifi_preferred(self):
629        return self._wfc_phone_setup_wifi_absent(True, WFC_MODE_WIFI_PREFERRED)
630
631    def _wfc_phone_setup_apm_wifi_absent_cellular_preferred(self):
632        return self._wfc_phone_setup_wifi_absent(True,
633                                                 WFC_MODE_CELLULAR_PREFERRED)
634
635    def _wfc_phone_setup_wifi_absent_wifi_only(self):
636        return self._wfc_phone_setup_wifi_absent(False, WFC_MODE_WIFI_ONLY)
637
638    def _wfc_phone_setup_wifi_absent_wifi_preferred(self):
639        return self._wfc_phone_setup_wifi_absent(False,
640                                                 WFC_MODE_WIFI_PREFERRED)
641
642    def _wfc_phone_setup_wifi_absent_cellular_preferred(self):
643        return self._wfc_phone_setup_wifi_absent(False,
644                                                 WFC_MODE_CELLULAR_PREFERRED)
645
646    def _wfc_phone_setup_cellular_absent_wifi_absent_wifi_only(self):
647        return self._wfc_phone_setup_cellular_absent_wifi_absent(
648            WFC_MODE_WIFI_ONLY)
649
650    def _wfc_phone_setup_cellular_absent_wifi_absent_wifi_preferred(self):
651        return self._wfc_phone_setup_cellular_absent_wifi_absent(
652            WFC_MODE_WIFI_PREFERRED)
653
654    def _wfc_phone_setup_cellular_absent_wifi_absent_cellular_preferred(self):
655        return self._wfc_phone_setup_cellular_absent_wifi_absent(
656            WFC_MODE_CELLULAR_PREFERRED)
657
658    def _wfc_phone_setup_wifi_absent_wifi_preferred_e4g_disabled(self):
659        return self._wfc_phone_setup_wifi_absent(
660            False, WFC_MODE_WIFI_PREFERRED, False)
661
662    def _wfc_phone_setup_wifi_disabled(self, is_airplane_mode, wfc_mode):
663        toggle_airplane_mode(self.log, self.android_devices[0], False)
664        toggle_volte(self.log, self.android_devices[0], True)
665        if not ensure_network_generation(
666                self.log,
667                self.android_devices[0],
668                GEN_4G,
669                voice_or_data=NETWORK_SERVICE_DATA):
670            return False
671
672        if not set_wfc_mode(self.log, self.android_devices[0], wfc_mode):
673            self.log.error("{} set WFC mode failed.".format(
674                self.android_devices[0].serial))
675            return False
676
677        toggle_airplane_mode(self.log, self.android_devices[0],
678                             is_airplane_mode)
679
680        wifi_toggle_state(self.log, self.android_devices[0], False)
681        return True
682
683    def _wfc_phone_setup_cellular_absent_wifi_disabled(self, wfc_mode):
684        is_exception_happened = False
685        time.sleep(60)
686        try:
687            if not toggle_airplane_mode(self.log, self.android_devices[0],
688                                        False):
689                raise Exception("Toggle APM failed.")
690            if not ensure_network_generation(
691                    self.log,
692                    self.android_devices[0],
693                    GEN_4G,
694                    voice_or_data=NETWORK_SERVICE_DATA):
695                raise Exception("Ensure LTE failed.")
696        except Exception:
697            is_exception_happened = True
698
699        if not is_exception_happened:
700            self.log.error(
701                "_wfc_phone_setup_cellular_absent_wifi_disabled error:"
702                "Phone on LTE, expected Phone have no cellular signal")
703            return False
704        if not toggle_volte(self.log, self.android_devices[0], True):
705            self.log.error(
706                "_wfc_phone_setup_cellular_absent: toggle VoLTE fail.")
707            raise False
708
709        if not set_wfc_mode(self.log, self.android_devices[0], wfc_mode):
710            self.log.error("{} set WFC mode failed.".format(
711                self.android_devices[0].serial))
712            return False
713
714        wifi_toggle_state(self.log, self.android_devices[0], False)
715        return True
716
717    def _wfc_phone_setup_apm_wifi_disabled_wifi_only(self):
718        return self._wfc_phone_setup_wifi_disabled(True, WFC_MODE_WIFI_ONLY)
719
720    def _wfc_phone_setup_apm_wifi_disabled_wifi_preferred(self):
721        return self._wfc_phone_setup_wifi_disabled(True,
722                                                   WFC_MODE_WIFI_PREFERRED)
723
724    def _wfc_phone_setup_apm_wifi_disabled_cellular_preferred(self):
725        return self._wfc_phone_setup_wifi_disabled(True,
726                                                   WFC_MODE_CELLULAR_PREFERRED)
727
728    def _wfc_phone_setup_wifi_disabled_wifi_only(self):
729        return self._wfc_phone_setup_wifi_disabled(False, WFC_MODE_WIFI_ONLY)
730
731    def _wfc_phone_setup_wifi_disabled_wifi_preferred(self):
732        return self._wfc_phone_setup_wifi_disabled(False,
733                                                   WFC_MODE_WIFI_PREFERRED)
734
735    def _wfc_phone_setup_wifi_disabled_cellular_preferred(self):
736        return self._wfc_phone_setup_wifi_disabled(False,
737                                                   WFC_MODE_CELLULAR_PREFERRED)
738
739    def _wfc_phone_setup_cellular_absent_wifi_disabled_wifi_only(self):
740        return self._wfc_phone_setup_cellular_absent_wifi_disabled(
741            WFC_MODE_WIFI_ONLY)
742
743    def _wfc_phone_setup_cellular_absent_wifi_disabled_wifi_preferred(self):
744        return self._wfc_phone_setup_cellular_absent_wifi_disabled(
745            WFC_MODE_WIFI_PREFERRED)
746
747    def _wfc_phone_setup_cellular_absent_wifi_disabled_cellular_preferred(
748            self):
749        return self._wfc_phone_setup_cellular_absent_wifi_disabled(
750            WFC_MODE_CELLULAR_PREFERRED)
751
752    def _wfc_set_wifi_strong_cell_strong(self):
753        self.log.info("--->Setting WiFi strong cell strong<---")
754        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G], 0,
755                 MAX_RSSI_RESERVED_VALUE)
756        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 0,
757                 MAX_RSSI_RESERVED_VALUE)
758        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 0,
759                 MAX_RSSI_RESERVED_VALUE)
760        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 0,
761                 MAX_RSSI_RESERVED_VALUE)
762        return True
763
764    def _wfc_set_wifi_strong_cell_weak(self):
765        self.log.info("--->Setting WiFi strong cell weak<---")
766        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G], 0,
767                 MAX_RSSI_RESERVED_VALUE)
768        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 0,
769                 MAX_RSSI_RESERVED_VALUE)
770        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G],
771                 self.cell_rssi_with_no_atten, CELL_WEAK_RSSI_VALUE)
772        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G],
773                 self.cell_rssi_with_no_atten, CELL_WEAK_RSSI_VALUE)
774        return True
775
776    def _wfc_set_wifi_strong_cell_absent(self):
777        self.log.info("--->Setting WiFi strong cell absent<---")
778        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G], 0,
779                 MAX_RSSI_RESERVED_VALUE)
780        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 0,
781                 MAX_RSSI_RESERVED_VALUE)
782        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 0,
783                 MIN_RSSI_RESERVED_VALUE)
784        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 0,
785                 MIN_RSSI_RESERVED_VALUE)
786        return True
787
788    def _wfc_set_wifi_weak_cell_strong(self):
789        self.log.info("--->Setting WiFi weak cell strong<---")
790        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
791                 self.wifi_rssi_with_no_atten, WIFI_WEAK_RSSI_VALUE)
792        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
793                 self.wifi_rssi_with_no_atten, WIFI_WEAK_RSSI_VALUE)
794        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 0,
795                 MAX_RSSI_RESERVED_VALUE)
796        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 0,
797                 MAX_RSSI_RESERVED_VALUE)
798        return True
799
800    def _wfc_set_wifi_weak_cell_weak(self):
801        self.log.info("--->Setting WiFi weak cell weak<---")
802        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
803                 self.wifi_rssi_with_no_atten, WIFI_WEAK_RSSI_VALUE)
804        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
805                 self.wifi_rssi_with_no_atten, WIFI_WEAK_RSSI_VALUE)
806        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G],
807                 self.cell_rssi_with_no_atten, CELL_WEAK_RSSI_VALUE)
808        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G],
809                 self.cell_rssi_with_no_atten, CELL_WEAK_RSSI_VALUE)
810        return True
811
812    def _wfc_set_wifi_weak_cell_absent(self):
813        self.log.info("--->Setting WiFi weak cell absent<---")
814        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
815                 self.wifi_rssi_with_no_atten, WIFI_WEAK_RSSI_VALUE)
816        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
817                 self.wifi_rssi_with_no_atten, WIFI_WEAK_RSSI_VALUE)
818        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 0,
819                 MIN_RSSI_RESERVED_VALUE)
820        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 0,
821                 MIN_RSSI_RESERVED_VALUE)
822        return True
823
824    def _wfc_set_wifi_absent_cell_strong(self):
825        self.log.info("--->Setting WiFi absent cell strong<---")
826        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G], 0,
827                 MIN_RSSI_RESERVED_VALUE)
828        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 0,
829                 MIN_RSSI_RESERVED_VALUE)
830        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 0,
831                 MAX_RSSI_RESERVED_VALUE)
832        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 0,
833                 MAX_RSSI_RESERVED_VALUE)
834        return True
835
836    def _wfc_set_wifi_absent_cell_weak(self):
837        self.log.info("--->Setting WiFi absent cell weak<---")
838        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G], 0,
839                 MIN_RSSI_RESERVED_VALUE)
840        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 0,
841                 MIN_RSSI_RESERVED_VALUE)
842        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G],
843                 self.cell_rssi_with_no_atten, CELL_WEAK_RSSI_VALUE)
844        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G],
845                 self.cell_rssi_with_no_atten, CELL_WEAK_RSSI_VALUE)
846        return True
847
848    def _wfc_set_wifi_absent_cell_absent(self):
849        self.log.info("--->Setting WiFi absent cell absent<---")
850        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G], 0,
851                 MIN_RSSI_RESERVED_VALUE)
852        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 0,
853                 MIN_RSSI_RESERVED_VALUE)
854        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 0,
855                 MIN_RSSI_RESERVED_VALUE)
856        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 0,
857                 MIN_RSSI_RESERVED_VALUE)
858        return True
859
860    """ Tests Begin """
861
862    @test_tracker_info(uuid="a9a369bc-b8cc-467b-a847-82d004db851d")
863    @TelephonyBaseTest.tel_test_wrap
864    def test_call_epdg_wfc_wifi_only_wifi_strong_apm(self):
865        """ Test WFC MO MT, WiFI only mode, WIFI Strong, Phone in APM
866
867        Set WiFi/Cellular network environment.
868        Make Sure PhoneA is set correct WFC parameters.
869        Make SUre PhoneB is able to make MO/MT call.
870        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
871        Call from PhoneB to PHoneA, call should succeed, call should on WiFi.
872
873        Returns:
874            True if pass; False if fail.
875        """
876
877        ads = [self.android_devices[0], self.android_devices[1]]
878        mo_result = self._wfc_call_sequence(
879            ads, DIRECTION_MOBILE_ORIGINATED,
880            self._wfc_set_wifi_strong_cell_strong,
881            self._wfc_phone_setup_apm_wifi_only, self._phone_idle_iwlan,
882            self._is_phone_in_call_iwlan, None, True)
883
884        mt_result = self._wfc_call_sequence(
885            ads, DIRECTION_MOBILE_TERMINATED,
886            self._wfc_set_wifi_strong_cell_strong,
887            self._wfc_phone_setup_apm_wifi_only, self._phone_idle_iwlan,
888            self._is_phone_in_call_iwlan, None, True)
889
890        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
891        return ((mo_result is True) and (mt_result is True))
892
893    @test_tracker_info(uuid="c88999d7-7fe7-4163-9430-4aee88852e7b")
894    @TelephonyBaseTest.tel_test_wrap
895    def test_call_epdg_wfc_wifi_preferred_wifi_strong_apm(self):
896        """ Test WFC MO MT, WiFI preferred mode, WIFI Strong, Phone in APM
897
898        Set WiFi/Cellular network environment.
899        Make Sure PhoneA is set correct WFC parameters.
900        Make SUre PhoneB is able to make MO/MT call.
901        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
902        Call from PhoneB to PHoneA, call should succeed, call should on WiFi.
903
904        Returns:
905            True if pass; False if fail.
906        """
907
908        ads = [self.android_devices[0], self.android_devices[1]]
909        mo_result = self._wfc_call_sequence(
910            ads, DIRECTION_MOBILE_ORIGINATED,
911            self._wfc_set_wifi_strong_cell_strong,
912            self._wfc_phone_setup_apm_wifi_preferred, self._phone_idle_iwlan,
913            self._is_phone_in_call_iwlan, None, True)
914
915        mt_result = self._wfc_call_sequence(
916            ads, DIRECTION_MOBILE_TERMINATED,
917            self._wfc_set_wifi_strong_cell_strong,
918            self._wfc_phone_setup_apm_wifi_preferred, self._phone_idle_iwlan,
919            self._is_phone_in_call_iwlan, None, True)
920
921        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
922        return ((mo_result is True) and (mt_result is True))
923
924    @test_tracker_info(uuid="a4464c2c-753e-4702-b4fc-73d7bb6265da")
925    @TelephonyBaseTest.tel_test_wrap
926    def test_call_epdg_wfc_cellular_preferred_wifi_strong_apm(self):
927        """ Test WFC MO MT, cellular preferred mode, WIFI Strong, Phone in APM
928
929        Set WiFi/Cellular network environment.
930        Make Sure PhoneA is set correct WFC parameters.
931        Make SUre PhoneB is able to make MO/MT call.
932        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
933        Call from PhoneB to PHoneA, call should succeed, call should on WiFi.
934
935        Returns:
936            True if pass; False if fail.
937        """
938
939        ads = [self.android_devices[0], self.android_devices[1]]
940        mo_result = self._wfc_call_sequence(
941            ads, DIRECTION_MOBILE_ORIGINATED,
942            self._wfc_set_wifi_strong_cell_strong,
943            self._wfc_phone_setup_apm_cellular_preferred,
944            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
945
946        mt_result = self._wfc_call_sequence(
947            ads, DIRECTION_MOBILE_TERMINATED,
948            self._wfc_set_wifi_strong_cell_strong,
949            self._wfc_phone_setup_apm_cellular_preferred,
950            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
951
952        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
953        return ((mo_result is True) and (mt_result is True))
954
955    @test_tracker_info(uuid="797ad987-db48-456e-b092-d27be110b7ff")
956    @TelephonyBaseTest.tel_test_wrap
957    def test_call_epdg_wfc_wifi_only_wifi_weak_apm(self):
958        """ Test WFC MO MT, WiFI only mode, WIFI weak, Phone in APM
959
960        Set WiFi/Cellular network environment.
961        Make Sure PhoneA is set correct WFC parameters.
962        Make SUre PhoneB is able to make MO/MT call.
963        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
964        Call from PhoneB to PHoneA, call should succeed, call should on WiFi.
965
966        Returns:
967            True if pass; False if fail.
968        """
969
970        ads = [self.android_devices[0], self.android_devices[1]]
971        mo_result = self._wfc_call_sequence(
972            ads, DIRECTION_MOBILE_ORIGINATED,
973            self._wfc_set_wifi_weak_cell_strong,
974            self._wfc_phone_setup_apm_wifi_only, self._phone_idle_iwlan,
975            self._is_phone_in_call_iwlan, None, True)
976
977        mt_result = self._wfc_call_sequence(
978            ads, DIRECTION_MOBILE_TERMINATED,
979            self._wfc_set_wifi_weak_cell_strong,
980            self._wfc_phone_setup_apm_wifi_only, self._phone_idle_iwlan,
981            self._is_phone_in_call_iwlan, None, True)
982
983        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
984        return ((mo_result is True) and (mt_result is True))
985
986    @test_tracker_info(uuid="00000f11-1749-47e9-a9b3-d67a43f97470")
987    @TelephonyBaseTest.tel_test_wrap
988    def test_call_epdg_wfc_wifi_preferred_wifi_weak_apm(self):
989        """ Test WFC MO MT, WiFI preferred mode, WIFI weak, Phone in APM
990
991        Set WiFi/Cellular network environment.
992        Make Sure PhoneA is set correct WFC parameters.
993        Make SUre PhoneB is able to make MO/MT call.
994        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
995        Call from PhoneB to PHoneA, call should succeed, call should on WiFi.
996
997        Returns:
998            True if pass; False if fail.
999        """
1000
1001        ads = [self.android_devices[0], self.android_devices[1]]
1002        mo_result = self._wfc_call_sequence(
1003            ads, DIRECTION_MOBILE_ORIGINATED,
1004            self._wfc_set_wifi_weak_cell_strong,
1005            self._wfc_phone_setup_apm_wifi_preferred, self._phone_idle_iwlan,
1006            self._is_phone_in_call_iwlan, None, True)
1007
1008        mt_result = self._wfc_call_sequence(
1009            ads, DIRECTION_MOBILE_TERMINATED,
1010            self._wfc_set_wifi_weak_cell_strong,
1011            self._wfc_phone_setup_apm_wifi_preferred, self._phone_idle_iwlan,
1012            self._is_phone_in_call_iwlan, None, True)
1013
1014        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1015        return ((mo_result is True) and (mt_result is True))
1016
1017    @test_tracker_info(uuid="db3e96f4-bbb6-48f8-9eb6-71f489987f8f")
1018    @TelephonyBaseTest.tel_test_wrap
1019    def test_call_epdg_wfc_cellular_preferred_wifi_weak_apm(self):
1020        """ Test WFC MO MT, cellular preferred mode, WIFI weak, Phone in APM
1021
1022        Set WiFi/Cellular network environment.
1023        Make Sure PhoneA is set correct WFC parameters.
1024        Make SUre PhoneB is able to make MO/MT call.
1025        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
1026        Call from PhoneB to PHoneA, call should succeed, call should on WiFi.
1027
1028        Returns:
1029            True if pass; False if fail.
1030        """
1031
1032        ads = [self.android_devices[0], self.android_devices[1]]
1033        mo_result = self._wfc_call_sequence(
1034            ads, DIRECTION_MOBILE_ORIGINATED,
1035            self._wfc_set_wifi_weak_cell_strong,
1036            self._wfc_phone_setup_apm_cellular_preferred,
1037            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
1038
1039        mt_result = self._wfc_call_sequence(
1040            ads, DIRECTION_MOBILE_TERMINATED,
1041            self._wfc_set_wifi_weak_cell_strong,
1042            self._wfc_phone_setup_apm_cellular_preferred,
1043            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
1044
1045        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1046        return ((mo_result is True) and (mt_result is True))
1047
1048    @test_tracker_info(uuid="121574c3-4c58-4fd5-abbb-c626c5f777c8")
1049    @TelephonyBaseTest.tel_test_wrap
1050    def test_call_epdg_wfc_wifi_only_wifi_absent_apm(self):
1051        """ Test WFC MO MT, WiFI only mode, WIFI absent, Phone in APM
1052
1053        Set WiFi/Cellular network environment.
1054        Make Sure PhoneA is set correct WFC parameters.
1055        Make SUre PhoneB is able to make MO/MT call.
1056        Call from PhoneA to PhoneB, call should fail.
1057        Call from PhoneB to PHoneA, call should fail.
1058
1059        Returns:
1060            True if pass; False if fail.
1061        """
1062        ads = [self.android_devices[0], self.android_devices[1]]
1063        mo_result = self._wfc_call_sequence(
1064            ads, DIRECTION_MOBILE_ORIGINATED,
1065            self._wfc_set_wifi_absent_cell_strong,
1066            self._wfc_phone_setup_apm_wifi_absent_wifi_only,
1067            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1068            "initiate_call fail.")
1069
1070        mt_result = self._wfc_call_sequence(
1071            ads, DIRECTION_MOBILE_TERMINATED,
1072            self._wfc_set_wifi_absent_cell_strong,
1073            self._wfc_phone_setup_apm_wifi_absent_wifi_only,
1074            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1075            "wait_and_answer_call fail.")
1076
1077        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1078        return ((mo_result is True) and (mt_result is True))
1079
1080    @test_tracker_info(uuid="bccff410-ada3-407a-8b50-c84b0064bd8a")
1081    @TelephonyBaseTest.tel_test_wrap
1082    def test_call_epdg_wfc_wifi_preferred_wifi_absent_apm(self):
1083        """ Test WFC MO MT, WiFI preferred mode, WIFI absent, Phone in APM
1084
1085        Set WiFi/Cellular network environment.
1086        Make Sure PhoneA is set correct WFC parameters.
1087        Make SUre PhoneB is able to make MO/MT call.
1088        Call from PhoneA to PhoneB, call should fail.
1089        Call from PhoneB to PHoneA, call should fail.
1090
1091        Returns:
1092            True if pass; False if fail.
1093        """
1094        ads = [self.android_devices[0], self.android_devices[1]]
1095        mo_result = self._wfc_call_sequence(
1096            ads, DIRECTION_MOBILE_ORIGINATED,
1097            self._wfc_set_wifi_absent_cell_strong,
1098            self._wfc_phone_setup_apm_wifi_absent_wifi_preferred,
1099            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1100            "initiate_call fail.")
1101
1102        mt_result = self._wfc_call_sequence(
1103            ads, DIRECTION_MOBILE_TERMINATED,
1104            self._wfc_set_wifi_absent_cell_strong,
1105            self._wfc_phone_setup_apm_wifi_absent_wifi_preferred,
1106            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1107            "wait_and_answer_call fail.")
1108
1109        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1110        return ((mo_result is True) and (mt_result is True))
1111
1112    @test_tracker_info(uuid="a9722c73-5b6e-46d0-962c-e612df84b7b7")
1113    @TelephonyBaseTest.tel_test_wrap
1114    def test_call_epdg_wfc_cellular_preferred_wifi_absent_apm(self):
1115        """ Test WFC MO MT, cellular preferred mode, WIFI absent, Phone in APM
1116
1117        Set WiFi/Cellular network environment.
1118        Make Sure PhoneA is set correct WFC parameters.
1119        Make SUre PhoneB is able to make MO/MT call.
1120        Call from PhoneA to PhoneB, call should fail.
1121        Call from PhoneB to PHoneA, call should fail.
1122
1123        Returns:
1124            True if pass; False if fail.
1125        """
1126        ads = [self.android_devices[0], self.android_devices[1]]
1127        mo_result = self._wfc_call_sequence(
1128            ads, DIRECTION_MOBILE_ORIGINATED,
1129            self._wfc_set_wifi_absent_cell_strong,
1130            self._wfc_phone_setup_apm_wifi_absent_cellular_preferred,
1131            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1132            "initiate_call fail.")
1133
1134        mt_result = self._wfc_call_sequence(
1135            ads, DIRECTION_MOBILE_TERMINATED,
1136            self._wfc_set_wifi_absent_cell_strong,
1137            self._wfc_phone_setup_apm_wifi_absent_cellular_preferred,
1138            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1139            "wait_and_answer_call fail.")
1140
1141        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1142        return ((mo_result is True) and (mt_result is True))
1143
1144    @test_tracker_info(uuid="6ed1be09-b825-43a4-8317-822070023329")
1145    @TelephonyBaseTest.tel_test_wrap
1146    def test_call_epdg_wfc_wifi_only_wifi_disabled_apm(self):
1147        """ Test WFC MO MT, WiFI only mode, WIFI disabled, Phone in APM
1148
1149        Set WiFi/Cellular network environment.
1150        Make Sure PhoneA is set correct WFC parameters.
1151        Make SUre PhoneB is able to make MO/MT call.
1152        Call from PhoneA to PhoneB, call should fail.
1153        Call from PhoneB to PHoneA, call should fail.
1154
1155        Returns:
1156            True if pass; False if fail.
1157        """
1158        ads = [self.android_devices[0], self.android_devices[1]]
1159        mo_result = self._wfc_call_sequence(
1160            ads, DIRECTION_MOBILE_ORIGINATED,
1161            self._wfc_set_wifi_strong_cell_strong,
1162            self._wfc_phone_setup_apm_wifi_disabled_wifi_only,
1163            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1164            "initiate_call fail.")
1165
1166        mt_result = self._wfc_call_sequence(
1167            ads, DIRECTION_MOBILE_TERMINATED,
1168            self._wfc_set_wifi_strong_cell_strong,
1169            self._wfc_phone_setup_apm_wifi_disabled_wifi_only,
1170            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1171            "wait_and_answer_call fail.")
1172
1173        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1174        return ((mo_result is True) and (mt_result is True))
1175
1176    @test_tracker_info(uuid="c4059ea2-732c-4a22-943c-f19ad65d5fe9")
1177    @TelephonyBaseTest.tel_test_wrap
1178    def test_call_epdg_wfc_wifi_preferred_wifi_disabled_apm(self):
1179        """ Test WFC MO MT, WiFI preferred mode, WIFI disabled, Phone in APM
1180
1181        Set WiFi/Cellular network environment.
1182        Make Sure PhoneA is set correct WFC parameters.
1183        Make SUre PhoneB is able to make MO/MT call.
1184        Call from PhoneA to PhoneB, call should fail.
1185        Call from PhoneB to PHoneA, call should fail.
1186
1187        Returns:
1188            True if pass; False if fail.
1189        """
1190        ads = [self.android_devices[0], self.android_devices[1]]
1191        mo_result = self._wfc_call_sequence(
1192            ads, DIRECTION_MOBILE_ORIGINATED,
1193            self._wfc_set_wifi_strong_cell_strong,
1194            self._wfc_phone_setup_apm_wifi_disabled_wifi_preferred,
1195            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1196            "initiate_call fail.")
1197
1198        mt_result = self._wfc_call_sequence(
1199            ads, DIRECTION_MOBILE_TERMINATED,
1200            self._wfc_set_wifi_strong_cell_strong,
1201            self._wfc_phone_setup_apm_wifi_disabled_wifi_preferred,
1202            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1203            "wait_and_answer_call fail.")
1204
1205        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1206        return ((mo_result is True) and (mt_result is True))
1207
1208    @test_tracker_info(uuid="a4c000a1-b3cd-4fe2-8d82-d857fb3b2d62")
1209    @TelephonyBaseTest.tel_test_wrap
1210    def test_call_epdg_wfc_cellular_preferred_wifi_disabled_apm(self):
1211        """ Test WFC MO MT, cellular preferred mode, WIFI disabled, Phone in APM
1212
1213        Set WiFi/Cellular network environment.
1214        Make Sure PhoneA is set correct WFC parameters.
1215        Make SUre PhoneB is able to make MO/MT call.
1216        Call from PhoneA to PhoneB, call should fail.
1217        Call from PhoneB to PHoneA, call should fail.
1218
1219        Returns:
1220            True if pass; False if fail.
1221        """
1222        ads = [self.android_devices[0], self.android_devices[1]]
1223        mo_result = self._wfc_call_sequence(
1224            ads, DIRECTION_MOBILE_ORIGINATED,
1225            self._wfc_set_wifi_strong_cell_strong,
1226            self._wfc_phone_setup_apm_wifi_disabled_cellular_preferred,
1227            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1228            "initiate_call fail.")
1229
1230        mt_result = self._wfc_call_sequence(
1231            ads, DIRECTION_MOBILE_TERMINATED,
1232            self._wfc_set_wifi_strong_cell_strong,
1233            self._wfc_phone_setup_apm_wifi_disabled_cellular_preferred,
1234            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1235            "wait_and_answer_call fail.")
1236
1237        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1238        return ((mo_result is True) and (mt_result is True))
1239
1240    @test_tracker_info(uuid="d37909d3-40b4-4989-a444-fca60bd355cf")
1241    @TelephonyBaseTest.tel_test_wrap
1242    def test_call_epdg_wfc_wifi_only_wifi_strong_cellular_strong(self):
1243        """ Test WFC MO MT, WiFI only mode, WIFI strong, Cellular strong
1244
1245        Set WiFi/Cellular network environment.
1246        Make Sure PhoneA is set correct WFC parameters.
1247        Make SUre PhoneB is able to make MO/MT call.
1248        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
1249        Call from PhoneB to PHoneA, call should succeed, call should on WiFi.
1250
1251        Returns:
1252            True if pass; False if fail.
1253        """
1254        ads = [self.android_devices[0], self.android_devices[1]]
1255        mo_result = self._wfc_call_sequence(
1256            ads, DIRECTION_MOBILE_ORIGINATED,
1257            self._wfc_set_wifi_strong_cell_strong,
1258            self._wfc_phone_setup_wifi_only, self._phone_idle_iwlan,
1259            self._is_phone_in_call_iwlan, None, True)
1260
1261        mt_result = self._wfc_call_sequence(
1262            ads, DIRECTION_MOBILE_TERMINATED,
1263            self._wfc_set_wifi_strong_cell_strong,
1264            self._wfc_phone_setup_wifi_only, self._phone_idle_iwlan,
1265            self._is_phone_in_call_iwlan, None, True)
1266
1267        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1268        return ((mo_result is True) and (mt_result is True))
1269
1270    @test_tracker_info(uuid="bba0d159-ec45-43ea-9c1f-94f6e3a0cff8")
1271    @TelephonyBaseTest.tel_test_wrap
1272    def test_call_epdg_wfc_wifi_preferred_wifi_strong_cellular_strong(self):
1273        """ Test WFC MO MT, WiFI preferred mode, WIFI strong, Cellular strong
1274
1275        Set WiFi/Cellular network environment.
1276        Make Sure PhoneA is set correct WFC parameters.
1277        Make SUre PhoneB is able to make MO/MT call.
1278        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
1279        Call from PhoneB to PHoneA, call should succeed, call should on WiFi.
1280
1281        Returns:
1282            True if pass; False if fail.
1283        """
1284        ads = [self.android_devices[0], self.android_devices[1]]
1285        mo_result = self._wfc_call_sequence(
1286            ads, DIRECTION_MOBILE_ORIGINATED,
1287            self._wfc_set_wifi_strong_cell_strong,
1288            self._wfc_phone_setup_wifi_preferred, self._phone_idle_iwlan,
1289            self._is_phone_in_call_iwlan, None, True)
1290
1291        mt_result = self._wfc_call_sequence(
1292            ads, DIRECTION_MOBILE_TERMINATED,
1293            self._wfc_set_wifi_strong_cell_strong,
1294            self._wfc_phone_setup_wifi_preferred, self._phone_idle_iwlan,
1295            self._is_phone_in_call_iwlan, None, True)
1296
1297        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1298        return ((mo_result is True) and (mt_result is True))
1299
1300    @test_tracker_info(uuid="39d6808c-37f3-4ae1-babb-2218a4827da9")
1301    @TelephonyBaseTest.tel_test_wrap
1302    def test_call_epdg_wfc_cellular_preferred_wifi_strong_cellular_strong(
1303            self):
1304        """ Test WFC MO MT, cellular preferred mode, WIFI strong, Cellular strong
1305
1306        Set WiFi/Cellular network environment.
1307        Make Sure PhoneA is set correct WFC parameters.
1308        Make SUre PhoneB is able to make MO/MT call.
1309        Call from PhoneA to PhoneB, call should succeed, call should on Cellular.
1310        Call from PhoneB to PHoneA, call should succeed, call should on Cellular.
1311
1312        Returns:
1313            True if pass; False if fail.
1314        """
1315        ads = [self.android_devices[0], self.android_devices[1]]
1316        mo_result = self._wfc_call_sequence(
1317            ads, DIRECTION_MOBILE_ORIGINATED,
1318            self._wfc_set_wifi_strong_cell_strong,
1319            self._wfc_phone_setup_cellular_preferred,
1320            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1321            True)
1322
1323        mt_result = self._wfc_call_sequence(
1324            ads, DIRECTION_MOBILE_TERMINATED,
1325            self._wfc_set_wifi_strong_cell_strong,
1326            self._wfc_phone_setup_cellular_preferred,
1327            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1328            True)
1329
1330        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1331        return ((mo_result is True) and (mt_result is True))
1332
1333    @test_tracker_info(uuid="ccc4973b-254f-4f12-a101-324c17e114d1")
1334    @TelephonyBaseTest.tel_test_wrap
1335    def test_call_epdg_wfc_wifi_only_wifi_weak_cellular_strong(self):
1336        """ Test WFC MO MT, WiFI only mode, WIFI weak, Cellular strong
1337
1338        Set WiFi/Cellular network environment.
1339        Make Sure PhoneA is set correct WFC parameters.
1340        Make SUre PhoneB is able to make MO/MT call.
1341        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
1342        Call from PhoneB to PHoneA, call should succeed, call should on WiFi.
1343
1344        Returns:
1345            True if pass; False if fail.
1346        """
1347        ads = [self.android_devices[0], self.android_devices[1]]
1348        mo_result = self._wfc_call_sequence(
1349            ads, DIRECTION_MOBILE_ORIGINATED,
1350            self._wfc_set_wifi_weak_cell_strong,
1351            self._wfc_phone_setup_wifi_only, self._phone_idle_iwlan,
1352            self._is_phone_in_call_iwlan, None, True)
1353
1354        mt_result = self._wfc_call_sequence(
1355            ads, DIRECTION_MOBILE_TERMINATED,
1356            self._wfc_set_wifi_weak_cell_strong,
1357            self._wfc_phone_setup_wifi_only, self._phone_idle_iwlan,
1358            self._is_phone_in_call_iwlan, None, True)
1359
1360        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1361        return ((mo_result is True) and (mt_result is True))
1362
1363    @test_tracker_info(uuid="cdbfca5e-06a3-4fd4-87a7-cc8028335c94")
1364    @TelephonyBaseTest.tel_test_wrap
1365    def test_call_epdg_wfc_wifi_preferred_wifi_weak_cellular_strong(self):
1366        """ Test WFC MO MT, WiFI preferred mode, WIFI weak, Cellular strong
1367
1368        Set WiFi/Cellular network environment.
1369        Make Sure PhoneA is set correct WFC parameters.
1370        Make SUre PhoneB is able to make MO/MT call.
1371        Call from PhoneA to PhoneB, call should succeed, call should on Cellular.
1372        Call from PhoneB to PHoneA, call should succeed, call should on Cellular.
1373
1374        Returns:
1375            True if pass; False if fail.
1376        """
1377        ads = [self.android_devices[0], self.android_devices[1]]
1378        mo_result = self._wfc_call_sequence(
1379            ads, DIRECTION_MOBILE_ORIGINATED,
1380            self._wfc_set_wifi_weak_cell_strong,
1381            self._wfc_phone_setup_wifi_preferred, self._phone_idle_not_iwlan,
1382            self._is_phone_in_call_not_iwlan, None, True)
1383
1384        mt_result = self._wfc_call_sequence(
1385            ads, DIRECTION_MOBILE_TERMINATED,
1386            self._wfc_set_wifi_weak_cell_strong,
1387            self._wfc_phone_setup_wifi_preferred, self._phone_idle_not_iwlan,
1388            self._is_phone_in_call_not_iwlan, None, True)
1389
1390        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1391        return ((mo_result is True) and (mt_result is True))
1392
1393    @test_tracker_info(uuid="dbcbc77a-8551-4a40-88c3-3493d7c4d506")
1394    @TelephonyBaseTest.tel_test_wrap
1395    def test_call_epdg_wfc_cellular_preferred_wifi_weak_cellular_strong(self):
1396        """ Test WFC MO MT, cellular preferred mode, WIFI strong, Cellular strong
1397
1398        Set WiFi/Cellular network environment.
1399        Make Sure PhoneA is set correct WFC parameters.
1400        Make SUre PhoneB is able to make MO/MT call.
1401        Call from PhoneA to PhoneB, call should succeed, call should on Cellular.
1402        Call from PhoneB to PHoneA, call should succeed, call should on Cellular.
1403
1404        Returns:
1405            True if pass; False if fail.
1406        """
1407        ads = [self.android_devices[0], self.android_devices[1]]
1408        mo_result = self._wfc_call_sequence(
1409            ads, DIRECTION_MOBILE_ORIGINATED,
1410            self._wfc_set_wifi_weak_cell_strong,
1411            self._wfc_phone_setup_cellular_preferred,
1412            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1413            True)
1414
1415        mt_result = self._wfc_call_sequence(
1416            ads, DIRECTION_MOBILE_TERMINATED,
1417            self._wfc_set_wifi_weak_cell_strong,
1418            self._wfc_phone_setup_cellular_preferred,
1419            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1420            True)
1421
1422        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1423        return ((mo_result is True) and (mt_result is True))
1424
1425    @test_tracker_info(uuid="2a52dbf7-b63b-42d9-8406-09d168878041")
1426    @TelephonyBaseTest.tel_test_wrap
1427    def test_call_epdg_wfc_wifi_only_wifi_absent_cellular_strong(self):
1428        """ Test WFC MO MT, WiFI only mode, WIFI absent, Cellular strong
1429
1430        Set WiFi/Cellular network environment.
1431        Make Sure PhoneA is set correct WFC parameters.
1432        Make SUre PhoneB is able to make MO/MT call.
1433        Call from PhoneA to PhoneB, call should fail.
1434        Call from PhoneB to PHoneA, call should fail.
1435
1436        Returns:
1437            True if pass; False if fail.
1438        """
1439        ads = [self.android_devices[0], self.android_devices[1]]
1440        mo_result = self._wfc_call_sequence(
1441            ads, DIRECTION_MOBILE_ORIGINATED,
1442            self._wfc_set_wifi_absent_cell_strong,
1443            self._wfc_phone_setup_wifi_absent_wifi_only,
1444            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1445            "initiate_call fail.")
1446
1447        mt_result = self._wfc_call_sequence(
1448            ads, DIRECTION_MOBILE_TERMINATED,
1449            self._wfc_set_wifi_absent_cell_strong,
1450            self._wfc_phone_setup_wifi_absent_wifi_only,
1451            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1452            "wait_and_answer_call fail.")
1453
1454        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1455        return ((mo_result is True) and (mt_result is True))
1456
1457    @test_tracker_info(uuid="31ae1aee-977c-45ec-abfc-24121fcd2fe9")
1458    @TelephonyBaseTest.tel_test_wrap
1459    def test_call_epdg_wfc_wifi_preferred_wifi_absent_cellular_strong(self):
1460        """ Test WFC MO MT, WiFI preferred mode, WIFI absent, Cellular strong
1461
1462        Set WiFi/Cellular network environment.
1463        Make Sure PhoneA is set correct WFC parameters.
1464        Make SUre PhoneB is able to make MO/MT call.
1465        Call from PhoneA to PhoneB, call should succeed, call should on Cellular.
1466        Call from PhoneB to PHoneA, call should succeed, call should on Cellular.
1467
1468        Returns:
1469            True if pass; False if fail.
1470        """
1471        ads = [self.android_devices[0], self.android_devices[1]]
1472        mo_result = self._wfc_call_sequence(
1473            ads, DIRECTION_MOBILE_ORIGINATED,
1474            self._wfc_set_wifi_absent_cell_strong,
1475            self._wfc_phone_setup_wifi_absent_wifi_preferred,
1476            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1477            True)
1478
1479        mt_result = self._wfc_call_sequence(
1480            ads, DIRECTION_MOBILE_TERMINATED,
1481            self._wfc_set_wifi_absent_cell_strong,
1482            self._wfc_phone_setup_wifi_absent_wifi_preferred,
1483            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1484            True)
1485
1486        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1487        return ((mo_result is True) and (mt_result is True))
1488
1489    @test_tracker_info(uuid="314bf912-0fef-4047-bdeb-5cae2e89bbe6")
1490    @TelephonyBaseTest.tel_test_wrap
1491    def test_call_epdg_wfc_cellular_preferred_wifi_absent_cellular_strong(
1492            self):
1493        """ Test WFC MO MT, cellular preferred mode, WIFI absent, Cellular strong
1494
1495        Set WiFi/Cellular network environment.
1496        Make Sure PhoneA is set correct WFC parameters.
1497        Make SUre PhoneB is able to make MO/MT call.
1498        Call from PhoneA to PhoneB, call should succeed, call should on Cellular.
1499        Call from PhoneB to PHoneA, call should succeed, call should on Cellular.
1500
1501        Returns:
1502            True if pass; False if fail.
1503        """
1504        ads = [self.android_devices[0], self.android_devices[1]]
1505        mo_result = self._wfc_call_sequence(
1506            ads, DIRECTION_MOBILE_ORIGINATED,
1507            self._wfc_set_wifi_absent_cell_strong,
1508            self._wfc_phone_setup_wifi_absent_cellular_preferred,
1509            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1510            True)
1511
1512        mt_result = self._wfc_call_sequence(
1513            ads, DIRECTION_MOBILE_TERMINATED,
1514            self._wfc_set_wifi_absent_cell_strong,
1515            self._wfc_phone_setup_wifi_absent_cellular_preferred,
1516            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1517            True)
1518
1519        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1520        return ((mo_result is True) and (mt_result is True))
1521
1522    @test_tracker_info(uuid="27516aa7-0f28-4cf6-9562-4f0ad7378f64")
1523    @TelephonyBaseTest.tel_test_wrap
1524    def test_call_epdg_wfc_wifi_only_wifi_disabled_cellular_strong(self):
1525        """ Test WFC MO MT, WiFI only mode, WIFI disabled, Cellular strong
1526
1527        Set WiFi/Cellular network environment.
1528        Make Sure PhoneA is set correct WFC parameters.
1529        Make SUre PhoneB is able to make MO/MT call.
1530        Call from PhoneA to PhoneB, call should fail.
1531        Call from PhoneB to PHoneA, call should fail.
1532
1533        Returns:
1534            True if pass; False if fail.
1535        """
1536        ads = [self.android_devices[0], self.android_devices[1]]
1537        mo_result = self._wfc_call_sequence(
1538            ads, DIRECTION_MOBILE_ORIGINATED,
1539            self._wfc_set_wifi_strong_cell_strong,
1540            self._wfc_phone_setup_wifi_disabled_wifi_only,
1541            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1542            "initiate_call fail.")
1543
1544        mt_result = self._wfc_call_sequence(
1545            ads, DIRECTION_MOBILE_TERMINATED,
1546            self._wfc_set_wifi_strong_cell_strong,
1547            self._wfc_phone_setup_wifi_disabled_wifi_only,
1548            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1549            "wait_and_answer_call fail.")
1550
1551        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1552        return ((mo_result is True) and (mt_result is True))
1553
1554    @test_tracker_info(uuid="e031a0f4-6896-454a-af70-8472a9805432")
1555    @TelephonyBaseTest.tel_test_wrap
1556    def test_call_epdg_wfc_wifi_preferred_wifi_disabled_cellular_strong(self):
1557        """ Test WFC MO MT, WiFI preferred mode, WIFI disabled, Cellular strong
1558
1559        Set WiFi/Cellular network environment.
1560        Make Sure PhoneA is set correct WFC parameters.
1561        Make SUre PhoneB is able to make MO/MT call.
1562        Call from PhoneA to PhoneB, call should succeed, call should on Cellular.
1563        Call from PhoneB to PHoneA, call should succeed, call should on Cellular.
1564
1565        Returns:
1566            True if pass; False if fail.
1567        """
1568        ads = [self.android_devices[0], self.android_devices[1]]
1569        mo_result = self._wfc_call_sequence(
1570            ads, DIRECTION_MOBILE_ORIGINATED,
1571            self._wfc_set_wifi_strong_cell_strong,
1572            self._wfc_phone_setup_wifi_disabled_wifi_preferred,
1573            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1574            True)
1575
1576        mt_result = self._wfc_call_sequence(
1577            ads, DIRECTION_MOBILE_TERMINATED,
1578            self._wfc_set_wifi_strong_cell_strong,
1579            self._wfc_phone_setup_wifi_disabled_wifi_preferred,
1580            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1581            True)
1582
1583        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1584        return ((mo_result is True) and (mt_result is True))
1585
1586    @test_tracker_info(uuid="1aff2cb3-fcbe-425e-be46-2cd693b1d239")
1587    @TelephonyBaseTest.tel_test_wrap
1588    def test_call_epdg_wfc_cellular_preferred_wifi_disabled_cellular_strong(
1589            self):
1590        """ Test WFC MO MT, cellular preferred mode, WIFI disabled, Cellular strong
1591
1592        Set WiFi/Cellular network environment.
1593        Make Sure PhoneA is set correct WFC parameters.
1594        Make SUre PhoneB is able to make MO/MT call.
1595        Call from PhoneA to PhoneB, call should succeed, call should on Cellular.
1596        Call from PhoneB to PHoneA, call should succeed, call should on Cellular.
1597
1598        Returns:
1599            True if pass; False if fail.
1600        """
1601        ads = [self.android_devices[0], self.android_devices[1]]
1602        mo_result = self._wfc_call_sequence(
1603            ads, DIRECTION_MOBILE_ORIGINATED,
1604            self._wfc_set_wifi_strong_cell_strong,
1605            self._wfc_phone_setup_wifi_disabled_cellular_preferred,
1606            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1607            True)
1608
1609        mt_result = self._wfc_call_sequence(
1610            ads, DIRECTION_MOBILE_TERMINATED,
1611            self._wfc_set_wifi_strong_cell_strong,
1612            self._wfc_phone_setup_wifi_disabled_cellular_preferred,
1613            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1614            True)
1615
1616        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1617        return ((mo_result is True) and (mt_result is True))
1618
1619    @test_tracker_info(uuid="fb24722e-3c11-4443-a65e-3bc64cff55ef")
1620    @TelephonyBaseTest.tel_test_wrap
1621    def test_call_epdg_wfc_wifi_only_wifi_strong_cellular_weak(self):
1622        """ Test WFC MO MT, WiFI only mode, WIFI strong, Cellular weak
1623
1624        Set WiFi/Cellular network environment.
1625        Make Sure PhoneA is set correct WFC parameters.
1626        Make SUre PhoneB is able to make MO/MT call.
1627        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
1628        Call from PhoneB to PhoneA, call should succeed, call should on WiFi.
1629
1630        Returns:
1631            True if pass; False if fail.
1632        """
1633        ads = [self.android_devices[0], self.android_devices[1]]
1634        mo_result = self._wfc_call_sequence(
1635            ads, DIRECTION_MOBILE_ORIGINATED,
1636            self._wfc_set_wifi_strong_cell_weak,
1637            self._wfc_phone_setup_wifi_only, self._phone_idle_iwlan,
1638            self._is_phone_in_call_iwlan, None, True)
1639
1640        mt_result = self._wfc_call_sequence(
1641            ads, DIRECTION_MOBILE_TERMINATED,
1642            self._wfc_set_wifi_strong_cell_weak,
1643            self._wfc_phone_setup_wifi_only, self._phone_idle_iwlan,
1644            self._is_phone_in_call_iwlan, None, True)
1645
1646        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1647        return ((mo_result is True) and (mt_result is True))
1648
1649    @test_tracker_info(uuid="5b649c6d-1fa2-4044-b487-79cb897a803f")
1650    @TelephonyBaseTest.tel_test_wrap
1651    def test_call_epdg_wfc_wifi_preferred_wifi_strong_cellular_weak(self):
1652        """ Test WFC MO MT, WiFI preferred mode, WIFI strong, Cellular weak
1653
1654        Set WiFi/Cellular network environment.
1655        Make Sure PhoneA is set correct WFC parameters.
1656        Make SUre PhoneB is able to make MO/MT call.
1657        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
1658        Call from PhoneB to PhoneA, call should succeed, call should on WiFi.
1659
1660        Returns:
1661            True if pass; False if fail.
1662        """
1663        ads = [self.android_devices[0], self.android_devices[1]]
1664        mo_result = self._wfc_call_sequence(
1665            ads, DIRECTION_MOBILE_ORIGINATED,
1666            self._wfc_set_wifi_strong_cell_weak,
1667            self._wfc_phone_setup_wifi_preferred, self._phone_idle_iwlan,
1668            self._is_phone_in_call_iwlan, None, True)
1669
1670        mt_result = self._wfc_call_sequence(
1671            ads, DIRECTION_MOBILE_TERMINATED,
1672            self._wfc_set_wifi_strong_cell_weak,
1673            self._wfc_phone_setup_wifi_preferred, self._phone_idle_iwlan,
1674            self._is_phone_in_call_iwlan, None, True)
1675
1676        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1677        return ((mo_result is True) and (mt_result is True))
1678
1679    @test_tracker_info(uuid="225cc438-620f-45c4-9682-ae5f13c81b03")
1680    @TelephonyBaseTest.tel_test_wrap
1681    def test_call_epdg_wfc_cellular_preferred_wifi_strong_cellular_weak(self):
1682        """ Test WFC MO MT, cellular preferred mode, WIFI strong, Cellular weak
1683
1684        Set WiFi/Cellular network environment.
1685        Make Sure PhoneA is set correct WFC parameters.
1686        Make SUre PhoneB is able to make MO/MT call.
1687        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
1688        Call from PhoneB to PhoneA, call should succeed, call should on WiFi.
1689
1690        Returns:
1691            True if pass; False if fail.
1692        """
1693        ads = [self.android_devices[0], self.android_devices[1]]
1694        mo_result = self._wfc_call_sequence(
1695            ads, DIRECTION_MOBILE_ORIGINATED,
1696            self._wfc_set_wifi_strong_cell_weak,
1697            self._wfc_phone_setup_cellular_preferred, self._phone_idle_iwlan,
1698            self._is_phone_in_call_iwlan, None, True)
1699
1700        mt_result = self._wfc_call_sequence(
1701            ads, DIRECTION_MOBILE_TERMINATED,
1702            self._wfc_set_wifi_strong_cell_weak,
1703            self._wfc_phone_setup_cellular_preferred, self._phone_idle_iwlan,
1704            self._is_phone_in_call_iwlan, None, True)
1705
1706        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1707        return ((mo_result is True) and (mt_result is True))
1708
1709    @test_tracker_info(uuid="837de903-06f2-4a60-a623-b3478a5d6639")
1710    @TelephonyBaseTest.tel_test_wrap
1711    def test_call_epdg_wfc_wifi_only_wifi_weak_cellular_weak(self):
1712        """ Test WFC MO MT, WiFI only mode, WIFI weak, Cellular weak
1713
1714        Set WiFi/Cellular network environment.
1715        Make Sure PhoneA is set correct WFC parameters.
1716        Make SUre PhoneB is able to make MO/MT call.
1717        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
1718        Call from PhoneB to PhoneA, call should succeed, call should on WiFi.
1719
1720        Returns:
1721            True if pass; False if fail.
1722        """
1723        ads = [self.android_devices[0], self.android_devices[1]]
1724        mo_result = self._wfc_call_sequence(
1725            ads, DIRECTION_MOBILE_ORIGINATED,
1726            self._wfc_set_wifi_weak_cell_weak, self._wfc_phone_setup_wifi_only,
1727            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
1728
1729        mt_result = self._wfc_call_sequence(
1730            ads, DIRECTION_MOBILE_TERMINATED,
1731            self._wfc_set_wifi_weak_cell_weak, self._wfc_phone_setup_wifi_only,
1732            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
1733
1734        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1735        return ((mo_result is True) and (mt_result is True))
1736
1737    @test_tracker_info(uuid="57f70488-19ec-4ca9-9837-e6acec2494ae")
1738    @TelephonyBaseTest.tel_test_wrap
1739    def test_call_epdg_wfc_wifi_preferred_wifi_weak_cellular_weak(self):
1740        """ Test WFC MO MT, WiFI preferred mode, WIFI weak, Cellular weak
1741
1742        Set WiFi/Cellular network environment.
1743        Make Sure PhoneA is set correct WFC parameters.
1744        Make SUre PhoneB is able to make MO/MT call.
1745        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
1746        Call from PhoneB to PhoneA, call should succeed, call should on WiFi.
1747
1748        Returns:
1749            True if pass; False if fail.
1750        """
1751        ads = [self.android_devices[0], self.android_devices[1]]
1752        mo_result = self._wfc_call_sequence(
1753            ads, DIRECTION_MOBILE_ORIGINATED,
1754            self._wfc_set_wifi_weak_cell_weak,
1755            self._wfc_phone_setup_wifi_preferred, self._phone_idle_iwlan,
1756            self._is_phone_in_call_iwlan, None, True)
1757
1758        mt_result = self._wfc_call_sequence(
1759            ads, DIRECTION_MOBILE_TERMINATED,
1760            self._wfc_set_wifi_weak_cell_weak,
1761            self._wfc_phone_setup_wifi_preferred, self._phone_idle_iwlan,
1762            self._is_phone_in_call_iwlan, None, True)
1763
1764        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1765        return ((mo_result is True) and (mt_result is True))
1766
1767    @test_tracker_info(uuid="845a62ba-3457-42ed-8a74-0f7fdde44011")
1768    @TelephonyBaseTest.tel_test_wrap
1769    def test_call_epdg_wfc_cellular_preferred_wifi_weak_cellular_weak(self):
1770        """ Test WFC MO MT, cellular preferred mode, WIFI weak, Cellular weak
1771
1772        Set WiFi/Cellular network environment.
1773        Make Sure PhoneA is set correct WFC parameters.
1774        Make SUre PhoneB is able to make MO/MT call.
1775        Call from PhoneA to PhoneB, call should succeed, call should on Cellular.
1776        Call from PhoneB to PhoneA, call should succeed, call should on Cellular.
1777
1778        Returns:
1779            True if pass; False if fail.
1780        """
1781        ads = [self.android_devices[0], self.android_devices[1]]
1782        mo_result = self._wfc_call_sequence(
1783            ads, DIRECTION_MOBILE_ORIGINATED,
1784            self._wfc_set_wifi_weak_cell_weak,
1785            self._wfc_phone_setup_cellular_preferred,
1786            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1787            True)
1788
1789        mt_result = self._wfc_call_sequence(
1790            ads, DIRECTION_MOBILE_TERMINATED,
1791            self._wfc_set_wifi_weak_cell_weak,
1792            self._wfc_phone_setup_cellular_preferred,
1793            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1794            True)
1795
1796        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1797        return ((mo_result is True) and (mt_result is True))
1798
1799    @test_tracker_info(uuid="298f92e5-c509-42d7-bd85-d29337e391df")
1800    @TelephonyBaseTest.tel_test_wrap
1801    def test_call_epdg_wfc_wifi_only_wifi_absent_cellular_weak(self):
1802        """ Test WFC MO MT, WiFI only mode, WIFI absent, Cellular weak
1803
1804        Set WiFi/Cellular network environment.
1805        Make Sure PhoneA is set correct WFC parameters.
1806        Make SUre PhoneB is able to make MO/MT call.
1807        Call from PhoneA to PhoneB, call should fail.
1808        Call from PhoneB to PhoneA, call should fail.
1809
1810        Returns:
1811            True if pass; False if fail.
1812        """
1813        ads = [self.android_devices[0], self.android_devices[1]]
1814        mo_result = self._wfc_call_sequence(
1815            ads, DIRECTION_MOBILE_ORIGINATED,
1816            self._wfc_set_wifi_absent_cell_weak,
1817            self._wfc_phone_setup_wifi_absent_wifi_only,
1818            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1819            "initiate_call fail.")
1820
1821        mt_result = self._wfc_call_sequence(
1822            ads, DIRECTION_MOBILE_TERMINATED,
1823            self._wfc_set_wifi_absent_cell_weak,
1824            self._wfc_phone_setup_wifi_absent_wifi_only,
1825            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1826            "wait_and_answer_call fail.")
1827
1828        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1829        return ((mo_result is True) and (mt_result is True))
1830
1831    @test_tracker_info(uuid="845278c5-1442-4a3a-93cd-c661190a5574")
1832    @TelephonyBaseTest.tel_test_wrap
1833    def test_call_epdg_wfc_wifi_preferred_wifi_absent_cellular_weak(self):
1834        """ Test WFC MO MT, WiFI preferred mode, WIFI absent, Cellular weak
1835
1836        Set WiFi/Cellular network environment.
1837        Make Sure PhoneA is set correct WFC parameters.
1838        Make SUre PhoneB is able to make MO/MT call.
1839        Call from PhoneA to PhoneB, call should succeed, call should on Cellular.
1840        Call from PhoneB to PhoneA, call should succeed, call should on Cellular.
1841
1842        Returns:
1843            True if pass; False if fail.
1844        """
1845        ads = [self.android_devices[0], self.android_devices[1]]
1846        mo_result = self._wfc_call_sequence(
1847            ads, DIRECTION_MOBILE_ORIGINATED,
1848            self._wfc_set_wifi_absent_cell_weak,
1849            self._wfc_phone_setup_wifi_absent_wifi_preferred,
1850            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1851            True)
1852
1853        mt_result = self._wfc_call_sequence(
1854            ads, DIRECTION_MOBILE_TERMINATED,
1855            self._wfc_set_wifi_absent_cell_weak,
1856            self._wfc_phone_setup_wifi_absent_wifi_preferred,
1857            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1858            True)
1859
1860        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1861        return ((mo_result is True) and (mt_result is True))
1862
1863    @test_tracker_info(uuid="63319009-aaef-424a-bfb1-da56d3f9a2b2")
1864    @TelephonyBaseTest.tel_test_wrap
1865    def test_call_epdg_wfc_cellular_preferred_wifi_absent_cellular_weak(self):
1866        """ Test WFC MO MT, cellular preferred mode, WIFI absent, Cellular weak
1867
1868        Set WiFi/Cellular network environment.
1869        Make Sure PhoneA is set correct WFC parameters.
1870        Make SUre PhoneB is able to make MO/MT call.
1871        Call from PhoneA to PhoneB, call should succeed, call should on Cellular.
1872        Call from PhoneB to PhoneA, call should succeed, call should on Cellular.
1873
1874        Returns:
1875            True if pass; False if fail.
1876        """
1877        ads = [self.android_devices[0], self.android_devices[1]]
1878        mo_result = self._wfc_call_sequence(
1879            ads, DIRECTION_MOBILE_ORIGINATED,
1880            self._wfc_set_wifi_absent_cell_weak,
1881            self._wfc_phone_setup_wifi_absent_cellular_preferred,
1882            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1883            True)
1884
1885        mt_result = self._wfc_call_sequence(
1886            ads, DIRECTION_MOBILE_TERMINATED,
1887            self._wfc_set_wifi_absent_cell_weak,
1888            self._wfc_phone_setup_wifi_absent_cellular_preferred,
1889            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1890            True)
1891
1892        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1893        return ((mo_result is True) and (mt_result is True))
1894
1895    @test_tracker_info(uuid="ff3f474c-5d7a-4440-b2d4-a99ccb5d2dd7")
1896    @TelephonyBaseTest.tel_test_wrap
1897    def test_call_epdg_wfc_wifi_only_wifi_disabled_cellular_weak(self):
1898        """ Test WFC MO MT, WiFI only mode, WIFI disabled, Cellular weak
1899
1900        Set WiFi/Cellular network environment.
1901        Make Sure PhoneA is set correct WFC parameters.
1902        Make SUre PhoneB is able to make MO/MT call.
1903        Call from PhoneA to PhoneB, call should fail.
1904        Call from PhoneB to PhoneA, call should fail.
1905
1906        Returns:
1907            True if pass; False if fail.
1908        """
1909        ads = [self.android_devices[0], self.android_devices[1]]
1910        mo_result = self._wfc_call_sequence(
1911            ads, DIRECTION_MOBILE_ORIGINATED,
1912            self._wfc_set_wifi_strong_cell_weak,
1913            self._wfc_phone_setup_wifi_disabled_wifi_only,
1914            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1915            "initiate_call fail.")
1916
1917        mt_result = self._wfc_call_sequence(
1918            ads, DIRECTION_MOBILE_TERMINATED,
1919            self._wfc_set_wifi_strong_cell_weak,
1920            self._wfc_phone_setup_wifi_disabled_wifi_only,
1921            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
1922            "wait_and_answer_call fail.")
1923
1924        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1925        return ((mo_result is True) and (mt_result is True))
1926
1927    @test_tracker_info(uuid="7ad6d6e3-1113-4304-96fa-961983380207")
1928    @TelephonyBaseTest.tel_test_wrap
1929    def test_call_epdg_wfc_wifi_preferred_wifi_disabled_cellular_weak(self):
1930        """ Test WFC MO MT, WiFI preferred mode, WIFI disabled, Cellular weak
1931
1932        Set WiFi/Cellular network environment.
1933        Make Sure PhoneA is set correct WFC parameters.
1934        Make SUre PhoneB is able to make MO/MT call.
1935        Call from PhoneA to PhoneB, call should succeed, call should on Cellular.
1936        Call from PhoneB to PhoneA, call should succeed, call should on Cellular.
1937
1938        Returns:
1939            True if pass; False if fail.
1940        """
1941        ads = [self.android_devices[0], self.android_devices[1]]
1942        mo_result = self._wfc_call_sequence(
1943            ads, DIRECTION_MOBILE_ORIGINATED,
1944            self._wfc_set_wifi_strong_cell_weak,
1945            self._wfc_phone_setup_wifi_disabled_wifi_preferred,
1946            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1947            True)
1948
1949        mt_result = self._wfc_call_sequence(
1950            ads, DIRECTION_MOBILE_TERMINATED,
1951            self._wfc_set_wifi_strong_cell_weak,
1952            self._wfc_phone_setup_wifi_disabled_wifi_preferred,
1953            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1954            True)
1955
1956        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1957        return ((mo_result is True) and (mt_result is True))
1958
1959    @test_tracker_info(uuid="3062d062-17f1-4265-8dec-ed75d5d275ee")
1960    @TelephonyBaseTest.tel_test_wrap
1961    def test_call_epdg_wfc_cellular_preferred_wifi_disabled_cellular_weak(
1962            self):
1963        """ Test WFC MO MT, cellular preferred mode, WIFI disabled, Cellular weak
1964
1965        Set WiFi/Cellular network environment.
1966        Make Sure PhoneA is set correct WFC parameters.
1967        Make SUre PhoneB is able to make MO/MT call.
1968        Call from PhoneA to PhoneB, call should succeed, call should on Cellular.
1969        Call from PhoneB to PhoneA, call should succeed, call should on Cellular.
1970
1971        Returns:
1972            True if pass; False if fail.
1973        """
1974        ads = [self.android_devices[0], self.android_devices[1]]
1975        mo_result = self._wfc_call_sequence(
1976            ads, DIRECTION_MOBILE_ORIGINATED,
1977            self._wfc_set_wifi_strong_cell_weak,
1978            self._wfc_phone_setup_wifi_disabled_cellular_preferred,
1979            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1980            True)
1981
1982        mt_result = self._wfc_call_sequence(
1983            ads, DIRECTION_MOBILE_TERMINATED,
1984            self._wfc_set_wifi_strong_cell_weak,
1985            self._wfc_phone_setup_wifi_disabled_cellular_preferred,
1986            self._phone_idle_not_iwlan, self._is_phone_in_call_not_iwlan, None,
1987            True)
1988
1989        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
1990        return ((mo_result is True) and (mt_result is True))
1991
1992    @test_tracker_info(uuid="0f40d344-25b4-459e-a21e-79c84bb5db41")
1993    @TelephonyBaseTest.tel_test_wrap
1994    def test_call_epdg_wfc_wifi_only_wifi_strong_cellular_absent(self):
1995        """ Test WFC MO MT, WiFI only mode, WIFI strong, Cellular absent
1996
1997        Set WiFi/Cellular network environment.
1998        Make Sure PhoneA is set correct WFC parameters.
1999        Make SUre PhoneB is able to make MO/MT call.
2000        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
2001        Call from PhoneB to PhoneA, call should succeed, call should on WiFi.
2002
2003        Returns:
2004            True if pass; False if fail.
2005        """
2006        ads = [self.android_devices[0], self.android_devices[1]]
2007        mo_result = self._wfc_call_sequence(
2008            ads, DIRECTION_MOBILE_ORIGINATED,
2009            self._wfc_set_wifi_strong_cell_absent,
2010            self._wfc_phone_setup_cellular_absent_wifi_only,
2011            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
2012
2013        mt_result = self._wfc_call_sequence(
2014            ads, DIRECTION_MOBILE_TERMINATED,
2015            self._wfc_set_wifi_strong_cell_absent,
2016            self._wfc_phone_setup_cellular_absent_wifi_only,
2017            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
2018
2019        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2020        return ((mo_result is True) and (mt_result is True))
2021
2022    @test_tracker_info(uuid="62c0e1c7-9fd7-4d98-87c8-a2d8df69cbd6")
2023    @TelephonyBaseTest.tel_test_wrap
2024    def test_call_epdg_wfc_wifi_preferred_wifi_strong_cellular_absent(self):
2025        """ Test WFC MO MT, WiFI preferred mode, WIFI strong, Cellular absent
2026
2027        Set WiFi/Cellular network environment.
2028        Make Sure PhoneA is set correct WFC parameters.
2029        Make SUre PhoneB is able to make MO/MT call.
2030        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
2031        Call from PhoneB to PhoneA, call should succeed, call should on WiFi.
2032
2033        Returns:
2034            True if pass; False if fail.
2035        """
2036        ads = [self.android_devices[0], self.android_devices[1]]
2037        mo_result = self._wfc_call_sequence(
2038            ads, DIRECTION_MOBILE_ORIGINATED,
2039            self._wfc_set_wifi_strong_cell_absent,
2040            self._wfc_phone_setup_cellular_absent_wifi_preferred,
2041            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
2042
2043        mt_result = self._wfc_call_sequence(
2044            ads, DIRECTION_MOBILE_TERMINATED,
2045            self._wfc_set_wifi_strong_cell_absent,
2046            self._wfc_phone_setup_cellular_absent_wifi_preferred,
2047            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
2048
2049        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2050        return ((mo_result is True) and (mt_result is True))
2051
2052    @test_tracker_info(uuid="2b13f862-71e4-4b33-be0b-e83a61e3f443")
2053    @TelephonyBaseTest.tel_test_wrap
2054    def test_call_epdg_wfc_cellular_preferred_wifi_strong_cellular_absent(
2055            self):
2056        """ Test WFC MO MT, cellular preferred mode, WIFI strong, Cellular absent
2057
2058        Set WiFi/Cellular network environment.
2059        Make Sure PhoneA is set correct WFC parameters.
2060        Make SUre PhoneB is able to make MO/MT call.
2061        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
2062        Call from PhoneB to PhoneA, call should succeed, call should on WiFi.
2063
2064        Returns:
2065            True if pass; False if fail.
2066        """
2067        ads = [self.android_devices[0], self.android_devices[1]]
2068        mo_result = self._wfc_call_sequence(
2069            ads, DIRECTION_MOBILE_ORIGINATED,
2070            self._wfc_set_wifi_strong_cell_absent,
2071            self._wfc_phone_setup_cellular_absent_cellular_preferred,
2072            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
2073
2074        mt_result = self._wfc_call_sequence(
2075            ads, DIRECTION_MOBILE_TERMINATED,
2076            self._wfc_set_wifi_strong_cell_absent,
2077            self._wfc_phone_setup_cellular_absent_cellular_preferred,
2078            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
2079
2080        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2081        return ((mo_result is True) and (mt_result is True))
2082
2083    @test_tracker_info(uuid="49aa09d1-afd5-4b8a-9155-b351b1cecd83")
2084    @TelephonyBaseTest.tel_test_wrap
2085    def test_call_epdg_wfc_wifi_only_wifi_weak_cellular_absent(self):
2086        """ Test WFC MO MT, WiFI only mode, WIFI weak, Cellular absent
2087
2088        Set WiFi/Cellular network environment.
2089        Make Sure PhoneA is set correct WFC parameters.
2090        Make SUre PhoneB is able to make MO/MT call.
2091        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
2092        Call from PhoneB to PhoneA, call should succeed, call should on WiFi.
2093
2094        Returns:
2095            True if pass; False if fail.
2096        """
2097        ads = [self.android_devices[0], self.android_devices[1]]
2098        mo_result = self._wfc_call_sequence(
2099            ads, DIRECTION_MOBILE_ORIGINATED,
2100            self._wfc_set_wifi_weak_cell_absent,
2101            self._wfc_phone_setup_cellular_absent_wifi_only,
2102            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
2103
2104        mt_result = self._wfc_call_sequence(
2105            ads, DIRECTION_MOBILE_TERMINATED,
2106            self._wfc_set_wifi_weak_cell_absent,
2107            self._wfc_phone_setup_cellular_absent_wifi_only,
2108            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
2109
2110        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2111        return ((mo_result is True) and (mt_result is True))
2112
2113    @test_tracker_info(uuid="29e20d21-33bd-444f-ba51-487332e8bcbb")
2114    @TelephonyBaseTest.tel_test_wrap
2115    def test_call_epdg_wfc_wifi_preferred_wifi_weak_cellular_absent(self):
2116        """ Test WFC MO MT, WiFI preferred mode, WIFI weak, Cellular absent
2117
2118        Set WiFi/Cellular network environment.
2119        Make Sure PhoneA is set correct WFC parameters.
2120        Make SUre PhoneB is able to make MO/MT call.
2121        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
2122        Call from PhoneB to PhoneA, call should succeed, call should on WiFi.
2123
2124        Returns:
2125            True if pass; False if fail.
2126        """
2127        ads = [self.android_devices[0], self.android_devices[1]]
2128        mo_result = self._wfc_call_sequence(
2129            ads, DIRECTION_MOBILE_ORIGINATED,
2130            self._wfc_set_wifi_weak_cell_absent,
2131            self._wfc_phone_setup_cellular_absent_wifi_preferred,
2132            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
2133
2134        mt_result = self._wfc_call_sequence(
2135            ads, DIRECTION_MOBILE_TERMINATED,
2136            self._wfc_set_wifi_weak_cell_absent,
2137            self._wfc_phone_setup_cellular_absent_wifi_preferred,
2138            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
2139
2140        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2141        return ((mo_result is True) and (mt_result is True))
2142
2143    @test_tracker_info(uuid="f1aae6c2-0b40-4ee5-a8a9-f0036130dcf1")
2144    @TelephonyBaseTest.tel_test_wrap
2145    def test_call_epdg_wfc_cellular_preferred_wifi_weak_cellular_absent(self):
2146        """ Test WFC MO MT, cellular preferred mode, WIFI weak, Cellular absent
2147
2148        Set WiFi/Cellular network environment.
2149        Make Sure PhoneA is set correct WFC parameters.
2150        Make SUre PhoneB is able to make MO/MT call.
2151        Call from PhoneA to PhoneB, call should succeed, call should on WiFi.
2152        Call from PhoneB to PhoneA, call should succeed, call should on WiFi.
2153
2154        Returns:
2155            True if pass; False if fail.
2156        """
2157        ads = [self.android_devices[0], self.android_devices[1]]
2158        mo_result = self._wfc_call_sequence(
2159            ads, DIRECTION_MOBILE_ORIGINATED,
2160            self._wfc_set_wifi_weak_cell_absent,
2161            self._wfc_phone_setup_cellular_absent_cellular_preferred,
2162            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
2163
2164        mt_result = self._wfc_call_sequence(
2165            ads, DIRECTION_MOBILE_TERMINATED,
2166            self._wfc_set_wifi_weak_cell_absent,
2167            self._wfc_phone_setup_cellular_absent_cellular_preferred,
2168            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
2169
2170        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2171        return ((mo_result is True) and (mt_result is True))
2172
2173    @test_tracker_info(uuid="7be33498-8f1c-4462-909b-09cd9abab053")
2174    @TelephonyBaseTest.tel_test_wrap
2175    def test_call_epdg_wfc_wifi_only_wifi_absent_cellular_absent(self):
2176        """ Test WFC MO MT, WiFI only mode, WIFI absent, Cellular absent
2177
2178        Set WiFi/Cellular network environment.
2179        Make Sure PhoneA is set correct WFC parameters.
2180        Make SUre PhoneB is able to make MO/MT call.
2181        Call from PhoneA to PhoneB, call should fail.
2182        Call from PhoneB to PhoneA, call should fail.
2183
2184        Returns:
2185            True if pass; False if fail.
2186        """
2187        ads = [self.android_devices[0], self.android_devices[1]]
2188        mo_result = self._wfc_call_sequence(
2189            ads, DIRECTION_MOBILE_ORIGINATED,
2190            self._wfc_set_wifi_absent_cell_absent,
2191            self._wfc_phone_setup_cellular_absent_wifi_absent_wifi_only,
2192            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
2193            "initiate_call fail.")
2194
2195        mt_result = self._wfc_call_sequence(
2196            ads, DIRECTION_MOBILE_TERMINATED,
2197            self._wfc_set_wifi_absent_cell_absent,
2198            self._wfc_phone_setup_cellular_absent_wifi_absent_wifi_only,
2199            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
2200            "wait_and_answer_call fail.")
2201
2202        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2203        return ((mo_result is True) and (mt_result is True))
2204
2205    @test_tracker_info(uuid="406c86cc-f3bb-4356-9ce7-6ae336e164f3")
2206    @TelephonyBaseTest.tel_test_wrap
2207    def test_call_epdg_wfc_wifi_preferred_wifi_absent_cellular_absent(self):
2208        """ Test WFC MO MT, WiFI preferred mode, WIFI absent, Cellular absent
2209
2210        Set WiFi/Cellular network environment.
2211        Make Sure PhoneA is set correct WFC parameters.
2212        Make SUre PhoneB is able to make MO/MT call.
2213        Call from PhoneA to PhoneB, call should fail.
2214        Call from PhoneB to PhoneA, call should fail.
2215
2216        Returns:
2217            True if pass; False if fail.
2218        """
2219        ads = [self.android_devices[0], self.android_devices[1]]
2220        mo_result = self._wfc_call_sequence(
2221            ads, DIRECTION_MOBILE_ORIGINATED,
2222            self._wfc_set_wifi_absent_cell_absent,
2223            self._wfc_phone_setup_cellular_absent_wifi_absent_wifi_preferred,
2224            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
2225            "initiate_call fail.")
2226
2227        mt_result = self._wfc_call_sequence(
2228            ads, DIRECTION_MOBILE_TERMINATED,
2229            self._wfc_set_wifi_absent_cell_absent,
2230            self._wfc_phone_setup_cellular_absent_wifi_absent_wifi_preferred,
2231            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
2232            "wait_and_answer_call fail.")
2233
2234        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2235        return ((mo_result is True) and (mt_result is True))
2236
2237    @test_tracker_info(uuid="e172082b-5e88-4229-9da9-e16a74da8fbb")
2238    @TelephonyBaseTest.tel_test_wrap
2239    def test_call_epdg_wfc_cellular_preferred_wifi_absent_cellular_absent(
2240            self):
2241        """ Test WFC MO MT, cellular preferred mode, WIFI absent, Cellular absent
2242
2243        Set WiFi/Cellular network environment.
2244        Make Sure PhoneA is set correct WFC parameters.
2245        Make SUre PhoneB is able to make MO/MT call.
2246        Call from PhoneA to PhoneB, call should fail.
2247        Call from PhoneB to PhoneA, call should fail.
2248
2249        Returns:
2250            True if pass; False if fail.
2251        """
2252        ads = [self.android_devices[0], self.android_devices[1]]
2253        mo_result = self._wfc_call_sequence(
2254            ads, DIRECTION_MOBILE_ORIGINATED,
2255            self._wfc_set_wifi_absent_cell_absent, self.
2256            _wfc_phone_setup_cellular_absent_wifi_absent_cellular_preferred,
2257            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
2258            "initiate_call fail.")
2259
2260        mt_result = self._wfc_call_sequence(
2261            ads, DIRECTION_MOBILE_TERMINATED,
2262            self._wfc_set_wifi_absent_cell_absent, self.
2263            _wfc_phone_setup_cellular_absent_wifi_absent_cellular_preferred,
2264            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
2265            "wait_and_answer_call fail.")
2266
2267        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2268        return ((mo_result is True) and (mt_result is True))
2269
2270    @test_tracker_info(uuid="f4a93a88-4a20-4e4a-9168-a7b1f1ad5462")
2271    @TelephonyBaseTest.tel_test_wrap
2272    def test_call_epdg_wfc_wifi_only_wifi_disabled_cellular_absent(self):
2273        """ Test WFC MO MT, WiFI only mode, WIFI strong, Cellular absent
2274
2275        Set WiFi/Cellular network environment.
2276        Make Sure PhoneA is set correct WFC parameters.
2277        Make SUre PhoneB is able to make MO/MT call.
2278        Call from PhoneA to PhoneB, call should fail.
2279        Call from PhoneB to PhoneA, call should fail.
2280
2281        Returns:
2282            True if pass; False if fail.
2283        """
2284        ads = [self.android_devices[0], self.android_devices[1]]
2285        mo_result = self._wfc_call_sequence(
2286            ads, DIRECTION_MOBILE_ORIGINATED,
2287            self._wfc_set_wifi_strong_cell_absent,
2288            self._wfc_phone_setup_cellular_absent_wifi_disabled_wifi_only,
2289            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
2290            "initiate_call fail.")
2291
2292        mt_result = self._wfc_call_sequence(
2293            ads, DIRECTION_MOBILE_TERMINATED,
2294            self._wfc_set_wifi_strong_cell_absent,
2295            self._wfc_phone_setup_cellular_absent_wifi_disabled_wifi_only,
2296            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
2297            "wait_and_answer_call fail.")
2298
2299        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2300        return ((mo_result is True) and (mt_result is True))
2301
2302    @test_tracker_info(uuid="c8f62254-2dba-4c54-a9d1-5741b6c05f10")
2303    @TelephonyBaseTest.tel_test_wrap
2304    def test_call_epdg_wfc_wifi_preferred_wifi_disabled_cellular_absent(self):
2305        """ Test WFC MO MT, WiFI preferred mode, WIFI strong, Cellular absent
2306
2307        Set WiFi/Cellular network environment.
2308        Make Sure PhoneA is set correct WFC parameters.
2309        Make SUre PhoneB is able to make MO/MT call.
2310        Call from PhoneA to PhoneB, call should fail.
2311        Call from PhoneB to PhoneA, call should fail.
2312
2313        Returns:
2314            True if pass; False if fail.
2315        """
2316        ads = [self.android_devices[0], self.android_devices[1]]
2317        mo_result = self._wfc_call_sequence(
2318            ads, DIRECTION_MOBILE_ORIGINATED,
2319            self._wfc_set_wifi_strong_cell_absent,
2320            self._wfc_phone_setup_cellular_absent_wifi_disabled_wifi_preferred,
2321            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
2322            "initiate_call fail.")
2323
2324        mt_result = self._wfc_call_sequence(
2325            ads, DIRECTION_MOBILE_TERMINATED,
2326            self._wfc_set_wifi_strong_cell_absent,
2327            self._wfc_phone_setup_cellular_absent_wifi_disabled_wifi_preferred,
2328            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
2329            "wait_and_answer_call fail.")
2330
2331        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2332        return ((mo_result is True) and (mt_result is True))
2333
2334    @test_tracker_info(uuid="1c593836-fbdd-415c-a997-5835303069ad")
2335    @TelephonyBaseTest.tel_test_wrap
2336    def test_call_epdg_wfc_cellular_preferred_wifi_disabled_cellular_absent(
2337            self):
2338        """ Test WFC MO MT, cellular preferred mode, WIFI strong, Cellular absent
2339
2340        Set WiFi/Cellular network environment.
2341        Make Sure PhoneA is set correct WFC parameters.
2342        Make SUre PhoneB is able to make MO/MT call.
2343        Call from PhoneA to PhoneB, call should fail.
2344        Call from PhoneB to PhoneA, call should fail.
2345
2346        Returns:
2347            True if pass; False if fail.
2348        """
2349        ads = [self.android_devices[0], self.android_devices[1]]
2350        mo_result = self._wfc_call_sequence(
2351            ads, DIRECTION_MOBILE_ORIGINATED,
2352            self._wfc_set_wifi_strong_cell_absent, self.
2353            _wfc_phone_setup_cellular_absent_wifi_disabled_cellular_preferred,
2354            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
2355            "initiate_call fail.")
2356
2357        mt_result = self._wfc_call_sequence(
2358            ads, DIRECTION_MOBILE_TERMINATED,
2359            self._wfc_set_wifi_strong_cell_absent, self.
2360            _wfc_phone_setup_cellular_absent_wifi_disabled_cellular_preferred,
2361            self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
2362            "wait_and_answer_call fail.")
2363
2364        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2365        return ((mo_result is True) and (mt_result is True))
2366
2367    @test_tracker_info(uuid="41ec5080-810a-47f0-93c6-281fc19c4d12")
2368    @TelephonyBaseTest.tel_test_wrap
2369    def test_call_epdg_wfc_disabled_wifi_strong_cellular_strong(self):
2370        """ Test WFC MO MT, WFC disabled, WIFI strong, Cellular strong
2371
2372        Set WiFi/Cellular network environment.
2373        Make Sure PhoneA is set correct WFC parameters.
2374        Make SUre PhoneB is able to make MO/MT call.
2375        Call from PhoneA to PhoneB, call should succeed, call should on Cellular.
2376        Call from PhoneB to PHoneA, call should succeed, call should on Cellular.
2377
2378        Returns:
2379            True if pass; False if fail.
2380        """
2381        ads = [self.android_devices[0], self.android_devices[1]]
2382        mo_result = self._wfc_call_sequence(
2383            ads, DIRECTION_MOBILE_ORIGINATED,
2384            self._wfc_set_wifi_strong_cell_strong,
2385            self._wfc_phone_setup_wfc_disabled, None,
2386            self._is_phone_in_call_not_iwlan, None, True)
2387
2388        mt_result = self._wfc_call_sequence(
2389            ads, DIRECTION_MOBILE_TERMINATED,
2390            self._wfc_set_wifi_strong_cell_strong,
2391            self._wfc_phone_setup_wfc_disabled, None,
2392            self._is_phone_in_call_not_iwlan, None, True)
2393
2394        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2395        return ((mo_result is True) and (mt_result is True))
2396
2397    @test_tracker_info(uuid="8c9dd7a3-c840-474d-b929-07e557428648")
2398    @TelephonyBaseTest.tel_test_wrap
2399    def test_call_epdg_wfc_disabled_wifi_strong_cellular_weak(self):
2400        """ Test WFC MO MT, WFC disabled, WIFI strong, Cellular weak
2401
2402        Set WiFi/Cellular network environment.
2403        Make Sure PhoneA is set correct WFC parameters.
2404        Make SUre PhoneB is able to make MO/MT call.
2405        Call from PhoneA to PhoneB, call should succeed, call should on Cellular.
2406        Call from PhoneB to PHoneA, call should succeed, call should on Cellular.
2407
2408        Returns:
2409            True if pass; False if fail.
2410        """
2411        ads = [self.android_devices[0], self.android_devices[1]]
2412        mo_result = self._wfc_call_sequence(
2413            ads, DIRECTION_MOBILE_ORIGINATED,
2414            self._wfc_set_wifi_strong_cell_weak,
2415            self._wfc_phone_setup_wfc_disabled, None,
2416            self._is_phone_in_call_not_iwlan, None, True)
2417
2418        mt_result = self._wfc_call_sequence(
2419            ads, DIRECTION_MOBILE_TERMINATED,
2420            self._wfc_set_wifi_strong_cell_weak,
2421            self._wfc_phone_setup_wfc_disabled, None,
2422            self._is_phone_in_call_not_iwlan, None, True)
2423
2424        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2425        return ((mo_result is True) and (mt_result is True))
2426
2427    @test_tracker_info(uuid="ddb3372d-23d2-492c-881a-e509e7ac4c8d")
2428    @TelephonyBaseTest.tel_test_wrap
2429    def test_call_epdg_wfc_disabled_wifi_strong_cellular_absent(self):
2430        """ Test WFC MO MT, WFC disabled, WIFI strong, Cellular absent
2431
2432        Set WiFi/Cellular network environment.
2433        Make Sure PhoneA is set correct WFC parameters.
2434        Make SUre PhoneB is able to make MO/MT call.
2435        Call from PhoneA to PhoneB, call should fail.
2436        Call from PhoneB to PhoneA, call should fail.
2437
2438        Returns:
2439            True if pass; False if fail.
2440        """
2441        ads = [self.android_devices[0], self.android_devices[1]]
2442        mo_result = self._wfc_call_sequence(
2443            ads, DIRECTION_MOBILE_ORIGINATED,
2444            self._wfc_set_wifi_strong_cell_absent,
2445            self._wfc_phone_setup_cellular_absent_wfc_disabled, None,
2446            self._is_phone_not_in_call, None, "initiate_call fail.")
2447
2448        mt_result = self._wfc_call_sequence(
2449            ads, DIRECTION_MOBILE_TERMINATED,
2450            self._wfc_set_wifi_strong_cell_absent,
2451            self._wfc_phone_setup_cellular_absent_wfc_disabled, None,
2452            self._is_phone_not_in_call, None, "wait_and_answer_call fail.")
2453
2454        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2455        return ((mo_result is True) and (mt_result is True))
2456
2457    @test_tracker_info(uuid="91232d7e-ccb5-4581-8093-1ab42eca3815")
2458    @TelephonyBaseTest.tel_test_wrap
2459    def test_call_epdg_wfc_disabled_wifi_strong_apm(self):
2460        """ Test WFC MO MT, WFC disabled, WIFI strong, Phone in APM
2461
2462        Set WiFi/Cellular network environment.
2463        Make Sure PhoneA is set correct WFC parameters.
2464        Make SUre PhoneB is able to make MO/MT call.
2465        Call from PhoneA to PhoneB, call should fail.
2466        Call from PhoneB to PhoneA, call should fail.
2467
2468        Returns:
2469            True if pass; False if fail.
2470        """
2471        ads = [self.android_devices[0], self.android_devices[1]]
2472        mo_result = self._wfc_call_sequence(
2473            ads, DIRECTION_MOBILE_ORIGINATED,
2474            self._wfc_set_wifi_strong_cell_strong,
2475            self._wfc_phone_setup_apm_wfc_disabled, None,
2476            self._is_phone_not_in_call, None, "initiate_call fail.")
2477
2478        mt_result = self._wfc_call_sequence(
2479            ads, DIRECTION_MOBILE_TERMINATED,
2480            self._wfc_set_wifi_strong_cell_strong,
2481            self._wfc_phone_setup_apm_wfc_disabled, None,
2482            self._is_phone_not_in_call, None, "wait_and_answer_call fail.")
2483
2484        self.log.info("MO: {}, MT: {}".format(mo_result, mt_result))
2485        return ((mo_result is True) and (mt_result is True))
2486
2487    def _rove_in_test(self, cellular_gen, wfc_mode):
2488        """Test utility for Rove-in Tests.
2489
2490        Cellular strong, WiFi RSSI < -100 dBm.
2491        Setup Cellular network and wfc_mode, WiFi enabled but not associated.
2492        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_NOT_ROVE_IN in 10s,
2493            PhoneA does not rove-in.
2494        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN in 10s,
2495            PhoneA rove-in.
2496        Make WFC call.
2497        """
2498        self._wfc_set_wifi_absent_cell_strong()
2499        # ensure cellular rat, wfc mode, wifi not associated
2500        toggle_airplane_mode(self.log, self.android_devices[0], False)
2501        toggle_volte(self.log, self.android_devices[0], True)
2502        if not ensure_network_generation(
2503                self.log,
2504                self.android_devices[0],
2505                cellular_gen,
2506                voice_or_data=NETWORK_SERVICE_DATA):
2507            self.log.error("_rove_in_test: {} failed to be in rat: {}".format(
2508                self.android_devices[0].serial, cellular_rat))
2509            return False
2510        if not set_wfc_mode(self.log, self.android_devices[0], wfc_mode):
2511            self.log.error("{} set WFC mode failed.".format(
2512                self.android_devices[0].serial))
2513            return False
2514
2515        if ensure_wifi_connected(self.log, self.android_devices[0],
2516                                 self.wifi_network_ssid,
2517                                 self.wifi_network_pass, 1):
2518            self.log.error(
2519                "{} connect WiFI succeed, expected not succeed".format(
2520                    self.android_devices[0].serial))
2521            return False
2522
2523        # set up wifi to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_NOT_ROVE_IN in 10 seconds
2524        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
2525                 self.wifi_rssi_with_no_atten,
2526                 WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_NOT_ROVE_IN, 5, 1)
2527        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
2528                 self.wifi_rssi_with_no_atten,
2529                 WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_NOT_ROVE_IN, 5, 1)
2530        if (not wait_for_wifi_data_connection(self.log,
2531                                              self.android_devices[0], True) or
2532                not verify_http_connection(self.log, self.android_devices[0])):
2533            self.log.error("No Data on Wifi")
2534            return False
2535
2536        if self._phone_idle_iwlan():
2537            self.log.error("Phone should not report iwlan in WiFi {}Bm".format(
2538                WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_NOT_ROVE_IN))
2539            return False
2540
2541        # set up wifi to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN in 10 seconds
2542        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
2543                 self.wifi_rssi_with_no_atten,
2544                 WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN, 1, 1)
2545        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
2546                 self.wifi_rssi_with_no_atten,
2547                 WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN, 1, 1)
2548        if not self._phone_idle_iwlan():
2549            self.log.error("Phone should report iwlan in WiFi {}dBm".format(
2550                WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN))
2551            return False
2552
2553        # make a wfc call.
2554        return self._wfc_call_sequence(
2555            [self.android_devices[0], self.android_devices[1]],
2556            DIRECTION_MOBILE_ORIGINATED, None, None, self._phone_idle_iwlan,
2557            self._is_phone_in_call_iwlan, None, True)
2558
2559    def _rove_out_test(self, cellular_gen, wfc_mode):
2560        """Test utility for Rove-out Tests.
2561
2562        Cellular strong, WiFi RSSI WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_INITIAL_STATE.
2563        Setup Cellular network and wfc_mode, WiFi associated.
2564        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_NOT_ROVE_OUT in 10s,
2565            PhoneA does not rove-out.
2566        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT in 10s,
2567            PhoneA rove-out.
2568        Make a call.
2569        """
2570        # set up cell strong
2571        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G],
2572                 self.cell_rssi_with_no_atten, MAX_RSSI_RESERVED_VALUE)
2573        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G],
2574                 self.cell_rssi_with_no_atten, MAX_RSSI_RESERVED_VALUE)
2575        # set up wifi WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_INITIAL_STATE
2576        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
2577                 self.wifi_rssi_with_no_atten,
2578                 WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_INITIAL_STATE)
2579        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
2580                 self.wifi_rssi_with_no_atten,
2581                 WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_INITIAL_STATE)
2582        # ensure cellular rat, wfc mode, wifi associated
2583        toggle_airplane_mode(self.log, self.android_devices[0], False)
2584        toggle_volte(self.log, self.android_devices[0], True)
2585
2586        if not ensure_network_generation(
2587                self.log,
2588                self.android_devices[0],
2589                GEN_4G,
2590                voice_or_data=NETWORK_SERVICE_DATA):
2591            self.log.error("_rove_out_test: {} failed to be in rat: {}".format(
2592                self.android_devices[0].serial, cellular_rat))
2593            get_telephony_signal_strength(self.android_devices[0])
2594            get_wifi_signal_strength(self.android_devices[0])
2595            return False
2596
2597        if not set_wfc_mode(self.log, self.android_devices[0], wfc_mode):
2598            self.log.error("{} set WFC mode failed.".format(
2599                self.android_devices[0].serial))
2600            return False
2601
2602        if not ensure_wifi_connected(self.log, self.android_devices[0],
2603                                     self.wifi_network_ssid,
2604                                     self.wifi_network_pass):
2605            self.log.error("{} connect WiFI failed, expected succeed".format(
2606                self.android_devices[0].serial))
2607            return False
2608
2609        if (not wait_for_wifi_data_connection(self.log,
2610                                              self.android_devices[0], True) or
2611                not verify_http_connection(self.log, self.android_devices[0])):
2612            self.log.error("No Data on Wifi")
2613            get_telephony_signal_strength(self.android_devices[0])
2614            get_wifi_signal_strength(self.android_devices[0])
2615            return False
2616
2617        if not self._phone_idle_iwlan():
2618            self.log.error("Phone failed to report iwlan in {}dBm.".format(
2619                WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_INITIAL_STATE))
2620            get_telephony_signal_strength(self.android_devices[0])
2621            get_wifi_signal_strength(self.android_devices[0])
2622            return False
2623
2624        # set up wifi to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_NOT_ROVE_OUT in 10 seconds
2625        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
2626                 self.wifi_rssi_with_no_atten,
2627                 WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_NOT_ROVE_OUT, 1, 1)
2628        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
2629                 self.wifi_rssi_with_no_atten,
2630                 WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_NOT_ROVE_OUT, 1, 1)
2631        if (not wait_for_wifi_data_connection(self.log,
2632                                              self.android_devices[0], True) or
2633                not verify_http_connection(self.log, self.android_devices[0])):
2634            self.log.error("No Data on Wifi")
2635            get_telephony_signal_strength(self.android_devices[0])
2636            get_wifi_signal_strength(self.android_devices[0])
2637            return False
2638
2639        if self._phone_wait_for_not_wfc() or not self._phone_idle_iwlan():
2640            self.log.error("Phone should not rove-out in {}dBm.".format(
2641                WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_NOT_ROVE_OUT))
2642            get_telephony_signal_strength(self.android_devices[0])
2643            get_wifi_signal_strength(self.android_devices[0])
2644            return False
2645
2646        # set up wifi to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT in 10 seconds
2647        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
2648                 self.wifi_rssi_with_no_atten,
2649                 WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT, 2, 1)
2650        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
2651                 self.wifi_rssi_with_no_atten,
2652                 WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT, 2, 1)
2653        if (not wait_for_wifi_data_connection(self.log,
2654                                              self.android_devices[0], True) or
2655                not verify_http_connection(self.log, self.android_devices[0])):
2656            self.log.error("No Data on Wifi")
2657            get_telephony_signal_strength(self.android_devices[0])
2658            get_wifi_signal_strength(self.android_devices[0])
2659            return False
2660
2661        if not self._phone_wait_for_not_wfc() or self._phone_idle_iwlan():
2662            self.log.error("Phone should rove-out in {}dBm.".format(
2663                WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT))
2664            get_telephony_signal_strength(self.android_devices[0])
2665            get_wifi_signal_strength(self.android_devices[0])
2666            return False
2667
2668        # make a call.
2669        if wfc_mode == WFC_MODE_WIFI_ONLY:
2670            return self._wfc_call_sequence(
2671                [self.android_devices[0], self.android_devices[1]],
2672                DIRECTION_MOBILE_ORIGINATED, None, None,
2673                self._phone_idle_not_iwlan, self._is_phone_not_in_call, None,
2674                "initiate_call fail.")
2675        elif wfc_mode == WFC_MODE_WIFI_PREFERRED:
2676            if cellular_gen == GEN_4G:
2677                return self._wfc_call_sequence(
2678                    [self.android_devices[0], self.android_devices[1]],
2679                    DIRECTION_MOBILE_ORIGINATED, None, None,
2680                    self._phone_idle_volte, self._is_phone_in_call_volte, None,
2681                    True)
2682            else:
2683                return self._wfc_call_sequence(
2684                    [self.android_devices[0], self.android_devices[1]],
2685                    DIRECTION_MOBILE_ORIGINATED, None, None,
2686                    self._phone_idle_3g, self._is_phone_in_call_3g, None, True)
2687        else:
2688            return False
2689
2690    @test_tracker_info(uuid="7f9779c1-75c6-413e-9e3b-7e4d9896379a")
2691    @TelephonyBaseTest.tel_test_wrap
2692    def test_rove_out_in_stress(self):
2693        """WiFi Calling Rove out/in stress test.
2694
2695        Steps:
2696        1. PhoneA on LTE, VoLTE enabled.
2697        2. PhoneA WFC mode WiFi preferred, WiFi associated.
2698        3. Cellular strong, WiFi RSSI WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_INITIAL_STATE.
2699        4. Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT in 10s,
2700            PhoneA rove-out.
2701        5. Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN in 10s,
2702            PhoneA rove-in.
2703        6. Repeat Step 4~5.
2704
2705        Expected Results:
2706        4. Phone should rove out.
2707        5. Phone should rove in.
2708        6. Stress test pass rate should be higher than pre-defined limit.
2709        """
2710        self._wfc_set_wifi_strong_cell_strong()
2711        if not self._wfc_phone_setup_wifi_preferred():
2712            self.log.error("Setup WFC failed.")
2713            return False
2714        if (not wait_for_wifi_data_connection(self.log,
2715                                              self.android_devices[0], True) or
2716                not verify_http_connection(self.log, self.android_devices[0])):
2717            self.log.error("No Data on Wifi")
2718            return False
2719        if not self._phone_idle_iwlan():
2720            self.log.error("Phone failed to report iwlan in {}dBm.".format(
2721                WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_INITIAL_STATE))
2722            return False
2723        total_iteration = self.stress_test_number
2724        self.log.info(
2725            "Rove_out/Rove_in stress test. Total iteration = {}.".format(
2726                total_iteration))
2727        current_iteration = 1
2728        while (current_iteration <= total_iteration):
2729            self.log.info(">----Current iteration = {}/{}----<".format(
2730                current_iteration, total_iteration))
2731
2732            # set up wifi to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT in 10 seconds
2733            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
2734                     self.wifi_rssi_with_no_atten,
2735                     WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT, 2, 1)
2736            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
2737                     self.wifi_rssi_with_no_atten,
2738                     WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT, 2, 1)
2739            if (not wait_for_wifi_data_connection(
2740                    self.log, self.android_devices[0], True)
2741                    or not verify_http_connection(self.log,
2742                                                  self.android_devices[0])):
2743                self.log.error("No Data on Wifi")
2744                break
2745            if not self._phone_wait_for_not_wfc():
2746                self.log.error("Phone should rove-out in {}dBm.".format(
2747                    WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT))
2748                break
2749            self.log.info("Rove-out succeed.")
2750            # set up wifi to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN in 10 seconds
2751            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
2752                     self.wifi_rssi_with_no_atten,
2753                     WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN, 2, 1)
2754            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
2755                     self.wifi_rssi_with_no_atten,
2756                     WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN, 2, 1)
2757            if (not wait_for_wifi_data_connection(
2758                    self.log, self.android_devices[0], True)
2759                    or not verify_http_connection(self.log,
2760                                                  self.android_devices[0])):
2761                self.log.error("No Data on Wifi")
2762                break
2763            if not self._phone_wait_for_wfc():
2764                self.log.error("Phone should rove-in in {}dBm.".format(
2765                    WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN))
2766                break
2767            self.log.info("Rove-in succeed.")
2768
2769            self.log.info(">----Iteration : {}/{} succeed.----<".format(
2770                current_iteration, total_iteration))
2771            current_iteration += 1
2772        if current_iteration <= total_iteration:
2773            self.log.info(">----Iteration : {}/{} failed.----<".format(
2774                current_iteration, total_iteration))
2775            return False
2776        else:
2777            return True
2778
2779    @test_tracker_info(uuid="3ba22f37-a9fd-4890-9805-941d80f5600d")
2780    @TelephonyBaseTest.tel_test_wrap
2781    def test_rove_in_out_stress(self):
2782        """WiFi Calling Rove in/out stress test.
2783
2784        Steps:
2785        1. PhoneA on LTE, VoLTE enabled.
2786        2. PhoneA WFC mode WiFi preferred, WiFi associated.
2787        3. Cellular strong, WiFi RSSI weak.
2788        4. Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN in 10s,
2789            PhoneA rove-in.
2790        5. Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT in 10s,
2791            PhoneA rove-out.
2792        6. Repeat Step 4~5.
2793
2794        Expected Results:
2795        4. Phone should rove in.
2796        5. Phone should rove out.
2797        6. Stress test pass rate should be higher than pre-defined limit.
2798        """
2799        self._wfc_set_wifi_weak_cell_strong()
2800        # ensure cellular rat, wfc mode, wifi not associated
2801        if not self._wfc_phone_setup_wifi_preferred():
2802            self.log.error("Failed to setup for rove_in_out_stress")
2803            return False
2804        total_iteration = self.stress_test_number
2805        self.log.info(
2806            "Rove_in/Rove_out stress test. Total iteration = {}.".format(
2807                total_iteration))
2808        current_iteration = 1
2809        while (current_iteration <= total_iteration):
2810            self.log.info(">----Current iteration = {}/{}----<".format(
2811                current_iteration, total_iteration))
2812
2813            # set up wifi to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN in 10 seconds
2814            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
2815                     self.wifi_rssi_with_no_atten,
2816                     WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN, 2, 1)
2817            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
2818                     self.wifi_rssi_with_no_atten,
2819                     WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN, 2, 1)
2820            if (not wait_for_wifi_data_connection(
2821                    self.log, self.android_devices[0], True)
2822                    or not verify_http_connection(self.log,
2823                                                  self.android_devices[0])):
2824                self.log.error("No Data on Wifi")
2825                break
2826            if not self._phone_wait_for_wfc():
2827                self.log.error("Phone should rove-in in {}dBm.".format(
2828                    WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN))
2829                break
2830            self.log.info("Rove-in succeed.")
2831
2832            # set up wifi to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT in 10 seconds
2833            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
2834                     self.wifi_rssi_with_no_atten,
2835                     WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT, 2, 1)
2836            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
2837                     self.wifi_rssi_with_no_atten,
2838                     WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT, 2, 1)
2839            if (not wait_for_wifi_data_connection(
2840                    self.log, self.android_devices[0], True)
2841                    or not verify_http_connection(self.log,
2842                                                  self.android_devices[0])):
2843                self.log.error("No Data on Wifi")
2844                break
2845            if not self._phone_wait_for_not_wfc():
2846                self.log.error("Phone should rove-out in {}dBm.".format(
2847                    WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT))
2848                break
2849            self.log.info("Rove-out succeed.")
2850
2851            self.log.info(">----Iteration : {}/{} succeed.----<".format(
2852                current_iteration, total_iteration))
2853            current_iteration += 1
2854        if current_iteration <= total_iteration:
2855            self.log.info(">----Iteration : {}/{} failed.----<".format(
2856                current_iteration, total_iteration))
2857            return False
2858        else:
2859            return True
2860
2861    @test_tracker_info(uuid="791bce68-d875-41cd-addd-355ff61773b9")
2862    @TelephonyBaseTest.tel_test_wrap
2863    def test_rove_in_lte_wifi_preferred(self):
2864        """ Test WFC rove-in features.
2865
2866        PhoneA on LTE, VoLTE enabled.
2867        PhoneA WFC mode WiFi preferred, WiFi enabled but not associated.
2868        Cellular strong, WiFi RSSI < -100 dBm.
2869        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_NOT_ROVE_IN in 10s,
2870            PhoneA does not rove-in.
2871        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN in 10s,
2872            PhoneA rove-in.
2873        Make WFC call.
2874
2875        Returns:
2876            True if pass; False if fail.
2877        """
2878        return self._rove_in_test(GEN_4G, WFC_MODE_WIFI_PREFERRED)
2879
2880    @test_tracker_info(uuid="f4b70fbb-cc44-4e7c-805e-c5f28c78e2dd")
2881    @TelephonyBaseTest.tel_test_wrap
2882    def test_rove_in_lte_wifi_only(self):
2883        """ Test WFC rove-in features.
2884
2885        PhoneA on LTE, VoLTE enabled.
2886        PhoneA WFC mode WiFi only, WiFi enabled but not associated.
2887        Cellular strong, WiFi RSSI < -100 dBm.
2888        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_NOT_ROVE_IN in 10s,
2889            PhoneA does not rove-in.
2890        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN in 10s,
2891            PhoneA rove-in.
2892        Make WFC call.
2893
2894        Returns:
2895            True if pass; False if fail.
2896        """
2897        return self._rove_in_test(GEN_4G, WFC_MODE_WIFI_ONLY)
2898
2899    @test_tracker_info(uuid="b9f3648e-7168-4c82-aec5-f4a7cc77ad99")
2900    @TelephonyBaseTest.tel_test_wrap
2901    def test_rove_in_wcdma_wifi_preferred(self):
2902        """ Test WFC rove-in features.
2903
2904        PhoneA on WCDMA, VoLTE enabled.
2905        PhoneA WFC mode WiFi preferred, WiFi enabled but not associated.
2906        Cellular strong, WiFi RSSI < -100 dBm.
2907        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_NOT_ROVE_IN in 10s,
2908            PhoneA does not rove-in.
2909        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN in 10s,
2910            PhoneA rove-in.
2911        Make WFC call.
2912
2913        Returns:
2914            True if pass; False if fail.
2915        """
2916        return self._rove_in_test(GEN_3G, WFC_MODE_WIFI_PREFERRED)
2917
2918    @test_tracker_info(uuid="8ce03ae7-0b21-49e4-828f-cf8dcd54ba35")
2919    @TelephonyBaseTest.tel_test_wrap
2920    def test_rove_in_wcdma_wifi_only(self):
2921        """ Test WFC rove-in features.
2922
2923        PhoneA on WCDMA, VoLTE enabled.
2924        PhoneA WFC mode WiFi only, WiFi enabled but not associated.
2925        Cellular strong, WiFi RSSI < -100 dBm.
2926        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_NOT_ROVE_IN in 10s,
2927            PhoneA does not rove-in.
2928        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_IN_TEST_PHONE_ROVE_IN in 10s,
2929            PhoneA rove-in.
2930        Make WFC call.
2931
2932        Returns:
2933            True if pass; False if fail.
2934        """
2935        return self._rove_in_test(GEN_3G, WFC_MODE_WIFI_ONLY)
2936
2937    @test_tracker_info(uuid="7784923f-10f1-4dca-bdc1-8de55b7b9d40")
2938    @TelephonyBaseTest.tel_test_wrap
2939    def test_rove_out_lte_wifi_preferred(self):
2940        """ Test WFC rove-out features.
2941
2942        PhoneA on LTE, VoLTE enabled.
2943        PhoneA WFC mode WiFi preferred, WiFi associated.
2944        Cellular strong, WiFi RSSI WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_INITIAL_STATE.
2945        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_NOT_ROVE_OUT in 10s,
2946            PhoneA does not rove-out.
2947        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT in 10s,
2948            PhoneA rove-out.
2949        Make a call, call should succeed by cellular VoLTE.
2950
2951        Returns:
2952            True if pass; False if fail.
2953        """
2954        return self._rove_out_test(GEN_4G, WFC_MODE_WIFI_PREFERRED)
2955
2956    @test_tracker_info(uuid="6bb42ab2-02bd-4637-b3b6-3ce4cffffda8")
2957    @TelephonyBaseTest.tel_test_wrap
2958    def test_rove_out_lte_wifi_only(self):
2959        """ Test WFC rove-out features.
2960
2961        PhoneA on LTE, VoLTE enabled.
2962        PhoneA WFC mode WiFi only, WiFi associated.
2963        Cellular strong, WiFi RSSI WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_INITIAL_STATE.
2964        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_NOT_ROVE_OUT in 10s,
2965            PhoneA does not rove-out.
2966        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT in 10s,
2967            PhoneA rove-out.
2968        Make a call, call should fail.
2969
2970        Returns:
2971            True if pass; False if fail.
2972        """
2973        return self._rove_out_test(GEN_4G, WFC_MODE_WIFI_ONLY)
2974
2975    @test_tracker_info(uuid="3261b432-01de-4dd9-a309-ff53059df521")
2976    @TelephonyBaseTest.tel_test_wrap
2977    def test_rove_out_wcdma_wifi_preferred(self):
2978        """ Test WFC rove-out features.
2979
2980        PhoneA on WCDMA, VoLTE enabled.
2981        PhoneA WFC mode WiFi preferred, WiFi associated.
2982        Cellular strong, WiFi RSSI WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_INITIAL_STATE.
2983        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_NOT_ROVE_OUT in 10s,
2984            PhoneA does not rove-out.
2985        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT in 10s,
2986            PhoneA rove-out.
2987        Make a call, call should succeed by cellular 3g.
2988
2989        Returns:
2990            True if pass; False if fail.
2991        """
2992        return self._rove_out_test(GEN_3G, WFC_MODE_WIFI_PREFERRED)
2993
2994    @test_tracker_info(uuid="89fac8bf-b8e1-443a-8be7-f21f306c0d6c")
2995    @TelephonyBaseTest.tel_test_wrap
2996    def test_rove_out_wcdma_wifi_only(self):
2997        """ Test WFC rove-out features.
2998
2999        PhoneA on WCDMA, VoLTE enabled.
3000        PhoneA WFC mode WiFi only, WiFi associated.
3001        Cellular strong, WiFi RSSI WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_INITIAL_STATE.
3002        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_NOT_ROVE_OUT in 10s,
3003            PhoneA does not rove-out.
3004        Set WiFI RSSI to WIFI_RSSI_FOR_ROVE_OUT_TEST_PHONE_ROVE_OUT in 10s,
3005            PhoneA rove-out.
3006        Make a call, call should fail.
3007
3008        Returns:
3009            True if pass; False if fail.
3010        """
3011        return self._rove_out_test(GEN_3G, WFC_MODE_WIFI_ONLY)
3012
3013    def _increase_wifi_rssi_check_phone_hand_in(self):
3014        """Private Test utility for hand_in test.
3015
3016        Increase WiFI RSSI to WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_NOT_HAND_IN in 10s.
3017        PhoneA should connect to WiFi and have data on WiFi.
3018        PhoneA should not hand-in to iwlan.
3019        Increase WiFi RSSI to WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN in 10s.
3020        PhoneA should hand-in to iwlan.
3021        PhoneA call should remain active.
3022        """
3023        # Increase WiFI RSSI to WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_NOT_HAND_IN in 10s
3024        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
3025                 self.wifi_rssi_with_no_atten,
3026                 WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_NOT_HAND_IN, 5, 1)
3027        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
3028                 self.wifi_rssi_with_no_atten,
3029                 WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_NOT_HAND_IN, 5, 1)
3030        # Make sure WiFI connected and data OK.
3031        if (not wait_for_wifi_data_connection(self.log,
3032                                              self.android_devices[0], True) or
3033                not verify_http_connection(self.log, self.android_devices[0])):
3034            self.log.error("No Data on Wifi")
3035            return False
3036        # Make sure phone not hand in to iwlan.
3037        if self._phone_wait_for_wfc():
3038            self.log.error("Phone hand-in to wfc.")
3039            return False
3040        # Increase WiFI RSSI to WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN in 10s
3041        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
3042                 self.wifi_rssi_with_no_atten,
3043                 WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN, 2, 1)
3044        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
3045                 self.wifi_rssi_with_no_atten,
3046                 WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN, 2, 1)
3047        # Make sure phone hand in to iwlan.
3048        if not self._phone_wait_for_wfc():
3049            self.log.error("Phone failed to hand-in to wfc.")
3050            return False
3051        if self._is_phone_not_in_call():
3052            self.log.error("Phone call dropped.")
3053            return False
3054        return True
3055
3056    @test_tracker_info(uuid="e8ba5d0f-afc5-42c2-b7f0-9f5d06774556")
3057    @TelephonyBaseTest.tel_test_wrap
3058    def test_hand_in_wifi_preferred(self):
3059        """WiFi Hand-In Threshold - WiFi Preferred
3060
3061        PhoneA on LTE, VoLTE enabled, WFC WiFi preferred. WiFI not associated.
3062        Cellular Strong, WiFi <-100 dBm
3063        Call from PhoneA to PhoneB, PhoneA should be on VoLTE.
3064        Increase WiFI RSSI to WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_NOT_HAND_IN in 10s.
3065        PhoneA should connect to WiFi and have data on WiFi.
3066        PhoneA should not hand-in to iwlan.
3067        Increase WiFi RSSI to WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN in 10s.
3068        PhoneA should hand-in to iwlan.
3069        PhoneA call should remain active.
3070        """
3071        return self._wfc_call_sequence(
3072            [self.android_devices[0], self.android_devices[1]],
3073            DIRECTION_MOBILE_ORIGINATED, self._wfc_set_wifi_absent_cell_strong,
3074            self._wfc_phone_setup_wifi_absent_wifi_preferred,
3075            self._phone_idle_volte, self._is_phone_in_call_volte,
3076            self._increase_wifi_rssi_check_phone_hand_in, True)
3077
3078    def _increase_wifi_rssi_hand_in_and_decrease_wifi_rssi_hand_out(self):
3079        if not self._increase_wifi_rssi_check_phone_hand_in():
3080            return False
3081        if not self._decrease_wifi_rssi_check_phone_hand_out():
3082            return False
3083        return True
3084
3085    @test_tracker_info(uuid="2a20d499-80e1-4d4f-beca-05763863fbdb")
3086    @TelephonyBaseTest.tel_test_wrap
3087    def test_hand_in_out_wifi_preferred(self):
3088        """WiFi Hand-In-Out Threshold - WiFi Preferred
3089
3090        PhoneA on LTE, VoLTE enabled, WFC WiFi preferred. WiFI not associated.
3091        Cellular Strong, WiFi <-100 dBm
3092        Call from PhoneA to PhoneB, PhoneA should be on VoLTE.
3093
3094        Increase WiFI RSSI to WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_NOT_HAND_IN in 10s.
3095        PhoneA should connect to WiFi and have data on WiFi.
3096        PhoneA should not hand-in to iwlan.
3097        Increase WiFi RSSI to WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN in 10s.
3098        PhoneA should hand-in to iwlan.
3099        PhoneA call should remain active.
3100
3101        Decrease WiFi RSSI to WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_NOT_HAND_OUT, in 10s.
3102        PhoneA should still be in call.
3103        PhoneA should not hand-out, PhoneA should have data on WiFi.
3104        Decrease WiFi RSSI to WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_HAND_OUT, in 10s.
3105        PhoneA should still be in call. PhoneA should hand-out to LTE.
3106        """
3107        return self._wfc_call_sequence(
3108            [self.android_devices[0], self.android_devices[1]],
3109            DIRECTION_MOBILE_ORIGINATED, self._wfc_set_wifi_absent_cell_strong,
3110            self._wfc_phone_setup_wifi_absent_wifi_preferred,
3111            self._phone_idle_volte, self._is_phone_in_call_volte,
3112            self._increase_wifi_rssi_hand_in_and_decrease_wifi_rssi_hand_out,
3113            True)
3114
3115    def _decrease_lte_rssi_check_phone_not_hand_in(self):
3116        """Private Test utility for hand_in test.
3117
3118        Decrease Cellular RSSI to CELL_WEAK_RSSI_VALUE in 30s.
3119        PhoneA should not hand-in to WFC.
3120        PhoneA should either drop or hands over to 3g/2g.
3121        """
3122        # Decrease LTE RSSI to CELL_WEAK_RSSI_VALUE in 30 seconds
3123        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G],
3124                 self.cell_rssi_with_no_atten, CELL_WEAK_RSSI_VALUE, 1, 1)
3125        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G],
3126                 self.cell_rssi_with_no_atten, CELL_WEAK_RSSI_VALUE, 1, 1)
3127        # Make sure phone not hand in to iwlan.
3128        if self._phone_wait_for_wfc():
3129            self.log.error("Phone hand-in to wfc.")
3130            return False
3131
3132        if is_phone_not_in_call(self.log, self.android_devices[0]):
3133            self.log.info("Call drop.")
3134            return True
3135        if self._is_phone_in_call_csfb():
3136            self.log.info("Call hands over to 2g/3g.")
3137            return True
3138        return False
3139
3140    @test_tracker_info(uuid="a83734c1-db91-4ea2-9d79-02d7f803905a")
3141    @TelephonyBaseTest.tel_test_wrap
3142    def test_hand_in_cellular_preferred(self):
3143        """WiFi Hand-In Not Attempted - Cellular Preferred
3144
3145        PhoneA on LTE, VoLTE enabled, WFC cellular preferred. WiFI associated.
3146        Cellular and WiFi signal strong.
3147        Call from PhoneA to PhoneB, PhoneA should be on VoLTE.
3148        Decrease Cellular RSSI to CELL_WEAK_RSSI_VALUE in 30s.
3149        PhoneA should not hand-in to WFC.
3150        PhoneA should either drop or hands over to 3g/2g.
3151        """
3152        return self._wfc_call_sequence(
3153            [self.android_devices[0], self.android_devices[1]],
3154            DIRECTION_MOBILE_ORIGINATED, self._wfc_set_wifi_strong_cell_strong,
3155            self._wfc_phone_setup_cellular_preferred, self._phone_idle_volte,
3156            self._is_phone_in_call_volte,
3157            self._decrease_lte_rssi_check_phone_not_hand_in, True)
3158
3159    def _decrease_wifi_rssi_check_phone_hand_out(self):
3160        """Private Test utility for hand_out test.
3161
3162        Decrease WiFi RSSI to MIN_RSSI_RESERVED_VALUE
3163        PhoneA should still be in call. PhoneA should hand-out to LTE.
3164        """
3165        time.sleep(30)
3166        # Decrease WiFi RSSI to MIN_RSSI_RESERVED_VALUE
3167        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G], 0,
3168                 MIN_RSSI_RESERVED_VALUE, 5, 1)
3169        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 0,
3170                 MIN_RSSI_RESERVED_VALUE, 5, 1)
3171        # Make sure phone hand-out, not drop call
3172        if not self._phone_wait_for_not_wfc():
3173            self.log.error("Phone should hand out to LTE.")
3174            get_telephony_signal_strength(self.android_devices[0])
3175            get_wifi_signal_strength(self.android_devices[0])
3176            return False
3177        self.log.info("iWLAN to LTE switch happened at below Signal Strengths")
3178        get_telephony_signal_strength(self.android_devices[0])
3179        get_wifi_signal_strength(self.android_devices[0])
3180        if not self._is_phone_in_call_volte():
3181            self.log.error("Phone should be in volte call.")
3182            return False
3183
3184        return True
3185
3186    @test_tracker_info(uuid="2242aa49-474c-496b-be1b-ccd900523a54")
3187    @TelephonyBaseTest.tel_test_wrap
3188    def test_iwlan_lte_handoff_wifi_preferred(self):
3189        """VoWiFi to VoLTE In Call Handover Test
3190
3191        PhoneA on LTE, VoLTE enabled, WFC WiFi preferred, WiFi associated.
3192        Cellular strong, WiFi signal strong.
3193        Call from PhoneA to PhoneB, PhoneA should be on iwlan.
3194        Attenuate WiFi
3195        PhoneA should still be in call. PhoneA should handover to LTE.
3196        """
3197        return self._wfc_call_sequence(
3198            [self.android_devices[0], self.android_devices[1]],
3199            DIRECTION_MOBILE_ORIGINATED, self._wfc_set_wifi_strong_cell_strong,
3200            self._wfc_phone_setup_wifi_preferred, self._phone_idle_iwlan,
3201            self._is_phone_in_call_iwlan,
3202            self._decrease_wifi_rssi_check_phone_hand_out, True)
3203
3204    def _increase_lte_decrease_wifi_rssi_check_phone_hand_out(self):
3205        """Private Test utility for hand_out test.
3206
3207        Attenuate WiFi and Bringup LTE
3208        PhoneA should still be in call. PhoneA should hand-out to LTE.
3209        """
3210        # Increase LTE RSRP to MAX_RSSI_RESERVED_VALUE
3211        time.sleep(30)
3212        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 0,
3213                 MAX_RSSI_RESERVED_VALUE)
3214        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 0,
3215                 MAX_RSSI_RESERVED_VALUE)
3216        time.sleep(30)
3217        # Decrease WiFi RSSI to MIN_RSSI_RESERVED_VALUE
3218        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G], 0,
3219                 MIN_RSSI_RESERVED_VALUE, 5, 1)
3220        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 0,
3221                 MIN_RSSI_RESERVED_VALUE, 5, 1)
3222        # Make sure phone hand-out, not drop call
3223        if not self._phone_wait_for_not_wfc():
3224            self.log.error("Phone should hand out to LTE.")
3225            get_telephony_signal_strength(self.android_devices[0])
3226            get_wifi_signal_strength(self.android_devices[0])
3227            return False
3228        self.log.info("iWLAN to LTE switch happened at below Signal Strengths")
3229        get_telephony_signal_strength(self.android_devices[0])
3230        get_wifi_signal_strength(self.android_devices[0])
3231        if not self._is_phone_in_call_volte():
3232            self.log.error("Phone should be in volte call.")
3233            return False
3234
3235        return True
3236
3237    @test_tracker_info(uuid="dcd1e8f6-e002-48c3-b1eb-a46df5d66a6a")
3238    @TelephonyBaseTest.tel_test_wrap
3239    def test_iwlan_lte_handoff_cellular_preferred(self):
3240        """VoWiFi to VoLTE In Call Handover Test
3241
3242        PhoneA on LTE, VoLTE enabled, WFC Cellular preferred, WiFi associated.
3243        Cellular absent, WiFi signal strong.
3244        Call from PhoneA to PhoneB, PhoneA should be on iwlan.
3245        Attenuate WiFi and Bring up LTE
3246        PhoneA should still be in call. PhoneA should handover to LTE.
3247        """
3248        return self._wfc_call_sequence(
3249            [self.android_devices[0], self.android_devices[1]],
3250            DIRECTION_MOBILE_ORIGINATED, self._wfc_set_wifi_strong_cell_absent,
3251            self._wfc_phone_setup_cellular_preferred, self._phone_idle_iwlan,
3252            self._is_phone_in_call_iwlan,
3253            self._increase_lte_decrease_wifi_rssi_check_phone_hand_out, True)
3254
3255    def _decrease_wifi_rssi_hand_out_and_increase_wifi_rssi_hand_in(self):
3256        if not self._decrease_wifi_rssi_check_phone_hand_out():
3257            return False
3258        if not self._increase_wifi_rssi_check_phone_hand_in():
3259            return False
3260        return True
3261
3262    @test_tracker_info(uuid="59fc0104-5f4c-4aa5-b58b-e50d94fb90fe")
3263    @TelephonyBaseTest.tel_test_wrap
3264    def test_hand_out_in_wifi_preferred(self):
3265        """WiFi Hand-Out Threshold - WiFi Preferred
3266
3267        PhoneA on LTE, VoLTE enabled, WFC WiFi preferred, WiFi associated.
3268        Cellular and WiFi signal strong.
3269        Call from PhoneA to PhoneB, PhoneA should be on iwlan.
3270
3271        Decrease WiFi RSSI to WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_NOT_HAND_OUT in 10s.
3272        PhoneA should still be in call.
3273        PhoneA should not hand-out, PhoneA should have data on WiFi.
3274        Decrease WiFi RSSI to WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_HAND_OUT in 10s.
3275        PhoneA should still be in call. PhoneA should hand-out to LTE.
3276        PhoneA should have data on WiFi.
3277
3278        Increase WiFI RSSI to WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_NOT_HAND_IN in 10s.
3279        PhoneA should connect to WiFi and have data on WiFi.
3280        PhoneA should not hand-in to iwlan.
3281        Increase WiFi RSSI to WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN in 10s.
3282        PhoneA should hand-in to iwlan.
3283        PhoneA call should remain active.
3284        """
3285        return self._wfc_call_sequence(
3286            [self.android_devices[0], self.android_devices[1]],
3287            DIRECTION_MOBILE_ORIGINATED, self._wfc_set_wifi_strong_cell_strong,
3288            self._wfc_phone_setup_wifi_preferred, self._phone_idle_iwlan,
3289            self._is_phone_in_call_iwlan,
3290            self._decrease_wifi_rssi_hand_out_and_increase_wifi_rssi_hand_in,
3291            True)
3292
3293    def _hand_out_hand_in_stress(self):
3294        total_iteration = self.stress_test_number
3295        self.log.info(
3296            "Hand_out/Hand_in stress test. Total iteration = {}.".format(
3297                total_iteration))
3298        current_iteration = 1
3299        if self._phone_wait_for_call_drop():
3300            self.log.error("Call Drop.")
3301            return False
3302        while (current_iteration <= total_iteration):
3303            self.log.info(">----Current iteration = {}/{}----<".format(
3304                current_iteration, total_iteration))
3305
3306            # Decrease WiFi RSSI to WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_HAND_OUT
3307            # in 10 seconds
3308            self.log.info("Decrease WiFi RSSI to hand out.")
3309            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
3310                     self.wifi_rssi_with_no_atten,
3311                     WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_HAND_OUT, 2, 1)
3312            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
3313                     self.wifi_rssi_with_no_atten,
3314                     WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_HAND_OUT, 2, 1)
3315            # Make sure WiFi still connected and have data.
3316            if (not wait_for_wifi_data_connection(
3317                    self.log, self.android_devices[0], True)
3318                    or not verify_http_connection(self.log,
3319                                                  self.android_devices[0])):
3320                self.log.error("No Data on Wifi")
3321                break
3322            # Make sure phone hand-out, not drop call
3323            if not self._phone_wait_for_not_wfc():
3324                self.log.error("Phone failed to hand-out in RSSI {}.".format(
3325                    WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_HAND_OUT))
3326                break
3327            if self._phone_wait_for_call_drop():
3328                self.log.error("Call Drop.")
3329                break
3330            # Increase WiFI RSSI to WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN in 10s
3331            self.log.info("Increase WiFi RSSI to hand in.")
3332            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
3333                     self.wifi_rssi_with_no_atten,
3334                     WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN, 2, 1)
3335            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
3336                     self.wifi_rssi_with_no_atten,
3337                     WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN, 2, 1)
3338            # Make sure WiFi still connected and have data.
3339            if (not wait_for_wifi_data_connection(
3340                    self.log, self.android_devices[0], True)
3341                    or not verify_http_connection(self.log,
3342                                                  self.android_devices[0])):
3343                self.log.error("No Data on Wifi")
3344                break
3345            # Make sure phone hand in to iwlan.
3346            if not self._phone_wait_for_wfc():
3347                self.log.error("Phone failed to hand-in to wfc.")
3348                break
3349            if self._phone_wait_for_call_drop():
3350                self.log.error("Call Drop.")
3351                break
3352
3353            self.log.info(">----Iteration : {}/{} succeed.----<".format(
3354                current_iteration, total_iteration))
3355            current_iteration += 1
3356        if current_iteration <= total_iteration:
3357            self.log.info(">----Iteration : {}/{} failed.----<".format(
3358                current_iteration, total_iteration))
3359            return False
3360        else:
3361            return True
3362
3363    @test_tracker_info(uuid="330ef8d7-3bbb-4492-84d0-43fdfe3fe78b")
3364    @TelephonyBaseTest.tel_test_wrap
3365    def test_hand_out_in_stress(self):
3366        """WiFi Calling Hand out/in stress test.
3367
3368        Steps:
3369        1. PhoneA on LTE, VoLTE enabled.
3370        2. PhoneA WFC mode WiFi preferred, WiFi associated.
3371        3. Cellular strong, WiFi RSSI strong. Call from PhoneA to PhoneB,
3372            call should be on WFC.
3373        4. Set WiFI RSSI to WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_HAND_OUT in 10s,
3374            PhoneA hand-out.
3375        5. Set WiFI RSSI to WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN in 10s,
3376            PhoneA hand-in.
3377        6. Repeat Step 4~5. Call should not drop.
3378
3379        Expected Results:
3380        4. Phone should hand out.
3381        5. Phone should hand in.
3382        6. Stress test pass rate should be higher than pre-defined limit.
3383        """
3384        return self._wfc_call_sequence(
3385            [self.android_devices[0], self.android_devices[1]],
3386            DIRECTION_MOBILE_ORIGINATED, self._wfc_set_wifi_strong_cell_strong,
3387            self._wfc_phone_setup_wifi_preferred, self._phone_idle_iwlan,
3388            self._is_phone_in_call_iwlan, self._hand_out_hand_in_stress, True)
3389
3390    def _hand_in_hand_out_stress(self):
3391        total_iteration = self.stress_test_number
3392        self.log.info(
3393            "Hand_in/Hand_out stress test. Total iteration = {}.".format(
3394                total_iteration))
3395        current_iteration = 1
3396        if self._phone_wait_for_call_drop():
3397            self.log.error("Call Drop.")
3398            return False
3399        while (current_iteration <= total_iteration):
3400            self.log.info(">----Current iteration = {}/{}----<".format(
3401                current_iteration, total_iteration))
3402
3403            # Increase WiFi RSSI to WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN
3404            # in 10 seconds
3405            self.log.info("Increase WiFi RSSI to hand in.")
3406            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
3407                     self.wifi_rssi_with_no_atten,
3408                     WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN, 2, 1)
3409            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
3410                     self.wifi_rssi_with_no_atten,
3411                     WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN, 2, 1)
3412            # Make sure WiFi still connected and have data.
3413            if (not wait_for_wifi_data_connection(
3414                    self.log, self.android_devices[0], True)
3415                    or not verify_http_connection(self.log,
3416                                                  self.android_devices[0])):
3417                self.log.error("No Data on Wifi")
3418                break
3419            # Make sure phone hand in to iwlan.
3420            if not self._phone_wait_for_wfc():
3421                self.log.error("Phone failed to hand-in to wfc.")
3422                break
3423            if self._phone_wait_for_call_drop():
3424                self.log.error("Call Drop.")
3425                break
3426
3427            # Decrease WiFI RSSI to WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_HAND_OUT in 10s
3428            self.log.info("Decrease WiFi RSSI to hand out.")
3429            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
3430                     self.wifi_rssi_with_no_atten,
3431                     WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_HAND_OUT, 2, 1)
3432            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
3433                     self.wifi_rssi_with_no_atten,
3434                     WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_HAND_OUT, 2, 1)
3435            # Make sure WiFi still connected and have data.
3436            if (not wait_for_wifi_data_connection(
3437                    self.log, self.android_devices[0], True)
3438                    or not verify_http_connection(self.log,
3439                                                  self.android_devices[0])):
3440                self.log.error("No Data on Wifi")
3441                break
3442            # Make sure phone hand-out, not drop call
3443            if not self._phone_wait_for_not_wfc():
3444                self.log.error("Phone failed to hand-out in RSSI {}.".format(
3445                    WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_HAND_OUT))
3446                break
3447            if self._phone_wait_for_call_drop():
3448                self.log.error("Call Drop.")
3449                break
3450
3451            self.log.info(">----Iteration : {}/{} succeed.----<".format(
3452                current_iteration, total_iteration))
3453            current_iteration += 1
3454        if current_iteration <= total_iteration:
3455            self.log.info(">----Iteration : {}/{} failed.----<".format(
3456                current_iteration, total_iteration))
3457            return False
3458        else:
3459            return True
3460
3461    @test_tracker_info(uuid="97ae2018-935c-4dfc-bf5a-747777201ae4")
3462    @TelephonyBaseTest.tel_test_wrap
3463    def test_hand_in_out_stress(self):
3464        """WiFi Calling Hand in/out stress test.
3465
3466        Steps:
3467        1. PhoneA on LTE, VoLTE enabled.
3468        2. PhoneA WFC mode WiFi preferred, WiFi associated.
3469        3. Cellular strong, WiFi RSSI weak. Call from PhoneA to PhoneB,
3470            call should be on VoLTE.
3471        4. Set WiFI RSSI to WIFI_RSSI_FOR_HAND_IN_TEST_PHONE_HAND_IN in 10s,
3472            PhoneA hand-in.
3473        5. Set WiFI RSSI to WIFI_RSSI_FOR_HAND_OUT_TEST_PHONE_HAND_OUT in 10s,
3474            PhoneA hand-out.
3475        6. Repeat Step 4~5. Call should not drop.
3476
3477        Expected Results:
3478        4. Phone should hand in.
3479        5. Phone should hand out.
3480        6. Stress test pass rate should be higher than pre-defined limit.
3481        """
3482        return self._wfc_call_sequence(
3483            [self.android_devices[0], self.android_devices[1]],
3484            DIRECTION_MOBILE_ORIGINATED, self._wfc_set_wifi_weak_cell_strong,
3485            self._wfc_phone_setup_wifi_preferred, self._phone_idle_volte,
3486            self._is_phone_in_call_volte, self._hand_in_hand_out_stress, True)
3487
3488    def _decrease_cellular_rssi_check_phone_hand_out(self):
3489        """Private Test utility for hand_out test.
3490
3491        Decrease Cellular RSSI to MIN_RSSI_RESERVED_VALUE 5db per sec
3492        PhoneA should still be in call. PhoneA should hand-out to iWLAN.
3493        """
3494        time.sleep(60)
3495        # Decrease Cellular RSSI to MIN_RSSI_RESERVED_VALUE
3496        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 0,
3497                 MIN_RSSI_RESERVED_VALUE, 5, 1)
3498        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 0,
3499                 MIN_RSSI_RESERVED_VALUE, 5, 1)
3500        # Make sure phone hand-out to iWLAN, not drop call
3501        if not self._phone_wait_for_wfc():
3502            self.log.error("Phone should hand out to iWLAN.")
3503            get_telephony_signal_strength(self.android_devices[0])
3504            get_wifi_signal_strength(self.android_devices[0])
3505            return False
3506        self.log.info("LTE to iWLAN switch happened at below Signal Strengths")
3507        get_telephony_signal_strength(self.android_devices[0])
3508        get_wifi_signal_strength(self.android_devices[0])
3509        time.sleep(30)
3510        if not self._is_phone_in_call_iwlan():
3511            self.log.error("Phone should be in iWLAN call.")
3512            return False
3513        time.sleep(30)
3514        return True
3515
3516    @test_tracker_info(uuid="a83734c1-db91-4ea2-9d79-02d7f803905a")
3517    @TelephonyBaseTest.tel_test_wrap
3518    def test_lte_iwlan_handoff_cellular_preferred(self):
3519        """VoLTE to VoWiFi In Call Handover Test
3520
3521        PhoneA on LTE, VoLTE enabled, WFC WiFi preferred, WiFi associated.
3522        Cellular strong, WiFi signal strong.
3523        Call from PhoneA to PhoneB, PhoneA should be on LTE.
3524        Attenuate LTE
3525        PhoneA should still be in call. PhoneA should handover to iWLAN.
3526        """
3527        return self._wfc_call_sequence(
3528            [self.android_devices[0], self.android_devices[1]],
3529            DIRECTION_MOBILE_ORIGINATED, self._wfc_set_wifi_strong_cell_strong,
3530            self._wfc_phone_setup_cellular_preferred, self._phone_idle_volte,
3531            self._is_phone_in_call_volte,
3532            self._decrease_cellular_rssi_check_phone_hand_out, True)
3533
3534    def _increase_wifi_decrease_cellular_check_phone_hand_out(self):
3535        """Private Test utility for hand_out test.
3536
3537        Increase WiFi RSSI to MAX_RSSI_RESERVED_VALUE
3538        Decrease Cellular RSSI to MIN_RSSI_RESERVED_VALUE 5db per sec
3539        PhoneA should still be in call. PhoneA should hand-out to iWLAN.
3540        """
3541        time.sleep(30)
3542        # Increase WiFi RSSI to MAX_RSSI_RESERVED_VALUE
3543        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G], 0,
3544                 MAX_RSSI_RESERVED_VALUE)
3545        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 0,
3546                 MAX_RSSI_RESERVED_VALUE)
3547        time.sleep(30)
3548        if not ensure_wifi_connected(self.log, self.android_devices[0],
3549                                     self.wifi_network_ssid,
3550                                     self.wifi_network_pass):
3551            self.log.error("{} connect WiFI failed".format(
3552                self.android_devices[0].serial))
3553            return False
3554        # Decrease Cellular RSSI to MIN_RSSI_RESERVED_VALUE
3555        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 0,
3556                 MIN_RSSI_RESERVED_VALUE, 5, 1)
3557        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 0,
3558                 MIN_RSSI_RESERVED_VALUE, 5, 1)
3559        # Make sure phone hand-out to iWLAN, not drop call
3560        if not self._phone_wait_for_wfc():
3561            self.log.error("Phone should hand out to iWLAN.")
3562            get_telephony_signal_strength(self.android_devices[0])
3563            get_wifi_signal_strength(self.android_devices[0])
3564            return False
3565        self.log.info("LTE to iWLAN switch happened at below Signal Strengths")
3566        get_telephony_signal_strength(self.android_devices[0])
3567        get_wifi_signal_strength(self.android_devices[0])
3568        time.sleep(30)
3569        if not self._is_phone_in_call_iwlan():
3570            self.log.error("Phone should be in iWLAN call.")
3571            return False
3572        time.sleep(30)
3573        return True
3574
3575    @test_tracker_info(uuid="6a71f8f5-d348-49b6-8ca6-2464e6387d26")
3576    @TelephonyBaseTest.tel_test_wrap
3577    def test_lte_iwlan_handoff_wifi_preferred(self):
3578        """VoLTE to VoWiFi In Call Handover Test
3579
3580        PhoneA on LTE, VoLTE enabled, WFC WiFi preferred, WiFi not associated.
3581        Cellular strong, WiFi signal absent.
3582        Call from PhoneA to PhoneB, PhoneA should be on LTE.
3583        Attenuate LTE and Bringup WiFi
3584        PhoneA should still be in call. PhoneA should handover to iWLAN.
3585        """
3586        return self._wfc_call_sequence(
3587            [self.android_devices[0], self.android_devices[1]],
3588            DIRECTION_MOBILE_ORIGINATED, self._wfc_set_wifi_absent_cell_strong,
3589            self._wfc_phone_setup_wifi_absent_wifi_preferred,
3590            self._phone_idle_volte, self._is_phone_in_call_volte,
3591            self._increase_wifi_decrease_cellular_check_phone_hand_out, True)
3592
3593    def _decrease_wifi_rssi_check_phone_not_hand_out(self):
3594        """Private Test utility for hand_out test.
3595
3596        Decrease WiFi RSSI to <-100dBm, in 30s.
3597        PhoneA should drop call. PhoneA should not report LTE as voice RAT.
3598        PhoneA data should be on LTE.
3599        """
3600        # Decrease WiFi RSSI to <-100dBm in 30 seconds
3601        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
3602                 self.wifi_rssi_with_no_atten, MIN_RSSI_RESERVED_VALUE)
3603        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
3604                 self.wifi_rssi_with_no_atten, MIN_RSSI_RESERVED_VALUE)
3605        # Make sure PhoneA data is on LTE.
3606        if (not wait_for_cell_data_connection(self.log,
3607                                              self.android_devices[0], True) or
3608                not verify_http_connection(self.log, self.android_devices[0])):
3609            self.log.error("Data not on Cell.")
3610            return False
3611        # Make sure phone drop.
3612        self.log.info("Wait for call drop.")
3613        if not self._phone_wait_for_call_drop():
3614            self.log.error("Phone should drop call.")
3615            return False
3616        # Make sure Voice RAT is not LTE.
3617        # FIXME: I think there's something wrong with this check
3618        if RAT_LTE == get_network_rat(self.log, self.android_devices[0],
3619                                      NETWORK_SERVICE_VOICE):
3620            self.log.error("Phone should not report lte as voice rat.")
3621            return False
3622        return True
3623
3624    @test_tracker_info(uuid="40aa17a5-d9e0-4cff-9ca8-c187d7ae3ad1")
3625    @TelephonyBaseTest.tel_test_wrap
3626    def test_hand_out_wifi_only(self):
3627        """WiFi Hand-Out Not Attempted - WiFi Only
3628
3629        PhoneA on LTE, VoLTE enabled, WFC WiFi only, WiFi associated.
3630        Cellular and WiFi signal strong.
3631        Call from PhoneA to PhoneB, PhoneA should be on iwlan.
3632        Decrease WiFi RSSI to <-100dBm, in 30s.
3633        PhoneA should drop call. PhoneA should not report LTE as voice RAT.
3634        PhoneA data should be on LTE.
3635        """
3636        return self._wfc_call_sequence(
3637            [self.android_devices[0], self.android_devices[1]],
3638            DIRECTION_MOBILE_ORIGINATED, self._wfc_set_wifi_strong_cell_strong,
3639            self._wfc_phone_setup_wifi_only, self._phone_idle_iwlan,
3640            self._is_phone_in_call_iwlan,
3641            self._decrease_wifi_rssi_check_phone_not_hand_out, True)
3642
3643    @test_tracker_info(uuid="75a0ae08-3e17-4011-8201-2634026a1fb5")
3644    @TelephonyBaseTest.tel_test_wrap
3645    def test_call_epdg_wfc_wifi_preferred_e4g_disabled(self):
3646        """WiFi Calling with E4G disabled.
3647
3648        PhoneA on LTE, VoLTE disabled, WFC WiFi preferred, WiFi associated.
3649        Cellular and WiFi signal strong.
3650        Call from PhoneA to PhoneB, PhoneA should be on iwlan.
3651        """
3652        return self._wfc_call_sequence(
3653            [self.android_devices[0], self.android_devices[1]],
3654            DIRECTION_MOBILE_ORIGINATED, self._wfc_set_wifi_strong_cell_strong,
3655            self._wfc_phone_setup_wifi_preferred_e4g_disabled,
3656            self._phone_idle_iwlan, self._is_phone_in_call_iwlan, None, True)
3657
3658    @test_tracker_info(uuid="b6b4b423-e7bd-480d-b460-6260556ce73b")
3659    @TelephonyBaseTest.tel_test_wrap
3660    def test_call_epdg_wfc_wifi_preferred_e4g_disabled_wifi_not_connected(
3661            self):
3662        """WiFi Calling with E4G disabled.
3663
3664        PhoneA on LTE, VoLTE disabled, WFC WiFi preferred, WiFi not associated.
3665        Cellular signal strong, WiFi absent.
3666        Call from PhoneA to PhoneB, PhoneA should be on CSFB.
3667        """
3668        return self._wfc_call_sequence(
3669            [self.android_devices[0], self.android_devices[1]],
3670            DIRECTION_MOBILE_ORIGINATED, self._wfc_set_wifi_absent_cell_strong,
3671            self._wfc_phone_setup_wifi_absent_wifi_preferred_e4g_disabled,
3672            self._phone_idle_not_iwlan, self._is_phone_in_call_csfb, None,
3673            True)
3674
3675    def _decrease_wifi_rssi_check_phone_drop(self):
3676        """Private Test utility for e4g_disabled_wfc test.
3677
3678        Decrease WiFi RSSI to make sure WiFI not connected. Call should Drop.
3679        """
3680        # Decrease WiFi RSSI to <-100dBm in 30 seconds
3681        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
3682                 self.wifi_rssi_with_no_atten, MIN_RSSI_RESERVED_VALUE)
3683        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
3684                 self.wifi_rssi_with_no_atten, MIN_RSSI_RESERVED_VALUE)
3685        # Make sure PhoneA data is on cellular.
3686        if (not wait_for_cell_data_connection(self.log,
3687                                              self.android_devices[0], True) or
3688                not verify_http_connection(self.log, self.android_devices[0])):
3689            self.log.error("Data not on Cell.")
3690            return False
3691        # Make sure phone drop.
3692        self.log.info("Wait for call drop.")
3693        if not self._phone_wait_for_call_drop():
3694            self.log.error("Phone should drop call.")
3695            return False
3696        return True
3697
3698    @test_tracker_info(uuid="0de1cf4f-9ae3-4da6-8f0c-666b3968009b")
3699    @TelephonyBaseTest.tel_test_wrap
3700    def test_call_epdg_wfc_wifi_preferred_e4g_disabled_leave_wifi_coverage(
3701            self):
3702        """WiFi Calling with E4G disabled.
3703
3704        PhoneA on LTE, VoLTE disabled, WFC WiFi preferred, WiFi associated.
3705        Cellular and WiFi signal strong.
3706        Call from PhoneA to PhoneB, PhoneA should be on iwlan.
3707        Decrease WiFi RSSI to make sure WiFI not connected. Call should Drop.
3708        """
3709        return self._wfc_call_sequence(
3710            [self.android_devices[0], self.android_devices[1]],
3711            DIRECTION_MOBILE_ORIGINATED, self._wfc_set_wifi_strong_cell_strong,
3712            self._wfc_phone_setup_wifi_preferred_e4g_disabled,
3713            self._phone_idle_iwlan, self._is_phone_in_call_iwlan,
3714            self._decrease_wifi_rssi_check_phone_drop, True)
3715
3716    @TelephonyBaseTest.tel_test_wrap
3717    def test_rssi_monitoring(self):
3718        """Test WiFi RSSI Monitoring API and Callback function.
3719
3720        Steps:
3721        1. Set WiFi RSSI to INITIAL_RSSI (-60dBm), connect WiFi on DUT.
3722        2. Start WiFi RSSI Monitoring for HIGHER_RSSI_THRESHOLD (-50dBm) and
3723            LOWER_RSSI_THRESHOLD (-70dBm)
3724        3. Increase WiFi RSSI to HIGHER_RSSI_THRESHOLD+5dBm
3725        4. Decrease WiFi RSSI to HIGHER_RSSI_THRESHOLD-5dBm
3726        5. Decrease WiFi RSSI to LOWER_RSSI_THRESHOLD-5dBm
3727        6. Increase WiFi RSSI to LOWER_RSSI_THRESHOLD+5dBm
3728
3729        Expected Results:
3730        1. WiFi Connected successfully.
3731        2. DUT report LOWER_RSSI_THRESHOLD available.
3732        3. DUT report HIGHER_RSSI_THRESHOLD available.
3733        4. DUT report HIGHER_RSSI_THRESHOLD lost.
3734        5. DUT report LOWER_RSSI_THRESHOLD lost.
3735        6. DUT report LOWER_RSSI_THRESHOLD available.
3736        """
3737        INITIAL_RSSI = -60
3738        HIGHER_RSSI_THRESHOLD = -50
3739        LOWER_RSSI_THRESHOLD = -70
3740        RSSI_THRESHOLD_MARGIN = 5
3741
3742        WIFI_RSSI_CHANGE_STEP_SIZE = 2
3743        WIFI_RSSI_CHANGE_DELAY_PER_STEP = 1
3744
3745        ad = self.android_devices[0]
3746
3747        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
3748                 self.wifi_rssi_with_no_atten, INITIAL_RSSI)
3749        set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
3750                 self.wifi_rssi_with_no_atten, INITIAL_RSSI)
3751        if not ensure_wifi_connected(self.log, ad, self.wifi_network_ssid,
3752                                     self.wifi_network_pass):
3753            self.log.error("{} connect WiFI failed".format(ad.serial))
3754            return False
3755        try:
3756            rssi_monitoring_id_higher = ad.droid.connectivitySetRssiThresholdMonitor(
3757                HIGHER_RSSI_THRESHOLD)
3758            rssi_monitoring_id_lower = ad.droid.connectivitySetRssiThresholdMonitor(
3759                LOWER_RSSI_THRESHOLD)
3760
3761            self.log.info(
3762                "Initial RSSI: {},"
3763                "rssi_monitoring_id_lower should be available.".format(
3764                    INITIAL_RSSI))
3765            try:
3766                event = ad.ed.wait_for_event(
3767                    EventNetworkCallback,
3768                    is_network_call_back_event_match,
3769                    network_callback_id=rssi_monitoring_id_lower,
3770                    network_callback_event=NetworkCallbackAvailable)
3771                self.log.info("Received Event: {}".format(event))
3772            except Empty:
3773                self.log.error("No {} event for id {}".format(
3774                    NetworkCallbackAvailable, rssi_monitoring_id_lower))
3775                return False
3776
3777            self.log.info("Set RSSI to HIGHER_RSSI_THRESHOLD+5,"
3778                          "rssi_monitoring_id_higher should be available.")
3779            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
3780                     self.wifi_rssi_with_no_atten,
3781                     HIGHER_RSSI_THRESHOLD + RSSI_THRESHOLD_MARGIN,
3782                     WIFI_RSSI_CHANGE_STEP_SIZE,
3783                     WIFI_RSSI_CHANGE_DELAY_PER_STEP)
3784            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
3785                     self.wifi_rssi_with_no_atten,
3786                     HIGHER_RSSI_THRESHOLD + RSSI_THRESHOLD_MARGIN,
3787                     WIFI_RSSI_CHANGE_STEP_SIZE,
3788                     WIFI_RSSI_CHANGE_DELAY_PER_STEP)
3789            try:
3790                event = ad.ed.wait_for_event(
3791                    EventNetworkCallback,
3792                    is_network_call_back_event_match,
3793                    network_callback_id=rssi_monitoring_id_higher,
3794                    network_callback_event=NetworkCallbackAvailable)
3795                self.log.info("Received Event: {}".format(event))
3796            except Empty:
3797                self.log.error("No {} event for id {}".format(
3798                    NetworkCallbackAvailable, rssi_monitoring_id_higher))
3799                return False
3800
3801            self.log.info("Set RSSI to HIGHER_RSSI_THRESHOLD-5,"
3802                          "rssi_monitoring_id_higher should be lost.")
3803            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
3804                     self.wifi_rssi_with_no_atten,
3805                     HIGHER_RSSI_THRESHOLD - RSSI_THRESHOLD_MARGIN,
3806                     WIFI_RSSI_CHANGE_STEP_SIZE,
3807                     WIFI_RSSI_CHANGE_DELAY_PER_STEP)
3808            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
3809                     self.wifi_rssi_with_no_atten,
3810                     HIGHER_RSSI_THRESHOLD - RSSI_THRESHOLD_MARGIN,
3811                     WIFI_RSSI_CHANGE_STEP_SIZE,
3812                     WIFI_RSSI_CHANGE_DELAY_PER_STEP)
3813            try:
3814                event = ad.ed.wait_for_event(
3815                    EventNetworkCallback,
3816                    is_network_call_back_event_match,
3817                    network_callback_id=rssi_monitoring_id_higher,
3818                    network_callback_event=NetworkCallbackLost)
3819                self.log.info("Received Event: {}".format(event))
3820            except Empty:
3821                self.log.error("No {} event for id {}".format(
3822                    NetworkCallbackLost, rssi_monitoring_id_higher))
3823                return False
3824
3825            self.log.info("Set RSSI to LOWER_RSSI_THRESHOLD-5,"
3826                          "rssi_monitoring_id_lower should be lost.")
3827            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
3828                     self.wifi_rssi_with_no_atten,
3829                     LOWER_RSSI_THRESHOLD - RSSI_THRESHOLD_MARGIN,
3830                     WIFI_RSSI_CHANGE_STEP_SIZE,
3831                     WIFI_RSSI_CHANGE_DELAY_PER_STEP)
3832            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
3833                     self.wifi_rssi_with_no_atten,
3834                     LOWER_RSSI_THRESHOLD - RSSI_THRESHOLD_MARGIN,
3835                     WIFI_RSSI_CHANGE_STEP_SIZE,
3836                     WIFI_RSSI_CHANGE_DELAY_PER_STEP)
3837            try:
3838                event = ad.ed.wait_for_event(
3839                    EventNetworkCallback,
3840                    is_network_call_back_event_match,
3841                    network_callback_id=rssi_monitoring_id_lower,
3842                    network_callback_event=NetworkCallbackLost)
3843                self.log.info("Received Event: {}".format(event))
3844            except Empty:
3845                self.log.error("No {} event for id {}".format(
3846                    NetworkCallbackLost, rssi_monitoring_id_lower))
3847                return False
3848
3849            self.log.info("Set RSSI to LOWER_RSSI_THRESHOLD+5,"
3850                          "rssi_monitoring_id_lower should be available.")
3851            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G],
3852                     self.wifi_rssi_with_no_atten,
3853                     LOWER_RSSI_THRESHOLD + RSSI_THRESHOLD_MARGIN,
3854                     WIFI_RSSI_CHANGE_STEP_SIZE,
3855                     WIFI_RSSI_CHANGE_DELAY_PER_STEP)
3856            set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G],
3857                     self.wifi_rssi_with_no_atten,
3858                     LOWER_RSSI_THRESHOLD + RSSI_THRESHOLD_MARGIN,
3859                     WIFI_RSSI_CHANGE_STEP_SIZE,
3860                     WIFI_RSSI_CHANGE_DELAY_PER_STEP)
3861            try:
3862                event = ad.ed.wait_for_event(
3863                    EventNetworkCallback,
3864                    is_network_call_back_event_match,
3865                    network_callback_id=rssi_monitoring_id_lower,
3866                    network_callback_event=NetworkCallbackAvailable)
3867                self.log.info("Received Event: {}".format(event))
3868            except Empty:
3869                self.log.error("No {} event for id {}".format(
3870                    NetworkCallbackAvailable, rssi_monitoring_id_lower))
3871                return False
3872        finally:
3873            ad.droid.connectivityStopRssiThresholdMonitor(
3874                rssi_monitoring_id_higher)
3875            ad.droid.connectivityStopRssiThresholdMonitor(
3876                rssi_monitoring_id_lower)
3877        return True
3878
3879
3880""" Tests End """
3881