blob: bbe9b14f80a695140a534aca8a025e0f2d8e3dcb [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright 2021 - The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import time
from acts import asserts
from acts import signals
from acts.test_decorators import test_tracker_info
from acts.libs.utils.multithread import multithread_func
from acts_contrib.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
from acts_contrib.test_utils.tel.GFTInOutBaseTest import GFTInOutBaseTest
from acts_contrib.test_utils.tel.gft_inout_defines import VOICE_CALL
from acts_contrib.test_utils.tel.gft_inout_utils import check_no_service_time
from acts_contrib.test_utils.tel.gft_inout_utils import check_back_to_service_time
from acts_contrib.test_utils.tel.gft_inout_utils import mo_voice_call
from acts_contrib.test_utils.tel.tel_defines import RAT_3G
from acts_contrib.test_utils.tel.tel_defines import RAT_4G
from acts_contrib.test_utils.tel.tel_defines import RAT_5G
from acts_contrib.test_utils.tel.tel_defines import GEN_3G
from acts_contrib.test_utils.tel.tel_defines import GEN_4G
from acts_contrib.test_utils.tel.tel_defines import GEN_5G
from acts_contrib.test_utils.tel.tel_defines import YOUTUBE_PACKAGE_NAME
from acts_contrib.test_utils.tel.tel_data_utils import wait_for_cell_data_connection
from acts_contrib.test_utils.tel.tel_phone_setup_utils import ensure_network_generation
from acts_contrib.test_utils.tel.tel_phone_setup_utils import ensure_phone_default_state
from acts_contrib.test_utils.tel.tel_phone_setup_utils import ensure_phones_idle
from acts_contrib.test_utils.tel.tel_test_utils import start_youtube_video
from acts_contrib.test_utils.tel.tel_test_utils import toggle_airplane_mode
from acts_contrib.test_utils.tel.tel_test_utils import set_preferred_network_mode_pref
AIRPLANE_MODE_ON_TIME = 60
AIRPLANE_MODE_OFF_TIME = 60
MOBILE_DATA_ON_OFF_CASE = 1
DATA_TRANSFER_CASE = 2
WIFI_HOTSPOT_CASE = 3
IN_CALL_CASE = 4
class TelLabGFTAirplaneModeTest(GFTInOutBaseTest):
def __init__(self, controllers):
GFTInOutBaseTest.__init__(self, controllers)
def setup_test(self):
for ad in self.android_devices:
ensure_phone_default_state(self.log, ad)
GFTInOutBaseTest.setup_test(self)
self.my_error_msg = ""
def teardown_test(self):
for ad in self.android_devices:
ad.force_stop_apk(YOUTUBE_PACKAGE_NAME)
ensure_phones_idle(self.log, self.android_devices)
@test_tracker_info(uuid="c5d2e9b3-478c-4f86-86e5-c8341944d222")
@TelephonyBaseTest.tel_test_wrap
def test_airplane_mode_mobile_data_off_3g(self):
'''
1.9.5 - 3G Airplane mode on/off - Mobile data off
Returns:
True if pass; False if fail
'''
tasks = [(self._airplane_mode_helper, (ad, MOBILE_DATA_ON_OFF_CASE, RAT_3G))
for ad in self.android_devices]
if not multithread_func(self.log, tasks):
raise signals.TestFailure("_airplane_mode_data_on_off failure: %s"
%(self.my_error_msg))
return True
@test_tracker_info(uuid="22956c54-ab2a-4031-8dfc-95fdb69fb3a6")
@TelephonyBaseTest.tel_test_wrap
def test_airplane_mode_mobile_data_off_4g(self):
'''
1.13.5 - 4G Airplane mode on/off - Mobile data off
Returns:
True if pass; False if fail
'''
tasks = [(self._airplane_mode_helper, (ad, MOBILE_DATA_ON_OFF_CASE, RAT_4G))
for ad in self.android_devices]
if not multithread_func(self.log, tasks):
raise signals.TestFailure("_airplane_mode_data_on_off failure: %s"
%(self.my_error_msg))
return True
@test_tracker_info(uuid="9ab8e183-6864-4543-855e-4d9a6cb74e42")
@TelephonyBaseTest.tel_test_wrap
def test_airplane_mode_mobile_data_off_5g(self):
'''
1.14.5 - 5G [NSA/SA] Airplane mode on/off - Mobile data off
Returns:
True if pass; False if fail
'''
tasks = [(self._airplane_mode_helper, (ad, MOBILE_DATA_ON_OFF_CASE, RAT_5G))
for ad in self.android_devices]
if not multithread_func(self.log, tasks):
raise signals.TestFailure("_airplane_mode_data_on_off failure: %s"
%(self.my_error_msg))
return True
@test_tracker_info(uuid="114afeb6-4c60-4da3-957f-b4b0005223be")
@TelephonyBaseTest.tel_test_wrap
def test_airplane_mode_voice_call_3g(self):
'''
3G 1.9.2 - Airplane mode on/off - Active call
Returns:
True if pass; False if fail
'''
tasks = [(self._airplane_mode_helper, (ad, IN_CALL_CASE, GEN_3G))
for ad in self.android_devices]
if not multithread_func(self.log, tasks):
raise signals.TestFailure("_airplane_mode_voice_call failure: %s"
%(self.my_error_msg))
return True
@test_tracker_info(uuid="0e00ca1a-f896-4a18-a3c8-05514975ecd6")
@TelephonyBaseTest.tel_test_wrap
def test_airplane_mode_voice_call_4g(self):
'''
4G 1.13.2 - Airplane mode on/off - Active call
Returns:
True if pass; False if fail
'''
tasks = [(self._airplane_mode_helper, (ad, IN_CALL_CASE, GEN_4G))
for ad in self.android_devices]
if not multithread_func(self.log, tasks):
raise signals.TestFailure("_airplane_mode_voice_call failure: %s"
%(self.my_error_msg))
return True
@test_tracker_info(uuid="cb228d48-78b4-48b4-9996-26ac252a9486")
@TelephonyBaseTest.tel_test_wrap
def test_airplane_mode_voice_call_5g(self):
'''
5G 1.14.2 - [NSA/SA] Airplane mode on/off - Active call
For NSA, call goes through IMS over LTE (VoLTE).
For SA, call goes through IMS over LTE/NR (EPSFB or VoNR)
depends on carrier's implementation.
Returns:
True if pass; False if fail
'''
tasks = [(self._airplane_mode_helper, (ad, IN_CALL_CASE, GEN_5G))
for ad in self.android_devices]
if not multithread_func(self.log, tasks):
raise signals.TestFailure("_airplane_mode_voice_call failure: %s"
%(self.my_error_msg))
return True
def _airplane_mode_mobile_data_off(self, ad):
""" Mobile data on/off and airplane mode on/off.
Args:
ad: android_device object.
Returns:
result: True if operation succeed. False if error happens.
"""
# Repeat for 3 cycles.
for x in range (3):
ad.log.info("Turn off mobile data")
ad.droid.telephonyToggleDataConnection(False)
if not wait_for_cell_data_connection(self.log, ad, False):
self.my_error_msg += "fail to turn off mobile data"
return False
if not self._airplane_mode_on_off(ad):
return False
ad.log.info("Turn on mobile data")
ad.droid.telephonyToggleDataConnection(True)
#If True, it will wait for status to be DATA_STATE_CONNECTED
if not wait_for_cell_data_connection(self.log, ad, True):
self.my_error_msg += "fail to turn on mobile data"
return False
# UE turn airplane mode on then off.
if not self._airplane_mode_on_off(ad):
return False
return True
def _airplane_mode_on_off(self, ad):
""" Toggle airplane mode on/off.
Args:
ad: android_device object.
Returns:
result: True if operation succeed. False if error happens.
"""
ad.log.info("Turn on airplane mode")
if not toggle_airplane_mode(self.log, ad, True):
self.my_error_msg += "Fail to enable airplane mode on. "
return False
time.sleep(AIRPLANE_MODE_ON_TIME)
ad.log.info("Turn off airplane mode")
if not toggle_airplane_mode(self.log, ad, False):
self.my_error_msg += "Fail to enable airplane mode off. "
return False
time.sleep(AIRPLANE_MODE_OFF_TIME)
return True
def _airplane_mode_voice_call(self, ad):
""" Airplane mode on/off while in-call.
Args:
ad: android_device object.
Returns:
result: True if operation succeed. False if error happens.
"""
# Repeat for 3 cycles.
for x in range (3):
ad.log.info("Make a MO call.")
if not mo_voice_call(self.log, ad, VOICE_CALL, False):
return False
self.log.info("turn airplane mode on then off during in call")
if not self._airplane_mode_on_off(ad):
return False
return True
def _airplane_mode_data_transfer(self, ad):
""" Airplane mode on/off while data transfer.
Args:
ad: android_device object.
Returns:
result: True if operation succeed. False if error happens.
"""
# Repeat for 3 cycles.
for x in range (3):
ad.log.info("Perform a data transferring. Start streaming")
if not start_youtube_video(ad):
ad.log.warning("Fail to bring up youtube video")
self.my_error_msg += "Fail to bring up youtube video. "
return False
self.log.info("turn airplane mode on then off during data transferring")
if not self._airplane_mode_on_off(ad):
return False
return True
def _airplane_mode_wifi_hotspot(self, ad):
""" Airplane mode on/off Wi-Fi hotspot enabled
Args:
ad: android_device object.
Returns:
result: True if operation succeed. False if error happens.
"""
# Repeat for 3 cycles.
for x in range (3):
ad.log.info("Enable Wi-Fi Hotspot on UE")
#if not start_youtube_video(ad):
# return False
self.log.info("turn airplane mode on then off")
if not self._airplane_mode_on_off(ad):
return False
return True
def _airplane_mode_helper(self, ad, case= MOBILE_DATA_ON_OFF_CASE, rat=GEN_4G, loop=1):
self.log.info("Lock network mode to %s." , rat)
if not ensure_network_generation(self.log, ad, rat):
raise signals.TestFailure("device fail to register at %s"
%(rat))
for x in range(self.user_params.get("apm_cycle", 1)):
self.log.info("%s loop: %s/%s" %(self.current_test_name,x+1, loop))
if case == MOBILE_DATA_ON_OFF_CASE:
if not self._airplane_mode_mobile_data_off(ad):
return False
elif case == DATA_TRANSFER_CASE:
if not self._airplane_mode_data_transfer(ad):
return False
elif case == WIFI_HOTSPOT_CASE:
if not self._airplane_mode_wifi_hotspot(ad):
return False
elif case == IN_CALL_CASE:
if not self._airplane_mode_voice_call(ad):
return False
#check radio function
tasks = [(self.verify_device_status, (ad, VOICE_CALL))
for ad in self.android_devices]
if not multithread_func(self.log, tasks):
raise signals.TestFailure("verify_device_status failure: %s"
%(self.my_error_msg))
return True
@test_tracker_info(uuid="0205ec77-36c1-478f-9d05-c8a72fffdd03")
@TelephonyBaseTest.tel_test_wrap
def test_airplane_mode_data_transfer_5g(self):
'''
5G - [NSA/SA] Airplane mode on/off - transfer
For NSA, call goes through IMS over LTE (VoLTE).
For SA, call goes through IMS over LTE/NR (EPSFB or VoNR)
depends on carrier's implementation.
Raises:
TestFailure if not success.
Returns:
True if pass; False if fail
'''
tasks = [(self._airplane_mode_helper, (ad, DATA_TRANSFER_CASE, GEN_5G))
for ad in self.android_devices]
if not multithread_func(self.log, tasks):
raise signals.TestFailure("_airplane_mode_data_transfer failure: %s"
%(self.my_error_msg))
return True
@test_tracker_info(uuid="c76a1154-29c0-4259-bd4c-05279d80537b")
@TelephonyBaseTest.tel_test_wrap
def test_airplane_mode_data_transfer_4g(self):
'''
4G - Airplane mode on/off - Data transferring
Raises:
TestFailure if not success.
Returns:
True if pass; False if fail
'''
tasks = [(self._airplane_mode_helper, (ad, DATA_TRANSFER_CASE, GEN_4G))
for ad in self.android_devices]
if not multithread_func(self.log, tasks):
raise signals.TestFailure("_airplane_mode_data_transfer failure: %s"
%(self.my_error_msg))
return True
@test_tracker_info(uuid="c16ea0bb-0155-4f5f-97a8-22c7e0e6e2f5")
@TelephonyBaseTest.tel_test_wrap
def test_airplane_mode_data_transfer_3g(self):
'''
3G - Airplane mode on/off - Data transferring
Raises:
TestFailure if not success.
Returns:
True if pass; False if fail
'''
tasks = [(self._airplane_mode_helper, (ad, DATA_TRANSFER_CASE, GEN_3G))
for ad in self.android_devices]
if not multithread_func(self.log, tasks):
raise signals.TestFailure("_airplane_mode_data_transfer failure: %s"
%(self.my_error_msg))
return True
@test_tracker_info(uuid="b1db4e3b-ea0b-4b61-9f2c-4b8fc251c71a")
@TelephonyBaseTest.tel_test_wrap
def test_airplane_mode_wifi_hotspot_5g(self):
'''
5G -[NSA/SA] Airplane mode off/on - Wi-Fi Hotspot enabled
For NSA, call goes through IMS over LTE (VoLTE).
For SA, call goes through IMS over LTE/NR (EPSFB or VoNR)
depends on carrier's implementation.
Raises:
TestFailure if not success.
Returns:
True if pass; False if fail
'''
tasks = [(self._airplane_mode_helper, (ad, WIFI_HOTSPOT_CASE, GEN_5G))
for ad in self.android_devices]
if not multithread_func(self.log, tasks):
raise signals.TestFailure("_airplane_mode_wifi_hotspot failure: %s"
%(self.my_error_msg)))
return True
@test_tracker_info(uuid="f21f4554-7755-4019-b8a2-6f86d1ebd57a")
@TelephonyBaseTest.tel_test_wrap
def test_airplane_mode_wifi_hotspot_4g(self):
'''
4G - Airplane mode off/on - Wi-Fi Hotspot enabled
Raises:
TestFailure if not success.
Returns:
True if pass; False if fail
'''
tasks = [(self._airplane_mode_helper, (ad, WIFI_HOTSPOT_CASE, GEN_4G))
for ad in self.android_devices]
if not multithread_func(self.log, tasks):
raise signals.TestFailure("_airplane_mode_wifi_hotspot failure: %s"
%(self.my_error_msg))
return True
@test_tracker_info(uuid="8cf3c617-4534-4b08-b31f-f702c5f8bb8b")
@TelephonyBaseTest.tel_test_wrap
def test_airplane_mode_wifi_hotspot_3g(self):
'''
3G - Airplane mode off/on - Wi-Fi Hotspot enabled
Raises:
TestFailure if not success.
Returns:
True if pass; False if fail
'''
tasks = [(self._airplane_mode_helper, (ad, WIFI_HOTSPOT_CASE, GEN_3G))
for ad in self.android_devices]
if not multithread_func(self.log, tasks):
raise signals.TestFailure("_airplane_mode_wifi_hotspot failure: %s"
%(self.my_error_msg))
return True