Remove duplicate code in Nsa5gVoiceTest.

1. Move _test_call_setup_in_active_data_transfer,
        _test_call_setup_in_active_youtube_video,
        _call_epdg_to_epdg_wfc from TelLiveVoiceTest to tel_data_utils
2. Remove _test_call_setup_in_active_data_transfer_5g_nsa,
          _test_call_setup_in_active_youtube_video_5g_nsa,
          _test_call_epdg_to_epdg_wfc_5g_nsa from Nsa5gVoiceTest
3. Update Nsa5gVoiceTest, TelLiveVoiceTest accordingly.

Test: yes, Chunghwa telecom
Bug: 179409496
Change-Id: I3e08f212bcd964403abf7c28b5eed0275b777d85
diff --git a/acts_tests/tests/google/nr/nsa5g/Nsa5gVoiceTest.py b/acts_tests/tests/google/nr/nsa5g/Nsa5gVoiceTest.py
index bbe950e..a1e7a64 100755
--- a/acts_tests/tests/google/nr/nsa5g/Nsa5gVoiceTest.py
+++ b/acts_tests/tests/google/nr/nsa5g/Nsa5gVoiceTest.py
@@ -23,9 +23,6 @@
 from acts.utils import adb_shell_ping
 from acts_contrib.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
 from acts_contrib.test_utils.tel.tel_defines import WAIT_TIME_IN_CALL_FOR_IMS
-from acts_contrib.test_utils.tel.tel_defines import WAIT_TIME_IN_CALL
-from acts_contrib.test_utils.tel.tel_defines import CALL_STATE_ACTIVE
-from acts_contrib.test_utils.tel.tel_defines import CALL_STATE_HOLDING
 from acts_contrib.test_utils.tel.tel_defines import DIRECTION_MOBILE_ORIGINATED
 from acts_contrib.test_utils.tel.tel_defines import DIRECTION_MOBILE_TERMINATED
 from acts_contrib.test_utils.tel.tel_defines import WAIT_TIME_ANDROID_STATE_SETTLING
@@ -35,24 +32,13 @@
 from acts_contrib.test_utils.tel.tel_test_utils import call_setup_teardown
 from acts_contrib.test_utils.tel.tel_test_utils import hangup_call
 from acts_contrib.test_utils.tel.tel_test_utils import multithread_func
-from acts_contrib.test_utils.tel.tel_test_utils import num_active_calls
-from acts_contrib.test_utils.tel.tel_test_utils import verify_incall_state
-from acts_contrib.test_utils.tel.tel_test_utils import verify_internet_connection
-from acts_contrib.test_utils.tel.tel_test_utils import start_youtube_video
-from acts_contrib.test_utils.tel.tel_test_utils import wait_for_cell_data_connection
-from acts_contrib.test_utils.tel.tel_test_utils import active_file_download_task
-from acts_contrib.test_utils.tel.tel_test_utils import run_multithread_func
-from acts_contrib.test_utils.tel.tel_test_utils import wait_for_state
 from acts_contrib.test_utils.tel.tel_test_utils import is_phone_in_call_active
-from acts_contrib.test_utils.tel.tel_test_utils import toggle_airplane_mode
 from acts_contrib.test_utils.tel.tel_voice_utils import phone_setup_volte
-from acts_contrib.test_utils.tel.tel_voice_utils import hold_unhold_test
 from acts_contrib.test_utils.tel.tel_voice_utils import phone_setup_call_hold_unhold_test
 from acts_contrib.test_utils.tel.tel_voice_utils import is_phone_in_call_volte
 from acts_contrib.test_utils.tel.tel_voice_utils import two_phone_call_short_seq
 from acts_contrib.test_utils.tel.tel_voice_utils import phone_setup_voice_3g
 from acts_contrib.test_utils.tel.tel_voice_utils import is_phone_in_call_3g
-from acts_contrib.test_utils.tel.tel_voice_utils import phone_idle_iwlan
 from acts_contrib.test_utils.tel.tel_voice_utils import is_phone_in_call_iwlan
 from acts_contrib.test_utils.tel.tel_voice_utils import phone_setup_iwlan
 from acts_contrib.test_utils.tel.tel_5g_utils import set_preferred_mode_for_5g
@@ -61,6 +47,9 @@
 from acts_contrib.test_utils.tel.tel_5g_utils import verify_5g_attach_for_both_devices
 from acts_contrib.test_utils.tel.tel_5g_utils import is_current_network_5g_nsa
 from acts_contrib.test_utils.tel.tel_data_utils import wifi_cell_switching
+from acts_contrib.test_utils.tel.tel_data_utils import test_call_setup_in_active_data_transfer
+from acts_contrib.test_utils.tel.tel_data_utils import test_call_setup_in_active_youtube_video
+from acts_contrib.test_utils.tel.tel_data_utils import call_epdg_to_epdg_wfc
 
 
 class Nsa5gVoiceTest(TelephonyBaseTest):
@@ -75,244 +64,6 @@
     def teardown_test(self):
         ensure_phones_idle(self.log, self.android_devices)
 
-
-    def _test_call_setup_in_active_data_transfer_5g_nsa(
-            self,
-            new_gen=None,
-            call_direction=DIRECTION_MOBILE_ORIGINATED,
-            allow_data_transfer_interruption=False):
-        """Test call can be established during active data connection in 5G NSA.
-
-        Turn off airplane mode, disable WiFi, enable Cellular Data.
-        Make sure phone in 5G NSA.
-        Starting downloading file from Internet.
-        Initiate a voice call. Verify call can be established.
-        Hangup Voice Call, verify file is downloaded successfully.
-        Note: file download will be suspended when call is initiated if voice
-              is using voice channel and voice channel and data channel are
-              on different RATs.
-
-        Returns:
-            True if success.
-            False if failed.
-        """
-        ads = self.android_devices
-
-        def _call_setup_teardown(log, ad_caller, ad_callee, ad_hangup,
-                                 caller_verifier, callee_verifier,
-                                 wait_time_in_call):
-            #wait time for active data transfer
-            time.sleep(5)
-            return call_setup_teardown(log, ad_caller, ad_callee, ad_hangup,
-                                       caller_verifier, callee_verifier,
-                                       wait_time_in_call)
-
-        # Mode Pref
-        set_preferred_mode_for_5g(ads[0])
-
-        # Attach nsa5g
-        if not is_current_network_5g_nsa(ads[0]):
-            ads[0].log.error("Phone not attached on 5G NSA before call.")
-            return False
-
-        if new_gen:
-            ads[0].droid.telephonyToggleDataConnection(True)
-            if not wait_for_cell_data_connection(self.log, ads[0], True):
-                ads[0].log.error("Data connection is not on cell")
-                return False
-
-        if not verify_internet_connection(self.log, ads[0]):
-            ads[0].log.error("Internet connection is not available")
-            return False
-
-        if call_direction == DIRECTION_MOBILE_ORIGINATED:
-            ad_caller = ads[0]
-            ad_callee = ads[1]
-        else:
-            ad_caller = ads[1]
-            ad_callee = ads[0]
-        ad_download = ads[0]
-
-        start_youtube_video(ad_download)
-        call_task = (_call_setup_teardown, (self.log, ad_caller, ad_callee,
-                                            ad_caller, None, None, 30))
-        download_task = active_file_download_task(self.log, ad_download, file_name="10MB")
-        results = run_multithread_func(self.log, [download_task, call_task])
-        if wait_for_state(ad_download.droid.audioIsMusicActive, True, 15, 1):
-            ad_download.log.info("After call hangup, audio is back to music")
-        else:
-            ad_download.log.warning(
-                "After call hang up, audio is not back to music")
-        ad_download.force_stop_apk("com.google.android.youtube")
-        if not results[1]:
-            self.log.error("Call setup failed in active data transfer.")
-            return False
-        if results[0]:
-            ad_download.log.info("Data transfer succeeded.")
-        elif not allow_data_transfer_interruption:
-            ad_download.log.error(
-                "Data transfer failed with parallel phone call.")
-            return False
-        else:
-            ad_download.log.info("Retry data connection after call hung up")
-            if not verify_internet_connection(self.log, ad_download):
-                ad_download.log.error("Internet connection is not available")
-                return False
-        if not is_current_network_5g_nsa(ads[0]):
-            ads[0].log.error("Phone not attached on 5G NSA after call.")
-            return False
-        return True
-
-    def _test_call_setup_in_active_youtube_video_5g_nsa(
-            self,
-            new_gen=None,
-            call_direction=DIRECTION_MOBILE_ORIGINATED,
-            allow_data_transfer_interruption=False):
-        """Test call can be established during active data connection on 5G NSA.
-
-        Setup phoneA on 5G NSA.
-        Make sure phoneA on 5G NSA
-        Starting playing youtube video.
-        Initiate a voice call. Verify call can be established.
-        Make sure phoneA on 5G NSA
-
-        Returns:
-            True if success.
-            False if failed.
-        """
-        ads = self.android_devices
-        # Mode Pref
-        set_preferred_mode_for_5g(ads[0])
-
-        # Attach 5g
-        if not is_current_network_5g_nsa(ads[0]):
-            ads[0].log.error("Phone not attached on 5G NSA before call.")
-            return False
-
-        if new_gen:
-            ads[0].droid.telephonyToggleDataConnection(True)
-            if not wait_for_cell_data_connection(self.log, ads[0], True):
-                ads[0].log.error("Data connection is not on cell")
-                return False
-
-        if not verify_internet_connection(self.log, ads[0]):
-            ads[0].log.error("Internet connection is not available")
-            return False
-
-        if call_direction == DIRECTION_MOBILE_ORIGINATED:
-            ad_caller = ads[0]
-            ad_callee = ads[1]
-        else:
-            ad_caller = ads[1]
-            ad_callee = ads[0]
-        ad_download = ads[0]
-
-        if not start_youtube_video(ad_download):
-            ad_download.log.warning("Fail to bring up youtube video")
-
-        if not call_setup_teardown(self.log, ad_caller, ad_callee, ad_caller,
-                                   None, None, 30):
-            ad_download.log.error("Call setup failed in active youtube video")
-            result = False
-        else:
-            ad_download.log.info("Call setup succeed in active youtube video")
-            result = True
-
-        if wait_for_state(ad_download.droid.audioIsMusicActive, True, 15, 1):
-            ad_download.log.info("After call hangup, audio is back to music")
-        else:
-            ad_download.log.warning(
-                "After call hang up, audio is not back to music")
-        ad_download.force_stop_apk("com.google.android.youtube")
-        if not is_current_network_5g_nsa(ads[0]):
-            ads[0].log.error("Phone not attached on 5G NSA after call.")
-            result = False
-        return result
-
-    def _test_call_epdg_to_epdg_wfc_5g_nsa(self,
-                                      ads,
-                                      apm_mode,
-                                      wfc_mode,
-                                      wifi_ssid,
-                                      wifi_pwd):
-        """ Test epdg<->epdg call functionality on 5G NSA.
-
-        Set PhoneA/PhoneB on 5G NSA
-        Make sure PhoneA/PhoneB on 5G NSA before testing
-        Make Sure PhoneA is set to make epdg call.
-        Make Sure PhoneB is set to make epdg call.
-        Call from PhoneA to PhoneB, accept on PhoneB, hang up on PhoneA.
-        Call from PhoneA to PhoneB, accept on PhoneB, hang up on PhoneB.
-        Make sure PhoneA/PhoneB on 5G NSA after testing
-
-        Args:
-            ads: list of android objects, this list should have two ad.
-            apm_mode: phones' airplane mode.
-                if True, phones are in airplane mode during test.
-                if False, phones are not in airplane mode during test.
-            wfc_mode: phones' wfc mode.
-                Valid mode includes: WFC_MODE_WIFI_ONLY, WFC_MODE_CELLULAR_PREFERRED,
-                WFC_MODE_WIFI_PREFERRED, WFC_MODE_DISABLED.
-            wifi_ssid: WiFi ssid to connect during test.
-            wifi_pwd: WiFi password.
-
-        Returns:
-            True if pass; False if fail.
-        """
-        DEFAULT_PING_DURATION = 120  # in seconds
-
-        # if apm_mode is true, turn off apm first before setting network
-        # preferred mode to 5G NSA.
-        if apm_mode:
-            # Turn off airplane mode
-            self.log.info("Turn off APM mode before starting testing.")
-            tasks = [(toggle_airplane_mode, (self.log, ads[0], False)),
-                     (toggle_airplane_mode, (self.log, ads[1], False))]
-            if not multithread_func(self.log, tasks):
-                self.log.error("Failed to turn off airplane mode")
-                return False
-
-        if not provision_both_devices_for_5g(self.log, ads):
-            return False
-
-        if not verify_5g_attach_for_both_devices(self.log, ads):
-            self.log.error("Phone not attached on 5G NSA before epdg call.")
-            return False
-
-        tasks = [(phone_setup_iwlan, (self.log, ads[0], apm_mode, wfc_mode,
-                                      wifi_ssid, wifi_pwd)),
-                 (phone_setup_iwlan, (self.log, ads[1], apm_mode, wfc_mode,
-                                      wifi_ssid, wifi_pwd))]
-        if not multithread_func(self.log, tasks):
-            self.log.error("Phone Failed to Set Up Properly.")
-            return False
-
-        time.sleep(WAIT_TIME_ANDROID_STATE_SETTLING)
-
-        ad_ping = ads[0]
-
-        call_task = (two_phone_call_short_seq,
-                     (self.log, ads[0], phone_idle_iwlan,
-                      is_phone_in_call_iwlan, ads[1], phone_idle_iwlan,
-                      is_phone_in_call_iwlan, None, WAIT_TIME_IN_CALL_FOR_IMS))
-        ping_task = (adb_shell_ping, (ad_ping, DEFAULT_PING_DURATION))
-
-        results = run_multithread_func(self.log, [ping_task, call_task])
-
-        time.sleep(WAIT_TIME_ANDROID_STATE_SETTLING)
-
-        if not verify_5g_attach_for_both_devices(self.log, ads):
-            self.log.error("Phone not attached on 5G NSA after epdg call.")
-            return False
-
-        if not results[1]:
-            self.log.error("Call setup failed in active ICMP transfer.")
-        if results[0]:
-            self.log.info("ICMP transfer succeeded with parallel phone call.")
-        else:
-            self.log.error("ICMP transfer failed with parallel phone call.")
-        return all(results)
-
     """ Tests Begin """
 
     @test_tracker_info(uuid="1bef3da1-4608-4b0e-8b78-f3f7be0115d5")
@@ -487,9 +238,10 @@
         if not phone_setup_volte(self.log, ads[0]):
             ads[0].log.error("failed to setup volte")
             return False
-        return self._test_call_setup_in_active_data_transfer_5g_nsa(
-            GEN_5G,
-            DIRECTION_MOBILE_ORIGINATED)
+        return test_call_setup_in_active_data_transfer(self.log,
+                                                       ads,
+                                                       GEN_5G,
+                                                       DIRECTION_MOBILE_ORIGINATED)
 
 
     @test_tracker_info(uuid="aaa98e51-0bde-472a-abc3-5dc180f56a08")
@@ -514,9 +266,10 @@
         if not phone_setup_volte(self.log, ads[0]):
             ads[0].log.error("failed to setup volte")
             return False
-        return self._test_call_setup_in_active_data_transfer_5g_nsa(
-            GEN_5G,
-            DIRECTION_MOBILE_TERMINATED)
+        return test_call_setup_in_active_data_transfer(self.log,
+                                                       ads,
+                                                       GEN_5G,
+                                                       DIRECTION_MOBILE_TERMINATED)
 
 
     @test_tracker_info(uuid="3a607dee-7e92-4567-8ca0-05099590b773")
@@ -596,9 +349,13 @@
         Returns:
             True if pass; False if fail.
         """
-        return self._test_call_epdg_to_epdg_wfc_5g_nsa(
-            self.android_devices, False, WFC_MODE_WIFI_PREFERRED,
-            self.wifi_network_ssid, self.wifi_network_pass)
+        return call_epdg_to_epdg_wfc(self.log,
+                                     self.android_devices,
+                                     False,
+                                     WFC_MODE_WIFI_PREFERRED,
+                                     self.wifi_network_ssid,
+                                     self.wifi_network_pass,
+                                     GEN_5G)
 
 
     @test_tracker_info(uuid="29fa7f44-8d6a-4948-8178-33c9a9aab334")
@@ -620,9 +377,10 @@
         if not phone_setup_volte(self.log, self.android_devices[0]):
             self.android_devices[0].log.error("Failed to setup VoLTE")
             return False
-        return self._test_call_setup_in_active_youtube_video_5g_nsa(
-            GEN_5G,
-            DIRECTION_MOBILE_ORIGINATED)
+        return test_call_setup_in_active_youtube_video(self.log,
+                                                       self.android_devices,
+                                                       GEN_5G,
+                                                       DIRECTION_MOBILE_ORIGINATED)
 
     @test_tracker_info(uuid="4e138477-3536-48bd-ab8a-7fb7c228b3e6")
     @TelephonyBaseTest.tel_test_wrap
@@ -643,9 +401,10 @@
         if not phone_setup_volte(self.log, self.android_devices[0]):
             self.android_devices[0].log.error("Failed to setup VoLTE")
             return False
-        return self._test_call_setup_in_active_youtube_video_5g_nsa(
-            GEN_5G,
-            DIRECTION_MOBILE_TERMINATED)
+        return test_call_setup_in_active_youtube_video(self.log,
+                                                       self.android_devices,
+                                                       GEN_5G,
+                                                       DIRECTION_MOBILE_TERMINATED)
 
 
     @test_tracker_info(uuid="0d477f6f-3464-4b32-a5e5-0fd134f2753d")