Adding a test which performs data connection network switching during VoLTE call in 5G NSA.

The test verfiies data connection in the following network conditions,
  1. Airplane Off, WiFi On, Data On.
  2. WiFi is Off, Data is on Cell.
  3. WiFi is On, Data is on WiFi.
  4. WiFi is Off, Data is on Cell.

Test: Yes, Taiwan CHT Telecomm
Bug: 171140970
Change-Id: I21f5a1b290f18bf54e4a63397e5c7c6bee9b5175
diff --git a/acts_tests/acts_contrib/test_utils/tel/tel_5g_utils.py b/acts_tests/acts_contrib/test_utils/tel/tel_5g_utils.py
index e3ffe19..5e28946 100644
--- a/acts_tests/acts_contrib/test_utils/tel/tel_5g_utils.py
+++ b/acts_tests/acts_contrib/test_utils/tel/tel_5g_utils.py
@@ -33,6 +33,11 @@
 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 phone_setup_iwlan
+from acts_contrib.test_utils.tel.tel_test_utils import start_youtube_video
+from acts_contrib.test_utils.tel.tel_test_utils import wifi_toggle_state
+from acts_contrib.test_utils.tel.tel_test_utils import wait_for_wifi_data_connection
+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 verify_internet_connection
 
 
 def is_current_network_5g_nsa(ad, timeout=30):
@@ -166,4 +171,70 @@
         sub_id = ad.droid.subscriptionGetDefaultSubId()
     if mode is None:
         mode = NETWORK_MODE_NR_LTE_GSM_WCDMA
-    return set_preferred_network_mode_pref(ad.log, ad, sub_id, mode)
\ No newline at end of file
+    return set_preferred_network_mode_pref(ad.log, ad, sub_id, mode)
+
+
+def wifi_cell_switching_for_5g_nsa(log, ad, wifi_network_ssid, wifi_network_pass):
+    """Test data connection network switching under 5G NSA.
+
+    Ensure WiFi can connect to live network,
+    Airplane mode is off, data connection is on, WiFi is on.
+    Turn off WiFi, verify data is on cell and browse to google.com is OK.
+    Turn on WiFi, verify data is on WiFi and browse to google.com is OK.
+    Turn off WiFi, verify data is on cell and browse to google.com is OK.
+
+    Args:
+        log: log object.
+        ad: android object.
+        wifi_network_ssid: ssid for live wifi network.
+        wifi_network_pass: password for live wifi network.
+
+    Returns:
+        True if pass.
+    """
+    try:
+
+        start_youtube_video(ad)
+        # Ensure WiFi can connect to live network
+        ad.log.info("Make sure phone can connect to live network by WIFI")
+        if not ensure_wifi_connected(log, ad, wifi_network_ssid,
+                                     wifi_network_pass):
+            ad.log.error("WiFi connect fail.")
+            return False
+        log.info("Phone connected to WIFI.")
+
+        log.info("Step1 Airplane Off, WiFi On, Data On.")
+        toggle_airplane_mode(log, ad, False)
+        wifi_toggle_state(log, ad, True)
+        ad.droid.telephonyToggleDataConnection(True)
+        if (not wait_for_wifi_data_connection(log, ad, True)
+                or not verify_internet_connection(log, ad)):
+            ad.log.error("Data is not on WiFi")
+            return False
+
+        log.info("Step2 WiFi is Off, Data is on Cell.")
+        wifi_toggle_state(log, ad, False)
+        if (not wait_for_cell_data_connection(log, ad, True)
+                or not verify_internet_connection(log, ad)):
+            ad.log.error("Data did not return to cell")
+            return False
+
+        log.info("Step3 WiFi is On, Data is on WiFi.")
+        wifi_toggle_state(log, ad, True)
+        if (not wait_for_wifi_data_connection(log, ad, True)
+                or not verify_internet_connection(log, ad)):
+            ad.log.error("Data did not return to WiFi")
+            return False
+
+        log.info("Step4 WiFi is Off, Data is on Cell.")
+        wifi_toggle_state(log, ad, False)
+        if (not wait_for_cell_data_connection(log, ad, True)
+                or not verify_internet_connection(log, ad)):
+            ad.log.error("Data did not return to cell")
+            return False
+        return True
+
+    finally:
+        ad.force_stop_apk("com.google.android.youtube")
+        wifi_toggle_state(log, ad, False)
+
diff --git a/acts_tests/tests/google/nr/nsa5g/Nsa5gVoiceTest.py b/acts_tests/tests/google/nr/nsa5g/Nsa5gVoiceTest.py
index 3220663..651f185 100755
--- a/acts_tests/tests/google/nr/nsa5g/Nsa5gVoiceTest.py
+++ b/acts_tests/tests/google/nr/nsa5g/Nsa5gVoiceTest.py
@@ -27,10 +27,9 @@
 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
 from acts_contrib.test_utils.tel.tel_test_utils import ensure_phones_idle
-from acts_contrib.test_utils.tel.tel_test_utils import ensure_wifi_connected
 from acts_contrib.test_utils.tel.tel_test_utils import call_setup_teardown
-from acts_contrib.test_utils.tel.tel_test_utils import toggle_airplane_mode
 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
@@ -41,12 +40,13 @@
 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_voice_utils import phone_setup_volte
 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_5g_utils import is_current_network_5g_nsa
+from acts_contrib.test_utils.tel.tel_5g_utils import is_current_network_5g_nsa, wifi_cell_switching_for_5g_nsa
 from acts_contrib.test_utils.tel.tel_5g_utils import set_preferred_mode_for_5g
 from acts_contrib.test_utils.tel.tel_5g_utils import provision_both_devices_for_5g
 from acts_contrib.test_utils.tel.tel_5g_utils import provision_both_devices_for_volte
@@ -200,7 +200,6 @@
             else:
                 return True
 
-
     """ Tests Begin """
 
     @test_tracker_info(uuid="1bef3da1-4608-4b0e-8b78-f3f7be0115d5")
@@ -439,4 +438,65 @@
             DIRECTION_MOBILE_TERMINATED)
 
 
+    @test_tracker_info(uuid="3a607dee-7e92-4567-8ca0-05099590b773")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_5g_nsa_volte_in_call_wifi_toggling(self):
+        """ Test data connection network switching during VoLTE call in 5G NSA.
+
+        1. Make Sure PhoneA in VoLTE.
+        2. Make Sure PhoneB in VoLTE.
+        3. Make sure Phones are in 5G NSA
+        4. Call from PhoneA to PhoneB.
+        5. Toggling Wifi connection in call.
+        6. Verify call is active.
+        7. Hung up the call on PhoneA
+        8. Make sure Phones are in 5G NSA
+
+        Returns:
+            True if pass; False if fail.
+        """
+        ads = self.android_devices
+        result = True
+        if not provision_both_devices_for_volte(self.log, ads):
+            return False
+
+        time.sleep(WAIT_TIME_ANDROID_STATE_SETTLING)
+
+        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 call.")
+            return False
+
+        if not call_setup_teardown(self.log, ads[0], ads[1], None, None, None,
+                                   5):
+            self.log.error("Call setup failed")
+            return False
+        else:
+            self.log.info("Call setup succeed")
+
+        if not wifi_cell_switching_for_5g_nsa(self.log, ads[0], self.wifi_network_ssid,
+                                              self.wifi_network_pass):
+            ads[0].log.error("Failed to do WIFI and Cell switch in call")
+            result = False
+
+        if not is_phone_in_call_active(ads[0]):
+            return False
+        else:
+            if not ads[0].droid.telecomCallGetAudioState():
+                ads[0].log.error("Audio is not on call")
+                result = False
+            else:
+                ads[0].log.info("Audio is on call")
+            hangup_call(self.log, ads[0])
+
+            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 call.")
+                return False
+            return result
+
+
     """ Tests End """
\ No newline at end of file