Merge "add test cases to TelLabGFTInOutServiceTest"
diff --git a/acts_tests/acts_contrib/test_utils/tel/GFTInOutBaseTest.py b/acts_tests/acts_contrib/test_utils/tel/GFTInOutBaseTest.py
index c7f988a..a55959a 100644
--- a/acts_tests/acts_contrib/test_utils/tel/GFTInOutBaseTest.py
+++ b/acts_tests/acts_contrib/test_utils/tel/GFTInOutBaseTest.py
@@ -27,12 +27,29 @@
import math
import re
-from acts.base_test import BaseTestClass
-from acts_contrib.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
+from acts import asserts
+from acts.test_decorators import test_info
from acts.test_decorators import test_tracker_info
from acts.logger import epoch_to_log_line_timestamp
from acts.utils import get_current_epoch_time
+from acts.base_test import BaseTestClass
+from acts_contrib.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
+
+from acts_contrib.test_utils.tel.tel_test_utils import multithread_func
+from acts_contrib.test_utils.tel.tel_test_utils import run_multithread_func
+from acts_contrib.test_utils.tel.tel_test_utils import get_service_state_by_adb
+from acts_contrib.test_utils.tel.tel_test_utils import get_screen_shot_log
+from acts_contrib.test_utils.tel.tel_test_utils import get_screen_shot_logs
+from acts_contrib.test_utils.tel.tel_test_utils import log_screen_shot
+from acts_contrib.test_utils.tel.tel_test_utils import hangup_call
+from acts_contrib.test_utils.tel.tel_test_utils import is_phone_in_call
+
+from acts_contrib.test_utils.tel.gft_inout_utils import mo_voice_call
+from acts_contrib.test_utils.tel.gft_inout_utils import get_voice_call_type
+from acts_contrib.test_utils.tel.gft_inout_utils import verify_data_connection
+from acts_contrib.test_utils.tel.gft_inout_utils import check_network_service
+
from acts_contrib.test_utils.tel.gft_inout_defines import NO_SERVICE_POWER_LEVEL
from acts_contrib.test_utils.tel.gft_inout_defines import IN_SERVICE_POWER_LEVEL
from acts_contrib.test_utils.tel.gft_inout_defines import NO_SERVICE_AREA
@@ -49,15 +66,20 @@
class GFTInOutBaseTest(TelephonyBaseTest):
def __init__(self, controllers):
TelephonyBaseTest.__init__(self, controllers)
+ self.my_error_msg = ""
def setup_test(self):
TelephonyBaseTest.setup_test(self)
+ self.my_error_msg = ""
def teardown_test(self):
TelephonyBaseTest.teardown_test(self)
begin_time = get_current_epoch_time()
self._take_bug_report(self.test_name, begin_time)
- for ad in self.android_devices:
+ for ad in self.android_devices:
+ hangup_call(self.log, ad)
+ get_screen_shot_logs(self.android_devices)
+ for ad in self.android_devices:
ad.adb.shell("rm -rf /sdcard/Pictures/screenvideo_*", ignore_status=True)
def check_network(self):
@@ -69,6 +91,7 @@
for ad in self.android_devices:
network_type_voice = ad.droid.telephonyGetCurrentVoiceNetworkType()
network_type_data = ad.droid.telephonyGetCurrentDataNetworkType()
+ service_state = get_service_state_by_adb(ad.log,ad)
sim_state = ad.droid.telephonyGetSimState()
wifi_info = ad.droid.wifiGetConnectionInfo()
if wifi_info["supplicant_state"] == "completed":
@@ -78,11 +101,12 @@
ad.log.info("sim_state=%s" %(sim_state))
ad.log.info("networkType_voice=%s" %(network_type_voice))
ad.log.info("network_type_data=%s" %(network_type_data))
-
+ ad.log.info("service_state=%s" %(service_state))
if network_type_voice == UNKNOWN:
return False
return True
+
def adjust_cellular_signal(self, power):
"""Sets the attenuation value of cellular port
@@ -97,6 +121,7 @@
self.attenuators[CELLULAR_PORT].set_atten(power)
return True
else:
+ self.log.info("Attenuator is set to False in config file")
return False
def adjust_wifi_signal(self, power):
@@ -113,6 +138,9 @@
self.attenuators[WIFI_PORT].set_atten(power)
self.attenuators[2].set_atten(power)
self.attenuators[3].set_atten(power)
+ else:
+ self.log.info("Attenuator is set to False in config file")
+ return False
return True
def adjust_attens(self, power):
@@ -206,3 +234,28 @@
self.check_network()
return True
+ def verify_device_status(self, ad, call_type=None, end_call=True, talk_time=30):
+ """verfiy device status includes network service, data connection and voice call
+
+ Args:
+ ad: android device
+ call_type: WFC call, VOLTE call. CSFB call, voice call
+ end_call: hangup call after voice call flag
+ talk_time: in call duration in sec
+
+ Returns:
+ return True if given port is set
+ """
+ test_result = True
+ tasks = [(check_network_service, (ad, )) for ad in self.android_devices]
+ if not multithread_func(self.log, tasks):
+ test_result = False
+ tasks = [(verify_data_connection, (ad, )) for ad in self.android_devices]
+ if not multithread_func(self.log, tasks):
+ test_result = False
+ if call_type != None:
+ tasks = [(mo_voice_call, (self.log, ad, call_type, end_call, talk_time))
+ for ad in self.android_devices]
+ if not multithread_func(self.log, tasks):
+ test_result = False
+ return test_result
diff --git a/acts_tests/tests/google/tel/lab/TelLabGFTInOutServiceTest.py b/acts_tests/tests/google/tel/lab/TelLabGFTInOutServiceTest.py
index 7924a77..5f04fff 100644
--- a/acts_tests/tests/google/tel/lab/TelLabGFTInOutServiceTest.py
+++ b/acts_tests/tests/google/tel/lab/TelLabGFTInOutServiceTest.py
@@ -20,6 +20,7 @@
import logging
from acts import asserts
+from acts.test_decorators import test_info
from acts.test_decorators import test_tracker_info
from acts.base_test import BaseTestClass
@@ -34,6 +35,13 @@
from acts_contrib.test_utils.tel.tel_test_utils import get_screen_shot_logs
from acts_contrib.test_utils.tel.tel_test_utils import log_screen_shot
from acts_contrib.test_utils.tel.tel_test_utils import hangup_call
+from acts_contrib.test_utils.tel.tel_test_utils import active_file_download_test
+
+from acts_contrib.test_utils.tel.tel_data_utils import wait_for_cell_data_connection
+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.gft_inout_utils import get_voice_call_type
from acts_contrib.test_utils.tel.tel_defines import DATA_STATE_CONNECTED
from acts_contrib.test_utils.tel.tel_defines import DATA_STATE_DISCONNECTED
@@ -43,11 +51,6 @@
from acts_contrib.test_utils.tel.tel_defines import SERVICE_STATE_OUT_OF_SERVICE
from acts_contrib.test_utils.tel.tel_defines import SERVICE_STATE_POWER_OFF
-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.gft_inout_utils import get_voice_call_type
-
from acts_contrib.test_utils.tel.gft_inout_defines import VOICE_CALL
from acts_contrib.test_utils.tel.gft_inout_defines import VOLTE_CALL
from acts_contrib.test_utils.tel.gft_inout_defines import CSFB_CALL
@@ -62,15 +65,24 @@
from acts_contrib.test_utils.tel.gft_inout_defines import WAIT_FOR_SERVICE_TIME
+IDLE_CASE = 1
+DATA_TRANSFER_CASE = 2
+PDP_OFF_CASE = 3
+IN_CALL_CASE = 4
+CALL_DATA_CASE = 5
+
class TelLabGFTInOutServiceTest(GFTInOutBaseTest):
def __init__(self, controllers):
GFTInOutBaseTest.__init__(self, controllers)
+ self.my_error_msg = ""
def setup_test(self):
self.adjust_cellular_signal(IN_SERVICE_POWER_LEVEL)
self.adjust_wifi_signal(IN_SERVICE_POWER_LEVEL)
GFTInOutBaseTest.setup_test(self)
self.check_network()
+ self.my_error_msg = ""
+
@test_tracker_info(uuid="c602e556-8273-4c75-b8fa-4d51ba514654")
@TelephonyBaseTest.tel_test_wrap
@@ -135,13 +147,247 @@
"""
return self._test_in_out_service_idle(idle_time)
- def _test_in_out_service_idle(self, idle_time, loop=1):
+
+ @test_tracker_info(uuid="65ebac02-8d5a-48c2-bd26-6d931d6048f1")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_no_service_data_transfer_1min(self, idle_time=60):
+ """ In/Out service - Stationary data transfer - 1 min
+ UE is performing data transfer (E.g. Use FTP or browse tools)
+ move UE from coverage area to no service area and UE shows no service
+ Wait for 1 min, then re-enter coverage area
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, DATA_TRANSFER_CASE)
+
+
+ @test_tracker_info(uuid="ec3e7de4-bcf6-4a8a-ae04-868bd7925191")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_no_service_data_transfer_2min(self, idle_time=120):
+ """ In/Out service - Stationary data transfer - 2 min
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, DATA_TRANSFER_CASE)
+
+
+ @test_tracker_info(uuid="8bd7017d-0a88-4423-a94b-1e37060bba1d")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_no_service_data_transfer_5min(self, idle_time=300):
+ """ In/Out service - Stationary data transfer - 5 min
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, DATA_TRANSFER_CASE)
+
+
+ @test_tracker_info(uuid="c3b9c52d-41d3-449c-99ff-4bb830ca0219")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_no_service_data_transfer_10min(self, idle_time=600):
+ """ In/Out service - Stationary data transfer - 10 min
+
+ Args:
+ idle_time: idle time in service area
+ file_name: download filename
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, DATA_TRANSFER_CASE)
+
+
+ @test_tracker_info(uuid="86a6b3b3-e754-4bde-b418-d4273b1ad907")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_service_incall_1min(self, idle_time=60):
+ """ In/Out service - Stationary incall - 1 min
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, IN_CALL_CASE)
+
+
+ @test_tracker_info(uuid="0f8772cd-6f86-48eb-b583-4cbaf80a21a9")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_service_incall_2min(self, idle_time=120):
+ """ In/Out service - Stationary incall - 2 min
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, IN_CALL_CASE)
+
+
+ @test_tracker_info(uuid="11f24c0f-db33-4eb3-b847-9aed447eb820")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_service_incall_5min(self, idle_time=300):
+ """ In/Out service - Stationary incall - 5 min
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, IN_CALL_CASE)
+
+
+ @test_tracker_info(uuid="e318921b-de6b-428b-b2c4-3db7786d7558")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_service_incall_10min(self, idle_time=600):
+ """ In/Out service - Stationary incall - 10 min
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, IN_CALL_CASE)
+
+
+ @test_tracker_info(uuid="f6cf0019-e123-4ebd-990b-0fa5b236840c")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_service_call_date_1min(self, idle_time=60):
+ """ In/Out service - Stationary incall + data transfer - 1 mins
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, CALL_DATA_CASE)
+
+
+ @test_tracker_info(uuid="2f49a9de-0383-4ec6-a8ee-c62f52ea0cf2")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_service_call_date_2min(self, idle_time=120):
+ """ In/Out service - Stationary incall + data transfer - 2 mins
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, CALL_DATA_CASE)
+
+
+ @test_tracker_info(uuid="73a6eedb-791f-4486-b815-8067a95efd5c")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_service_call_date_5min(self, idle_time=300):
+ """ In/Out service - Stationary incall + data transfer - 5 mins
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, CALL_DATA_CASE)
+
+ @test_tracker_info(uuid="5cfbc90a-97e1-43e9-a69e-4ce2815c544d")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_service_call_date_10min(self, idle_time=600):
+ """ In/Out service - Stationary incall + data transfer - 10 mins
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, CALL_DATA_CASE)
+
+
+
+ @test_tracker_info(uuid="c70180c9-5a36-4dc5-9ccc-3e6c0b5e6d37")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_service_pdp_off_1min(self, idle_time=60):
+ """ In/Out service - Stationary data off - 1 min
+ Disable UE mobile data
+ Move UE from coverage area to no service area and UE shows no service
+ Wait for 1 min, then re-enter coverage area
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, PDP_OFF_CASE)
+
+
+ @test_tracker_info(uuid="50cc8e73-d96f-45a6-91cd-bf51de5241d2")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_service_pdp_off_2min(self, idle_time=120):
+ """ In/Out service - Stationary data off - 2 min
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, PDP_OFF_CASE)
+
+
+ @test_tracker_info(uuid="1f25d40c-1bfe-4d18-b57c-d7be69664f0d")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_service_pdp_off_5min(self, idle_time=300):
+ """ In/Out service - Stationary data off - 5 min
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, PDP_OFF_CASE)
+
+
+ @test_tracker_info(uuid="b076b0d0-a105-4be9-aa0b-db0d782f70f2")
+ @TelephonyBaseTest.tel_test_wrap
+ def test_in_out_service_pdp_off_10min(self, idle_time=600):
+ """ In/Out service - Stationary data off - 10 min
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ return self._test_in_out_service_idle(idle_time, PDP_OFF_CASE)
+
+
+
+ def _test_in_out_service_idle(self, idle_time, case= IDLE_CASE, loop=1):
""" UE is in idle
Move UE from coverage area to no service area and UE shows no service
Args:
- loop: cycle
idle_time: idle time in service area
-
+ case: include IDLE_CAS, DATA_TRANSFER_CASE, PDP_OFF_CASE,
+ IN_CALL_CASE, CALL_DATA_CASE
+ loop: cycle
Returns:
True if pass; False if fail.
"""
@@ -151,13 +397,28 @@
for x in range (loop):
self.log.info("%s loop: %s/%s" %(self.current_test_name,x+1, loop))
- if not self._in_out_service_idle(idle_time):
- test_result = False
+ if case == IDLE_CASE:
+ if not self._in_out_service_idle_only(idle_time):
+ test_result = False
+ elif case == DATA_TRANSFER_CASE:
+ if not self._data_transfer_mode(idle_time):
+ test_result = False
+ elif case == PDP_OFF_CASE:
+ if not self._in_out_service_pdp_off(idle_time):
+ test_result = False
+ elif case == IN_CALL_CASE:
+ if not self._in_call_in_out_service(idle_time):
+ test_result = False
+ elif case == CALL_DATA_CASE:
+ if not self._call_data_in_out_service(idle_time):
+ test_result = False
+ asserts.assert_true(test_result, "Fail: %s." %(self.my_error_msg),
+ extras={"failure_cause": self.my_error_msg})
return test_result
- def _in_out_service_idle(self, no_service_time=60, check_back_to_service=True,
- check_no_service=True):
+ def _in_out_service_idle_only(self, no_service_time=60, check_back_to_service=True,
+ check_no_service=True):
""" Move UE from coverage area to no service area and UE shows no service
Wait for no_service_time sec , then re-enter coverage area
@@ -170,14 +431,16 @@
True if pass; False if fail.
"""
test_result = True
+ error_msg = ""
for ad in self.android_devices:
network_type = ad.droid.telephonyGetNetworkType()
service_state = get_service_state_by_adb(self.log,ad)
ad.log.info("service_state=%s. network_type=%s"
%(service_state ,network_type))
if service_state != SERVICE_STATE_IN_SERVICE:
- ad.log.info("Device is not ready for AutoIO test. service_state=%s."
- %(service_state))
+ error_msg = "Device is not ready for test. Service_state=%s." %(service_state)
+ ad.log.info("Device is not ready for test. Service_state=%s." %(service_state))
+ self.my_error_msg += error_msg
return False
self.log.info("Move UE from coverage area to no service area")
@@ -186,17 +449,132 @@
if check_no_service:
tasks = [(check_no_service_time, (ad, )) for ad in self.android_devices]
if not multithread_func(self.log, tasks):
- self.log.info("Device does not become no service")
+ self.check_network()
+ error_msg = "Device does not become no service"
+ self.my_error_msg += error_msg
+ self.log.info(error_msg)
return False
else:
self.log.info("wait for %s sec in no/limited service area" %(no_service_time))
time.sleep(no_service_time)
self.log.info("Move UE back to service area")
self.adjust_cellular_signal(IN_SERVICE_POWER_LEVEL)
+ if check_back_to_service:
+ test_result = self._check_after_no_service()
+ return test_result
- if test_result:
- if check_back_to_service:
- tasks = [(check_back_to_service_time, (ad,)) for ad in self.android_devices]
- test_result = multithread_func(self.log, tasks)
- self.log.info("Device is not back to the service")
- return test_result
\ No newline at end of file
+ def _data_transfer_mode(self, idle_time, file_name="10MB"):
+ """ Download file and in/out service
+
+ Args:
+ idle_time: stay at no service area time in sec
+ file_name: file to be download
+
+ Returns:
+ True if pass; False if fail.
+ """
+ error_msg =""
+ tasks_a = [(self._in_out_service_idle_only, (idle_time, False,))]
+ tasks_b = [(active_file_download_test, (self.log, ad, file_name))
+ for ad in self.android_devices]
+ tasks_b.extend(tasks_a)
+ if not multithread_func(self.log, tasks_b):
+ error_msg = " data transfer fail. "
+ self.my_error_msg += error_msg
+ self.log.info(error_msg)
+ return False
+ return self._check_after_no_service()
+
+ def _in_out_service_pdp_off(self, idle_time):
+ """ UE is in idle
+ Disable UE mobile data
+ Move UE from coverage area to no/limited service area
+ enable UE mobile data
+ After UE show no service, re-enter coverage area
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ error_msg =""
+ for ad in self.android_devices:
+ 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._in_out_service_idle_only(idle_time, False):
+ return False
+
+ for ad in self.android_devices:
+ 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
+ return self._check_after_no_service()
+
+ def _in_call_in_out_service(self, idle_time):
+ """ UE is in call
+ Move UE from coverage area to no/limited service area
+ After UE show no service, re-enter coverage area
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ error_msg = ""
+ tasks = [(mo_voice_call, (self.log, ad, VOICE_CALL, False)) for ad in self.android_devices]
+ if not multithread_func(self.log, tasks):
+ error_msg = "MO voice call fail"
+ self.my_error_msg += error_msg
+ self.log.info(error_msg)
+ return False
+
+ if not self._in_out_service_idle_only(idle_time, False):
+ return False
+ return self._check_after_no_service()
+
+ def _call_data_in_out_service(self, idle_time):
+ """ UE is performing data transfer (E.g. Use FTP or browse tools)
+ UE makes a MO call
+ Move UE from coverage area to no/limited service area
+ After UE show no service, re-enter coverage area
+
+ Args:
+ idle_time: idle time in service area
+
+ Returns:
+ True if pass; False if fail.
+ """
+ tasks_a = [(active_file_download_test, (self.log, ad, )) for ad in self.android_devices]
+ tasks_b= [(mo_voice_call, (self.log, ad, VOICE_CALL, False)) for ad in self.android_devices]
+ tasks_b.extend(tasks_a)
+ if not multithread_func(self.log, tasks_b):
+ error_msg = "fail to perfrom data transfer/voice call"
+ self.my_error_msg += error_msg
+ return False
+
+ if not self._in_out_service_idle_only(idle_time, False):
+ return False
+ return self._check_after_no_service()
+
+ def _check_after_no_service(self):
+ """ check device is back to service or not
+
+ Returns:
+ True if pass; False if fail.
+ """
+ tasks = [(check_back_to_service_time, (ad,)) for ad in self.android_devices]
+ if not multithread_func(self.log, tasks):
+ error_msg = "Device is not back to the service"
+ self.my_error_msg += error_msg
+ self.log.info(error_msg)
+ return False
+ return True