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