New test cases related to simple DSDS WFC call are added

Following 48 new test cases are added into the test class "Nsa5gDSDSVoiceTest":

- test_msim_voice_psim_mo_5g_nsa_wfc_wifi_preferred_esim_5g_nsa_volte_dds_0
- test_msim_voice_psim_mt_5g_nsa_wfc_wifi_preferred_esim_5g_nsa_volte_dds_0
- test_msim_voice_esim_mo_5g_nsa_wfc_wifi_preferred_psim_5g_nsa_volte_dds_0
- test_msim_voice_esim_mt_5g_nsa_wfc_wifi_preferred_psim_5g_nsa_volte_dds_0
- test_msim_voice_psim_mo_5g_nsa_wfc_wifi_preferred_esim_5g_nsa_volte_dds_1
- test_msim_voice_psim_mt_5g_nsa_wfc_wifi_preferred_esim_5g_nsa_volte_dds_1
- test_msim_voice_esim_mo_5g_nsa_wfc_wifi_preferred_psim_5g_nsa_volte_dds_1
- test_msim_voice_esim_mt_5g_nsa_wfc_wifi_preferred_psim_5g_nsa_volte_dds_1
- test_msim_voice_psim_mo_4g_wfc_wifi_preferred_esim_5g_nsa_volte_dds_0
- test_msim_voice_psim_mt_4g_wfc_wifi_preferred_esim_5g_nsa_volte_dds_0
- test_msim_voice_esim_mo_5g_nsa_wfc_wifi_preferred_psim_4g_volte_dds_0
- test_msim_voice_esim_mt_5g_nsa_wfc_wifi_preferred_psim_4g_volte_dds_0
- test_msim_voice_psim_mo_4g_wfc_wifi_preferred_esim_5g_nsa_volte_dds_1
- test_msim_voice_psim_mt_4g_wfc_wifi_preferred_esim_5g_nsa_volte_dds_1
- test_msim_voice_esim_mo_5g_nsa_wfc_wifi_preferred_psim_4g_volte_dds_1
- test_msim_voice_esim_mt_5g_nsa_wfc_wifi_preferred_psim_4g_volte_dds_1
- test_msim_voice_psim_mo_5g_nsa_wfc_wifi_preferred_esim_4g_volte_dds_0
- test_msim_voice_psim_mt_5g_nsa_wfc_wifi_preferred_esim_4g_volte_dds_0
- test_msim_voice_esim_mo_4g_wfc_wifi_preferred_psim_5g_nsa_volte_dds_0
- test_msim_voice_esim_mt_4g_wfc_wifi_preferred_psim_5g_nsa_volte_dds_0
- test_msim_voice_psim_mo_5g_nsa_wfc_wifi_preferred_esim_4g_volte_dds_1
- test_msim_voice_psim_mt_5g_nsa_wfc_wifi_preferred_esim_4g_volte_dds_1
- test_msim_voice_esim_mo_4g_wfc_wifi_preferred_psim_5g_nsa_volte_dds_1
- test_msim_voice_esim_mt_4g_wfc_wifi_preferred_psim_5g_nsa_volte_dds_1
- test_msim_voice_psim_mo_5g_nsa_wfc_cellular_preferred_esim_5g_nsa_volte_dds_0
- test_msim_voice_psim_mt_5g_nsa_wfc_cellular_preferred_esim_5g_nsa_volte_dds_0
- test_msim_voice_esim_mo_5g_nsa_wfc_cellular_preferred_psim_5g_nsa_volte_dds_0
- test_msim_voice_esim_mt_5g_nsa_wfc_cellular_preferred_psim_5g_nsa_volte_dds_0
- test_msim_voice_psim_mo_5g_nsa_wfc_cellular_preferred_esim_5g_nsa_volte_dds_1
- test_msim_voice_psim_mt_5g_nsa_wfc_cellular_preferred_esim_5g_nsa_volte_dds_1
- test_msim_voice_esim_mo_5g_nsa_wfc_cellular_preferred_psim_5g_nsa_volte_dds_1
- test_msim_voice_esim_mt_5g_nsa_wfc_cellular_preferred_psim_5g_nsa_volte_dds_1
- test_msim_voice_psim_mo_4g_wfc_cellular_preferred_esim_5g_nsa_volte_dds_0
- test_msim_voice_psim_mt_4g_wfc_cellular_preferred_esim_5g_nsa_volte_dds_0
- test_msim_voice_esim_mo_5g_nsa_wfc_cellular_preferred_psim_4g_volte_dds_0
- test_msim_voice_esim_mt_5g_nsa_wfc_cellular_preferred_psim_4g_volte_dds_0
- test_msim_voice_psim_mo_4g_wfc_cellular_preferred_esim_5g_nsa_volte_dds_1
- test_msim_voice_psim_mt_4g_wfc_cellular_preferred_esim_5g_nsa_volte_dds_1
- test_msim_voice_esim_mo_5g_nsa_wfc_cellular_preferred_psim_4g_volte_dds_1
- test_msim_voice_esim_mt_5g_nsa_wfc_cellular_preferred_psim_4g_volte_dds_1
- test_msim_voice_psim_mo_5g_nsa_wfc_cellular_preferred_esim_4g_volte_dds_0
- test_msim_voice_psim_mt_5g_nsa_wfc_cellular_preferred_esim_4g_volte_dds_0
- test_msim_voice_esim_mo_4g_wfc_cellular_preferred_psim_5g_nsa_volte_dds_0
- test_msim_voice_esim_mt_4g_wfc_cellular_preferred_psim_5g_nsa_volte_dds_0
- test_msim_voice_psim_mo_5g_nsa_wfc_cellular_preferred_esim_4g_volte_dds_1
- test_msim_voice_psim_mt_5g_nsa_wfc_cellular_preferred_esim_4g_volte_dds_1
- test_msim_voice_esim_mo_4g_wfc_cellular_preferred_psim_5g_nsa_volte_dds_1
- test_msim_voice_esim_mt_4g_wfc_cellular_preferred_psim_5g_nsa_volte_dds_1

Bug: None
Test: Yes, locally
Change-Id: Idc4fe1b2fea80945c8eac48cf60134ad7c55ae68
diff --git a/acts_tests/acts_contrib/test_utils/tel/tel_dsds_utils.py b/acts_tests/acts_contrib/test_utils/tel/tel_dsds_utils.py
index b776f66..79efec2 100644
--- a/acts_tests/acts_contrib/test_utils/tel/tel_dsds_utils.py
+++ b/acts_tests/acts_contrib/test_utils/tel/tel_dsds_utils.py
@@ -61,6 +61,7 @@
 from acts_contrib.test_utils.tel.tel_test_utils import verify_incall_state
 from acts_contrib.test_utils.tel.tel_test_utils import verify_http_connection
 from acts_contrib.test_utils.tel.tel_test_utils import wait_and_reject_call_for_subscription
+from acts_contrib.test_utils.tel.tel_test_utils import wifi_toggle_state
 from acts_contrib.test_utils.tel.tel_voice_utils import is_phone_in_call_on_rat
 from acts_contrib.test_utils.tel.tel_voice_utils import phone_setup_voice_general
 from acts_contrib.test_utils.tel.tel_voice_utils import phone_setup_on_rat
@@ -84,7 +85,15 @@
         dds,
         mo_rat=["", ""],
         mt_rat=["", ""],
-        call_direction="mo"):
+        call_direction="mo",
+        is_airplane_mode=False,
+        wfc_mode=[
+            WFC_MODE_CELLULAR_PREFERRED,
+            WFC_MODE_CELLULAR_PREFERRED],
+        wifi_network_ssid=None,
+        wifi_network_pass=None,
+        turn_off_wifi_in_the_end=False,
+        turn_off_airplane_mode_in_the_end=False):
     """Make MO/MT voice call at specific slot in specific RAT with DDS at
     specific slot.
 
@@ -94,6 +103,9 @@
     3. Check HTTP connection after DDS switch.
     4. Set up phones in desired RAT.
     5. Make voice call.
+    6. Turn off airplane mode if necessary.
+    7. Turn off Wi-Fi if necessary.
+    8. Verify RAT and HTTP connection.
 
     Args:
         log: logger object
@@ -104,10 +116,22 @@
         mo_rat: RAT for both slots of MO device
         mt_rat: RAT for both slots of MT device
         call_direction: "mo" or "mt"
+        is_airplane_mode: True or False for WFC setup
+        wfc_mode: Cellular preferred or Wi-Fi preferred.
+        wifi_network_ssid: SSID of Wi-Fi AP
+        wifi_network_pass: Password of Wi-Fi AP SSID
+        turn_off_wifi_in_the_end: True to turn off Wi-Fi and False not to turn
+            off Wi-Fi in the end of the function.
+        turn_off_airplane_mode_in_the_end: True to turn off airplane mode and
+            False not to turn off airplane mode in the end of the function.
 
     Returns:
         TestFailure if failed.
     """
+    if not toggle_airplane_mode(log, ads[0], False):
+        ads[0].log.error("Failed to disable airplane mode.")
+        return False
+
     if call_direction == "mo":
         ad_mo = ads[0]
         ad_mt = ads[1]
@@ -164,9 +188,28 @@
     else:
         log.info("Verify http connection successfully.")
 
+    log.info("Step 3: Set up phones in desired RAT.")
     if mo_slot == 0 or mo_slot == 1:
-        phone_setup_on_rat(log, ad_mo, mo_rat[1-mo_slot], mo_other_sub_id)
-        mo_phone_setup_func_argv = (log, ad_mo, mo_rat[mo_slot], mo_sub_id)
+        phone_setup_on_rat(
+            log,
+            ad_mo,
+            mo_rat[1-mo_slot],
+            mo_other_sub_id,
+            is_airplane_mode,
+            wfc_mode[1-mo_slot],
+            wifi_network_ssid,
+            wifi_network_pass)
+
+        mo_phone_setup_func_argv = (
+            log,
+            ad_mo,
+            mo_rat[mo_slot],
+            mo_sub_id,
+            is_airplane_mode,
+            wfc_mode[mo_slot],
+            wifi_network_ssid,
+            wifi_network_pass)
+
         is_mo_in_call = is_phone_in_call_on_rat(
             log, ad_mo, mo_rat[mo_slot], only_return_fn=True)
     else:
@@ -175,8 +218,26 @@
             log, ad_mo, 'general', only_return_fn=True)
 
     if mt_slot == 0 or mt_slot == 1:
-        phone_setup_on_rat(log, ad_mt, mt_rat[1-mt_slot], mt_other_sub_id)
-        mt_phone_setup_func_argv = (log, ad_mt, mt_rat[mt_slot], mt_sub_id)
+        phone_setup_on_rat(
+            log,
+            ad_mt,
+            mt_rat[1-mt_slot],
+            mt_other_sub_id,
+            is_airplane_mode,
+            wfc_mode[1-mt_slot],
+            wifi_network_ssid,
+            wifi_network_pass)
+
+        mt_phone_setup_func_argv = (
+            log,
+            ad_mt,
+            mt_rat[mt_slot],
+            mt_sub_id,
+            is_airplane_mode,
+            wfc_mode[mt_slot],
+            wifi_network_ssid,
+            wifi_network_pass)
+
         is_mt_in_call = is_phone_in_call_on_rat(
             log, ad_mt, mt_rat[mt_slot], only_return_fn=True)
     else:
@@ -184,7 +245,6 @@
         is_mt_in_call = is_phone_in_call_on_rat(
             log, ad_mt, 'general', only_return_fn=True)
 
-    log.info("Step 3: Set up phones in desired RAT.")
     tasks = [(phone_setup_on_rat, mo_phone_setup_func_argv),
                 (phone_setup_on_rat, mt_phone_setup_func_argv)]
     if not multithread_func(log, tasks):
@@ -214,6 +274,43 @@
         raise signals.TestFailure("Failed",
             extras={"fail_reason": str(result.result_value)})
 
+    log.info("Step 5: Verify RAT and HTTP connection.")
+    if call_direction == "mo":
+        rat_list = [mo_rat[mo_slot], mo_rat[1-mo_slot]]
+        sub_id_list = [mo_sub_id, mo_other_sub_id]
+    else:
+        rat_list = [mt_rat[mt_slot], mt_rat[1-mt_slot]]
+        sub_id_list = [mt_sub_id, mt_other_sub_id]
+
+    # For the tese cases related to WFC in which airplane mode will be turned
+    # off in the end.
+    if turn_off_airplane_mode_in_the_end:
+        log.info("Step 5-1: Turning off airplane mode......")
+        if not toggle_airplane_mode(log, ads[0], False):
+            ads[0].log.error('Failed to toggle off airplane mode.')
+
+    # For the tese cases related to WFC in which Wi-Fi will be turned off in the
+    # end.
+    if turn_off_wifi_in_the_end:
+        log.info("Step 5-2: Turning off Wi-Fi......")
+        if not wifi_toggle_state(log, ads[0], False):
+            ads[0].log.error('Failed to toggle off Wi-Fi.')
+            return False
+
+        for index, value in enumerate(rat_list):
+            if value == '5g_wfc':
+                rat_list[index] = '5g'
+            elif value == 'wfc':
+                rat_list[index] = '4g'
+
+    for rat, sub_id in zip(rat_list, sub_id_list):
+        if not wait_for_network_idle(log, ads[0], rat, sub_id):
+            raise signals.TestFailure(
+                "Failed",
+                extras={
+                    "fail_reason": "Idle state of sub ID %s does not match the "
+                    "given RAT %s." % (sub_id, rat)})
+
 def dsds_message_test(
         log,
         ads,