• 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 Telephony Pre Check In Sanity
18"""
19
20import collections
21import random
22import time
23import os
24
25from acts import signals
26from acts.test_decorators import test_tracker_info
27from acts.test_utils.tel.tel_subscription_utils import \
28    get_subid_from_slot_index
29from acts.test_utils.bt.bt_test_utils import bluetooth_enabled_check
30from acts.test_utils.bt.bt_test_utils import disable_bluetooth
31from acts.test_utils.bt.bt_test_utils import pair_pri_to_sec
32from acts.test_utils.tel.tel_subscription_utils import set_subid_for_data
33from acts.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
34from acts.test_utils.tel.tel_defines import DIRECTION_MOBILE_ORIGINATED
35from acts.test_utils.tel.tel_defines import DIRECTION_MOBILE_TERMINATED
36from acts.test_utils.tel.tel_defines import DATA_STATE_CONNECTED
37from acts.test_utils.tel.tel_defines import GEN_2G
38from acts.test_utils.tel.tel_defines import GEN_3G
39from acts.test_utils.tel.tel_defines import GEN_4G
40from acts.test_utils.tel.tel_defines import NETWORK_SERVICE_DATA
41from acts.test_utils.tel.tel_defines import NETWORK_SERVICE_VOICE
42from acts.test_utils.tel.tel_defines import RAT_2G
43from acts.test_utils.tel.tel_defines import RAT_3G
44from acts.test_utils.tel.tel_defines import RAT_4G
45from acts.test_utils.tel.tel_defines import RAT_FAMILY_LTE
46from acts.test_utils.tel.tel_defines import SIM1_SLOT_INDEX
47from acts.test_utils.tel.tel_defines import SIM2_SLOT_INDEX
48from acts.test_utils.tel.tel_defines import MAX_WAIT_TIME_NW_SELECTION
49from acts.test_utils.tel.tel_defines import MAX_WAIT_TIME_TETHERING_ENTITLEMENT_CHECK
50from acts.test_utils.tel.tel_defines import MAX_WAIT_TIME_WIFI_CONNECTION
51from acts.test_utils.tel.tel_defines import TETHERING_MODE_WIFI
52from acts.test_utils.tel.tel_defines import WAIT_TIME_AFTER_REBOOT
53from acts.test_utils.tel.tel_defines import WAIT_TIME_ANDROID_STATE_SETTLING
54from acts.test_utils.tel.tel_defines import WAIT_TIME_BETWEEN_REG_AND_CALL
55from acts.test_utils.tel.tel_defines import \
56    WAIT_TIME_DATA_STATUS_CHANGE_DURING_WIFI_TETHERING
57from acts.test_utils.tel.tel_defines import WAIT_TIME_TETHERING_AFTER_REBOOT
58from acts.test_utils.tel.tel_data_utils import airplane_mode_test
59from acts.test_utils.tel.tel_data_utils import change_data_sim_and_verify_data
60from acts.test_utils.tel.tel_data_utils import data_connectivity_single_bearer
61from acts.test_utils.tel.tel_data_utils import tethering_check_internet_connection
62from acts.test_utils.tel.tel_data_utils import wifi_cell_switching
63from acts.test_utils.tel.tel_data_utils import wifi_tethering_cleanup
64from acts.test_utils.tel.tel_data_utils import wifi_tethering_setup_teardown
65from acts.test_utils.tel.tel_test_utils import active_file_download_test
66from acts.test_utils.tel.tel_test_utils import call_setup_teardown
67from acts.test_utils.tel.tel_test_utils import check_is_wifi_connected
68from acts.test_utils.tel.tel_test_utils import ensure_phones_default_state
69from acts.test_utils.tel.tel_test_utils import ensure_phones_idle
70from acts.test_utils.tel.tel_test_utils import ensure_network_generation
71from acts.test_utils.tel.tel_test_utils import \
72    ensure_network_generation_for_subscription
73from acts.test_utils.tel.tel_test_utils import ensure_wifi_connected
74from acts.test_utils.tel.tel_test_utils import get_mobile_data_usage
75from acts.test_utils.tel.tel_test_utils import get_slot_index_from_subid
76from acts.test_utils.tel.tel_test_utils import get_network_rat_for_subscription
77from acts.test_utils.tel.tel_test_utils import hangup_call
78from acts.test_utils.tel.tel_test_utils import multithread_func
79from acts.test_utils.tel.tel_test_utils import remove_mobile_data_usage_limit
80from acts.test_utils.tel.tel_test_utils import set_call_state_listen_level
81from acts.test_utils.tel.tel_test_utils import set_mobile_data_usage_limit
82from acts.test_utils.tel.tel_test_utils import setup_sim
83from acts.test_utils.tel.tel_test_utils import stop_wifi_tethering
84from acts.test_utils.tel.tel_test_utils import toggle_airplane_mode
85from acts.test_utils.tel.tel_test_utils import toggle_airplane_mode_by_adb
86from acts.test_utils.tel.tel_test_utils import toggle_volte
87from acts.test_utils.tel.tel_test_utils import verify_internet_connection
88from acts.test_utils.tel.tel_test_utils import verify_http_connection
89from acts.test_utils.tel.tel_test_utils import verify_incall_state
90from acts.test_utils.tel.tel_test_utils import wait_for_cell_data_connection
91from acts.test_utils.tel.tel_test_utils import wait_for_network_rat
92from acts.test_utils.tel.tel_test_utils import \
93    wait_for_voice_attach_for_subscription
94from acts.test_utils.tel.tel_test_utils import \
95    wait_for_data_attach_for_subscription
96from acts.test_utils.tel.tel_test_utils import wait_for_wifi_data_connection
97from acts.test_utils.tel.tel_test_utils import wifi_reset
98from acts.test_utils.tel.tel_test_utils import wait_for_state
99from acts.test_utils.tel.tel_test_utils import wifi_toggle_state
100from acts.test_utils.tel.tel_test_utils import WIFI_CONFIG_APBAND_2G
101from acts.test_utils.tel.tel_test_utils import WIFI_CONFIG_APBAND_5G
102from acts.test_utils.tel.tel_test_utils import WIFI_SSID_KEY
103from acts.test_utils.tel.tel_test_utils import bring_up_sl4a
104from acts.test_utils.tel.tel_test_utils import check_data_stall_detection
105from acts.test_utils.tel.tel_test_utils import check_network_validation_fail
106from acts.test_utils.tel.tel_test_utils import break_internet_except_sl4a_port
107from acts.test_utils.tel.tel_test_utils import resume_internet_with_sl4a_port
108from acts.test_utils.tel.tel_test_utils import get_device_epoch_time
109from acts.test_utils.tel.tel_test_utils import check_data_stall_recovery
110from acts.test_utils.tel.tel_test_utils import \
111    test_data_browsing_success_using_sl4a
112from acts.test_utils.tel.tel_test_utils import \
113    test_data_browsing_failure_using_sl4a
114from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_3g
115from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_csfb
116from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_volte
117from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_3g
118from acts.test_utils.tel.tel_voice_utils import phone_setup_csfb
119from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_general
120from acts.test_utils.tel.tel_voice_utils import phone_setup_volte
121from acts.utils import disable_doze
122from acts.utils import enable_doze
123from acts.utils import rand_ascii_str
124from acts.utils import adb_shell_ping
125
126
127class TelLiveDataTest(TelephonyBaseTest):
128    def __init__(self, controllers):
129        TelephonyBaseTest.__init__(self, controllers)
130
131        self.stress_test_number = self.get_stress_test_number()
132        self.provider = self.android_devices[0]
133        self.clients = self.android_devices[1:]
134
135    def setup_test(self):
136        TelephonyBaseTest.setup_test(self)
137        self.number_of_devices = 1
138
139    def teardown_class(self):
140        TelephonyBaseTest.teardown_class(self)
141
142    @test_tracker_info(uuid="1b0354f3-8668-4a28-90a5-3b3d2b2756d3")
143    @TelephonyBaseTest.tel_test_wrap
144    def test_airplane_mode(self):
145        """ Test airplane mode basic on Phone and Live SIM.
146
147        Ensure phone attach, data on, WiFi off and verify Internet.
148        Turn on airplane mode to make sure detach.
149        Turn off airplane mode to make sure attach.
150        Verify Internet connection.
151
152        Returns:
153            True if pass; False if fail.
154        """
155        return airplane_mode_test(self.log, self.android_devices[0])
156
157    @test_tracker_info(uuid="47430f01-583f-4efb-923a-285a51b75d50")
158    @TelephonyBaseTest.tel_test_wrap
159    def test_lte_wifi_switching(self):
160        """Test data connection network switching when phone camped on LTE.
161
162        Ensure phone is camped on LTE
163        Ensure WiFi can connect to live network,
164        Airplane mode is off, data connection is on, WiFi is on.
165        Turn off WiFi, verify data is on cell and browse to google.com is OK.
166        Turn on WiFi, verify data is on WiFi and browse to google.com is OK.
167        Turn off WiFi, verify data is on cell and browse to google.com is OK.
168
169        Returns:
170            True if pass.
171        """
172        return wifi_cell_switching(self.log, self.android_devices[0],
173                                   self.wifi_network_ssid,
174                                   self.wifi_network_pass, GEN_4G)
175
176    @test_tracker_info(uuid="98d9f8c9-0532-49b6-85a3-5246b8314755")
177    @TelephonyBaseTest.tel_test_wrap
178    def test_lte_wifi_switching_stress(self):
179        """LTE WiFi Switching Data Connection Check
180
181        Same steps as test_lte_wifi_switching with stress testing
182
183        Returns:
184            True if pass.
185        """
186        MINIMUM_SUCCESS_RATE = .95
187        success_count = 0
188        fail_count = 0
189        self.stress_test_number = 10
190
191        for i in range(1, self.stress_test_number + 1):
192            ensure_phones_default_state(
193                self.log, [self.android_devices[0]])
194
195            if wifi_cell_switching(self.log, self.android_devices[0],
196                                   self.wifi_network_ssid,
197                                   self.wifi_network_pass, GEN_4G):
198                success_count += 1
199                result_str = "Succeeded"
200            else:
201                fail_count += 1
202                result_str = "Failed"
203            self.log.info("Iteration {} {}. Current: {} / {} passed.".format(
204                i, result_str, success_count, self.stress_test_number))
205
206        self.log.info("Final Count - Success: {}, Failure: {} - {}%".format(
207            success_count, fail_count,
208            str(100 * success_count / (success_count + fail_count))))
209        if success_count / (
210                success_count + fail_count) >= MINIMUM_SUCCESS_RATE:
211            return True
212        else:
213            return False
214
215    @test_tracker_info(uuid="8a836cf1-600b-4cf3-abfe-2e3da5c11396")
216    @TelephonyBaseTest.tel_test_wrap
217    def test_wcdma_wifi_switching(self):
218        """Test data connection network switching when phone camped on WCDMA.
219
220        Ensure phone is camped on WCDMA
221        Ensure WiFi can connect to live network,
222        Airplane mode is off, data connection is on, WiFi is on.
223        Turn off WiFi, verify data is on cell and browse to google.com is OK.
224        Turn on WiFi, verify data is on WiFi and browse to google.com is OK.
225        Turn off WiFi, verify data is on cell and browse to google.com is OK.
226
227        Returns:
228            True if pass.
229        """
230        return wifi_cell_switching(self.log, self.android_devices[0],
231                                   self.wifi_network_ssid,
232                                   self.wifi_network_pass, GEN_3G)
233
234    @test_tracker_info(uuid="c016f2e8-0af6-42e4-a3cb-a2b7d8b564d0")
235    @TelephonyBaseTest.tel_test_wrap
236    def test_gsm_wifi_switching(self):
237        """Test data connection network switching when phone camped on GSM.
238
239        Ensure phone is camped on GSM
240        Ensure WiFi can connect to live network,,
241        Airplane mode is off, data connection is on, WiFi is on.
242        Turn off WiFi, verify data is on cell and browse to google.com is OK.
243        Turn on WiFi, verify data is on WiFi and browse to google.com is OK.
244        Turn off WiFi, verify data is on cell and browse to google.com is OK.
245
246        Returns:
247            True if pass.
248        """
249        return wifi_cell_switching(self.log, self.android_devices[0],
250                                   self.wifi_network_ssid,
251                                   self.wifi_network_pass, GEN_2G)
252
253    @test_tracker_info(uuid="78d6b258-82d4-47b4-8723-3b3a15412d2d")
254    @TelephonyBaseTest.tel_test_wrap
255    def test_lte_multi_bearer(self):
256        """Test LTE data connection before call and in call. (VoLTE call)
257
258
259        Turn off airplane mode, disable WiFi, enable Cellular Data.
260        Make sure phone in LTE, verify Internet.
261        Initiate a voice call. verify Internet.
262        Disable Cellular Data, verify Internet is inaccessible.
263        Enable Cellular Data, verify Internet.
264        Hangup Voice Call, verify Internet.
265
266        Returns:
267            True if success.
268            False if failed.
269        """
270        if not phone_setup_volte(self.log, self.android_devices[0]):
271            self.log.error("Failed to setup VoLTE")
272            return False
273        return self._test_data_connectivity_multi_bearer(GEN_4G)
274
275    @test_tracker_info(uuid="5c9cb076-0c26-4517-95dc-2ec4974e8ce3")
276    @TelephonyBaseTest.tel_test_wrap
277    def test_wcdma_multi_bearer(self):
278        """Test WCDMA data connection before call and in call.
279
280        Turn off airplane mode, disable WiFi, enable Cellular Data.
281        Make sure phone in WCDMA, verify Internet.
282        Initiate a voice call. verify Internet.
283        Disable Cellular Data, verify Internet is inaccessible.
284        Enable Cellular Data, verify Internet.
285        Hangup Voice Call, verify Internet.
286
287        Returns:
288            True if success.
289            False if failed.
290        """
291
292        return self._test_data_connectivity_multi_bearer(GEN_3G)
293
294    @test_tracker_info(uuid="314bbf1c-073f-4d48-9817-a6e14f96f3c0")
295    @TelephonyBaseTest.tel_test_wrap
296    def test_gsm_multi_bearer_mo(self):
297        """Test gsm data connection before call and in call.
298
299        Turn off airplane mode, disable WiFi, enable Cellular Data.
300        Make sure phone in GSM, verify Internet.
301        Initiate a MO voice call. Verify there is no Internet during call.
302        Hangup Voice Call, verify Internet.
303
304        Returns:
305            True if success.
306            False if failed.
307        """
308
309        return self._test_data_connectivity_multi_bearer(
310            GEN_2G, False, DIRECTION_MOBILE_ORIGINATED)
311
312    @test_tracker_info(uuid="549271ff-1034-4d02-8d92-b9d1b2bb912e")
313    @TelephonyBaseTest.tel_test_wrap
314    def test_gsm_multi_bearer_mt(self):
315        """Test gsm data connection before call and in call.
316
317        Turn off airplane mode, disable WiFi, enable Cellular Data.
318        Make sure phone in GSM, verify Internet.
319        Initiate a MT voice call. Verify there is no Internet during call.
320        Hangup Voice Call, verify Internet.
321
322        Returns:
323            True if success.
324            False if failed.
325        """
326
327        return self._test_data_connectivity_multi_bearer(
328            GEN_2G, False, DIRECTION_MOBILE_TERMINATED)
329
330    @test_tracker_info(uuid="111de471-559a-4bc3-9d3e-de18f098c162")
331    @TelephonyBaseTest.tel_test_wrap
332    def test_wcdma_multi_bearer_stress(self):
333        """Stress Test WCDMA data connection before call and in call.
334
335        This is a stress test for "test_wcdma_multi_bearer".
336        Default MINIMUM_SUCCESS_RATE is set to 95%.
337
338        Returns:
339            True stress pass rate is higher than MINIMUM_SUCCESS_RATE.
340            False otherwise.
341        """
342        MINIMUM_SUCCESS_RATE = .95
343        success_count = 0
344        fail_count = 0
345        self.number_of_devices = 2
346
347        for i in range(1, self.stress_test_number + 1):
348
349            ensure_phones_default_state(
350                self.log, [self.android_devices[0], self.android_devices[1]])
351
352            if self.test_wcdma_multi_bearer():
353                success_count += 1
354                result_str = "Succeeded"
355            else:
356                fail_count += 1
357                result_str = "Failed"
358            self.log.info("Iteration {} {}. Current: {} / {} passed.".format(
359                i, result_str, success_count, self.stress_test_number))
360
361        self.log.info("Final Count - Success: {}, Failure: {} - {}%".format(
362            success_count, fail_count,
363            str(100 * success_count / (success_count + fail_count))))
364        if success_count / (
365                success_count + fail_count) >= MINIMUM_SUCCESS_RATE:
366            return True
367        else:
368            return False
369
370    @test_tracker_info(uuid="c7f14ba7-7ac3-45d2-b391-5ed5c4b0e70b")
371    @TelephonyBaseTest.tel_test_wrap
372    def test_lte_multi_bearer_stress(self):
373        """Stress Test LTE data connection before call and in call. (VoLTE call)
374
375        This is a stress test for "test_lte_multi_bearer".
376        Default MINIMUM_SUCCESS_RATE is set to 95%.
377
378        Returns:
379            True stress pass rate is higher than MINIMUM_SUCCESS_RATE.
380            False otherwise.
381        """
382        ads = self.android_devices
383        MINIMUM_SUCCESS_RATE = .95
384        success_count = 0
385        fail_count = 0
386
387        for i in range(1, self.stress_test_number + 1):
388
389            ensure_phones_default_state(
390                self.log, [self.android_devices[0], self.android_devices[1]])
391
392            if self.test_lte_multi_bearer():
393                success_count += 1
394                result_str = "Succeeded"
395            else:
396                fail_count += 1
397                result_str = "Failed"
398            self.log.info("Iteration {} {}. Current: {} / {} passed.".format(
399                i, result_str, success_count, self.stress_test_number))
400
401        self.log.info("Final Count - Success: {}, Failure: {} - {}%".format(
402            success_count, fail_count,
403            str(100 * success_count / (success_count + fail_count))))
404        if success_count / (
405                success_count + fail_count) >= MINIMUM_SUCCESS_RATE:
406            return True
407        else:
408            return False
409
410    def _test_data_connectivity_multi_bearer(
411            self,
412            nw_gen,
413            simultaneous_voice_data=True,
414            call_direction=DIRECTION_MOBILE_ORIGINATED):
415        """Test data connection before call and in call.
416
417        Turn off airplane mode, disable WiFi, enable Cellular Data.
418        Make sure phone in <nw_gen>, verify Internet.
419        Initiate a voice call.
420        if simultaneous_voice_data is True, then:
421            Verify Internet.
422            Disable Cellular Data, verify Internet is inaccessible.
423            Enable Cellular Data, verify Internet.
424        if simultaneous_voice_data is False, then:
425            Verify Internet is not available during voice call.
426        Hangup Voice Call, verify Internet.
427
428        Returns:
429            True if success.
430            False if failed.
431        """
432
433        class _LocalException(Exception):
434            pass
435
436        self.number_of_devices = 2
437        ad_list = [self.android_devices[0], self.android_devices[1]]
438        ensure_phones_idle(self.log, ad_list)
439
440        if not ensure_network_generation_for_subscription(
441                self.log, self.android_devices[0], self.android_devices[0]
442                .droid.subscriptionGetDefaultDataSubId(), nw_gen,
443                MAX_WAIT_TIME_NW_SELECTION, NETWORK_SERVICE_DATA):
444            self.log.error("Device failed to reselect in {}s.".format(
445                MAX_WAIT_TIME_NW_SELECTION))
446            return False
447
448        if not wait_for_voice_attach_for_subscription(
449                self.log, self.android_devices[0], self.android_devices[0]
450                .droid.subscriptionGetDefaultVoiceSubId(),
451                MAX_WAIT_TIME_NW_SELECTION):
452            return False
453
454        self.log.info("Step1 WiFi is Off, Data is on Cell.")
455        toggle_airplane_mode(self.log, self.android_devices[0], False)
456        wifi_toggle_state(self.log, self.android_devices[0], False)
457        self.android_devices[0].droid.telephonyToggleDataConnection(True)
458        if (not wait_for_cell_data_connection(self.log,
459                                              self.android_devices[0], True)
460                or not verify_internet_connection(self.log,
461                                                  self.android_devices[0])):
462            self.log.error("Data not available on cell")
463            return False
464
465        self.log.info(
466            "b/69431819, sending data to increase NW threshold limit")
467        adb_shell_ping(
468            self.android_devices[0], count=30, timeout=60, loss_tolerance=100)
469
470        try:
471            self.log.info("Step2 Initiate call and accept.")
472            if call_direction == DIRECTION_MOBILE_ORIGINATED:
473                ad_caller = self.android_devices[0]
474                ad_callee = self.android_devices[1]
475            else:
476                ad_caller = self.android_devices[1]
477                ad_callee = self.android_devices[0]
478            if not call_setup_teardown(self.log, ad_caller, ad_callee, None,
479                                       None, None):
480                self.log.error(
481                    "Failed to Establish {} Voice Call".format(call_direction))
482                return False
483            if simultaneous_voice_data:
484                self.log.info("Step3 Verify internet.")
485                time.sleep(WAIT_TIME_ANDROID_STATE_SETTLING)
486                if not verify_internet_connection(
487                        self.log, self.android_devices[0], retries=3):
488                    raise _LocalException("Internet Inaccessible when Enabled")
489
490                self.log.info("Step4 Turn off data and verify not connected.")
491                self.android_devices[0].droid.telephonyToggleDataConnection(
492                    False)
493                if not wait_for_cell_data_connection(
494                        self.log, self.android_devices[0], False):
495                    raise _LocalException("Failed to Disable Cellular Data")
496
497                if verify_internet_connection(self.log,
498                                              self.android_devices[0]):
499                    raise _LocalException("Internet Accessible when Disabled")
500
501                self.log.info("Step5 Re-enable data.")
502                self.android_devices[0].droid.telephonyToggleDataConnection(
503                    True)
504                if not wait_for_cell_data_connection(
505                        self.log, self.android_devices[0], True):
506                    raise _LocalException("Failed to Re-Enable Cellular Data")
507                if not verify_internet_connection(
508                        self.log, self.android_devices[0], retries=3):
509                    raise _LocalException("Internet Inaccessible when Enabled")
510            else:
511                self.log.info("Step3 Verify no Internet and skip step 4-5.")
512                if verify_internet_connection(
513                        self.log, self.android_devices[0], retries=0):
514                    raise _LocalException("Internet Accessible.")
515
516            self.log.info("Step6 Verify phones still in call and Hang up.")
517            if not verify_incall_state(
518                    self.log,
519                [self.android_devices[0], self.android_devices[1]], True):
520                return False
521            if not hangup_call(self.log, self.android_devices[0]):
522                self.log.error("Failed to hang up call")
523                return False
524            if not verify_internet_connection(
525                    self.log, self.android_devices[0], retries=3):
526                raise _LocalException("Internet Inaccessible when Enabled")
527
528        except _LocalException as e:
529            self.log.error(str(e))
530            try:
531                hangup_call(self.log, self.android_devices[0])
532                self.android_devices[0].droid.telephonyToggleDataConnection(
533                    True)
534            except Exception:
535                pass
536            return False
537
538        return True
539
540    @test_tracker_info(uuid="dcb9bdc6-dbe2-47e1-9c2d-6f37c529d366")
541    @TelephonyBaseTest.tel_test_wrap
542    def test_2g(self):
543        """Test data connection in 2G.
544
545        Turn off airplane mode, disable WiFi, enable Cellular Data.
546        Ensure phone data generation is 2G.
547        Verify Internet.
548        Disable Cellular Data, verify Internet is inaccessible.
549        Enable Cellular Data, verify Internet.
550
551        Returns:
552            True if success.
553            False if failed.
554        """
555        wifi_reset(self.log, self.android_devices[0])
556        wifi_toggle_state(self.log, self.android_devices[0], False)
557        return data_connectivity_single_bearer(self.log,
558                                               self.android_devices[0], RAT_2G)
559
560    @test_tracker_info(uuid="84197a49-d73f-44ce-8b9e-9479e5c4dfdc")
561    @TelephonyBaseTest.tel_test_wrap
562    def test_2g_wifi_not_associated(self):
563        """Test data connection in 2G.
564
565        Turn off airplane mode, enable WiFi (but not connected), enable Cellular Data.
566        Ensure phone data generation is 2G.
567        Verify Internet.
568        Disable Cellular Data, verify Internet is inaccessible.
569        Enable Cellular Data, verify Internet.
570
571        Returns:
572            True if success.
573            False if failed.
574        """
575        wifi_reset(self.log, self.android_devices[0])
576        wifi_toggle_state(self.log, self.android_devices[0], False)
577        wifi_toggle_state(self.log, self.android_devices[0], True)
578        return data_connectivity_single_bearer(self.log,
579                                               self.android_devices[0], RAT_2G)
580
581    @test_tracker_info(uuid="97067ebb-130a-4fcb-8e6b-f4ec5874828f")
582    @TelephonyBaseTest.tel_test_wrap
583    def test_3g(self):
584        """Test data connection in 3G.
585
586        Turn off airplane mode, disable WiFi, enable Cellular Data.
587        Ensure phone data generation is 3G.
588        Verify Internet.
589        Disable Cellular Data, verify Internet is inaccessible.
590        Enable Cellular Data, verify Internet.
591
592        Returns:
593            True if success.
594            False if failed.
595        """
596        wifi_reset(self.log, self.android_devices[0])
597        wifi_toggle_state(self.log, self.android_devices[0], False)
598        return data_connectivity_single_bearer(self.log,
599                                               self.android_devices[0], RAT_3G)
600
601    @test_tracker_info(uuid="ffe2a392-95b8-4a4d-8a6f-bfa846c3462f")
602    @TelephonyBaseTest.tel_test_wrap
603    def test_3g_wifi_not_associated(self):
604        """Test data connection in 3G.
605
606        Turn off airplane mode, enable WiFi (but not connected), enable Cellular Data.
607        Ensure phone data generation is 3G.
608        Verify Internet.
609        Disable Cellular Data, verify Internet is inaccessible.
610        Enable Cellular Data, verify Internet.
611
612        Returns:
613            True if success.
614            False if failed.
615        """
616        wifi_reset(self.log, self.android_devices[0])
617        wifi_toggle_state(self.log, self.android_devices[0], False)
618        wifi_toggle_state(self.log, self.android_devices[0], True)
619        return data_connectivity_single_bearer(self.log,
620                                               self.android_devices[0], RAT_3G)
621
622    @test_tracker_info(uuid="9c2f459f-1aac-4c68-818b-8698e8124c8b")
623    @TelephonyBaseTest.tel_test_wrap
624    def test_4g(self):
625        """Test data connection in 4g.
626
627        Turn off airplane mode, disable WiFi, enable Cellular Data.
628        Ensure phone data generation is 4g.
629        Verify Internet.
630        Disable Cellular Data, verify Internet is inaccessible.
631        Enable Cellular Data, verify Internet.
632
633        Returns:
634            True if success.
635            False if failed.
636        """
637        wifi_reset(self.log, self.android_devices[0])
638        wifi_toggle_state(self.log, self.android_devices[0], False)
639        return data_connectivity_single_bearer(self.log,
640                                               self.android_devices[0], RAT_4G)
641
642    @test_tracker_info(uuid="015a39a1-15ac-4b76-962b-d7d82d52d425")
643    @TelephonyBaseTest.tel_test_wrap
644    def test_4g_wifi_not_associated(self):
645        """Test data connection in 4g.
646
647        Turn off airplane mode, enable WiFi (but not connected), enable Cellular Data.
648        Ensure phone data generation is 4g.
649        Verify Internet.
650        Disable Cellular Data, verify Internet is inaccessible.
651        Enable Cellular Data, verify Internet.
652
653        Returns:
654            True if success.
655            False if failed.
656        """
657        wifi_reset(self.log, self.android_devices[0])
658        wifi_toggle_state(self.log, self.android_devices[0], False)
659        wifi_toggle_state(self.log, self.android_devices[0], True)
660        return data_connectivity_single_bearer(self.log,
661                                               self.android_devices[0], RAT_4G)
662
663    @test_tracker_info(uuid="44f47b64-f8bc-4a17-9195-42dcca0806bb")
664    @TelephonyBaseTest.tel_test_wrap
665    def test_3g_stress(self):
666        """Stress Test data connection in 3G.
667
668        This is a stress test for "test_3g".
669        Default MINIMUM_SUCCESS_RATE is set to 95%.
670
671        Returns:
672            True stress pass rate is higher than MINIMUM_SUCCESS_RATE.
673            False otherwise.
674        """
675        MINIMUM_SUCCESS_RATE = .95
676        success_count = 0
677        fail_count = 0
678
679        for i in range(1, self.stress_test_number + 1):
680
681            ensure_phones_default_state(self.log, [self.android_devices[0]])
682            wifi_reset(self.log, self.android_devices[0])
683            wifi_toggle_state(self.log, self.android_devices[0], False)
684
685            if data_connectivity_single_bearer(
686                    self.log, self.android_devices[0], RAT_3G):
687                success_count += 1
688                result_str = "Succeeded"
689            else:
690                fail_count += 1
691                result_str = "Failed"
692            self.log.info("Iteration {} {}. Current: {} / {} passed.".format(
693                i, result_str, success_count, self.stress_test_number))
694
695        self.log.info("Final Count - Success: {}, Failure: {} - {}%".format(
696            success_count, fail_count,
697            str(100 * success_count / (success_count + fail_count))))
698        if success_count / (
699                success_count + fail_count) >= MINIMUM_SUCCESS_RATE:
700            return True
701        else:
702            return False
703
704    @test_tracker_info(uuid="c8876388-0441-4a51-81e6-ac2cb358a531")
705    @TelephonyBaseTest.tel_test_wrap
706    def test_4g_stress(self):
707        """Stress Test data connection in 4g.
708
709        This is a stress test for "test_4g".
710        Default MINIMUM_SUCCESS_RATE is set to 95%.
711
712        Returns:
713            True stress pass rate is higher than MINIMUM_SUCCESS_RATE.
714            False otherwise.
715        """
716        MINIMUM_SUCCESS_RATE = .95
717        success_count = 0
718        fail_count = 0
719        self.number_of_devices = 1
720
721        for i in range(1, self.stress_test_number + 1):
722
723            ensure_phones_default_state(self.log, [self.android_devices[0]])
724            wifi_reset(self.log, self.android_devices[0])
725            wifi_toggle_state(self.log, self.android_devices[0], False)
726
727            if data_connectivity_single_bearer(
728                    self.log, self.android_devices[0], RAT_4G):
729                success_count += 1
730                result_str = "Succeeded"
731            else:
732                fail_count += 1
733                result_str = "Failed"
734            self.log.info("Iteration {} {}. Current: {} / {} passed.".format(
735                i, result_str, success_count, self.stress_test_number))
736
737        self.log.info("Final Count - Success: {}, Failure: {} - {}%".format(
738            success_count, fail_count,
739            str(100 * success_count / (success_count + fail_count))))
740        if success_count / (
741                success_count + fail_count) >= MINIMUM_SUCCESS_RATE:
742            return True
743        else:
744            return False
745
746    def _test_setup_tethering(self, network_generation=None):
747        """Pre setup steps for WiFi tethering test.
748
749        Ensure all ads are idle.
750        Ensure tethering provider:
751            turn off APM, turn off WiFI, turn on Data.
752            have Internet connection, no active ongoing WiFi tethering.
753
754        Returns:
755            True if success.
756            False if failed.
757        """
758        self.number_of_devices = None
759        ensure_phones_idle(self.log, self.android_devices)
760        wifi_toggle_state(self.log, self.provider, False)
761        if network_generation:
762            if not ensure_network_generation(
763                    self.log, self.provider, network_generation,
764                    MAX_WAIT_TIME_NW_SELECTION, NETWORK_SERVICE_DATA):
765                self.provider.log.error("Provider failed to connect to %s.",
766                                        network_generation)
767                return False
768
769        self.provider.log.info(
770            "Set provider Airplane Off, Wifi Off, Bluetooth Off, Data On.")
771        toggle_airplane_mode(self.log, self.provider, False)
772        self.provider.droid.telephonyToggleDataConnection(True)
773        self.provider.log.info("Provider disable wifi")
774        wifi_toggle_state(self.log, self.provider, False)
775        # Turn off active SoftAP if any.
776        if self.provider.droid.wifiIsApEnabled():
777            self.provider.log.info("Disable provider wifi tethering")
778            stop_wifi_tethering(self.log, self.provider)
779        self.provider.log.info("Provider disable bluetooth")
780        disable_bluetooth(self.provider.droid)
781        time.sleep(10)
782
783        for ad in self.clients:
784            ad.log.info(
785                "Set client Airplane Off, Wifi Off, Bluetooth Off, Data Off.")
786            toggle_airplane_mode(self.log, ad, False)
787            ad.log.info("Client disable data")
788            ad.droid.telephonyToggleDataConnection(False)
789            ad.log.info("Client disable bluetooth")
790            disable_bluetooth(ad.droid)
791            ad.log.info("Client disable wifi")
792            wifi_toggle_state(self.log, ad, False)
793        if not wait_for_cell_data_connection(self.log, self.provider, True):
794            self.provider.log.error(
795                "Provider failed to enable data connection.")
796            return False
797
798        time.sleep(10)
799        self.log.info("Verify internet")
800        if not self._test_internet_connection(
801                client_status=False, provider_status=True):
802            self.log.error("Internet connection check failed before tethering")
803            return False
804
805        return True
806
807    def _enable_bluetooth_tethering_connection(self, provider, clients):
808        for ad in [self.provider] + self.clients:
809            if not bluetooth_enabled_check(ad):
810                ad.log.info("Bluetooth is not enabled")
811                return False
812            else:
813                ad.log.info("Bluetooth is enabled")
814
815        for client in self.clients:
816            if not (pair_pri_to_sec(self.provider, client)):
817                client.log.error("Client failed to pair with provider")
818                return False
819            else:
820                client.log.info("Client paired with provider")
821        self.provider.log.info("Provider enabling bluetooth tethering")
822        try:
823            provider.droid.bluetoothPanSetBluetoothTethering(True)
824        except Exception as e:
825            provider.log.error(
826                "Faile to enable provider Bluetooth tethering with %s", e)
827            return False
828
829        if wait_for_state(provider.droid.bluetoothPanIsTetheringOn, True):
830            provider.log.info("Provider Bluetooth tethering is enabled.")
831        else:
832            provider.log.error(
833                "Failed to enable provider Bluetooth tethering.")
834            provider.log.error("bluetoothPanIsTetheringOn = %s",
835                               provider.droid.bluetoothPanIsTetheringOn())
836            return False
837        time.sleep(5)
838        for client in clients:
839            client.droid.bluetoothConnectBonded(
840                provider.droid.bluetoothGetLocalAddress())
841        time.sleep(20)
842        return True
843
844    def _test_internet_connection(self,
845                                  client_status=True,
846                                  provider_status=True):
847        client_retry = 10 if client_status else 1
848        for client in self.clients:
849            if not verify_internet_connection(
850                    self.log,
851                    client,
852                    retries=client_retry,
853                    expected_state=client_status):
854                client.log.error("client internet connection state is not %s",
855                                 client_status)
856                return False
857            else:
858                client.log.info("client internet connection state is %s",
859                                client_status)
860        if not verify_internet_connection(
861                self.log, self.provider, retries=3,
862                expected_state=provider_status):
863            self.provider.log.error(
864                "provider internet connection is not %s" % provider_status)
865            return False
866        else:
867            self.provider.log.info(
868                "provider internet connection is %s" % provider_status)
869        return True
870
871    def _verify_bluetooth_tethering_connection(self,
872                                               change_rat=None,
873                                               toggle_data=False,
874                                               toggle_tethering=False,
875                                               voice_call=False,
876                                               toggle_bluetooth=True):
877        """Setups up a bluetooth tethering conenction between two android devices.
878
879        Returns:
880            True if PAN connection and verification is successful,
881            false if unsuccessful.
882        """
883        if not self._enable_bluetooth_tethering_connection(
884                self.provider, self.clients):
885            return False
886        if not self._test_internet_connection():
887            self.log.error("Internet connection check failed")
888            return False
889        if voice_call:
890            self.log.info("====== Voice call test =====")
891            for caller, callee in [(self.provider, self.clients[0]),
892                                   (self.clients[0], self.provider)]:
893                if not call_setup_teardown(
894                        self.log, caller, callee, ad_hangup=None):
895                    self.log.error("Setup Call Failed.")
896                    hangup_call(self.log, caller)
897                    return False
898                self.log.info("Verify data.")
899                if not verify_internet_connection(
900                        self.log, self.clients[0], retries=1):
901                    self.clients[0].log.warning(
902                        "client internet connection state is not on")
903                else:
904                    self.clients[0].log.info(
905                        "client internet connection state is on")
906                hangup_call(self.log, caller)
907                if not verify_internet_connection(
908                        self.log, self.clients[0], retries=1):
909                    self.clients[0].log.warning(
910                        "client internet connection state is not on")
911                    return False
912                else:
913                    self.clients[0].log.info(
914                        "client internet connection state is on")
915        if toggle_tethering:
916            self.log.info("====== Toggling provider bluetooth tethering =====")
917            self.provider.log.info("Disable bluetooth tethering")
918            self.provider.droid.bluetoothPanSetBluetoothTethering(False)
919            if not self._test_internet_connection(False, True):
920                self.log.error(
921                    "Internet connection check failed after disable tethering")
922                return False
923            self.provider.log.info("Enable bluetooth tethering")
924            if not self._enable_bluetooth_tethering_connection(
925                    self.provider, self.clients):
926                self.provider.log.error(
927                    "Fail to re-enable bluetooth tethering")
928                return False
929            if not self._test_internet_connection(True, True):
930                self.log.error(
931                    "Internet connection check failed after enable tethering")
932                return False
933        if toggle_bluetooth:
934            self.log.info("====== Toggling provider bluetooth =====")
935            self.provider.log.info("Disable provider bluetooth")
936            disable_bluetooth(self.provider.droid)
937            time.sleep(10)
938            if not self._test_internet_connection(False, True):
939                self.log.error(
940                    "Internet connection check failed after disable bluetooth")
941                return False
942            if not self._enable_bluetooth_tethering_connection(
943                    self.provider, self.clients):
944                self.provider.log.error(
945                    "Fail to re-enable bluetooth tethering")
946                return False
947            if not self._test_internet_connection(True, True):
948                self.log.error(
949                    "Internet connection check failed after enable bluetooth")
950                return False
951        if toggle_data:
952            self.log.info("===== Toggling provider data connection =====")
953            self.provider.log.info("Disable provider data connection")
954            self.provider.droid.telephonyToggleDataConnection(False)
955            time.sleep(10)
956            if not self._test_internet_connection(False, False):
957                return False
958            self.provider.log.info("Enable provider data connection")
959            self.provider.droid.telephonyToggleDataConnection(True)
960            if not wait_for_cell_data_connection(self.log, self.provider,
961                                                 True):
962                self.provider.log.error(
963                    "Provider failed to enable data connection.")
964                return False
965            if not self._test_internet_connection(True, True):
966                self.log.error(
967                    "Internet connection check failed after enable data")
968                return False
969        if change_rat:
970            self.log.info("===== Change provider RAT to %s =====", change_rat)
971            if not ensure_network_generation(
972                    self.log,
973                    self.provider,
974                    change_rat,
975                    voice_or_data=NETWORK_SERVICE_DATA,
976                    toggle_apm_after_setting=False):
977                self.provider.log.error("Provider failed to reselect to %s.",
978                                        change_rat)
979                return False
980            if not self._test_internet_connection(True, True):
981                self.log.error(
982                    "Internet connection check failed after RAT change to %s",
983                    change_rat)
984                return False
985        return True
986
987    @test_tracker_info(uuid="2d945656-22f7-4610-9a84-40ce04d603a4")
988    @TelephonyBaseTest.tel_test_wrap
989    def test_tethering_4g_to_bluetooth(self):
990        """Bluetooth Tethering test: LTE to Bluetooth Tethering
991
992        1. DUT in LTE mode, idle.
993        2. DUT start Bluetooth Tethering
994        3. PhoneB disable data, connect to DUT's softAP
995        4. Verify Internet access on DUT and PhoneB
996        5. Toggle provider bluetooth connection
997        6. Verify Internet access on DUT and PhoneB
998
999        Returns:
1000            True if success.
1001            False if failed.
1002        """
1003        if not self._test_setup_tethering(RAT_4G):
1004            self.log.error("Verify 4G Internet access failed.")
1005            return False
1006
1007        return self._verify_bluetooth_tethering_connection()
1008
1009    @test_tracker_info(uuid="8d2ae56b-c2c1-4c32-9b8e-5044007b5b90")
1010    @TelephonyBaseTest.tel_test_wrap
1011    def test_tethering_4g_to_bluetooth_with_voice_call(self):
1012        """Bluetooth Tethering test: LTE to Bluetooth Tethering
1013
1014        1. DUT in LTE mode, idle.
1015        2. DUT start Bluetooth Tethering
1016        3. PhoneB disable data, connect to DUT's softAP
1017        4. Verify Internet access on DUT and PhoneB
1018        5. Verify provider and client are able to make or receive phone call
1019        6. Verify Internet access on DUT and PhoneB
1020
1021        Returns:
1022            True if success.
1023            False if failed.
1024        """
1025        if not self._test_setup_tethering(RAT_4G):
1026            self.log.error("Verify 4G Internet access failed.")
1027            return False
1028
1029        return self._verify_bluetooth_tethering_connection(
1030            toggle_tethering=False, toggle_bluetooth=False, voice_call=True)
1031
1032    @test_tracker_info(uuid="b4617727-fa83-4451-89d7-7e574c0a0938")
1033    @TelephonyBaseTest.tel_test_wrap
1034    def test_tethering_4g_to_bluetooth_toggle_data(self):
1035        """Bluetooth Tethering test: LTE to Bluetooth Tethering
1036
1037        1. DUT in LTE mode, idle.
1038        2. DUT start Bluetooth Tethering
1039        3. PhoneB disable data, connect to DUT's softAP
1040        4. Verify Internet access on DUT and PhoneB
1041        5. Toggle provider data connection
1042        6. Verify Internet access on DUT and PhoneB
1043
1044        Returns:
1045            True if success.
1046            False if failed.
1047        """
1048        if not self._test_setup_tethering(RAT_4G):
1049            self.log.error("Verify 4G Internet access failed.")
1050            return False
1051
1052        return self._verify_bluetooth_tethering_connection(
1053            toggle_tethering=False, toggle_bluetooth=False, toggle_data=True)
1054
1055    @test_tracker_info(uuid="6a0f6001-609d-41f2-ad09-c8ae19f73ac8")
1056    @TelephonyBaseTest.tel_test_wrap
1057    def test_tethering_4g_to_bluetooth_toggle_tethering(self):
1058        """Bluetooth Tethering test: LTE to Bluetooth Tethering
1059
1060        1. DUT in LTE mode, idle.
1061        2. DUT start Bluetooth Tethering
1062        3. PhoneB disable data, connect to DUT's softAP
1063        4. Verify Internet access on DUT and PhoneB
1064        5. Toggle provider bluetooth tethering
1065        6. Verify Internet access on DUT and PhoneB
1066
1067        Returns:
1068            True if success.
1069            False if failed.
1070        """
1071        if not self._test_setup_tethering(RAT_4G):
1072            self.log.error("Verify 4G Internet access failed.")
1073            return False
1074
1075        return self._verify_bluetooth_tethering_connection(
1076            toggle_tethering=True, toggle_bluetooth=False, toggle_data=False)
1077
1078    @test_tracker_info(uuid="b1abc1ac-8018-4956-a17e-bf2ceaf264ea")
1079    @TelephonyBaseTest.tel_test_wrap
1080    def test_tethering_3g_to_bluetooth(self):
1081        """Bluetooth Tethering test: 3G to Bluetoothing Tethering
1082
1083        1. DUT in 3G mode, idle.
1084        2. DUT start bluetooth Tethering
1085        3. PhoneB disable data, connect to DUT's softAP
1086        4. Verify Internet access on DUT and PhoneB
1087        5. Toggle provider bluetooth connection
1088        6. Verify Internet access on DUT and PhoneB
1089
1090        Returns:
1091            True if success.
1092            False if failed.
1093        """
1094        if not self._test_setup_tethering(RAT_3G):
1095            self.log.error("Verify 3G Internet access failed.")
1096            return False
1097
1098        return self._verify_bluetooth_tethering_connection()
1099
1100    @test_tracker_info(uuid="69793745-0c49-4cef-9879-d372e3a3f4c7")
1101    @TelephonyBaseTest.tel_test_wrap
1102    def test_tethering_3g_to_bluetooth_with_voice_call(self):
1103        """Bluetooth Tethering test: 3G to Bluetooth Tethering
1104
1105        1. DUT in 3G mode, idle.
1106        2. DUT start Bluetooth Tethering
1107        3. PhoneB disable data, connect to DUT's softAP
1108        4. Verify Internet access on DUT and PhoneB
1109        5. Verify provider and client are able to make or receive phone call
1110        6. Verify Internet access on DUT and PhoneB
1111
1112        Returns:
1113            True if success.
1114            False if failed.
1115        """
1116        if not self._test_setup_tethering(RAT_3G):
1117            self.log.error("Verify 3G Internet access failed.")
1118            return False
1119
1120        return self._verify_bluetooth_tethering_connection(
1121            toggle_tethering=False, toggle_bluetooth=False, voice_call=True)
1122
1123    @test_tracker_info(uuid="4275ee69-dfdf-4f47-82c5-4224fceee761")
1124    @TelephonyBaseTest.tel_test_wrap
1125    def test_tethering_3g_to_bluetooth_toggle_data(self):
1126        """Bluetooth Tethering test: 3G to Bluetoothing Tethering
1127
1128        1. DUT in 3G mode, idle.
1129        2. DUT start bluetooth Tethering
1130        3. PhoneB disable data, connect to DUT's softAP
1131        4. Verify Internet access on DUT and PhoneB
1132        5. Toggle provider data connection
1133        6. Verify Internet access on DUT and PhoneB
1134
1135        Returns:
1136            True if success.
1137            False if failed.
1138        """
1139        if not self._test_setup_tethering(RAT_3G):
1140            self.log.error("Verify 3G Internet access failed.")
1141            return False
1142
1143        return self._verify_bluetooth_tethering_connection(
1144            toggle_tethering=False, toggle_bluetooth=False, toggle_data=True)
1145
1146    @test_tracker_info(uuid="db0e0f27-1a4f-4301-832d-b66415e289f3")
1147    @TelephonyBaseTest.tel_test_wrap
1148    def test_tethering_2g_to_bluetooth(self):
1149        """Bluetooth Tethering test: 2G to Bluetooth Tethering
1150
1151        1. DUT in 2G mode, idle.
1152        2. DUT start bluetooth Tethering
1153        3. PhoneB disable data, connect to DUT's softAP
1154        4. Verify Internet access on DUT and PhoneB
1155        5. Toggle provider bluetooth connection
1156        6. Verify Internet access on DUT and PhoneB
1157
1158        Returns:
1159            True if success.
1160            False if failed.
1161        """
1162        for a in self.android_devices:
1163            a.adb.shell("setprop persist.bluetooth.btsnoopenable true")
1164            if not toggle_airplane_mode_by_adb(self.log, a, True):
1165                self.log.error("Failed to toggle airplane mode on")
1166                return False
1167            if not toggle_airplane_mode_by_adb(self.log, a, False):
1168                self.log.error("Failed to toggle airplane mode off")
1169                return False
1170
1171        if not self._test_setup_tethering(RAT_2G):
1172            self.log.error("Verify 3G Internet access failed.")
1173            return False
1174
1175        return self._verify_bluetooth_tethering_connection()
1176
1177    @test_tracker_info(uuid="584e9fa5-a38e-47cd-aa33-fcf8d72c423e")
1178    @TelephonyBaseTest.tel_test_wrap
1179    def test_tethering_2g_to_bluetooth_with_voice_call(self):
1180        """Bluetooth Tethering test: 2G to Bluetooth Tethering
1181
1182        1. DUT in 2G mode, idle.
1183        2. DUT start Bluetooth Tethering
1184        3. PhoneB disable data, connect to DUT's softAP
1185        4. Verify Internet access on DUT and PhoneB
1186        5. Verify provider and client are able to make or receive phone call
1187        6. Verify Internet access on DUT and PhoneB
1188
1189        Returns:
1190            True if success.
1191            False if failed.
1192        """
1193        if not self._test_setup_tethering(RAT_2G):
1194            self.log.error("Verify 2G Internet access failed.")
1195            return False
1196
1197        return self._verify_bluetooth_tethering_connection(
1198            toggle_tethering=False, toggle_bluetooth=False, voice_call=True)
1199
1200    @test_tracker_info(uuid="be3e74f9-3dc8-4b72-8a33-32bff0868a44")
1201    @TelephonyBaseTest.tel_test_wrap
1202    def test_tethering_2g_to_bluetooth_toggle_data(self):
1203        """Bluetooth Tethering test: 2G to Bluetooth Tethering
1204
1205        1. DUT in 2G mode, idle.
1206        2. DUT start Bluetooth Tethering
1207        3. PhoneB disable data, connect to DUT's softAP
1208        4. Verify Internet access on DUT and PhoneB
1209        5. Toggle provider data connection
1210        6. Verify Internet access on DUT and PhoneB
1211
1212        Returns:
1213            True if success.
1214            False if failed.
1215        """
1216        if not self._test_setup_tethering(RAT_2G):
1217            self.log.error("Verify 4G Internet access failed.")
1218            return False
1219
1220        return self._verify_bluetooth_tethering_connection(
1221            toggle_tethering=False, toggle_bluetooth=False, toggle_data=True)
1222
1223    @test_tracker_info(uuid="4a106549-0bfa-4c8f-8e66-edec93fabadf")
1224    @TelephonyBaseTest.tel_test_wrap
1225    def test_tethering_rat_from_4g_to_3g_bluetooth(self):
1226        """Bluetooth Tethering test: 2G to Bluetooth Tethering
1227
1228        1. DUT in 4G mode, idle.
1229        2. DUT start bluetooth Tethering
1230        3. PhoneB disable data, connect to DUT's softAP
1231        4. Verify Internet access on DUT and PhoneB
1232        5. Change provider RAT to 3G
1233        6. Verify Internet access on DUT and PhoneB
1234
1235        Returns:
1236            True if success.
1237            False if failed.
1238        """
1239        if not self._test_setup_tethering(RAT_4G):
1240            self.log.error("Verify 3G Internet access failed.")
1241            return False
1242
1243        return self._verify_bluetooth_tethering_connection(
1244            toggle_tethering=False,
1245            toggle_bluetooth=False,
1246            toggle_data=False,
1247            change_rat=RAT_3G)
1248
1249    @test_tracker_info(uuid="eaa5b61b-f054-437f-ae82-8d80f6487785")
1250    @TelephonyBaseTest.tel_test_wrap
1251    def test_tethering_rat_from_4g_to_2g_bluetooth(self):
1252        """Bluetooth Tethering test: 2G to Bluetooth Tethering
1253
1254        1. DUT in 4G mode, idle.
1255        2. DUT start bluetooth Tethering
1256        3. PhoneB disable data, connect to DUT's softAP
1257        4. Verify Internet access on DUT and PhoneB
1258        5. Change provider RAT to 2G
1259        6. Verify Internet access on DUT and PhoneB
1260
1261        Returns:
1262            True if success.
1263            False if failed.
1264        """
1265        if not self._test_setup_tethering(RAT_4G):
1266            self.log.error("Verify 3G Internet access failed.")
1267            return False
1268
1269        return self._verify_bluetooth_tethering_connection(
1270            toggle_tethering=False,
1271            toggle_bluetooth=False,
1272            toggle_data=False,
1273            change_rat=RAT_2G)
1274
1275    @test_tracker_info(uuid="912a11a3-14b3-4928-885f-cea69f14a571")
1276    @TelephonyBaseTest.tel_test_wrap
1277    def test_tethering_4g_to_2gwifi(self):
1278        """WiFi Tethering test: LTE to WiFI 2.4G Tethering
1279
1280        1. DUT in LTE mode, idle.
1281        2. DUT start 2.4G WiFi Tethering
1282        3. PhoneB disable data, connect to DUT's softAP
1283        4. Verify Internet access on DUT and PhoneB
1284
1285        Returns:
1286            True if success.
1287            False if failed.
1288        """
1289        if not self._test_setup_tethering(RAT_4G):
1290            self.log.error("Verify 4G Internet access failed.")
1291            return False
1292
1293        return wifi_tethering_setup_teardown(
1294            self.log,
1295            self.provider,
1296            self.clients,
1297            ap_band=WIFI_CONFIG_APBAND_2G,
1298            check_interval=10,
1299            check_iteration=10)
1300
1301    @test_tracker_info(uuid="743e3998-d39f-42b9-b11f-009dcee34f3f")
1302    @TelephonyBaseTest.tel_test_wrap
1303    def test_tethering_4g_to_5gwifi(self):
1304        """WiFi Tethering test: LTE to WiFI 5G Tethering
1305
1306        1. DUT in LTE mode, idle.
1307        2. DUT start 5G WiFi Tethering
1308        3. PhoneB disable data, connect to DUT's softAP
1309        4. Verify Internet access on DUT and PhoneB
1310
1311        Returns:
1312            True if success.
1313            False if failed.
1314        """
1315        if not self._test_setup_tethering(RAT_4G):
1316            self.log.error("Verify 4G Internet access failed.")
1317            return False
1318
1319        return wifi_tethering_setup_teardown(
1320            self.log,
1321            self.provider,
1322            self.clients,
1323            ap_band=WIFI_CONFIG_APBAND_5G,
1324            check_interval=10,
1325            check_iteration=10)
1326
1327    @test_tracker_info(uuid="c1a16464-3800-40d3-ba63-35db784e0383")
1328    @TelephonyBaseTest.tel_test_wrap
1329    def test_tethering_default_to_5gwifi(self):
1330        """WiFi Tethering test: Default to WiFI 5G Tethering
1331
1332        1. DUT in default mode, idle.
1333        2. DUT start 5G WiFi Tethering
1334        3. PhoneB disable data, connect to DUT's softAP
1335        4. Verify Internet access on DUT and PhoneB
1336        5. True: Stop
1337           False: Change DUT to next device and repeat until find the device
1338                  with tethering capability
1339
1340        Returns:
1341            True if success.
1342            False if no device has tethering capability.
1343        """
1344        num = len(self.android_devices)
1345        for idx, ad in enumerate(self.android_devices):
1346            self.provider = self.android_devices[idx]
1347            self.clients = self.android_devices[:
1348                                                idx] + self.android_devices[idx
1349                                                                            +
1350                                                                            1:]
1351            ensure_phones_default_state(self.log, self.android_devices)
1352            wifi_toggle_state(self.log, self.provider, False)
1353
1354            if not self._test_setup_tethering(None):
1355                self.provider.log.error("Data connection check failed.")
1356                continue
1357
1358            if not self.provider.droid.carrierConfigIsTetheringModeAllowed(
1359                    TETHERING_MODE_WIFI,
1360                    MAX_WAIT_TIME_TETHERING_ENTITLEMENT_CHECK):
1361                self.provider.log.info("Tethering is not entitled")
1362                continue
1363
1364            if wifi_tethering_setup_teardown(
1365                    self.log,
1366                    self.provider, [self.clients[0]],
1367                    ap_band=WIFI_CONFIG_APBAND_5G,
1368                    check_interval=10,
1369                    check_iteration=10):
1370                self.android_devices = [self.provider] + self.clients
1371                return True
1372            elif idx == num - 1:
1373                self.log.error("Tethering is not working on all devices")
1374                return False
1375        self.log.error(
1376            "Failed to enable tethering on any device in this testbed")
1377        raise signals.TestAbortClass(
1378            "Tethering is not available on all devices in this testbed")
1379
1380    @test_tracker_info(uuid="c9a570b0-838c-44ba-991c-f1ddeee21f3c")
1381    @TelephonyBaseTest.tel_test_wrap
1382    def test_tethering_default_to_2gwifi(self):
1383        """WiFi Tethering test: Default to WiFI 2G Tethering
1384
1385        1. DUT in default mode, idle.
1386        2. DUT start 2G WiFi Tethering
1387        3. PhoneB disable data, connect to DUT's softAP
1388        4. Verify Internet access on DUT and PhoneB
1389        5. True: Stop
1390           False: Change DUT to next device and repeat until find the device
1391                  with tethering capability
1392
1393        Returns:
1394            True if success.
1395            False if no device has tethering capability.
1396        """
1397        num = len(self.android_devices)
1398        for idx, ad in enumerate(self.android_devices):
1399            self.provider = self.android_devices[idx]
1400            self.clients = self.android_devices[:
1401                                                idx] + self.android_devices[idx
1402                                                                            +
1403                                                                            1:]
1404            ensure_phones_default_state(self.log, self.android_devices)
1405            wifi_toggle_state(self.log, self.provider, False)
1406
1407            if not self._test_setup_tethering(None):
1408                self.provider.log.error("Data connection check failed.")
1409                continue
1410
1411            if not self.provider.droid.carrierConfigIsTetheringModeAllowed(
1412                    TETHERING_MODE_WIFI,
1413                    MAX_WAIT_TIME_TETHERING_ENTITLEMENT_CHECK):
1414                self.provider.log.info("Tethering is not entitled")
1415                continue
1416
1417            if wifi_tethering_setup_teardown(
1418                    self.log,
1419                    self.provider, [self.clients[0]],
1420                    ap_band=WIFI_CONFIG_APBAND_2G,
1421                    check_interval=10,
1422                    check_iteration=10):
1423                self.android_devices = [self.provider] + self.clients
1424                return True
1425            elif idx == num - 1:
1426                self.log.error("Tethering is not working on all devices")
1427                return False
1428        self.log.error(
1429            "Failed to enable tethering on any device in this testbed")
1430        raise signals.TestAbortClass(
1431            "Tethering is not available on all devices in this testbed")
1432
1433    @test_tracker_info(uuid="59be8d68-f05b-4448-8584-de971174fd81")
1434    @TelephonyBaseTest.tel_test_wrap
1435    def test_tethering_3g_to_2gwifi(self):
1436        """WiFi Tethering test: 3G to WiFI 2.4G Tethering
1437
1438        1. DUT in 3G mode, idle.
1439        2. DUT start 2.4G WiFi Tethering
1440        3. PhoneB disable data, connect to DUT's softAP
1441        4. Verify Internet access on DUT and PhoneB
1442
1443        Returns:
1444            True if success.
1445            False if failed.
1446        """
1447        if not self._test_setup_tethering(RAT_3G):
1448            self.log.error("Verify 3G Internet access failed.")
1449            return False
1450
1451        return wifi_tethering_setup_teardown(
1452            self.log,
1453            self.provider,
1454            self.clients,
1455            ap_band=WIFI_CONFIG_APBAND_2G,
1456            check_interval=10,
1457            check_iteration=10)
1458
1459    @test_tracker_info(uuid="1be6b741-92e8-4ee1-9f59-e7f9f369b065")
1460    @TelephonyBaseTest.tel_test_wrap
1461    def test_tethering_3g_to_5gwifi(self):
1462        """WiFi Tethering test: 3G to WiFI 5G Tethering
1463
1464        1. DUT in 3G mode, idle.
1465        2. DUT start 5G WiFi Tethering
1466        3. PhoneB disable data, connect to DUT's softAP
1467        4. Verify Internet access on DUT and PhoneB
1468
1469        Returns:
1470            True if success.
1471            False if failed.
1472        """
1473        if not self._test_setup_tethering(RAT_3G):
1474            self.log.error("Verify 3G Internet access failed.")
1475            return False
1476
1477        return wifi_tethering_setup_teardown(
1478            self.log,
1479            self.provider,
1480            self.clients,
1481            ap_band=WIFI_CONFIG_APBAND_5G,
1482            check_interval=10,
1483            check_iteration=10)
1484
1485    @test_tracker_info(uuid="89fe6321-4c0d-40c0-89b2-54008ecca68f")
1486    @TelephonyBaseTest.tel_test_wrap
1487    def test_tethering_2g_to_2gwifi(self):
1488        """WiFi Tethering test: 2G to WiFI 2.4G Tethering
1489
1490        1. DUT in 2G mode, idle.
1491        2. DUT start 2.4G WiFi Tethering
1492        3. PhoneB disable data, connect to DUT's softAP
1493        4. Verify Internet access on DUT and PhoneB
1494
1495        Returns:
1496            True if success.
1497            False if failed.
1498        """
1499        if not self._test_setup_tethering(RAT_2G):
1500            self.log.error("Verify 2G Internet access failed.")
1501            return False
1502
1503        return wifi_tethering_setup_teardown(
1504            self.log,
1505            self.provider, [self.clients[0]],
1506            ap_band=WIFI_CONFIG_APBAND_2G,
1507            check_interval=10,
1508            check_iteration=10)
1509
1510    @test_tracker_info(uuid="b8258d51-9581-4d52-80b6-501941ec1191")
1511    @TelephonyBaseTest.tel_test_wrap
1512    def test_tethering_2g_to_5gwifi(self):
1513        """WiFi Tethering test: 2G to WiFI 5G Tethering
1514
1515        1. DUT in 2G mode, idle.
1516        2. DUT start 5G WiFi Tethering
1517        3. PhoneB disable data, connect to DUT's softAP
1518        4. Verify Internet access on DUT and PhoneB
1519
1520        Returns:
1521            True if success.
1522            False if failed.
1523        """
1524        if not self._test_setup_tethering(RAT_2G):
1525            self.log.error("Verify 2G Internet access failed.")
1526            return False
1527
1528        return wifi_tethering_setup_teardown(
1529            self.log,
1530            self.provider, [self.clients[0]],
1531            ap_band=WIFI_CONFIG_APBAND_5G,
1532            check_interval=10,
1533            check_iteration=10)
1534
1535    @test_tracker_info(uuid="8ed766a6-71c5-4b3b-8897-a4e796c75619")
1536    @TelephonyBaseTest.tel_test_wrap
1537    def test_disable_wifi_tethering_resume_connected_wifi(self):
1538        """WiFi Tethering test: WiFI connected to 2.4G network,
1539        start (LTE) 2.4G WiFi tethering, then stop tethering
1540
1541        1. DUT in data connected, idle. WiFi connected to 2.4G Network
1542        2. DUT start 2.4G WiFi Tethering
1543        3. PhoneB disable data, connect to DUT's softAP
1544        4. Verify Internet access on DUT and PhoneB
1545        5. Disable WiFi Tethering on DUT.
1546        6. Verify DUT automatically connect to previous WiFI network
1547
1548        Returns:
1549            True if success.
1550            False if failed.
1551        """
1552        if not self._test_setup_tethering():
1553            self.log.error("Verify provider Internet access failed.")
1554            return False
1555        self.log.info("Connect WiFi.")
1556        if not ensure_wifi_connected(self.log, self.provider,
1557                                     self.wifi_network_ssid,
1558                                     self.wifi_network_pass):
1559            self.log.error("WiFi connect fail.")
1560            return False
1561        self.log.info("Start WiFi Tethering.")
1562        if not wifi_tethering_setup_teardown(
1563                self.log,
1564                self.provider, [self.clients[0]],
1565                check_interval=10,
1566                check_iteration=2):
1567            self.log.error("WiFi Tethering failed.")
1568            return False
1569
1570        if (not wait_for_wifi_data_connection(self.log, self.provider, True)
1571                or not verify_internet_connection(self.log, self.provider)):
1572            self.log.error("Provider data did not return to Wifi")
1573            return False
1574        return True
1575
1576    @test_tracker_info(uuid="b879ceb2-1b80-4762-93f9-afef4d688c28")
1577    @TelephonyBaseTest.tel_test_wrap
1578    def test_toggle_data_during_active_wifi_tethering(self):
1579        """WiFi Tethering test: Toggle Data during active WiFi Tethering
1580
1581        1. DUT data connection is on and idle.
1582        2. DUT start 2.4G WiFi Tethering
1583        3. PhoneB disable data, connect to DUT's softAP
1584        4. Verify Internet access on DUT and PhoneB
1585        5. Disable Data on DUT, verify PhoneB still connected to WiFi, but no Internet access.
1586        6. Enable Data on DUT, verify PhoneB still connected to WiFi and have Internet access.
1587
1588        Returns:
1589            True if success.
1590            False if failed.
1591        """
1592        if not self._test_setup_tethering():
1593            self.log.error("Provider Internet access check failed.")
1594            return False
1595        try:
1596            ssid = rand_ascii_str(10)
1597            if not wifi_tethering_setup_teardown(
1598                    self.log,
1599                    self.provider, [self.clients[0]],
1600                    ap_band=WIFI_CONFIG_APBAND_2G,
1601                    check_interval=10,
1602                    check_iteration=2,
1603                    do_cleanup=False,
1604                    ssid=ssid):
1605                self.log.error("WiFi Tethering failed.")
1606                return False
1607
1608            if not self.provider.droid.wifiIsApEnabled():
1609                self.provider.log.error("Provider WiFi tethering stopped.")
1610                return False
1611
1612            self.provider.log.info(
1613                "Disable Data on Provider, verify no data on Client.")
1614            self.provider.droid.telephonyToggleDataConnection(False)
1615            time.sleep(WAIT_TIME_DATA_STATUS_CHANGE_DURING_WIFI_TETHERING)
1616            if verify_internet_connection(self.log, self.provider):
1617                self.provider.log.error("Disable data on provider failed.")
1618                return False
1619            if not self.provider.droid.wifiIsApEnabled():
1620                self.provider.log.error("Provider WiFi tethering stopped.")
1621                return False
1622            if not check_is_wifi_connected(self.log, self.clients[0], ssid):
1623                self.clients[0].log.error("Client WiFi is not connected")
1624                return False
1625
1626            self.log.info(
1627                "Enable Data on Provider, verify data available on Client.")
1628            self.provider.droid.telephonyToggleDataConnection(True)
1629            if not wait_for_cell_data_connection(self.log, self.provider,
1630                                                 True):
1631                self.provider.log.error(
1632                    "Provider failed to enable data connection.")
1633                return False
1634            if not verify_internet_connection(self.log, self.provider):
1635                self.provider.log.error(
1636                    "Provider internet connection check failed.")
1637                return False
1638            if not self.provider.droid.wifiIsApEnabled():
1639                self.provider.log.error("Provider WiFi tethering stopped.")
1640                return False
1641
1642            if not check_is_wifi_connected(
1643                    self.log, self.clients[0],
1644                    ssid) or (not verify_internet_connection(
1645                        self.log, self.clients[0])):
1646                self.clients[0].log.error(
1647                    "Client wifi connection check failed!")
1648                return False
1649        finally:
1650            if not wifi_tethering_cleanup(self.log, self.provider,
1651                                          self.clients):
1652                return False
1653        return True
1654
1655    # Invalid Live Test. Can't rely on the result of this test with live network.
1656    # Network may decide not to change the RAT when data conenction is active.
1657    @test_tracker_info(uuid="c92a961b-e85d-435c-8988-052928add591")
1658    @TelephonyBaseTest.tel_test_wrap
1659    def test_change_rat_during_active_wifi_tethering_lte_to_3g(self):
1660        """WiFi Tethering test: Change Cellular Data RAT generation from LTE to 3G,
1661            during active WiFi Tethering.
1662
1663        1. DUT in LTE mode, idle.
1664        2. DUT start 2.4G WiFi Tethering
1665        3. PhoneB disable data, connect to DUT's softAP
1666        4. Verily Internet access on DUT and PhoneB
1667        5. Change DUT Cellular Data RAT generation from LTE to 3G.
1668        6. Verify both DUT and PhoneB have Internet access.
1669
1670        Returns:
1671            True if success.
1672            False if failed.
1673        """
1674        if not self._test_setup_tethering(RAT_4G):
1675            self.log.error("Verify 4G Internet access failed.")
1676            return False
1677        try:
1678            if not wifi_tethering_setup_teardown(
1679                    self.log,
1680                    self.provider, [self.clients[0]],
1681                    ap_band=WIFI_CONFIG_APBAND_2G,
1682                    check_interval=10,
1683                    check_iteration=2,
1684                    do_cleanup=False):
1685                self.log.error("WiFi Tethering failed.")
1686                return False
1687
1688            if not self.provider.droid.wifiIsApEnabled():
1689                self.provider.log.error("Provider WiFi tethering stopped.")
1690                return False
1691
1692            self.log.info("Provider change RAT from LTE to 3G.")
1693            if not ensure_network_generation(
1694                    self.log,
1695                    self.provider,
1696                    RAT_3G,
1697                    voice_or_data=NETWORK_SERVICE_DATA,
1698                    toggle_apm_after_setting=False):
1699                self.provider.log.error("Provider failed to reselect to 3G.")
1700                return False
1701            time.sleep(WAIT_TIME_DATA_STATUS_CHANGE_DURING_WIFI_TETHERING)
1702            if not verify_internet_connection(self.log, self.provider):
1703                self.provider.log.error("Data not available on Provider.")
1704                return False
1705            if not self.provider.droid.wifiIsApEnabled():
1706                self.provider.log.error("Provider WiFi tethering stopped.")
1707                return False
1708            if not tethering_check_internet_connection(
1709                    self.log, self.provider, [self.clients[0]], 10, 5):
1710                return False
1711        finally:
1712            if not wifi_tethering_cleanup(self.log, self.provider,
1713                                          self.clients):
1714                return False
1715        return True
1716
1717    # Invalid Live Test. Can't rely on the result of this test with live network.
1718    # Network may decide not to change the RAT when data conenction is active.
1719    @test_tracker_info(uuid="eb5f0180-b70d-436f-8fcb-60c59307cc43")
1720    @TelephonyBaseTest.tel_test_wrap
1721    def test_change_rat_during_active_wifi_tethering_3g_to_lte(self):
1722        """WiFi Tethering test: Change Cellular Data RAT generation from 3G to LTE,
1723            during active WiFi Tethering.
1724
1725        1. DUT in 3G mode, idle.
1726        2. DUT start 2.4G WiFi Tethering
1727        3. PhoneB disable data, connect to DUT's softAP
1728        4. Verily Internet access on DUT and PhoneB
1729        5. Change DUT Cellular Data RAT generation from 3G to LTE.
1730        6. Verify both DUT and PhoneB have Internet access.
1731
1732        Returns:
1733            True if success.
1734            False if failed.
1735        """
1736        if not self._test_setup_tethering(RAT_3G):
1737            self.log.error("Verify 3G Internet access failed.")
1738            return False
1739        try:
1740            if not wifi_tethering_setup_teardown(
1741                    self.log,
1742                    self.provider, [self.clients[0]],
1743                    ap_band=WIFI_CONFIG_APBAND_2G,
1744                    check_interval=10,
1745                    check_iteration=2,
1746                    do_cleanup=False):
1747                self.log.error("WiFi Tethering failed.")
1748                return False
1749
1750            if not self.provider.droid.wifiIsApEnabled():
1751                self.log.error("Provider WiFi tethering stopped.")
1752                return False
1753
1754            self.log.info("Provider change RAT from 3G to 4G.")
1755            if not ensure_network_generation(
1756                    self.log,
1757                    self.provider,
1758                    RAT_4G,
1759                    voice_or_data=NETWORK_SERVICE_DATA,
1760                    toggle_apm_after_setting=False):
1761                self.log.error("Provider failed to reselect to 4G.")
1762                return False
1763            time.sleep(WAIT_TIME_DATA_STATUS_CHANGE_DURING_WIFI_TETHERING)
1764            if not verify_internet_connection(self.log, self.provider):
1765                self.provider.log.error("Data not available on Provider.")
1766                return False
1767            if not self.provider.droid.wifiIsApEnabled():
1768                self.provider.log.error("Provider WiFi tethering stopped.")
1769                return False
1770            if not tethering_check_internet_connection(
1771                    self.log, self.provider, [self.clients[0]], 10, 5):
1772                return False
1773        finally:
1774            if not wifi_tethering_cleanup(self.log, self.provider, [self.clients[0]]):
1775                return False
1776        return True
1777
1778    @test_tracker_info(uuid="12a6c910-fa96-4d9b-99a5-8391fea33732")
1779    @TelephonyBaseTest.tel_test_wrap
1780    def test_toggle_apm_during_active_wifi_tethering(self):
1781        """WiFi Tethering test: Toggle APM during active WiFi Tethering
1782
1783        1. DUT in LTE mode, idle.
1784        2. DUT start 2.4G WiFi Tethering
1785        3. PhoneB disable data, connect to DUT's softAP
1786        4. Verify Internet access on DUT and PhoneB
1787        5. DUT toggle APM on, verify WiFi tethering stopped, PhoneB lost WiFi connection.
1788        6. DUT toggle APM off, verify PhoneA have cellular data and Internet connection.
1789
1790        Returns:
1791            True if success.
1792            False if failed.
1793        """
1794        if not self._test_setup_tethering(RAT_4G):
1795            self.log.error("Verify 4G Internet access failed.")
1796            return False
1797        try:
1798            ssid = rand_ascii_str(10)
1799            if not wifi_tethering_setup_teardown(
1800                    self.log,
1801                    self.provider, [self.clients[0]],
1802                    ap_band=WIFI_CONFIG_APBAND_2G,
1803                    check_interval=10,
1804                    check_iteration=2,
1805                    do_cleanup=False,
1806                    ssid=ssid):
1807                self.log.error("WiFi Tethering failed.")
1808                return False
1809
1810            if not self.provider.droid.wifiIsApEnabled():
1811                self.log.error("Provider WiFi tethering stopped.")
1812                return False
1813
1814            self.log.info(
1815                "Provider turn on APM, verify no wifi/data on Client.")
1816            if not toggle_airplane_mode(self.log, self.provider, True):
1817                self.log.error("Provider turn on APM failed.")
1818                return False
1819            time.sleep(WAIT_TIME_DATA_STATUS_CHANGE_DURING_WIFI_TETHERING)
1820            if self.provider.droid.wifiIsApEnabled():
1821                self.provider.log.error("Provider WiFi tethering not stopped.")
1822                return False
1823            if verify_internet_connection(self.log, self.clients[0]):
1824                self.clients[0].log.error(
1825                    "Client should not have Internet connection.")
1826                return False
1827            wifi_info = self.clients[0].droid.wifiGetConnectionInfo()
1828            self.clients[0].log.info("WiFi Info: {}".format(wifi_info))
1829            if wifi_info[WIFI_SSID_KEY] == ssid:
1830                self.clients[0].log.error(
1831                    "WiFi error. WiFi should not be connected.".format(
1832                        wifi_info))
1833                return False
1834
1835            self.log.info("Provider turn off APM.")
1836            if not toggle_airplane_mode(self.log, self.provider, False):
1837                self.provider.log.error("Provider turn on APM failed.")
1838                return False
1839            time.sleep(WAIT_TIME_DATA_STATUS_CHANGE_DURING_WIFI_TETHERING)
1840            if self.provider.droid.wifiIsApEnabled():
1841                self.provider.log.error(
1842                    "Provider WiFi tethering should not on.")
1843                return False
1844            if not verify_internet_connection(self.log, self.provider):
1845                self.provider.log.error(
1846                    "Provider should have Internet connection.")
1847                return False
1848        finally:
1849            self.clients[0].droid.telephonyToggleDataConnection(True)
1850            wifi_reset(self.log, self.clients[0])
1851        return True
1852
1853    @test_tracker_info(uuid="037e80fc-6eab-4cd1-846a-b9780a1d502d")
1854    @TelephonyBaseTest.tel_test_wrap
1855    def test_tethering_entitlement_check(self):
1856        """Tethering Entitlement Check Test
1857
1858        Get tethering entitlement check result.
1859
1860        Returns:
1861            True if entitlement check returns True.
1862        """
1863        if (not wait_for_cell_data_connection(self.log, self.provider, True)
1864                or not verify_internet_connection(self.log, self.provider)):
1865            self.log.error("Failed cell data call for entitlement check.")
1866            return False
1867
1868        result = self.provider.droid.carrierConfigIsTetheringModeAllowed(
1869            TETHERING_MODE_WIFI, MAX_WAIT_TIME_TETHERING_ENTITLEMENT_CHECK)
1870        self.provider.log.info("Tethering entitlement check result: %s",
1871                               result)
1872        return result
1873
1874    @test_tracker_info(uuid="4972826e-39ea-42f7-aae0-06fe3aa9ecc6")
1875    @TelephonyBaseTest.tel_test_wrap
1876    def test_tethering_4g_to_2gwifi_stress(self):
1877        """Stress Test LTE to WiFI 2.4G Tethering
1878
1879        This is a stress test for "test_tethering_4g_to_2gwifi".
1880        Default MINIMUM_SUCCESS_RATE is set to 95%.
1881
1882        Returns:
1883            True stress pass rate is higher than MINIMUM_SUCCESS_RATE.
1884            False otherwise.
1885        """
1886        MINIMUM_SUCCESS_RATE = .95
1887        success_count = 0
1888        fail_count = 0
1889
1890        for i in range(1, self.stress_test_number + 1):
1891
1892            ensure_phones_default_state(self.log, self.android_devices)
1893
1894            if self.test_tethering_4g_to_2gwifi():
1895                success_count += 1
1896                result_str = "Succeeded"
1897            else:
1898                fail_count += 1
1899                result_str = "Failed"
1900            self.log.info("Iteration {} {}. Current: {} / {} passed.".format(
1901                i, result_str, success_count, self.stress_test_number))
1902
1903        self.log.info("Final Count - Success: {}, Failure: {} - {}%".format(
1904            success_count, fail_count,
1905            str(100 * success_count / (success_count + fail_count))))
1906        if success_count / (
1907                success_count + fail_count) >= MINIMUM_SUCCESS_RATE:
1908            return True
1909        else:
1910            return False
1911
1912    @test_tracker_info(uuid="54e85aed-09e3-42e2-bb33-bca1005d93ab")
1913    @TelephonyBaseTest.tel_test_wrap
1914    def test_tethering_wifi_ssid_quotes(self):
1915        """WiFi Tethering test: SSID name have quotes.
1916        1. Set SSID name have double quotes.
1917        2. Start LTE to WiFi (2.4G) tethering.
1918        3. Verify tethering.
1919
1920        Returns:
1921            True if success.
1922            False if failed.
1923        """
1924        if not self._test_setup_tethering():
1925            self.log.error("Verify Internet access failed.")
1926            return False
1927        ssid = "\"" + rand_ascii_str(10) + "\""
1928        self.log.info(
1929            "Starting WiFi Tethering test with ssid: {}".format(ssid))
1930
1931        return wifi_tethering_setup_teardown(
1932            self.log,
1933            self.provider,
1934            self.clients,
1935            ap_band=WIFI_CONFIG_APBAND_2G,
1936            check_interval=10,
1937            check_iteration=10,
1938            ssid=ssid)
1939
1940    @test_tracker_info(uuid="320326da-bf32-444d-81f9-f781c55dbc99")
1941    @TelephonyBaseTest.tel_test_wrap
1942    def test_tethering_wifi_password_escaping_characters(self):
1943        """WiFi Tethering test: password have escaping characters.
1944        1. Set password have escaping characters.
1945            e.g.: '"DQ=/{Yqq;M=(^_3HzRvhOiL8S%`]w&l<Qp8qH)bs<4E9v_q=HLr^)}w$blA0Kg'
1946        2. Start LTE to WiFi (2.4G) tethering.
1947        3. Verify tethering.
1948
1949        Returns:
1950            True if success.
1951            False if failed.
1952        """
1953        if not self._test_setup_tethering():
1954            self.log.error("Verify Internet access failed.")
1955            return False
1956
1957        password = '"DQ=/{Yqq;M=(^_3HzRvhOiL8S%`]w&l<Qp8qH)bs<4E9v_q=HLr^)}w$blA0Kg'
1958        self.log.info(
1959            "Starting WiFi Tethering test with password: {}".format(password))
1960
1961        return wifi_tethering_setup_teardown(
1962            self.log,
1963            self.provider,
1964            self.clients,
1965            ap_band=WIFI_CONFIG_APBAND_2G,
1966            check_interval=10,
1967            check_iteration=10,
1968            password=password)
1969
1970    def _test_start_wifi_tethering_connect_teardown(self, ad_host, ad_client,
1971                                                    ssid, password):
1972        """Private test util for WiFi Tethering.
1973
1974        1. Host start WiFi tethering.
1975        2. Client connect to tethered WiFi.
1976        3. Host tear down WiFi tethering.
1977
1978        Args:
1979            ad_host: android device object for host
1980            ad_client: android device object for client
1981            ssid: WiFi tethering ssid
1982            password: WiFi tethering password
1983
1984        Returns:
1985            True if no error happen, otherwise False.
1986        """
1987        result = True
1988        self.number_of_devices = 2
1989        # Turn off active SoftAP if any.
1990        if ad_host.droid.wifiIsApEnabled():
1991            stop_wifi_tethering(self.log, ad_host)
1992
1993        time.sleep(WAIT_TIME_ANDROID_STATE_SETTLING)
1994        if not start_wifi_tethering(self.log, ad_host, ssid, password,
1995                                    WIFI_CONFIG_APBAND_2G):
1996            self.log.error("Start WiFi tethering failed.")
1997            result = False
1998        time.sleep(WAIT_TIME_ANDROID_STATE_SETTLING)
1999        if not ensure_wifi_connected(self.log, ad_client, ssid, password):
2000            self.log.error("Client connect to WiFi failed.")
2001            result = False
2002        if not wifi_reset(self.log, ad_client):
2003            self.log.error("Reset client WiFi failed. {}".format(
2004                ad_client.serial))
2005            result = False
2006        if not stop_wifi_tethering(self.log, ad_host):
2007            self.log.error("Stop WiFi tethering failed.")
2008            result = False
2009        return result
2010
2011    @test_tracker_info(uuid="617c7e71-f166-465f-bfd3-b5a3a40cc0d4")
2012    @TelephonyBaseTest.tel_test_wrap
2013    def test_tethering_wifi_ssid(self):
2014        """WiFi Tethering test: start WiFi tethering with all kinds of SSIDs.
2015
2016        For each listed SSID, start WiFi tethering on DUT, client connect WiFi,
2017        then tear down WiFi tethering.
2018
2019        Returns:
2020            True if WiFi tethering succeed on all SSIDs.
2021            False if failed.
2022        """
2023        if not self._test_setup_tethering(RAT_4G):
2024            self.log.error("Setup Failed.")
2025            return False
2026        ssid_list = [
2027            " !\"#$%&'()*+,-./0123456789:;<=>?",
2028            "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_",
2029            "`abcdefghijklmnopqrstuvwxyz{|}~", " a ", "!b!", "#c#", "$d$",
2030            "%e%", "&f&", "'g'", "(h(", ")i)", "*j*", "+k+", "-l-", ".m.",
2031            "/n/", "_", " !\"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}",
2032            "\u0644\u062c\u0648\u062c", "\u8c37\u6b4c", "\uad6c\uae00"
2033            "\u30b0\u30fc\u30eb",
2034            "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0443\u0439"
2035        ]
2036        fail_list = {}
2037
2038        for ssid in ssid_list:
2039            password = rand_ascii_str(8)
2040            self.log.info("SSID: <{}>, Password: <{}>".format(ssid, password))
2041            if not self._test_start_wifi_tethering_connect_teardown(
2042                    self.provider, self.clients[0], ssid, password):
2043                fail_list[ssid] = password
2044
2045        if (len(fail_list) > 0):
2046            self.log.error("Failed cases: {}".format(fail_list))
2047            return False
2048        else:
2049            return True
2050
2051    @test_tracker_info(uuid="9a5b5a34-b5cf-451d-94c4-8a64d456dfe5")
2052    @TelephonyBaseTest.tel_test_wrap
2053    def test_tethering_wifi_password(self):
2054        """WiFi Tethering test: start WiFi tethering with all kinds of passwords.
2055
2056        For each listed password, start WiFi tethering on DUT, client connect WiFi,
2057        then tear down WiFi tethering.
2058
2059        Returns:
2060            True if WiFi tethering succeed on all passwords.
2061            False if failed.
2062        """
2063        if not self._test_setup_tethering(RAT_4G):
2064            self.log.error("Setup Failed.")
2065            return False
2066        password_list = [
2067            " !\"#$%&'()*+,-./0123456789:;<=>?",
2068            "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_",
2069            "`abcdefghijklmnopqrstuvwxyz{|}~",
2070            " !\"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}", "abcdefgh",
2071            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!",
2072            " a12345 ", "!b12345!", "#c12345#", "$d12345$", "%e12345%",
2073            "&f12345&", "'g12345'", "(h12345(", ")i12345)", "*j12345*",
2074            "+k12345+", "-l12345-", ".m12345.", "/n12345/"
2075        ]
2076        fail_list = {}
2077
2078        for password in password_list:
2079            ssid = rand_ascii_str(8)
2080            self.log.info("SSID: <{}>, Password: <{}>".format(ssid, password))
2081            if not self._test_start_wifi_tethering_connect_teardown(
2082                    self.provider, self.clients[0], ssid, password):
2083                fail_list[ssid] = password
2084
2085        if (len(fail_list) > 0):
2086            self.log.error("Failed cases: {}".format(fail_list))
2087            return False
2088        else:
2089            return True
2090
2091    def _test_tethering_wifi_and_voice_call(self, provider_data_rat,
2092                                            provider_setup_func,
2093                                            provider_in_call_check_func):
2094        self.number_of_devices = 2
2095        if not self._test_setup_tethering(provider_data_rat):
2096            self.log.error("Verify 4G Internet access failed.")
2097            return False
2098
2099        tasks = [(provider_setup_func, (self.log, self.provider)),
2100                 (phone_setup_voice_general, (self.log, self.clients[0]))]
2101        if not multithread_func(self.log, tasks):
2102            self.log.error("Phone Failed to Set Up VoLTE.")
2103            return False
2104
2105        try:
2106            self.log.info("1. Setup WiFi Tethering.")
2107            if not wifi_tethering_setup_teardown(
2108                    self.log,
2109                    self.provider, [self.clients[0]],
2110                    ap_band=WIFI_CONFIG_APBAND_2G,
2111                    check_interval=10,
2112                    check_iteration=2,
2113                    do_cleanup=False):
2114                self.log.error("WiFi Tethering failed.")
2115                return False
2116            self.log.info("2. Make outgoing call.")
2117            if not call_setup_teardown(
2118                    self.log,
2119                    self.provider,
2120                    self.clients[0],
2121                    ad_hangup=None,
2122                    verify_caller_func=provider_in_call_check_func):
2123                self.log.error("Setup Call Failed.")
2124                return False
2125            self.log.info("3. Verify data.")
2126            if not verify_internet_connection(self.log, self.provider):
2127                self.provider.log.error("Provider have no Internet access.")
2128            if not verify_internet_connection(self.log, self.clients[0]):
2129                self.clients[0].log.error("Client have no Internet access.")
2130            hangup_call(self.log, self.provider)
2131
2132            time.sleep(WAIT_TIME_BETWEEN_REG_AND_CALL)
2133
2134            self.log.info("4. Make incoming call.")
2135            if not call_setup_teardown(
2136                    self.log,
2137                    self.clients[0],
2138                    self.provider,
2139                    ad_hangup=None,
2140                    verify_callee_func=provider_in_call_check_func):
2141                self.log.error("Setup Call Failed.")
2142                return False
2143            self.log.info("5. Verify data.")
2144            if not verify_internet_connection(self.log, self.provider):
2145                self.provider.log.error("Provider have no Internet access.")
2146            if not verify_internet_connection(self.log, self.clients[0]):
2147                self.clients[0].log.error("Client have no Internet access.")
2148            hangup_call(self.log, self.provider)
2149
2150        finally:
2151            if not wifi_tethering_cleanup(self.log, self.provider,
2152                                          self.clients):
2153                return False
2154        return True
2155
2156    @test_tracker_info(uuid="216bdb8c-edbf-4ff8-8750-a0861ab44df6")
2157    @TelephonyBaseTest.tel_test_wrap
2158    def test_tethering_wifi_volte_call(self):
2159        """WiFi Tethering test: VoLTE call during WiFi tethering
2160        1. Start LTE to WiFi (2.4G) tethering.
2161        2. Verify tethering.
2162        3. Make outgoing VoLTE call on tethering provider.
2163        4. Verify tethering still works.
2164        5. Make incoming VoLTE call on tethering provider.
2165        6. Verify tethering still works.
2166
2167        Returns:
2168            True if success.
2169            False if failed.
2170        """
2171        return self._test_tethering_wifi_and_voice_call(
2172            RAT_4G, phone_setup_volte, is_phone_in_call_volte)
2173
2174    @test_tracker_info(uuid="bcd430cc-6d33-47d1-825d-aae9f248addc")
2175    @TelephonyBaseTest.tel_test_wrap
2176    def test_tethering_wifi_csfb_call(self):
2177        """WiFi Tethering test: CSFB call during WiFi tethering
2178        1. Start LTE to WiFi (2.4G) tethering.
2179        2. Verify tethering.
2180        3. Make outgoing CSFB call on tethering provider.
2181        4. Verify tethering still works.
2182        5. Make incoming CSFB call on tethering provider.
2183        6. Verify tethering still works.
2184
2185        Returns:
2186            True if success.
2187            False if failed.
2188        """
2189        return self._test_tethering_wifi_and_voice_call(
2190            RAT_4G, phone_setup_csfb, is_phone_in_call_csfb)
2191
2192    @test_tracker_info(uuid="19e0df23-6819-4c69-bfda-eea9cce802d8")
2193    @TelephonyBaseTest.tel_test_wrap
2194    def test_tethering_wifi_3g_call(self):
2195        """WiFi Tethering test: 3G call during WiFi tethering
2196        1. Start 3G to WiFi (2.4G) tethering.
2197        2. Verify tethering.
2198        3. Make outgoing CS call on tethering provider.
2199        4. Verify tethering still works.
2200        5. Make incoming CS call on tethering provider.
2201        6. Verify tethering still works.
2202
2203        Returns:
2204            True if success.
2205            False if failed.
2206        """
2207        return self._test_tethering_wifi_and_voice_call(
2208            RAT_3G, phone_setup_voice_3g, is_phone_in_call_3g)
2209
2210    @test_tracker_info(uuid="4acd98b5-fdef-4736-969f-3fa953990a58")
2211    @TelephonyBaseTest.tel_test_wrap
2212    def test_tethering_wifi_no_password(self):
2213        """WiFi Tethering test: Start WiFi tethering with no password
2214
2215        1. DUT is idle.
2216        2. DUT start 2.4G WiFi Tethering, with no WiFi password.
2217        3. PhoneB disable data, connect to DUT's softAP
2218        4. Verify Internet access on DUT and PhoneB
2219
2220        Returns:
2221            True if success.
2222            False if failed.
2223        """
2224        if not self._test_setup_tethering():
2225            self.log.error("Verify Internet access failed.")
2226            return False
2227
2228        return wifi_tethering_setup_teardown(
2229            self.log,
2230            self.provider, [self.clients[0]],
2231            ap_band=WIFI_CONFIG_APBAND_2G,
2232            check_interval=10,
2233            check_iteration=10,
2234            password="")
2235
2236    @test_tracker_info(uuid="86ad1680-bfb8-457e-8b4d-23321cb3f223")
2237    @TelephonyBaseTest.tel_test_wrap
2238    def test_tethering_wifi_reboot(self):
2239        """WiFi Tethering test: Start WiFi tethering then Reboot device
2240
2241        1. DUT is idle.
2242        2. DUT start 2.4G WiFi Tethering.
2243        3. PhoneB disable data, connect to DUT's softAP
2244        4. Verify Internet access on DUT and PhoneB
2245        5. Reboot DUT
2246        6. After DUT reboot, verify tethering is stopped.
2247
2248        Returns:
2249            True if success.
2250            False if failed.
2251        """
2252        if not self._test_setup_tethering():
2253            self.log.error("Verify Internet access failed.")
2254            return False
2255        try:
2256            if not wifi_tethering_setup_teardown(
2257                    self.log,
2258                    self.provider, [self.clients[0]],
2259                    ap_band=WIFI_CONFIG_APBAND_2G,
2260                    check_interval=10,
2261                    check_iteration=2,
2262                    do_cleanup=False):
2263                self.log.error("WiFi Tethering failed.")
2264                return False
2265
2266            if not self.provider.droid.wifiIsApEnabled():
2267                self.log.error("Provider WiFi tethering stopped.")
2268                return False
2269
2270            self.provider.log.info("Reboot provider")
2271            self.provider.reboot()
2272            time.sleep(
2273                WAIT_TIME_AFTER_REBOOT + WAIT_TIME_TETHERING_AFTER_REBOOT)
2274
2275            self.log.info("After reboot check if tethering stopped.")
2276            if self.provider.droid.wifiIsApEnabled():
2277                self.log.error("Provider WiFi tethering did NOT stopped.")
2278                return False
2279        finally:
2280            self.clients[0].droid.telephonyToggleDataConnection(True)
2281            wifi_reset(self.log, self.clients[0])
2282            if self.provider.droid.wifiIsApEnabled():
2283                stop_wifi_tethering(self.log, self.provider)
2284        return True
2285
2286    @test_tracker_info(uuid="5cf04ca2-dfde-43d6-be74-78b9abdf6c26")
2287    @TelephonyBaseTest.tel_test_wrap
2288    def test_connect_wifi_start_tethering_wifi_reboot(self):
2289        """WiFi Tethering test: WiFI connected, then start WiFi tethering,
2290            then reboot device.
2291
2292        Initial Condition: DUT in 4G mode, idle, DUT connect to WiFi.
2293        1. DUT start 2.4G WiFi Tethering.
2294        2. PhoneB disable data, connect to DUT's softAP
2295        3. Verify Internet access on DUT and PhoneB
2296        4. Reboot DUT
2297        5. After DUT reboot, verify tethering is stopped. DUT is able to connect
2298            to previous WiFi AP.
2299
2300        Returns:
2301            True if success.
2302            False if failed.
2303        """
2304        if not self._test_setup_tethering():
2305            self.log.error("Verify Internet access failed.")
2306            return False
2307
2308        self.log.info("Make sure DUT can connect to live network by WIFI")
2309        if ((not ensure_wifi_connected(self.log, self.provider,
2310                                       self.wifi_network_ssid,
2311                                       self.wifi_network_pass))
2312                or (not verify_internet_connection(self.log, self.provider))):
2313            self.log.error("WiFi connect fail.")
2314            return False
2315
2316        try:
2317            if not wifi_tethering_setup_teardown(
2318                    self.log,
2319                    self.provider, [self.clients[0]],
2320                    ap_band=WIFI_CONFIG_APBAND_2G,
2321                    check_interval=10,
2322                    check_iteration=2,
2323                    do_cleanup=False):
2324                self.log.error("WiFi Tethering failed.")
2325                return False
2326
2327            if not self.provider.droid.wifiIsApEnabled():
2328                self.log.error("Provider WiFi tethering stopped.")
2329                return False
2330
2331            self.provider.log.info("Reboot Provider")
2332            self.provider.reboot()
2333            time.sleep(WAIT_TIME_AFTER_REBOOT)
2334            time.sleep(WAIT_TIME_TETHERING_AFTER_REBOOT)
2335
2336            self.log.info("After reboot check if tethering stopped.")
2337            if self.provider.droid.wifiIsApEnabled():
2338                self.provider.log.error(
2339                    "Provider WiFi tethering did NOT stopped.")
2340                return False
2341
2342            self.log.info("Make sure WiFi can connect automatically.")
2343            if (not wait_for_wifi_data_connection(self.log, self.provider,
2344                                                  True) or
2345                    not verify_internet_connection(self.log, self.provider)):
2346                self.log.error("Data did not return to WiFi")
2347                return False
2348
2349        finally:
2350            self.clients[0].droid.telephonyToggleDataConnection(True)
2351            wifi_reset(self.log, self.clients[0])
2352            if self.provider.droid.wifiIsApEnabled():
2353                stop_wifi_tethering(self.log, self.provider)
2354        return True
2355
2356    @test_tracker_info(uuid="e0621997-c5bd-4137-afa6-b43406e9c713")
2357    @TelephonyBaseTest.tel_test_wrap
2358    def test_connect_wifi_reboot_start_tethering_wifi(self):
2359        """WiFi Tethering test: DUT connected to WiFi, then reboot,
2360        After reboot, start WiFi tethering, verify tethering actually works.
2361
2362        Initial Condition: Device set to 4G mode, idle, DUT connect to WiFi.
2363        1. Verify Internet is working on DUT (by WiFi).
2364        2. Reboot DUT.
2365        3. DUT start 2.4G WiFi Tethering.
2366        4. PhoneB disable data, connect to DUT's softAP
2367        5. Verify Internet access on DUT and PhoneB
2368
2369        Returns:
2370            True if success.
2371            False if failed.
2372        """
2373        if not self._test_setup_tethering():
2374            self.log.error("Verify Internet access failed.")
2375            return False
2376
2377        self.log.info("Make sure DUT can connect to live network by WIFI")
2378        if ((not ensure_wifi_connected(self.log, self.provider,
2379                                       self.wifi_network_ssid,
2380                                       self.wifi_network_pass))
2381                or (not verify_internet_connection(self.log, self.provider))):
2382            self.log.error("WiFi connect fail.")
2383            return False
2384
2385        self.provider.log.info("Reboot provider")
2386        self.provider.reboot()
2387        time.sleep(WAIT_TIME_AFTER_REBOOT)
2388        time.sleep(WAIT_TIME_TETHERING_AFTER_REBOOT)
2389
2390        return wifi_tethering_setup_teardown(
2391            self.log,
2392            self.provider, [self.clients[0]],
2393            ap_band=WIFI_CONFIG_APBAND_2G,
2394            check_interval=10,
2395            check_iteration=10)
2396
2397    @test_tracker_info(uuid="89a849ef-e2ed-4bf2-ac31-81d34aba672a")
2398    @TelephonyBaseTest.tel_test_wrap
2399    def test_tethering_wifi_screen_off_enable_doze_mode(self):
2400        """WiFi Tethering test: Start WiFi tethering, then turn off DUT's screen,
2401            then enable doze mode.
2402
2403        1. Start WiFi tethering on DUT.
2404        2. PhoneB disable data, and connect to DUT's softAP
2405        3. Verify Internet access on DUT and PhoneB
2406        4. Turn off DUT's screen. Wait for 1 minute and
2407            verify Internet access on Client PhoneB.
2408        5. Enable doze mode on DUT. Wait for 1 minute and
2409            verify Internet access on Client PhoneB.
2410
2411        Returns:
2412            True if success.
2413            False if failed.
2414        """
2415        if not self._test_setup_tethering():
2416            self.log.error("Verify Internet access failed.")
2417            return False
2418        try:
2419            if not wifi_tethering_setup_teardown(
2420                    self.log,
2421                    self.provider, [self.clients[0]],
2422                    ap_band=WIFI_CONFIG_APBAND_2G,
2423                    check_interval=10,
2424                    check_iteration=2,
2425                    do_cleanup=False):
2426                self.log.error("WiFi Tethering failed.")
2427                return False
2428
2429            if not self.provider.droid.wifiIsApEnabled():
2430                self.provider.log.error("Provider WiFi tethering stopped.")
2431                return False
2432
2433            self.provider.log.info("Turn off screen on provider")
2434            self.provider.droid.goToSleepNow()
2435            time.sleep(60)
2436            if not verify_internet_connection(self.log, self.clients[0]):
2437                self.client.log.error("Client have no Internet access.")
2438                return False
2439
2440            self.provider.log.info("Enable doze mode on provider")
2441            if not enable_doze(self.provider):
2442                self.provider.log.error("Failed to enable doze mode.")
2443                return False
2444            time.sleep(60)
2445            if not verify_internet_connection(self.log, self.clients[0]):
2446                self.clients[0].log.error("Client have no Internet access.")
2447                return False
2448        finally:
2449            self.log.info("Disable doze mode.")
2450            if not disable_doze(self.provider):
2451                self.log.error("Failed to disable doze mode.")
2452                return False
2453            if not wifi_tethering_cleanup(self.log, self.provider,
2454                                          [self.clients[0]]):
2455                return False
2456        return True
2457
2458    @test_tracker_info(uuid="695eef18-f759-4b41-8ad3-1fb329ee4b1b")
2459    @TelephonyBaseTest.tel_test_wrap
2460    def test_msim_switch_data_sim_2g(self):
2461        """Switch Data SIM on 2G network.
2462
2463        Steps:
2464        1. Data on default Data SIM.
2465        2. Switch Data to another SIM. Make sure data is still available.
2466        3. Switch Data back to previous SIM. Make sure data is still available.
2467
2468        Expected Results:
2469        1. Verify Data on Cell
2470        2. Verify Data on Wifi
2471
2472        Returns:
2473            True if success.
2474            False if failed.
2475        """
2476        ad = self.android_devices[0]
2477        current_data_sub_id = ad.droid.subscriptionGetDefaultDataSubId()
2478        current_sim_slot_index = get_slot_index_from_subid(
2479            self.log, ad, current_data_sub_id)
2480        if current_sim_slot_index == SIM1_SLOT_INDEX:
2481            next_sim_slot_index = SIM2_SLOT_INDEX
2482        else:
2483            next_sim_slot_index = SIM1_SLOT_INDEX
2484        next_data_sub_id = get_subid_from_slot_index(self.log, ad,
2485                                                     next_sim_slot_index)
2486        self.log.info("Current Data is on subId: {}, SIM slot: {}".format(
2487            current_data_sub_id, current_sim_slot_index))
2488        if not ensure_network_generation_for_subscription(
2489                self.log,
2490                ad,
2491                ad.droid.subscriptionGetDefaultDataSubId(),
2492                GEN_2G,
2493                voice_or_data=NETWORK_SERVICE_DATA):
2494            self.log.error("Device data does not attach to 2G.")
2495            return False
2496        if not verify_internet_connection(self.log, ad):
2497            self.log.error("No Internet access on default Data SIM.")
2498            return False
2499
2500        self.log.info("Change Data to subId: {}, SIM slot: {}".format(
2501            next_data_sub_id, next_sim_slot_index))
2502        if not change_data_sim_and_verify_data(self.log, ad,
2503                                               next_sim_slot_index):
2504            self.log.error("Failed to change data SIM.")
2505            return False
2506
2507        next_data_sub_id = current_data_sub_id
2508        next_sim_slot_index = current_sim_slot_index
2509        self.log.info("Change Data back to subId: {}, SIM slot: {}".format(
2510            next_data_sub_id, next_sim_slot_index))
2511        if not change_data_sim_and_verify_data(self.log, ad,
2512                                               next_sim_slot_index):
2513            self.log.error("Failed to change data SIM.")
2514            return False
2515
2516        return True
2517
2518    def _test_wifi_connect_disconnect(self):
2519        """Perform multiple connects and disconnects from WiFi and verify that
2520            data switches between WiFi and Cell.
2521
2522        Steps:
2523        1. Reset Wifi on DUT
2524        2. Connect DUT to a WiFi AP
2525        3. Repeat steps 1-2, alternately disconnecting and disabling wifi
2526
2527        Expected Results:
2528        1. Verify Data on Cell
2529        2. Verify Data on Wifi
2530
2531        Returns:
2532            True if success.
2533            False if failed.
2534        """
2535        ad = self.android_devices[0]
2536
2537        wifi_toggles = [
2538            True, False, True, False, False, True, False, False, False, False,
2539            True, False, False, False, False, False, False, False, False
2540        ]
2541
2542        for toggle in wifi_toggles:
2543
2544            wifi_reset(self.log, ad, toggle)
2545
2546            if not wait_for_cell_data_connection(
2547                    self.log, ad, True, MAX_WAIT_TIME_WIFI_CONNECTION):
2548                self.log.error("Failed wifi connection, aborting!")
2549                return False
2550
2551            if not verify_internet_connection(self.log, ad):
2552                self.log.error("Failed to get user-plane traffic, aborting!")
2553                return False
2554
2555            if toggle:
2556                wifi_toggle_state(self.log, ad, True)
2557
2558            ensure_wifi_connected(self.log, ad, self.wifi_network_ssid,
2559                         self.wifi_network_pass)
2560
2561            if not wait_for_wifi_data_connection(
2562                    self.log, ad, True, MAX_WAIT_TIME_WIFI_CONNECTION):
2563                self.log.error("Failed wifi connection, aborting!")
2564                return False
2565
2566            if not verify_http_connection(
2567                    self.log, ad, 'http://www.google.com', 100, .1):
2568                self.log.error("Failed to get user-plane traffic, aborting!")
2569                return False
2570        return True
2571
2572    @test_tracker_info(uuid="9b8e92da-0ae1-472c-a72a-f6427e5405ce")
2573    @TelephonyBaseTest.tel_test_wrap
2574    def test_wifi_connect_disconnect_4g(self):
2575        """Perform multiple connects and disconnects from WiFi and verify that
2576            data switches between WiFi and Cell.
2577
2578        Steps:
2579        1. DUT Cellular Data is on 4G. Reset Wifi on DUT
2580        2. Connect DUT to a WiFi AP
2581        3. Repeat steps 1-2, alternately disconnecting and disabling wifi
2582
2583        Expected Results:
2584        1. Verify Data on Cell
2585        2. Verify Data on Wifi
2586
2587        Returns:
2588            True if success.
2589            False if failed.
2590        """
2591
2592        ad = self.android_devices[0]
2593        if not ensure_network_generation_for_subscription(
2594                self.log, ad, ad.droid.subscriptionGetDefaultDataSubId(),
2595                GEN_4G, MAX_WAIT_TIME_NW_SELECTION, NETWORK_SERVICE_DATA):
2596            self.log.error("Device {} failed to reselect in {}s.".format(
2597                ad.serial, MAX_WAIT_TIME_NW_SELECTION))
2598            return False
2599        return self._test_wifi_connect_disconnect()
2600
2601    @test_tracker_info(uuid="09893b1f-a4a2-49d3-8027-c2c91cb8742e")
2602    @TelephonyBaseTest.tel_test_wrap
2603    def test_wifi_connect_disconnect_3g(self):
2604        """Perform multiple connects and disconnects from WiFi and verify that
2605            data switches between WiFi and Cell.
2606
2607        Steps:
2608        1. DUT Cellular Data is on 3G. Reset Wifi on DUT
2609        2. Connect DUT to a WiFi AP
2610        3. Repeat steps 1-2, alternately disconnecting and disabling wifi
2611
2612        Expected Results:
2613        1. Verify Data on Cell
2614        2. Verify Data on Wifi
2615
2616        Returns:
2617            True if success.
2618            False if failed.
2619        """
2620
2621        ad = self.android_devices[0]
2622        if not ensure_network_generation_for_subscription(
2623                self.log, ad, ad.droid.subscriptionGetDefaultDataSubId(),
2624                GEN_3G, MAX_WAIT_TIME_NW_SELECTION, NETWORK_SERVICE_DATA):
2625            self.log.error("Device {} failed to reselect in {}s.".format(
2626                ad.serial, MAX_WAIT_TIME_NW_SELECTION))
2627            return False
2628        return self._test_wifi_connect_disconnect()
2629
2630    @test_tracker_info(uuid="0f095ca4-ce05-458f-9670-49a69f8c8270")
2631    @TelephonyBaseTest.tel_test_wrap
2632    def test_wifi_connect_disconnect_2g(self):
2633        """Perform multiple connects and disconnects from WiFi and verify that
2634            data switches between WiFi and Cell.
2635
2636        Steps:
2637        1. DUT Cellular Data is on 2G. Reset Wifi on DUT
2638        2. Connect DUT to a WiFi AP
2639        3. Repeat steps 1-2, alternately disconnecting and disabling wifi
2640
2641        Expected Results:
2642        1. Verify Data on Cell
2643        2. Verify Data on Wifi
2644
2645        Returns:
2646            True if success.
2647            False if failed.
2648        """
2649        ad = self.android_devices[0]
2650        if not ensure_network_generation_for_subscription(
2651                self.log, ad, ad.droid.subscriptionGetDefaultDataSubId(),
2652                GEN_2G, MAX_WAIT_TIME_NW_SELECTION, NETWORK_SERVICE_DATA):
2653            self.log.error("Device {} failed to reselect in {}s.".format(
2654                ad.serial, MAX_WAIT_TIME_NW_SELECTION))
2655            return False
2656        return self._test_wifi_connect_disconnect()
2657
2658    def _test_wifi_tethering_enabled_add_voice_call(
2659            self, network_generation, voice_call_direction,
2660            is_data_available_during_call):
2661        """Tethering enabled + voice call.
2662
2663        Steps:
2664        1. DUT data is on <network_generation>. Start WiFi Tethering.
2665        2. PhoneB connect to DUT's softAP
2666        3. DUT make a MO/MT (<voice_call_direction>) phone call.
2667        4. DUT end phone call.
2668
2669        Expected Results:
2670        1. DUT is able to start WiFi tethering.
2671        2. PhoneB connected to DUT's softAP and able to browse Internet.
2672        3. DUT WiFi tethering is still on. Phone call works OK.
2673            If is_data_available_during_call is True, then PhoneB still has
2674            Internet access.
2675            Else, then Data is suspend, PhoneB has no Internet access.
2676        4. WiFi Tethering still on, voice call stopped, and PhoneB have Internet
2677            access.
2678
2679        Returns:
2680            True if success.
2681            False if failed.
2682        """
2683        if not self._test_setup_tethering(network_generation):
2684            self.log.error("Verify Internet access failed.")
2685            return False
2686        try:
2687            # Start WiFi Tethering
2688            if not wifi_tethering_setup_teardown(
2689                    self.log,
2690                    self.provider, [self.clients[0]],
2691                    ap_band=WIFI_CONFIG_APBAND_2G,
2692                    check_interval=10,
2693                    check_iteration=2,
2694                    do_cleanup=False):
2695                self.log.error("WiFi Tethering failed.")
2696                return False
2697
2698            if not self.provider.droid.wifiIsApEnabled():
2699                self.log.error("Provider WiFi tethering stopped.")
2700                return False
2701
2702            # Make a voice call
2703            if voice_call_direction == DIRECTION_MOBILE_ORIGINATED:
2704                ad_caller = self.provider
2705                ad_callee = self.clients[0]
2706            else:
2707                ad_caller = self.clients[0]
2708                ad_callee = self.provider
2709            if not call_setup_teardown(self.log, ad_caller, ad_callee, None,
2710                                       None, None):
2711                self.log.error("Failed to Establish {} Voice Call".format(
2712                    voice_call_direction))
2713                return False
2714
2715            # Tethering should still be on.
2716            if not self.provider.droid.wifiIsApEnabled():
2717                self.provider.log.error("Provider WiFi tethering stopped.")
2718                return False
2719            if not is_data_available_during_call:
2720                if verify_internet_connection(
2721                        self.log, self.clients[0], retry=0):
2722                    self.clients[0].log.error(
2723                        "Client should not have Internet Access.")
2724                    return False
2725            else:
2726                if not verify_internet_connection(self.log, self.clients[0]):
2727                    self.clients[0].error(
2728                        "Client should have Internet Access.")
2729                    return False
2730
2731            # Hangup call. Client should have data.
2732            if not hangup_call(self.log, self.provider):
2733                self.provider.log.error("Failed to hang up call")
2734                return False
2735            if not self.provider.droid.wifiIsApEnabled():
2736                self.provider.log.error("Provider WiFi tethering stopped.")
2737                return False
2738            if not verify_internet_connection(self.log, self.clients[0]):
2739                self.clients[0].log.error(
2740                    "Client should have Internet Access.")
2741                return False
2742        finally:
2743            self.clients[0].droid.telephonyToggleDataConnection(True)
2744            wifi_reset(self.log, self.clients[0])
2745            if self.provider.droid.wifiIsApEnabled():
2746                stop_wifi_tethering(self.log, self.provider)
2747        return True
2748
2749    @test_tracker_info(uuid="4d7a68c6-5eae-4242-a6e6-668f830caec3")
2750    @TelephonyBaseTest.tel_test_wrap
2751    def test_wifi_tethering_enabled_add_mo_voice_call_2g_dsds(self):
2752        """Tethering enabled + voice call
2753
2754        Steps:
2755        1. DUT is DSDS device, Data on 2G. Start WiFi Tethering on <Data SIM>
2756        2. PhoneB connect to DUT's softAP
2757        3. DUT make a mo phone call on <Voice SIM>
2758        4. DUT end phone call.
2759
2760        Expected Results:
2761        1. DUT is able to start WiFi tethering.
2762        2. PhoneB connected to DUT's softAP and able to browse Internet.
2763        3. DUT WiFi tethering is still on. Phone call works OK. Data is suspend,
2764            PhoneB still connected to DUT's softAP, but no data available.
2765        4. DUT data resumes, and PhoneB have Internet access.
2766
2767        Returns:
2768            True if success.
2769            False if failed.
2770        """
2771
2772        return self._test_wifi_tethering_enabled_add_voice_call(
2773            GEN_2G, DIRECTION_MOBILE_ORIGINATED, False)
2774
2775    @test_tracker_info(uuid="de720069-a46c-4a6f-ae80-60b9349c8528")
2776    @TelephonyBaseTest.tel_test_wrap
2777    def test_wifi_tethering_enabled_add_mt_voice_call_2g_dsds(self):
2778        """Tethering enabled + voice call
2779
2780        Steps:
2781        1. DUT is DSDS device, Data on 2G. Start WiFi Tethering on <Data SIM>
2782        2. PhoneB connect to DUT's softAP
2783        3. DUT make a mt phone call on <Voice SIM>
2784        4. DUT end phone call.
2785
2786        Expected Results:
2787        1. DUT is able to start WiFi tethering.
2788        2. PhoneB connected to DUT's softAP and able to browse Internet.
2789        3. DUT WiFi tethering is still on. Phone call works OK. Data is suspend,
2790            PhoneB still connected to DUT's softAP, but no data available.
2791        4. DUT data resumes, and PhoneB have Internet access.
2792
2793        Returns:
2794            True if success.
2795            False if failed.
2796        """
2797
2798        return self._test_wifi_tethering_enabled_add_voice_call(
2799            GEN_2G, DIRECTION_MOBILE_TERMINATED, False)
2800
2801    @test_tracker_info(uuid="fad169c0-8ae6-45d2-98ba-3fb60466ff0b")
2802    @TelephonyBaseTest.tel_test_wrap
2803    def test_wifi_tethering_msim_switch_data_sim(self):
2804        """Tethering enabled + switch data SIM.
2805
2806        Steps:
2807        1. Start WiFi Tethering on <Default Data SIM>
2808        2. PhoneB connect to DUT's softAP
2809        3. DUT change Default Data SIM.
2810
2811        Expected Results:
2812        1. DUT is able to start WiFi tethering.
2813        2. PhoneB connected to DUT's softAP and able to browse Internet.
2814        3. DUT Data changed to 2nd SIM, WiFi tethering should continues,
2815            PhoneB should have Internet access.
2816
2817        Returns:
2818            True if success.
2819            False if failed.
2820        """
2821        current_data_sub_id = self.provider.droid.subscriptionGetDefaultDataSubId(
2822        )
2823        current_sim_slot_index = get_slot_index_from_subid(
2824            self.log, self.provider, current_data_sub_id)
2825        self.provider.log.info("Current Data is on subId: %s, SIM slot: %s",
2826                               current_data_sub_id, current_sim_slot_index)
2827        if not self._test_setup_tethering():
2828            self.log.error("Verify Internet access failed.")
2829            return False
2830        try:
2831            # Start WiFi Tethering
2832            if not wifi_tethering_setup_teardown(
2833                    self.log,
2834                    self.provider, [self.clients[0]],
2835                    ap_band=WIFI_CONFIG_APBAND_2G,
2836                    check_interval=10,
2837                    check_iteration=2,
2838                    do_cleanup=False):
2839                self.log.error("WiFi Tethering failed.")
2840                return False
2841            for i in range(0, 2):
2842                next_sim_slot_index = \
2843                    {SIM1_SLOT_INDEX : SIM2_SLOT_INDEX,
2844                     SIM2_SLOT_INDEX : SIM1_SLOT_INDEX}[current_sim_slot_index]
2845                self.log.info(
2846                    "Change Data to SIM slot: {}".format(next_sim_slot_index))
2847                if not change_data_sim_and_verify_data(self.log, self.provider,
2848                                                       next_sim_slot_index):
2849                    self.provider.log.error("Failed to change data SIM.")
2850                    return False
2851                current_sim_slot_index = next_sim_slot_index
2852                if not verify_internet_connection(self.log, self.clients[0]):
2853                    self.clients[0].log.error(
2854                        "Client should have Internet Access.")
2855                    return False
2856        finally:
2857            self.clients[0].droid.telephonyToggleDataConnection(True)
2858            wifi_reset(self.log, self.clients[0])
2859            if self.provider.droid.wifiIsApEnabled():
2860                stop_wifi_tethering(self.log, self.provider)
2861        return True
2862
2863    @test_tracker_info(uuid="8bb9383f-ddf9-400c-a831-c9462bae6b47")
2864    @TelephonyBaseTest.tel_test_wrap
2865    def test_msim_cell_data_switch_to_wifi_switch_data_sim_2g(self):
2866        """Switch Data SIM on 2G network.
2867
2868        Steps:
2869        1. Data on default Data SIM.
2870        2. Turn on WiFi, then data should be on WiFi.
2871        3. Switch Data to another SIM. Disable WiFi.
2872
2873        Expected Results:
2874        1. Verify Data on Cell
2875        2. Verify Data on WiFi
2876        3. After WiFi disabled, Cell Data is available on 2nd SIM.
2877
2878        Returns:
2879            True if success.
2880            False if failed.
2881        """
2882        ad = self.android_devices[0]
2883        current_data_sub_id = ad.droid.subscriptionGetDefaultDataSubId()
2884        current_sim_slot_index = get_slot_index_from_subid(
2885            self.log, ad, current_data_sub_id)
2886        if current_sim_slot_index == SIM1_SLOT_INDEX:
2887            next_sim_slot_index = SIM2_SLOT_INDEX
2888        else:
2889            next_sim_slot_index = SIM1_SLOT_INDEX
2890        next_data_sub_id = get_subid_from_slot_index(self.log, ad,
2891                                                     next_sim_slot_index)
2892        self.log.info("Current Data is on subId: {}, SIM slot: {}".format(
2893            current_data_sub_id, current_sim_slot_index))
2894        if not ensure_network_generation_for_subscription(
2895                self.log,
2896                ad,
2897                ad.droid.subscriptionGetDefaultDataSubId(),
2898                GEN_2G,
2899                voice_or_data=NETWORK_SERVICE_DATA):
2900            self.log.error("Device data does not attach to 2G.")
2901            return False
2902        if not verify_internet_connection(self.log, ad):
2903            self.log.error("No Internet access on default Data SIM.")
2904            return False
2905
2906        self.log.info("Connect to WiFi and verify Internet access.")
2907        if not ensure_wifi_connected(self.log, ad, self.wifi_network_ssid,
2908                                     self.wifi_network_pass):
2909            self.log.error("WiFi connect fail.")
2910            return False
2911        if (not wait_for_wifi_data_connection(self.log, ad, True)
2912                or not verify_internet_connection(self.log, ad)):
2913            self.log.error("Data is not on WiFi")
2914            return False
2915
2916        try:
2917            self.log.info(
2918                "Change Data SIM, Disable WiFi and verify Internet access.")
2919            set_subid_for_data(ad, next_data_sub_id)
2920            wifi_toggle_state(self.log, ad, False)
2921            if not wait_for_data_attach_for_subscription(
2922                    self.log, ad, next_data_sub_id,
2923                    MAX_WAIT_TIME_NW_SELECTION):
2924                self.log.error("Failed to attach data on subId:{}".format(
2925                    next_data_sub_id))
2926                return False
2927            if not verify_internet_connection(self.log, ad):
2928                self.log.error("No Internet access after changing Data SIM.")
2929                return False
2930
2931        finally:
2932            self.log.info("Change Data SIM back.")
2933            set_subid_for_data(ad, current_data_sub_id)
2934
2935        return True
2936
2937    @test_tracker_info(uuid="ef03eff7-ddd3-48e9-8f67-5e271e14048b")
2938    @TelephonyBaseTest.tel_test_wrap
2939    def test_vzw_embms_services(self):
2940        ad = self.android_devices[0]
2941        # Install App and Push config
2942        self.log.info("Pushing embms config and apk to the Android device.")
2943        android_embms_path = "/sdcard/mobitv"
2944        embms_path = self.user_params.get("embms_path", "embms_path")
2945        if isinstance(embms_path, list):
2946            embms_path = embms_path[0]
2947        ad.adb.shell("mkdir /sdcard/mobitv")
2948        dcafile = os.path.join(embms_path, "dca.config")
2949        apkfile = os.path.join(embms_path, "VzwDCA.apk")
2950        ad.adb.push("%s %s" % (dcafile, android_embms_path))
2951        ad.adb.install("%s" % apkfile)
2952
2953        # Co-ordinates Mapping
2954        lcd_density = ad.adb.shell("getprop ro.sf.lcd_density")
2955        ad.log.debug("lcd_density %s" % lcd_density)
2956        if lcd_density in ["420", "440"]:
2957            agree_y_axis = 1000
2958        else:
2959            agree_y_axis = 1300
2960
2961        # Screen ON needed to open the VZW App
2962        if "ON" in \
2963        ad.adb.shell(
2964               "dumpsys power | grep 'Display Power: state' | cut -d '=' -f2"):
2965            ad.log.info("Screen already ON")
2966            ad.adb.shell("input keyevent 82")
2967        else:
2968            ad.log.info("Screen OFF, turning ON")
2969            ad.adb.shell("input keyevent 26")
2970            ad.adb.shell("input keyevent 82")
2971
2972        try:
2973            # Check if app is installed
2974            if ad.is_apk_installed("com.mobitv.vzwdca"):
2975                ad.log.info("VZWDCA App is successfully installed")
2976            else:
2977                ad.log.error("VZWDCA App is not installed")
2978                return False
2979
2980            # Grant Permissions, Start, Agree, Register
2981            for cmd in ("pm grant com.mobitv.vzwdca "
2982                        "android.permission.READ_EXTERNAL_STORAGE",
2983                        "pm grant com.mobitv.vzwdca "
2984                        "android.permission.WRITE_EXTERNAL_STORAGE",
2985                        "am start -a android.intent.action.VIEW -n "
2986                        "com.mobitv.vzwdca/.DcaActivity",
2987                        "input tap 500 %d" % agree_y_axis, "input keyevent 61",
2988                        "input keyevent 61", "input keyevent 61",
2989                        "input keyevent 61", "input keyevent 61",
2990                        "input keyevent 66"):
2991                time.sleep(1)
2992                ad.log.info(cmd)
2993                ad.adb.shell(cmd)
2994
2995            # Check Reg-DeReg
2996            time.sleep(5)
2997            if ad.is_apk_running("com.qualcomm.ltebc_vzw"):
2998                ad.log.info("EMBMS Registered successfully")
2999                ad.adb.shell("input keyevent 61")
3000                time.sleep(1)
3001                ad.adb.shell("input keyevent 66")
3002                time.sleep(1)
3003                if not ad.is_apk_running("com.qualcomm.ltebc_vzw"):
3004                    ad.log.info("EMBMS De-Registered successfully")
3005                    return True
3006                else:
3007                    ad.log.error("EMBMS De-Registeration Failed")
3008                    return False
3009            else:
3010                ad.log.error("EMBMS Registeration Failed")
3011                return False
3012        finally:
3013            ad.log.info("Force Close the VZW App")
3014            ad.adb.shell("am force-stop com.mobitv.vzwdca")
3015
3016    @test_tracker_info(uuid="8a8cd773-77f5-4802-85ac-1a654bb4743c")
3017    @TelephonyBaseTest.tel_test_wrap
3018    def test_disable_data_on_non_active_data_sim(self):
3019        """Switch Data SIM on 2G network.
3020
3021        Steps:
3022        1. Data on default Data SIM.
3023        2. Disable data on non-active Data SIM.
3024
3025        Expected Results:
3026        1. Verify Data Status on Default Data SIM and non-active Data SIM.
3027        1. Verify Data Status on Default Data SIM and non-active Data SIM.
3028
3029        Returns:
3030            True if success.
3031            False if failed.
3032        """
3033        ad = self.android_devices[0]
3034        current_data_sub_id = ad.droid.subscriptionGetDefaultDataSubId()
3035        current_sim_slot_index = get_slot_index_from_subid(
3036            self.log, ad, current_data_sub_id)
3037        if current_sim_slot_index == SIM1_SLOT_INDEX:
3038            non_active_sim_slot_index = SIM2_SLOT_INDEX
3039        else:
3040            non_active_sim_slot_index = SIM1_SLOT_INDEX
3041        non_active_sub_id = get_subid_from_slot_index(
3042            self.log, ad, non_active_sim_slot_index)
3043        self.log.info("Current Data is on subId: {}, SIM slot: {}".format(
3044            current_data_sub_id, current_sim_slot_index))
3045
3046        if not ensure_network_generation_for_subscription(
3047                self.log,
3048                ad,
3049                ad.droid.subscriptionGetDefaultDataSubId(),
3050                GEN_2G,
3051                voice_or_data=NETWORK_SERVICE_DATA):
3052            self.log.error("Device data does not attach to 2G.")
3053            return False
3054        if not verify_internet_connection(self.log, ad):
3055            self.log.error("No Internet access on default Data SIM.")
3056            return False
3057
3058        if ad.droid.telephonyGetDataConnectionState() != DATA_STATE_CONNECTED:
3059            self.log.error("Data Connection State should be connected.")
3060            return False
3061        # TODO: Check Data state for non-active subId.
3062
3063        try:
3064            self.log.info("Disable Data on Non-Active Sub ID")
3065            ad.droid.telephonyToggleDataConnectionForSubscription(
3066                non_active_sub_id, False)
3067            # TODO: Check Data state for non-active subId.
3068            if ad.droid.telephonyGetDataConnectionState(
3069            ) != DATA_STATE_CONNECTED:
3070                self.log.error("Data Connection State should be connected.")
3071                return False
3072        finally:
3073            self.log.info("Enable Data on Non-Active Sub ID")
3074            ad.droid.telephonyToggleDataConnectionForSubscription(
3075                non_active_sub_id, True)
3076        return True
3077
3078    def file_download_stress(self):
3079        failure = 0
3080        total_count = 0
3081        self.result_info = collections.defaultdict(int)
3082        dut = self.android_devices[0]
3083        self.max_sleep_time = int(self.user_params.get("max_sleep_time", 1200))
3084        #file_names = ["5MB", "10MB", "20MB", "50MB", "200MB", "512MB", "1GB"]
3085        file_names = ["5MB", "10MB", "20MB", "50MB", "200MB", "512MB"]
3086        while total_count < self.stress_test_number:
3087            total_count += 1
3088            try:
3089                dut.log.info(dict(self.result_info))
3090                selection = random.randrange(0, len(file_names))
3091                file_name = file_names[selection]
3092                self.result_info["Total %s file download" % file_name] += 1
3093                if not active_file_download_test(self.log, dut, file_name):
3094                    self.result_info["%s file download failure" %
3095                                     file_name] += 1
3096                    failure += 1
3097                    dut.take_bug_report("%s_failure_%s" % (self.test_name,
3098                                                           failure),
3099                                        time.strftime("%m-%d-%Y-%H-%M-%S"))
3100                    self.dut.droid.goToSleepNow()
3101                    time.sleep(random.randrange(0, self.max_sleep_time))
3102            except Exception as e:
3103                self.log.error("Exception error %s", str(e))
3104                self.result_info["Exception Errors"] += 1
3105            dut.log.info("File download test failure: %s/%s", failure,
3106                         total_count)
3107        if failure / total_count > 0.1:
3108            dut.log.error("File download test failure: %s/%s", failure,
3109                          total_count)
3110            return False
3111        return True
3112
3113    @test_tracker_info(uuid="5381a6fa-6771-4b00-a0d6-4a3891a6dba8")
3114    @TelephonyBaseTest.tel_test_wrap
3115    def test_file_download_stress_default(self):
3116        """File download stress test
3117
3118        Steps:
3119        1. Download a file random picked.
3120        2. Device sleep for sometime and Repeat 1.
3121
3122        Expected Results:
3123        Total download failure rate is less than 10%.
3124
3125        Returns:
3126            True if success.
3127            False if failed.
3128        """
3129        return self.file_download_stress()
3130
3131    @test_tracker_info(uuid="c9970955-123b-467c-afbb-95ec8f99e9b7")
3132    def test_file_download_with_mobile_data_usage_limit_set(self):
3133        """ Steps:
3134
3135        1. Set the data usage limit to current data usage + 9MB
3136        2. Download 5MB file from internet.
3137        3. The first file download should succeed
3138        4. The second file download should fail
3139
3140        """
3141        dut = self.android_devices[0]
3142        ensure_phones_default_state(self.log, [dut])
3143        subscriber_id = dut.droid.telephonyGetSubscriberId()
3144        old_data_usage = get_mobile_data_usage(dut, subscriber_id)
3145
3146        # set data usage limit to current usage limit + 10MB
3147        data_limit = old_data_usage + 9 * 1000 * 1000
3148        set_mobile_data_usage_limit(dut, data_limit, subscriber_id)
3149
3150        # download file - size 5MB twice
3151        try:
3152            for _ in range(2):
3153                if not active_file_download_test(self.log, dut, "5MB", "curl"):
3154                    if get_mobile_data_usage(
3155                            dut, subscriber_id) + 5 * 1000 * 1000 < data_limit:
3156                        dut.log.error(
3157                            "Fail to download file when mobile data usage is"
3158                            " below data usage limit")
3159                        return False
3160                    else:
3161                        dut.log.info(
3162                            "Download fails as expected due to data limit reached"
3163                        )
3164                else:
3165                    if get_mobile_data_usage(dut, subscriber_id) < data_limit:
3166                        dut.log.info(
3167                            "Download file succeed when mobile data usage is"
3168                            " below data usage limit")
3169                    else:
3170                        dut.log.error(
3171                            "Download should fail due to data limit reached")
3172                        return False
3173            return True
3174        finally:
3175            remove_mobile_data_usage_limit(dut, subscriber_id)
3176
3177
3178    def _test_data_stall_detection_recovery(self, nw_type="cellular",
3179                                            validation_type="detection"):
3180        dut = self.android_devices[0]
3181        try:
3182            cmd = ('ss -l -p -n | grep "tcp.*droid_script" | tr -s " " '
3183                   '| cut -d " " -f 5 | sed s/.*://g')
3184            sl4a_port = dut.adb.shell(cmd)
3185            ensure_phones_default_state(self.log, [dut])
3186            if nw_type == "wifi":
3187                if not ensure_wifi_connected(self.log, dut,
3188                                self.wifi_network_ssid, self.wifi_network_pass):
3189                    return False
3190
3191            if not test_data_browsing_success_using_sl4a(self.log, dut):
3192                dut.log.error("Browsing failed before the test, aborting!")
3193                return False
3194
3195            begin_time = get_device_epoch_time(dut)
3196            break_internet_except_sl4a_port(dut, sl4a_port)
3197
3198            if not test_data_browsing_failure_using_sl4a(self.log, dut):
3199                dut.log.error("Browsing success even after breaking internet, "\
3200                              "aborting!")
3201                return False
3202
3203            if not check_data_stall_detection(dut):
3204                dut.log.error("NetworkMonitor unable to detect Data Stall")
3205
3206            if not check_network_validation_fail(dut, begin_time):
3207                dut.log.error("Unable to detect NW validation fail")
3208                return False
3209
3210            if validation_type == "recovery":
3211                if not check_data_stall_recovery(dut, begin_time):
3212                    dut.log.error("Recovery was not triggerred")
3213                    return False
3214
3215            resume_internet_with_sl4a_port(dut, sl4a_port)
3216            time.sleep(10)
3217
3218            if not test_data_browsing_success_using_sl4a(self.log, dut):
3219                dut.log.error("Browsing failed after resuming internet")
3220                return False
3221            return True
3222        finally:
3223            resume_internet_with_sl4a_port(dut, sl4a_port)
3224
3225
3226    @test_tracker_info(uuid="fda33416-698a-408f-8ddc-b5cde13b1f83")
3227    @TelephonyBaseTest.tel_test_wrap
3228    def test_data_stall_detection_cellular(self):
3229        """ Data Stall Detection Testing
3230
3231        1. Ensure device is camped, browsing working fine
3232        2. Break Internet access, browsing should fail
3233        3. Check for Data Stall Detection
3234
3235        """
3236        return self._test_data_stall_detection_recovery(nw_type="cellular")
3237
3238
3239    @test_tracker_info(uuid="a57891d6-7892-46c7-8bca-23cd2cca8552")
3240    @TelephonyBaseTest.tel_test_wrap
3241    def test_data_stall_detection_wifi(self):
3242        """ Data Stall Detection Testing
3243
3244        1. Ensure device is connected to WiFi, browsing working fine
3245        2. Break Internet access, browsing should fail
3246        3. Check for Data Stall Detection
3247
3248        """
3249        return self._test_data_stall_detection_recovery(nw_type="wifi")
3250
3251
3252    @test_tracker_info(uuid="16d3f123-cac3-45a9-a2e5-c01bab7044d4")
3253    @TelephonyBaseTest.tel_test_wrap
3254    def test_data_stall_recovery_cellular(self):
3255        """ Data Stall Recovery Testing
3256
3257        1. Ensure device is camped, browsing working fine
3258        2. Break Internet access, browsing should fail
3259        3. Check for Data Stall Detection
3260        4. Check for Data Stall Recovery
3261
3262        """
3263        return self._test_data_stall_detection_recovery(nw_type="cellular",
3264                                                validation_type="recovery")
3265
3266        """ Tests End """
3267