• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python3.4
2#
3#   Copyright 2018 - 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 IMS Settings
18"""
19
20import time
21
22from acts import signals
23from acts.test_decorators import test_tracker_info
24from acts.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
25from acts.test_utils.tel.tel_defines import CarrierConfigs
26from acts.test_utils.tel.tel_defines import CAPABILITY_VOLTE
27from acts.test_utils.tel.tel_defines import CAPABILITY_WFC
28from acts.test_utils.tel.tel_defines import CAPABILITY_WFC_MODE_CHANGE
29from acts.test_utils.tel.tel_defines import GEN_4G
30from acts.test_utils.tel.tel_defines import MAX_WAIT_TIME_WIFI_CONNECTION
31from acts.test_utils.tel.tel_defines import NETWORK_SERVICE_DATA
32from acts.test_utils.tel.tel_defines import NETWORK_SERVICE_VOICE
33from acts.test_utils.tel.tel_defines import MAX_WAIT_TIME_IMS_REGISTRATION
34from acts.test_utils.tel.tel_defines import MAX_WAIT_TIME_WFC_ENABLED
35from acts.test_utils.tel.tel_defines import RAT_FAMILY_WLAN
36from acts.test_utils.tel.tel_defines import RAT_LTE
37from acts.test_utils.tel.tel_defines import RAT_UNKNOWN
38from acts.test_utils.tel.tel_defines import WFC_MODE_CELLULAR_PREFERRED
39from acts.test_utils.tel.tel_defines import WFC_MODE_DISABLED
40from acts.test_utils.tel.tel_defines import WFC_MODE_WIFI_ONLY
41from acts.test_utils.tel.tel_defines import WFC_MODE_WIFI_PREFERRED
42from acts.test_utils.tel.tel_test_utils import call_setup_teardown
43from acts.test_utils.tel.tel_test_utils import dumpsys_carrier_config
44from acts.test_utils.tel.tel_test_utils import ensure_phone_subscription
45from acts.test_utils.tel.tel_test_utils import ensure_wifi_connected
46from acts.test_utils.tel.tel_test_utils import fastboot_wipe
47from acts.test_utils.tel.tel_test_utils import get_user_config_profile
48from acts.test_utils.tel.tel_test_utils import is_droid_in_rat_family
49from acts.test_utils.tel.tel_test_utils import revert_default_telephony_setting
50from acts.test_utils.tel.tel_test_utils import set_wfc_mode
51from acts.test_utils.tel.tel_test_utils import toggle_airplane_mode_by_adb
52from acts.test_utils.tel.tel_test_utils import toggle_volte
53from acts.test_utils.tel.tel_test_utils import toggle_wfc
54from acts.test_utils.tel.tel_test_utils import verify_default_telephony_setting
55from acts.test_utils.tel.tel_test_utils import verify_internet_connection
56from acts.test_utils.tel.tel_test_utils import wait_for_ims_registered
57from acts.test_utils.tel.tel_test_utils import wait_for_network_rat
58from acts.test_utils.tel.tel_test_utils import wait_for_not_network_rat
59from acts.test_utils.tel.tel_test_utils import wait_for_state
60from acts.test_utils.tel.tel_test_utils import wait_for_voice_attach
61from acts.test_utils.tel.tel_test_utils import wait_for_volte_enabled
62from acts.test_utils.tel.tel_test_utils import wait_for_wfc_disabled
63from acts.test_utils.tel.tel_test_utils import wait_for_wfc_enabled
64from acts.test_utils.tel.tel_test_utils import wait_for_wifi_data_connection
65from acts.test_utils.tel.tel_test_utils import wifi_reset
66from acts.test_utils.tel.tel_test_utils import wifi_toggle_state
67from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_iwlan
68from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_volte
69from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_3g
70from acts.test_utils.tel.tel_voice_utils import phone_setup_csfb
71from acts.test_utils.tel.tel_voice_utils import phone_setup_volte
72from acts.test_utils.tel.tel_test_utils import WIFI_SSID_KEY
73from acts.test_utils.tel.tel_test_utils import WIFI_PWD_KEY
74
75
76class TelLiveImsSettingsTest(TelephonyBaseTest):
77    def setup_class(self):
78        TelephonyBaseTest.setup_class(self)
79        self.dut = self.android_devices[0]
80        self.number_of_devices = 1
81        self.skip_reset_between_cases = False
82        self.carrier_configs = dumpsys_carrier_config(self.dut)
83        self.dut_capabilities = self.dut.telephony.get("capabilities", [])
84        self.dut.log.info("DUT capabilities: %s", self.dut_capabilities)
85        if CAPABILITY_VOLTE not in self.dut_capabilities:
86            raise signals.TestSkipClass("VoLTE is not supported")
87        if CAPABILITY_WFC not in self.dut_capabilities:
88            raise signals.TestSkipClass("WFC is not supported")
89
90        self.default_volte = (CAPABILITY_VOLTE in self.dut_capabilities) and (
91            self.carrier_configs[CarrierConfigs.
92                                 ENHANCED_4G_LTE_ON_BY_DEFAULT_BOOL])
93        self.default_wfc_enabled = (
94            CAPABILITY_WFC in self.dut_capabilities
95        ) and (
96            self.carrier_configs[CarrierConfigs.DEFAULT_WFC_IMS_ENABLED_BOOL])
97        self.default_wfc_mode = self.carrier_configs.get(
98            CarrierConfigs.DEFAULT_WFC_IMS_MODE_INT, None)
99        self.dut_wfc_modes = self.dut.telephony.get("wfc_modes", [])
100
101    def check_call_in_wfc(self):
102        result = True
103        if not call_setup_teardown(self.log, self.android_devices[1], self.dut,
104                                   self.dut, None, is_phone_in_call_iwlan):
105            if not call_setup_teardown(self.log, self.android_devices[1],
106                                       self.dut, self.dut, None,
107                                       is_phone_in_call_iwlan):
108                self.dut.log.error("MT WFC call failed")
109                result = False
110        if not call_setup_teardown(self.log, self.dut, self.android_devices[1],
111                                   self.dut, is_phone_in_call_iwlan):
112            self.dut.log.error("MO WFC call failed")
113            result = False
114        return result
115
116    def check_call_in_volte(self):
117        result = True
118        if not call_setup_teardown(self.log, self.android_devices[1], self.dut,
119                                   self.dut, None, is_phone_in_call_volte):
120            if not call_setup_teardown(self.log, self.android_devices[1],
121                                       self.dut, self.dut, None,
122                                       is_phone_in_call_volte):
123                self.dut.log.error("MT VoLTE call failed")
124                result = False
125        if not call_setup_teardown(self.log, self.dut, self.android_devices[1],
126                                   self.dut, is_phone_in_call_volte):
127            self.dut.log.error("MO VoLTE call failed")
128            result = False
129        return result
130
131    def check_call(self):
132        result = True
133        if not call_setup_teardown(self.log, self.android_devices[1], self.dut,
134                                   self.dut):
135            if not call_setup_teardown(self.log, self.android_devices[1],
136                                       self.dut, self.dut):
137                self.dut.log.error("MT call failed")
138                result = False
139        if not call_setup_teardown(self.log, self.dut, self.android_devices[1],
140                                   self.dut):
141            self.dut.log.error("MO call failed")
142            result = False
143        return result
144
145    def change_ims_setting(self,
146                           airplane_mode,
147                           wifi_enabled,
148                           volte_enabled,
149                           wfc_enabled,
150                           wfc_mode=None):
151        result = True
152        self.dut.log.info(
153            "Setting APM %s, WIFI %s, VoLTE %s, WFC %s, WFC mode %s",
154            airplane_mode, wifi_enabled, volte_enabled, wfc_enabled, wfc_mode)
155        toggle_airplane_mode_by_adb(self.log, self.dut, airplane_mode)
156        if wifi_enabled:
157            if not ensure_wifi_connected(self.log, self.dut,
158                                         self.wifi_network_ssid,
159                                         self.wifi_network_pass):
160                self.dut.log.error("Fail to connected to WiFi")
161                result = False
162        else:
163            if not wifi_toggle_state(self.log, self.dut, False):
164                self.dut.log.error("Failed to turn off WiFi.")
165                result = False
166        toggle_volte(self.log, self.dut, volte_enabled)
167        toggle_wfc(self.log, self.dut, wfc_enabled)
168        if wfc_mode:
169            set_wfc_mode(self.log, self.dut, wfc_mode)
170        wfc_mode = self.dut.droid.imsGetWfcMode()
171        if wifi_enabled or not airplane_mode:
172            if not ensure_phone_subscription(self.log, self.dut):
173                self.dut.log.error("Failed to find valid subscription")
174                result = False
175        if airplane_mode:
176            if (CAPABILITY_WFC in self.dut_capabilities) and (wifi_enabled
177                                                              and wfc_enabled):
178                if not wait_for_wfc_enabled(self.log, self.dut):
179                    result = False
180                elif not self.check_call_in_wfc():
181                    result = False
182            else:
183                if not wait_for_state(
184                        self.dut.droid.telephonyGetCurrentVoiceNetworkType,
185                        RAT_UNKNOWN):
186                    self.dut.log.error(
187                        "Voice RAT is %s not UNKNOWN",
188                        self.dut.droid.telephonyGetCurrentVoiceNetworkType())
189                    result = False
190                else:
191                    self.dut.log.info("Voice RAT is in UNKKNOWN")
192        else:
193            if (wifi_enabled and wfc_enabled) and (
194                    wfc_mode == WFC_MODE_WIFI_PREFERRED) and (
195                        CAPABILITY_WFC in self.dut_capabilities):
196                if not wait_for_wfc_enabled(self.log, self.dut):
197                    result = False
198                if not wait_for_state(
199                        self.dut.droid.telephonyGetCurrentVoiceNetworkType,
200                        RAT_UNKNOWN):
201                    self.dut.log.error(
202                        "Voice RAT is %s, not UNKNOWN",
203                        self.dut.droid.telephonyGetCurrentVoiceNetworkType())
204                if not self.check_call_in_wfc():
205                    result = False
206            else:
207                if not wait_for_wfc_disabled(self.log, self.dut):
208                    self.dut.log.error("WFC is not disabled")
209                    result = False
210                if volte_enabled and CAPABILITY_VOLTE in self.dut_capabilities:
211                    if not wait_for_volte_enabled(self.log, self.dut):
212                        result = False
213                    if not self.check_call_in_volte():
214                        result = False
215                else:
216                    if not wait_for_not_network_rat(
217                            self.log,
218                            self.dut,
219                            RAT_LTE,
220                            voice_or_data=NETWORK_SERVICE_VOICE):
221                        self.dut.log.error(
222                            "Voice RAT is %s",
223                            self.dut.droid.telephonyGetCurrentVoiceNetworkType(
224                            ))
225                        result = False
226                    if not wait_for_voice_attach(self.log, self.dut):
227                        result = False
228                    if not self.check_call():
229                        result = False
230        user_config_profile = get_user_config_profile(self.dut)
231        self.dut.log.info("user_config_profile: %s ",
232                          sorted(user_config_profile.items()))
233        return result
234
235    def verify_default_ims_setting(self):
236        result = True
237        airplane_mode = self.dut.droid.connectivityCheckAirplaneMode()
238        default_wfc_mode = self.carrier_configs.get(
239            CarrierConfigs.DEFAULT_WFC_IMS_MODE_INT, WFC_MODE_DISABLED)
240        if self.default_wfc_enabled:
241            wait_for_wfc_enabled(self.log, self.dut)
242        else:
243            wait_for_wfc_disabled(self.log, self.dut)
244            if airplane_mode:
245                wait_for_network_rat(
246                    self.log,
247                    self.dut,
248                    RAT_UNKNOWN,
249                    voice_or_data=NETWORK_SERVICE_VOICE)
250            else:
251                if self.default_volte:
252                    wait_for_volte_enabled(self.log, self.dut)
253                else:
254                    wait_for_not_network_rat(
255                        self.log,
256                        self.dut,
257                        RAT_UNKNOWN,
258                        voice_or_data=NETWORK_SERVICE_VOICE)
259        if not ensure_phone_subscription(self.log, self.dut):
260            ad.log.error("Failed to find valid subscription")
261            result = False
262        user_config_profile = get_user_config_profile(self.dut)
263        self.dut.log.info("user_config_profile = %s ",
264                          sorted(user_config_profile.items()))
265        if user_config_profile["VoLTE Enabled"] != self.default_volte:
266            self.dut.log.error("VoLTE mode is not %s", self.default_volte)
267            result = False
268        else:
269            self.dut.log.info("VoLTE mode is %s as expected",
270                              self.default_volte)
271        if user_config_profile["WFC Enabled"] != self.default_wfc_enabled:
272            self.dut.log.error("WFC enabled is not %s", default_wfc_enabled)
273        if user_config_profile["WFC Enabled"]:
274            if user_config_profile["WFC Mode"] != default_wfc_mode:
275                self.dut.log.error(
276                    "WFC mode is not %s after IMS factory reset",
277                    default_wfc_mode)
278                result = False
279            else:
280                self.dut.log.info("WFC mode is %s as expected",
281                                  default_wfc_mode)
282        if self.default_wfc_enabled and \
283            default_wfc_mode == WFC_MODE_WIFI_PREFERRED:
284            if not self.check_call_in_wfc():
285                result = False
286        elif not airplane_mode:
287            if self.default_volte:
288                if not self.check_call_in_volte():
289                    result = False
290            else:
291                if not self.check_call():
292                    result = False
293        if result == False:
294            user_config_profile = get_user_config_profile(self.dut)
295            self.dut.log.info("user_config_profile = %s ",
296                              sorted(user_config_profile.items()))
297        return result
298
299    @test_tracker_info(uuid="a3a680ba-d1e0-4770-a38c-4de8f15f9171")
300    @TelephonyBaseTest.tel_test_wrap
301    def test_lte_volte_wifi_connected_toggle_wfc(self):
302        """Test for WiFi Calling settings:
303        LTE + VoLTE Enabled + WiFi Connected, Toggling WFC
304
305        Steps:
306        1. Setup DUT Idle, LTE network type, VoLTE enabled.
307        2. Make sure DUT WiFi connected, WFC disabled.
308        3. Set DUT WFC enabled (WiFi Preferred), verify DUT WFC available,
309            report iwlan rat.
310        4. Set DUT WFC disabled, verify DUT WFC unavailable,
311            not report iwlan rat.
312
313        Expected Results:
314        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
315        4. DUT WiFi Calling feature bit return False, network rat is not iwlan.
316        """
317        if not phone_setup_volte(self.log, self.dut):
318            self.log.error("Failed to setup VoLTE")
319            return False
320        if not self.change_ims_setting(False, True, True, True,
321                                       self.default_wfc_mode):
322            return False
323        if not self.change_ims_setting(False, True, True, False, None):
324            return False
325        return self.change_ims_setting(False, True, True, True, None)
326
327    @test_tracker_info(uuid="d3ffae75-ae4a-4ed8-9337-9155c413311d")
328    @TelephonyBaseTest.tel_test_wrap
329    def test_lte_wifi_connected_toggle_wfc(self):
330        """Test for WiFi Calling settings:
331        LTE + VoLTE Disabled + WiFi Connected, Toggling WFC
332
333        Steps:
334        1. Setup DUT Idle, LTE network type, VoLTE disabled.
335        2. Make sure DUT WiFi connected, WFC disabled.
336        3. Set DUT WFC enabled (WiFi Preferred), verify DUT WFC available,
337            report iwlan rat.
338        4. Set DUT WFC disabled, verify DUT WFC unavailable,
339            not report iwlan rat.
340
341        Expected Results:
342        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
343        4. DUT WiFi Calling feature bit return False, network rat is not iwlan.
344        """
345        if not phone_setup_csfb(self.log, self.dut):
346            self.log.error("Failed to setup LTE")
347            return False
348        if not self.change_ims_setting(False, True, False, True,
349                                       self.default_wfc_mode):
350            return False
351        if not self.change_ims_setting(False, True, False, False, None):
352            return False
353        return self.change_ims_setting(False, True, False, True, None)
354
355    @test_tracker_info(uuid="29d2d7b7-1c31-4a2c-896a-3f6756c620ac")
356    @TelephonyBaseTest.tel_test_wrap
357    def test_3g_wifi_connected_toggle_wfc(self):
358        """Test for WiFi Calling settings:
359        3G + WiFi Connected, Toggling WFC
360
361        Steps:
362        1. Setup DUT Idle, 3G network type.
363        2. Make sure DUT WiFi connected, WFC disabled.
364        3. Set DUT WFC enabled (WiFi Preferred), verify DUT WFC available,
365            report iwlan rat.
366        4. Set DUT WFC disabled, verify DUT WFC unavailable,
367            not report iwlan rat.
368
369        Expected Results:
370        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
371        4. DUT WiFi Calling feature bit return False, network rat is not iwlan.
372        """
373        if not phone_setup_voice_3g(self.log, self.dut):
374            self.log.error("Failed to setup 3G")
375            return False
376        if not self.change_ims_setting(False, True, False, True,
377                                       self.default_wfc_mode):
378            return False
379        if not self.change_ims_setting(False, True, False, False, None):
380            return False
381        return self.change_ims_setting(False, True, False, True, None)
382
383    @test_tracker_info(uuid="ce2c0208-9ea0-4b31-91f4-d06a62cb927a")
384    @TelephonyBaseTest.tel_test_wrap
385    def test_apm_wifi_connected_toggle_wfc(self):
386        """Test for WiFi Calling settings:
387        APM + WiFi Connected, Toggling WFC
388
389        Steps:
390        1. Setup DUT Idle, Airplane mode.
391        2. Make sure DUT WiFi connected, WFC disabled.
392        3. Set DUT WFC enabled (WiFi Preferred), verify DUT WFC available,
393            report iwlan rat.
394        4. Set DUT WFC disabled, verify DUT WFC unavailable,
395            not report iwlan rat.
396
397        Expected Results:
398        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
399        4. DUT WiFi Calling feature bit return False, network rat is not iwlan.
400        """
401        if not self.change_ims_setting(True, True, True, True,
402                                       self.default_wfc_mode):
403            return False
404        if not self.change_ims_setting(True, True, True, False, None):
405            return False
406        return self.change_ims_setting(True, True, True, True, None)
407
408    @test_tracker_info(uuid="681e2448-32a2-434d-abd6-0bc2ab5afd9c")
409    @TelephonyBaseTest.tel_test_wrap
410    def test_lte_volte_wfc_enabled_toggle_wifi(self):
411        """Test for WiFi Calling settings:
412        LTE + VoLTE Enabled + WFC enabled, Toggling WiFi
413
414        Steps:
415        1. Setup DUT Idle, LTE network type, VoLTE enabled.
416        2. Make sure DUT WiFi disconnected, WFC enabled (WiFi Preferred).
417        3. DUT connect WiFi, verify DUT WFC available, report iwlan rat.
418        4. DUT disconnect WiFi,verify DUT WFC unavailable, not report iwlan rat.
419
420        Expected Results:
421        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
422        4. DUT WiFi Calling feature bit return False, network rat is not iwlan.
423        """
424        if not phone_setup_volte(self.log, self.dut):
425            self.log.error("Failed to setup VoLTE")
426            return False
427        if not self.change_ims_setting(False, True, True, True,
428                                       self.default_wfc_mode):
429            return False
430        if not self.change_ims_setting(False, True, True, False, None):
431            return False
432        return self.change_ims_setting(False, True, True, True, None)
433
434    @test_tracker_info(uuid="63922066-9caa-42e6-bc9f-49f5ac01cbe2")
435    @TelephonyBaseTest.tel_test_wrap
436    def test_lte_wfc_enabled_toggle_wifi(self):
437        """Test for WiFi Calling settings:
438        LTE + VoLTE Disabled + WFC enabled, Toggling WiFi
439
440        Steps:
441        1. Setup DUT Idle, LTE network type, VoLTE disabled.
442        2. Make sure DUT WiFi disconnected, WFC enabled (WiFi Preferred).
443        3. DUT connect WiFi, verify DUT WFC available, report iwlan rat.
444        4. DUT disconnect WiFi,verify DUT WFC unavailable, not report iwlan rat.
445
446        Expected Results:
447        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
448        4. DUT WiFi Calling feature bit return False, network rat is not iwlan.
449        """
450        if not phone_setup_csfb(self.log, self.dut):
451            self.log.error("Failed to setup CSFB")
452            return False
453        if not self.change_ims_setting(False, True, False, True,
454                                       self.default_wfc_mode):
455            return False
456        if not self.change_ims_setting(False, False, False, True, None):
457            return False
458        return self.change_ims_setting(False, True, False, True, None)
459
460    @test_tracker_info(uuid="8a80a446-2116-4b19-b0ef-f771f30a6d15")
461    @TelephonyBaseTest.tel_test_wrap
462    def test_3g_wfc_enabled_toggle_wifi(self):
463        """Test for WiFi Calling settings:
464        3G + WFC enabled, Toggling WiFi
465
466        Steps:
467        1. Setup DUT Idle, 3G network type.
468        2. Make sure DUT WiFi disconnected, WFC enabled (WiFi Preferred).
469        3. DUT connect WiFi, verify DUT WFC available, report iwlan rat.
470        4. DUT disconnect WiFi,verify DUT WFC unavailable, not report iwlan rat.
471
472        Expected Results:
473        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
474        4. DUT WiFi Calling feature bit return False, network rat is not iwlan.
475        """
476        if not phone_setup_voice_3g(self.log, self.dut):
477            self.log.error("Failed to setup 3G")
478            return False
479        if not self.change_ims_setting(False, True, False, True,
480                                       self.default_wfc_mode):
481            return False
482        if not self.change_ims_setting(False, False, False, True, None):
483            return False
484        return self.change_ims_setting(False, True, False, True, None)
485
486    @test_tracker_info(uuid="9889eebf-cde6-4f47-aec0-9cb204fdf2e5")
487    @TelephonyBaseTest.tel_test_wrap
488    def test_apm_wfc_enabled_toggle_wifi(self):
489        """Test for WiFi Calling settings:
490        APM + WFC enabled, Toggling WiFi
491
492        Steps:
493        1. Setup DUT Idle, Airplane mode.
494        2. Make sure DUT WiFi disconnected, WFC enabled (WiFi Preferred).
495        3. DUT connect WiFi, verify DUT WFC available, report iwlan rat.
496        4. DUT disconnect WiFi,verify DUT WFC unavailable, not report iwlan rat.
497
498        Expected Results:
499        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
500        4. DUT WiFi Calling feature bit return False, network rat is not iwlan.
501        """
502        if not self.change_ims_setting(True, True, True, True,
503                                       self.default_wfc_mode):
504            return False
505        if not self.change_ims_setting(True, False, True, True, None):
506            return False
507        return self.change_ims_setting(True, True, True, True, None)
508
509    @test_tracker_info(uuid="9b23e04b-4f70-4e73-88e7-6376262c739d")
510    @TelephonyBaseTest.tel_test_wrap
511    def test_lte_wfc_enabled_wifi_connected_toggle_volte(self):
512        """Test for WiFi Calling settings:
513        LTE + VoLTE Enabled + WiFi Connected + WFC enabled, toggle VoLTE setting
514
515        Steps:
516        1. Setup DUT Idle, LTE network type, VoLTE enabled.
517        2. Make sure DUT WiFi connected, WFC enabled (WiFi Preferred).
518            Verify DUT WFC available, report iwlan rat.
519        3. Disable VoLTE on DUT, verify in 2 minutes period,
520            DUT does not lost WiFi Calling, DUT still report WFC available,
521            rat iwlan.
522        4. Enable VoLTE on DUT, verify in 2 minutes period,
523            DUT does not lost WiFi Calling, DUT still report WFC available,
524            rat iwlan.
525
526        Expected Results:
527        2. DUT WiFi Calling feature bit return True, network rat is iwlan.
528        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
529        4. DUT WiFi Calling feature bit return True, network rat is iwlan.
530        """
531        if not phone_setup_volte(self.log, self.dut):
532            self.dut.log.error("Failed to setup VoLTE.")
533            return False
534        if not self.change_ims_setting(False, True, True, True,
535                                       self.default_wfc_mode):
536            return False
537        if not self.change_ims_setting(False, True, False, True, None):
538            return False
539        return self.change_ims_setting(False, True, True, True, None)
540
541    @test_tracker_info(uuid="04bdfda4-06f7-41df-9352-a8534bc2a67a")
542    @TelephonyBaseTest.tel_test_wrap
543    def test_lte_volte_wfc_wifi_preferred_to_cellular_preferred(self):
544        """Test for WiFi Calling settings:
545        LTE + VoLTE Enabled + WiFi Connected + WiFi Preferred,
546        change WFC to Cellular Preferred
547
548        Steps:
549        1. Setup DUT Idle, LTE network type, VoLTE enabled.
550        2. Make sure DUT WiFi connected, WFC is set to WiFi Preferred.
551            Verify DUT WFC available, report iwlan rat.
552        3. Change WFC setting to Cellular Preferred.
553        4. Verify DUT report WFC not available.
554
555        Expected Results:
556        2. DUT WiFi Calling feature bit return True, network rat is iwlan.
557        4. DUT WiFI Calling feature bit return False, network rat is not iwlan.
558        """
559        if WFC_MODE_WIFI_PREFERRED not in self.dut_wfc_modes:
560            raise signals.TestSkip("WFC_MODE_WIFI_PREFERRED is not supported")
561        if WFC_MODE_CELLULAR_PREFERRED not in self.dut_wfc_modes:
562            raise signals.TestSkip(
563                "WFC_MODE_CELLULAR_PREFERRED is not supported")
564        if not phone_setup_volte(self.log, self.dut):
565            self.dut.log.error("Failed to setup VoLTE.")
566            return False
567        if not self.change_ims_setting(False, True, True, True,
568                                       WFC_MODE_WIFI_PREFERRED):
569            return False
570        return self.change_ims_setting(False, True, True, True,
571                                       WFC_MODE_CELLULAR_PREFERRED)
572
573    @test_tracker_info(uuid="80d26bdb-992a-4b30-ad51-68308d5af168")
574    @TelephonyBaseTest.tel_test_wrap
575    def test_lte_wfc_wifi_preferred_to_cellular_preferred(self):
576        """Test for WiFi Calling settings:
577        LTE + WiFi Connected + WiFi Preferred, change WFC to Cellular Preferred
578
579        Steps:
580        1. Setup DUT Idle, LTE network type, VoLTE disabled.
581        2. Make sure DUT WiFi connected, WFC is set to WiFi Preferred.
582            Verify DUT WFC available, report iwlan rat.
583        3. Change WFC setting to Cellular Preferred.
584        4. Verify DUT report WFC not available.
585
586        Expected Results:
587        2. DUT WiFi Calling feature bit return True, network rat is iwlan.
588        4. DUT WiFI Calling feature bit return False, network rat is not iwlan.
589        """
590        if WFC_MODE_WIFI_PREFERRED not in self.dut_wfc_modes:
591            raise signals.TestSkip("WFC_MODE_WIFI_PREFERRED is not supported")
592        if WFC_MODE_CELLULAR_PREFERRED not in self.dut_wfc_modes:
593            raise signals.TestSkip(
594                "WFC_MODE_CELLULAR_PREFERRED is not supported")
595        if not phone_setup_csfb(self.log, self.dut):
596            self.dut.log.error("Failed to setup LTE.")
597            return False
598        if not self.change_ims_setting(False, True, False, True,
599                                       WFC_MODE_WIFI_PREFERRED):
600            return False
601        return self.change_ims_setting(False, True, False, True,
602                                       WFC_MODE_CELLULAR_PREFERRED)
603
604    @test_tracker_info(uuid="d486c7e3-3d2b-4552-8af8-7b19f6347427")
605    @TelephonyBaseTest.tel_test_wrap
606    def test_3g_wfc_wifi_preferred_to_cellular_preferred(self):
607        """Test for WiFi Calling settings:
608        3G + WiFi Connected + WiFi Preferred, change WFC to Cellular Preferred
609
610        Steps:
611        1. Setup DUT Idle, 3G network type.
612        2. Make sure DUT WiFi connected, WFC is set to WiFi Preferred.
613            Verify DUT WFC available, report iwlan rat.
614        3. Change WFC setting to Cellular Preferred.
615        4. Verify DUT report WFC not available.
616
617        Expected Results:
618        2. DUT WiFi Calling feature bit return True, network rat is iwlan.
619        4. DUT WiFI Calling feature bit return False, network rat is not iwlan.
620        """
621        if WFC_MODE_WIFI_PREFERRED not in self.dut_wfc_modes:
622            raise signals.TestSkip("WFC_MODE_WIFI_PREFERRED is not supported")
623        if WFC_MODE_CELLULAR_PREFERRED not in self.dut_wfc_modes:
624            raise signals.TestSkip(
625                "WFC_MODE_CELLULAR_PREFERRED is not supported")
626        if not phone_setup_voice_3g(self.dut.log, self.dut):
627            self.dut.log.error("Failed to setup 3G.")
628            return False
629        if not self.change_ims_setting(False, True, False, True,
630                                       WFC_MODE_WIFI_PREFERRED):
631            return False
632        return self.change_ims_setting(False, True, False, True,
633                                       WFC_MODE_CELLULAR_PREFERRED)
634
635    @test_tracker_info(uuid="0feb0add-8e22-4c86-b13e-be68659cdd87")
636    @TelephonyBaseTest.tel_test_wrap
637    def test_apm_wfc_wifi_preferred_to_cellular_preferred(self):
638        """Test for WiFi Calling settings:
639        APM + WiFi Connected + WiFi Preferred, change WFC to Cellular Preferred
640
641        Steps:
642        1. Setup DUT Idle, airplane mode.
643        2. Make sure DUT WiFi connected, WFC is set to WiFi Preferred.
644            Verify DUT WFC available, report iwlan rat.
645        3. Change WFC setting to Cellular Preferred.
646        4. Verify DUT report WFC not available.
647
648        Expected Results:
649        2. DUT WiFi Calling feature bit return True, network rat is iwlan.
650        4. DUT WiFI Calling feature bit return True, network rat is iwlan.
651        """
652        if WFC_MODE_WIFI_PREFERRED not in self.dut_wfc_modes:
653            raise signals.TestSkip("WFC_MODE_WIFI_PREFERRED is not supported")
654        if WFC_MODE_CELLULAR_PREFERRED not in self.dut_wfc_modes:
655            raise signals.TestSkip(
656                "WFC_MODE_CELLULAR_PREFERRED is not supported")
657        if not self.change_ims_setting(True, True, True, True,
658                                       WFC_MODE_WIFI_PREFERRED):
659            return False
660        return self.change_ims_setting(True, True, True, True,
661                                       WFC_MODE_CELLULAR_PREFERRED)
662
663    @test_tracker_info(uuid="9c8f359f-a084-4413-b8a9-34771af166c5")
664    @TelephonyBaseTest.tel_test_wrap
665    def test_lte_volte_wfc_cellular_preferred_to_wifi_preferred(self):
666        """Test for WiFi Calling settings:
667        LTE + VoLTE Enabled + WiFi Connected + Cellular Preferred,
668        change WFC to WiFi Preferred
669
670        Steps:
671        1. Setup DUT Idle, LTE network type, VoLTE enabled.
672        2. Make sure DUT WiFi connected, WFC is set to Cellular Preferred.
673            Verify DUT WFC not available.
674        3. Change WFC setting to WiFi Preferred.
675        4. Verify DUT report WFC available.
676
677        Expected Results:
678        2. DUT WiFi Calling feature bit return False, network rat is not iwlan.
679        4. DUT WiFI Calling feature bit return True, network rat is iwlan.
680        """
681        if WFC_MODE_WIFI_PREFERRED not in self.dut_wfc_modes:
682            raise signals.TestSkip("WFC_MODE_WIFI_PREFERRED is not supported")
683        if WFC_MODE_CELLULAR_PREFERRED not in self.dut_wfc_modes:
684            raise signals.TestSkip(
685                "WFC_MODE_CELLULAR_PREFERRED is not supported")
686        if not phone_setup_volte(self.log, self.dut):
687            self.dut.log.error("Failed to setup VoLTE.")
688            return False
689        if not self.change_ims_setting(False, True, True, True,
690                                       WFC_MODE_CELLULAR_PREFERRED):
691            return False
692        return self.change_ims_setting(False, True, True, True,
693                                       WFC_MODE_WIFI_PREFERRED)
694
695    @test_tracker_info(uuid="1894e685-63cf-43aa-91ed-938782ca35a9")
696    @TelephonyBaseTest.tel_test_wrap
697    def test_lte_wfc_cellular_preferred_to_wifi_preferred(self):
698        """Test for WiFi Calling settings:
699        LTE + WiFi Connected + Cellular Preferred, change WFC to WiFi Preferred
700
701        Steps:
702        1. Setup DUT Idle, LTE network type, VoLTE disabled.
703        2. Make sure DUT WiFi connected, WFC is set to Cellular Preferred.
704            Verify DUT WFC not available.
705        3. Change WFC setting to WiFi Preferred.
706        4. Verify DUT report WFC available.
707
708        Expected Results:
709        2. DUT WiFi Calling feature bit return False, network rat is not iwlan.
710        4. DUT WiFI Calling feature bit return True, network rat is iwlan.
711        """
712        if WFC_MODE_WIFI_PREFERRED not in self.dut_wfc_modes:
713            raise signals.TestSkip("WFC_MODE_WIFI_PREFERRED is not supported")
714        if WFC_MODE_CELLULAR_PREFERRED not in self.dut_wfc_modes:
715            raise signals.TestSkip(
716                "WFC_MODE_CELLULAR_PREFERRED is not supported")
717        if not phone_setup_csfb(self.log, self.dut):
718            self.dut.log.error("Failed to setup LTE.")
719            return False
720        if not self.change_ims_setting(False, True, False, True,
721                                       WFC_MODE_CELLULAR_PREFERRED):
722            return False
723        return self.change_ims_setting(False, True, False, True,
724                                       WFC_MODE_WIFI_PREFERRED)
725
726    @test_tracker_info(uuid="e7fb6a6c-4672-44da-bca2-78b4d96dea9e")
727    @TelephonyBaseTest.tel_test_wrap
728    def test_3g_wfc_cellular_preferred_to_wifi_preferred(self):
729        """Test for WiFi Calling settings:
730        3G + WiFi Connected + Cellular Preferred, change WFC to WiFi Preferred
731
732        Steps:
733        1. Setup DUT Idle, 3G network type.
734        2. Make sure DUT WiFi connected, WFC is set to Cellular Preferred.
735            Verify DUT WFC not available.
736        3. Change WFC setting to WiFi Preferred.
737        4. Verify DUT report WFC available.
738
739        Expected Results:
740        2. DUT WiFi Calling feature bit return False, network rat is not iwlan.
741        4. DUT WiFI Calling feature bit return True, network rat is iwlan.
742        """
743        if WFC_MODE_WIFI_PREFERRED not in self.dut_wfc_modes:
744            raise signals.TestSkip("WFC_MODE_WIFI_PREFERRED is not supported")
745        if WFC_MODE_CELLULAR_PREFERRED not in self.dut_wfc_modes:
746            raise signals.TestSkip(
747                "WFC_MODE_CELLULAR_PREFERRED is not supported")
748        if not phone_setup_voice_3g(self.log, self.dut):
749            self.dut.log.error("Failed to setup 3G.")
750            return False
751        if not self.change_ims_setting(False, True, False, True,
752                                       WFC_MODE_CELLULAR_PREFERRED):
753            return False
754        return self.change_ims_setting(False, True, False, True,
755                                       WFC_MODE_WIFI_PREFERRED)
756
757    @test_tracker_info(uuid="46262b2d-5de9-4984-87e8-42f44469289e")
758    @TelephonyBaseTest.tel_test_wrap
759    def test_apm_wfc_cellular_preferred_to_wifi_preferred(self):
760        """Test for WiFi Calling settings:
761        APM + WiFi Connected + Cellular Preferred, change WFC to WiFi Preferred
762
763        Steps:
764        1. Setup DUT Idle, airplane mode.
765        2. Make sure DUT WiFi connected, WFC is set to Cellular Preferred.
766            Verify DUT WFC not available.
767        3. Change WFC setting to WiFi Preferred.
768        4. Verify DUT report WFC available.
769
770        Expected Results:
771        2. DUT WiFi Calling feature bit return True, network rat is iwlan.
772        4. DUT WiFI Calling feature bit return True, network rat is iwlan.
773        """
774        if WFC_MODE_WIFI_PREFERRED not in self.dut_wfc_modes:
775            raise signals.TestSkip("WFC_MODE_WIFI_PREFERRED is not supported")
776        if WFC_MODE_CELLULAR_PREFERRED not in self.dut_wfc_modes:
777            raise signals.TestSkip(
778                "WFC_MODE_CELLULAR_PREFERRED is not supported")
779        if not self.change_ims_setting(True, True, True, True,
780                                       WFC_MODE_CELLULAR_PREFERRED):
781            return False
782        return self.change_ims_setting(True, True, True, True,
783                                       WFC_MODE_WIFI_PREFERRED)
784
785    @test_tracker_info(uuid="5b514f51-fed9-475e-99d3-17d2165e11a1")
786    @TelephonyBaseTest.tel_test_wrap
787    def test_apm_wfc_wifi_preferred_turn_off_apm(self):
788        """Test for WiFi Calling settings:
789        APM + WiFi Connected + WiFi Preferred + turn off APM
790
791        Steps:
792        1. Setup DUT Idle in Airplane mode.
793        2. Make sure DUT WiFi connected, set WFC mode to WiFi preferred.
794        3. verify DUT WFC available, report iwlan rat.
795        4. Turn off airplane mode.
796        5. Verify DUT WFC still available, report iwlan rat
797
798        Expected Results:
799        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
800        5. DUT WiFI Calling feature bit return True, network rat is iwlan.
801        """
802        if not self.change_ims_setting(True, True, True, True,
803                                       WFC_MODE_WIFI_PREFERRED):
804            return False
805        return self.change_ims_setting(False, True, True, True, None)
806
807    @test_tracker_info(uuid="f328cff2-9dec-44b3-ba74-a662b76fcf2a")
808    @TelephonyBaseTest.tel_test_wrap
809    def test_apm_wfc_cellular_preferred_turn_off_apm(self):
810        """Test for WiFi Calling settings:
811        APM + WiFi Connected + Cellular Preferred + turn off APM
812
813        Steps:
814        1. Setup DUT Idle in Airplane mode.
815        2. Make sure DUT WiFi connected, set WFC mode to Cellular preferred.
816        3. verify DUT WFC available, report iwlan rat.
817        4. Turn off airplane mode.
818        5. Verify DUT WFC not available, not report iwlan rat
819
820        Expected Results:
821        3. DUT WiFi Calling feature bit return True, network rat is iwlan.
822        5. DUT WiFI Calling feature bit return False, network rat is not iwlan.
823        """
824        if not self.change_ims_setting(True, True, True, True,
825                                       WFC_MODE_CELLULAR_PREFERRED):
826            return False
827        return self.change_ims_setting(False, True, True, True, None)
828
829    @test_tracker_info(uuid="7e30d219-42ee-4309-a95c-2b45b8831d26")
830    @TelephonyBaseTest.tel_test_wrap
831    def test_wfc_setup_timing(self):
832        """ Measures the time delay in enabling WiFi calling
833
834        Steps:
835        1. Make sure DUT idle.
836        2. Turn on Airplane Mode, Set WiFi Calling to WiFi_Preferred.
837        3. Turn on WiFi, connect to WiFi AP and measure time delay.
838        4. Wait for WiFi connected, verify Internet and measure time delay.
839        5. Wait for rat to be reported as iwlan and measure time delay.
840        6. Wait for ims registered and measure time delay.
841        7. Wait for WiFi Calling feature bit to be True and measure time delay.
842
843        Expected results:
844        Time Delay in each step should be within pre-defined limit.
845
846        Returns:
847            Currently always return True.
848        """
849        # TODO: b/26338119 Set pass/fail criteria
850        time_values = {
851            'start': 0,
852            'wifi_enabled': 0,
853            'wifi_connected': 0,
854            'wifi_data': 0,
855            'iwlan_rat': 0,
856            'ims_registered': 0,
857            'wfc_enabled': 0,
858            'mo_call_success': 0
859        }
860
861        wifi_reset(self.log, self.dut)
862        toggle_airplane_mode_by_adb(self.log, self.dut, True)
863
864        set_wfc_mode(self.log, self.dut, WFC_MODE_WIFI_PREFERRED)
865
866        time_values['start'] = time.time()
867
868        self.dut.log.info("Start Time %ss", time_values['start'])
869
870        wifi_toggle_state(self.log, self.dut, True)
871        time_values['wifi_enabled'] = time.time()
872        self.dut.log.info("WiFi Enabled After %ss",
873                          time_values['wifi_enabled'] - time_values['start'])
874
875        network = {WIFI_SSID_KEY: self.wifi_network_ssid}
876        if self.wifi_network_pass:
877            network[WIFI_PWD_KEY] = self.wifi_network_pass
878        try:
879            self.dut.droid.wifiConnectByConfig(network)
880        except Exception:
881            self.dut.log.info("Connecting to wifi by RPC wifiConnect instead")
882            self.dut.droid.wifiConnect(network)
883        self.dut.droid.wakeUpNow()
884
885        if not wait_for_wifi_data_connection(self.log, self.dut, True,
886                                             MAX_WAIT_TIME_WIFI_CONNECTION):
887            self.dut.log.error("Failed WiFi connection, aborting!")
888            return False
889        time_values['wifi_connected'] = time.time()
890
891        self.dut.log.info(
892            "WiFi Connected After %ss",
893            time_values['wifi_connected'] - time_values['wifi_enabled'])
894
895        if not verify_internet_connection(self.log, self.dut, retries=3):
896            self.dut.log.error("Failed to get user-plane traffic, aborting!")
897            return False
898
899        time_values['wifi_data'] = time.time()
900        self.dut.log.info(
901            "WifiData After %ss",
902            time_values['wifi_data'] - time_values['wifi_connected'])
903
904        if not wait_for_network_rat(
905                self.log,
906                self.dut,
907                RAT_FAMILY_WLAN,
908                voice_or_data=NETWORK_SERVICE_DATA):
909            self.dut.log.error("Failed to set-up iwlan, aborting!")
910            if is_droid_in_rat_family(self.log, self.dut, RAT_FAMILY_WLAN,
911                                      NETWORK_SERVICE_DATA):
912                self.dut.log.error(
913                    "Never received the event, but droid in iwlan")
914            else:
915                return False
916        time_values['iwlan_rat'] = time.time()
917        self.dut.log.info("iWLAN Reported After %ss",
918                          time_values['iwlan_rat'] - time_values['wifi_data'])
919
920        if not wait_for_ims_registered(self.log, self.dut,
921                                       MAX_WAIT_TIME_IMS_REGISTRATION):
922            self.dut.log.error("Never received IMS registered, aborting")
923            return False
924        time_values['ims_registered'] = time.time()
925        self.dut.log.info(
926            "Ims Registered After %ss",
927            time_values['ims_registered'] - time_values['iwlan_rat'])
928
929        if not wait_for_wfc_enabled(self.log, self.dut,
930                                    MAX_WAIT_TIME_WFC_ENABLED):
931            self.dut.log.error("Never received WFC feature, aborting")
932            return False
933
934        time_values['wfc_enabled'] = time.time()
935        self.dut.log.info(
936            "Wifi Calling Feature Enabled After %ss",
937            time_values['wfc_enabled'] - time_values['ims_registered'])
938
939        set_wfc_mode(self.log, self.dut, WFC_MODE_DISABLED)
940
941        wait_for_not_network_rat(
942            self.log,
943            self.dut,
944            RAT_FAMILY_WLAN,
945            voice_or_data=NETWORK_SERVICE_DATA)
946
947        self.dut.log.info("\n\n------------------summary-----------------")
948        self.dut.log.info("WiFi Enabled After %.2f seconds",
949                          time_values['wifi_enabled'] - time_values['start'])
950        self.dut.log.info(
951            "WiFi Connected After %.2f seconds",
952            time_values['wifi_connected'] - time_values['wifi_enabled'])
953        self.dut.log.info(
954            "WifiData After %.2f s",
955            time_values['wifi_data'] - time_values['wifi_connected'])
956        self.dut.log.info("iWLAN Reported After %.2f seconds",
957                          time_values['iwlan_rat'] - time_values['wifi_data'])
958        self.dut.log.info(
959            "Ims Registered After %.2f seconds",
960            time_values['ims_registered'] - time_values['iwlan_rat'])
961        self.dut.log.info(
962            "Wifi Calling Feature Enabled After %.2f seconds",
963            time_values['wfc_enabled'] - time_values['ims_registered'])
964        self.dut.log.info("\n\n")
965        return True
966
967    @test_tracker_info(uuid="135301ea-6d00-4233-98fd-cda706d61eb2")
968    @TelephonyBaseTest.tel_test_wrap
969    def test_ims_factory_reset(self):
970        """Test VOLTE and WFC reset to factory default.
971
972        Steps:
973        1. Setup VoLTE, WFC, APM is various mode.
974        2. Call IMS factory reset.
975        3. Verify VoLTE and WFC are back to factory default.
976        4. Verify VoLTE, WFC Voice call can be made successful if enabled.
977
978        """
979        result = True
980        wifi_enabled = True
981        for airplane_mode in (True, False):
982            for volte_enabled in (True, False):
983                for wfc_enabled in (True, False):
984                    if wfc_enabled:
985                        wfc_modes = self.dut_wfc_modes
986                    else:
987                        wfc_modes = [None]
988                    for wfc_mode in wfc_modes:
989                        if not self.change_ims_setting(
990                                airplane_mode, wifi_enabled, volte_enabled,
991                                wfc_enabled, wfc_mode):
992                            result = False
993                        self.dut.log.info("Call IMS factory reset")
994                        self.dut.droid.imsFactoryReset()
995                        if not self.verify_default_ims_setting():
996                            result = False
997        return result
998
999    @test_tracker_info(uuid="ce60740f-4d8e-4013-a7cf-65589e8a0893")
1000    @TelephonyBaseTest.tel_test_wrap
1001    def test_factory_reset_by_fastboot_wipe(self):
1002        """Verify the network setting after factory reset by wipe.
1003
1004        Steps:
1005        1. Config VoLTE, WFC, APM, data_roamingn, mobile_data,
1006           preferred_network_mode to non-factory default.
1007        2. Factory reset by fastboot wipe.
1008        3. Verify network configs back to factory default.
1009
1010        """
1011        self.dut.log.info("Set VoLTE off, WFC wifi preferred, APM on")
1012        toggle_volte(self.log, self.dut, False)
1013        revert_default_telephony_setting(self.dut)
1014        self.change_ims_setting(True, True, False, True,
1015                                WFC_MODE_WIFI_PREFERRED)
1016        self.dut.log.info("Wipe in fastboot")
1017        fastboot_wipe(self.dut)
1018        return verify_default_telephony_setting(
1019            self.dut) and (self.verify_default_ims_setting())
1020