Merge "Fix TypeError on provision_device_for_5g_nsa()."
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 0a93e8f..6b15886 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
@@ -14,14 +14,18 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+from datetime import datetime, timedelta
 import re
 import time
-from datetime import datetime, timedelta
+from typing import Optional, Sequence
 
 from acts import signals
+from acts import tracelogger
+from acts.controllers.android_device import AndroidDevice
 from acts.utils import rand_ascii_str
 from acts.libs.utils.multithread import multithread_func
 from acts_contrib.test_utils.tel.loggers.protos.telephony_metric_pb2 import TelephonyVoiceTestResult
+from acts_contrib.test_utils.tel.loggers.telephony_metric_logger import TelephonyMetricLogger
 from acts_contrib.test_utils.tel.tel_defines import INVALID_SUB_ID
 from acts_contrib.test_utils.tel.tel_defines import MAX_WAIT_TIME_SMS_RECEIVE
 from acts_contrib.test_utils.tel.tel_defines import WAIT_TIME_ANDROID_STATE_SETTLING
@@ -76,6 +80,237 @@
 CallResult = TelephonyVoiceTestResult.CallResult.Value
 
 
+def dsds_long_call_streaming_test(
+    log: tracelogger.TraceLogger,
+    tel_logger: TelephonyMetricLogger.for_test_case,
+    ads: Sequence[AndroidDevice],
+    test_rat: list,
+    test_slot: int,
+    dds_slot: int,
+    direction: str = "mo",
+    duration: int = 360,
+    streaming: bool = True,
+    is_airplane_mode = False,
+    wfc_mode: list[str, str] = [
+        WFC_MODE_CELLULAR_PREFERRED,
+        WFC_MODE_CELLULAR_PREFERRED],
+    wifi_network_ssid: Optional[str] = None,
+    wifi_network_pass: Optional[str] = None,
+    turn_off_wifi_in_the_end: bool = False,
+    turn_off_airplane_mode_in_the_end: bool = False) -> bool:
+    """Make MO/MT call at specific slot in specific RAT with DDS at specific
+    slot for the given time.
+
+    Args:
+        log: Logger object.
+        tel_logger: Logger object for telephony proto.
+        ads: A list of Android device objects.
+        test_rat: RAT for both slots of primary device.
+        test_slot: The slot which make/receive MO/MT call of primary device.
+        dds_slot: Preferred data slot of primary device.
+        direction: The direction of call("mo" or "mt").
+        streaming: True for playing Youtube and False on the contrary.
+        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.
+    """
+    log.info("Step 1: Switch DDS.")
+    if not set_dds_on_slot(ads[0], dds_slot):
+        ads[0].log.error(
+            "Failed to set DDS at slot %s on %s",(dds_slot, ads[0].serial))
+        return False
+
+    log.info("Step 2: Check HTTP connection after DDS switch.")
+    if not verify_http_connection(log, ads[0]):
+        ads[0].log.error("Failed to verify http connection.")
+        return False
+    else:
+        ads[0].log.info("Verify http connection successfully.")
+
+    log.info("Step 3: Set up phones in desired RAT.")
+    if direction == "mo":
+        # setup voice subid on primary device.
+        ad_mo = ads[0]
+        mo_sub_id = get_subid_from_slot_index(log, ad_mo, test_slot)
+        if mo_sub_id == INVALID_SUB_ID:
+            ad_mo.log.warning("Failed to get sub ID at slot %s.", test_slot)
+            return False
+        mo_other_sub_id = get_subid_from_slot_index(
+            log, ad_mo, 1-test_slot)
+        sub_id_list = [mo_sub_id, mo_other_sub_id]
+        set_voice_sub_id(ad_mo, mo_sub_id)
+        ad_mo.log.info("Sub ID for outgoing call at slot %s: %s", test_slot,
+        get_outgoing_voice_sub_id(ad_mo))
+
+        # setup voice subid on secondary device.
+        ad_mt = ads[1]
+        _, mt_sub_id, _ = get_subid_on_same_network_of_host_ad(ads)
+        if mt_sub_id == INVALID_SUB_ID:
+            ad_mt.log.warning("Failed to get sub ID at default voice slot.")
+            return False
+        mt_slot = get_slot_index_from_subid(ad_mt, mt_sub_id)
+        set_voice_sub_id(ad_mt, mt_sub_id)
+        ad_mt.log.info("Sub ID for incoming call at slot %s: %s", mt_slot,
+        get_outgoing_voice_sub_id(ad_mt))
+
+        # setup the rat on non-test slot(primary device).
+        phone_setup_on_rat(
+            log,
+            ad_mo,
+            test_rat[1-test_slot],
+            mo_other_sub_id,
+            is_airplane_mode,
+            wfc_mode[1-test_slot],
+            wifi_network_ssid,
+            wifi_network_pass)
+        # assign phone setup argv for test slot.
+        mo_phone_setup_func_argv = (
+            log,
+            ad_mo,
+            test_rat[test_slot],
+            mo_sub_id,
+            is_airplane_mode,
+            wfc_mode[test_slot],
+            wifi_network_ssid,
+            wifi_network_pass)
+        verify_caller_func = is_phone_in_call_on_rat(
+            log, ad_mo, test_rat[test_slot], only_return_fn=True)
+        mt_phone_setup_func_argv = (log, ad_mt, 'general')
+        verify_callee_func = is_phone_in_call_on_rat(
+            log, ad_mt, 'general', only_return_fn=True)
+    else:
+        # setup voice subid on primary device.
+        ad_mt = ads[0]
+        mt_sub_id = get_subid_from_slot_index(log, ad_mt, test_slot)
+        if mt_sub_id == INVALID_SUB_ID:
+            ad_mt.log.warning("Failed to get sub ID at slot %s.", test_slot)
+            return False
+        mt_other_sub_id = get_subid_from_slot_index(
+            log, ad_mt, 1-test_slot)
+        sub_id_list = [mt_sub_id, mt_other_sub_id]
+        set_voice_sub_id(ad_mt, mt_sub_id)
+        ad_mt.log.info("Sub ID for incoming call at slot %s: %s", test_slot,
+        get_outgoing_voice_sub_id(ad_mt))
+
+        # setup voice subid on secondary device.
+        ad_mo = ads[1]
+        _, mo_sub_id, _ = get_subid_on_same_network_of_host_ad(ads)
+        if mo_sub_id == INVALID_SUB_ID:
+            ad_mo.log.warning("Failed to get sub ID at default voice slot.")
+            return False
+        mo_slot = get_slot_index_from_subid(ad_mo, mo_sub_id)
+        set_voice_sub_id(ad_mo, mo_sub_id)
+        ad_mo.log.info("Sub ID for outgoing call at slot %s: %s", mo_slot,
+        get_outgoing_voice_sub_id(ad_mo))
+
+        # setup the rat on non-test slot(primary device).
+        phone_setup_on_rat(
+            log,
+            ad_mt,
+            test_rat[1-test_slot],
+            mt_other_sub_id,
+            is_airplane_mode,
+            wfc_mode[1-test_slot],
+            wifi_network_ssid,
+            wifi_network_pass)
+        # assign phone setup argv for test slot.
+        mt_phone_setup_func_argv = (
+            log,
+            ad_mt,
+            test_rat[test_slot],
+            mt_sub_id,
+            is_airplane_mode,
+            wfc_mode[test_slot],
+            wifi_network_ssid,
+            wifi_network_pass)
+        verify_callee_func = is_phone_in_call_on_rat(
+            log, ad_mt, test_rat[test_slot], only_return_fn=True)
+        mo_phone_setup_func_argv = (log, ad_mo, 'general')
+        verify_caller_func = is_phone_in_call_on_rat(
+            log, ad_mo, 'general', only_return_fn=True)
+
+    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):
+        log.error("Phone Failed to Set Up Properly.")
+        tel_logger.set_result(CallResult("CALL_SETUP_FAILURE"))
+        raise signals.TestFailure("Failed",
+            extras={"fail_reason": "Phone Failed to Set Up Properly."})
+    if streaming:
+        log.info("Step 4-0: Start Youtube streaming.")
+        if not start_youtube_video(ads[0]):
+            raise signals.TestFailure("Failed",
+                extras={"fail_reason": "Fail to bring up youtube video."})
+        time.sleep(10)
+
+    log.info("Step 4: Make voice call.")
+    result = call_setup_teardown(log,
+                                 ad_mo,
+                                 ad_mt,
+                                 ad_hangup=ad_mo,
+                                 verify_caller_func=verify_caller_func,
+                                 verify_callee_func=verify_callee_func,
+                                 wait_time_in_call=duration)
+    tel_logger.set_result(result.result_value)
+
+    if not result:
+        log.error(
+            "Failed to make %s call from %s slot %s to %s slot %s",
+                direction, ad_mo.serial, mo_slot, ad_mt.serial, mt_slot)
+        raise signals.TestFailure("Failed",
+            extras={"fail_reason": str(result.result_value)})
+
+    log.info("Step 5: Verify RAT and HTTP connection.")
+    # 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.
+
+    rat_list = [test_rat[test_slot], test_rat[1-test_slot]]
+
+    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)})
+
+    if not verify_http_connection(log, ads[0]):
+        ads[0].log.error("Failed to verify http connection.")
+        return False
+    else:
+        ads[0].log.info("Verify http connection successfully.")
+
+    if streaming:
+        ads[0].force_stop_apk(YOUTUBE_PACKAGE_NAME)
+
+
 def dsds_voice_call_test(
         log,
         tel_logger,
diff --git a/acts_tests/acts_contrib/test_utils/tel/tel_voice_utils.py b/acts_tests/acts_contrib/test_utils/tel/tel_voice_utils.py
index ac6f1f9..62e3d1e 100644
--- a/acts_tests/acts_contrib/test_utils/tel/tel_voice_utils.py
+++ b/acts_tests/acts_contrib/test_utils/tel/tel_voice_utils.py
@@ -857,131 +857,91 @@
         setattr(ad, "call_ids", call_ids)
         if call_ids:
             ad.log.info("Pre-exist CallId %s before making call", call_ids)
-    try:
-        if not initiate_call(
-                log,
-                ad_caller,
-                callee_number,
-                incall_ui_display=incall_ui_display,
-                video=video):
-            ad_caller.log.error("Initiate call failed.")
-            tel_result_wrapper.result_value = CallResult('INITIATE_FAILED')
-            return tel_result_wrapper
-        else:
-            ad_caller.log.info("Caller initate call successfully")
-        if not wait_and_answer_call_for_subscription(
-                log,
-                ad_callee,
-                subid_callee,
-                incoming_number=caller_number,
-                caller=ad_caller,
-                incall_ui_display=incall_ui_display,
-                video_state=video_state):
-            ad_callee.log.error("Answer call fail.")
-            tel_result_wrapper.result_value = CallResult(
-                'NO_RING_EVENT_OR_ANSWER_FAILED')
-            return tel_result_wrapper
-        else:
-            ad_callee.log.info("Callee answered the call successfully")
 
-        for ad, call_func in zip([ad_caller, ad_callee],
-                                 [verify_caller_func, verify_callee_func]):
-            call_ids = ad.droid.telecomCallGetCallIds()
-            new_call_ids = set(call_ids) - set(ad.call_ids)
-            if not new_call_ids:
-                ad.log.error(
-                    "No new call ids are found after call establishment")
-                ad.log.error("telecomCallGetCallIds returns %s",
-                             ad.droid.telecomCallGetCallIds())
-                tel_result_wrapper.result_value = CallResult('NO_CALL_ID_FOUND')
-            for new_call_id in new_call_ids:
-                if not wait_for_in_call_active(ad, call_id=new_call_id):
-                    tel_result_wrapper.result_value = CallResult(
-                        'CALL_STATE_NOT_ACTIVE_DURING_ESTABLISHMENT')
-                else:
-                    ad.log.info("callProperties = %s",
-                                ad.droid.telecomCallGetProperties(new_call_id))
+    if not initiate_call(
+            log,
+            ad_caller,
+            callee_number,
+            incall_ui_display=incall_ui_display,
+            video=video):
+        ad_caller.log.error("Initiate call failed.")
+        tel_result_wrapper.result_value = CallResult('INITIATE_FAILED')
+        return tel_result_wrapper
+    else:
+        ad_caller.log.info("Caller initate call successfully")
+    if not wait_and_answer_call_for_subscription(
+            log,
+            ad_callee,
+            subid_callee,
+            incoming_number=caller_number,
+            caller=ad_caller,
+            incall_ui_display=incall_ui_display,
+            video_state=video_state):
+        ad_callee.log.error("Answer call fail.")
+        tel_result_wrapper.result_value = CallResult(
+            'NO_RING_EVENT_OR_ANSWER_FAILED')
+        return tel_result_wrapper
+    else:
+        ad_callee.log.info("Callee answered the call successfully")
 
-            if not ad.droid.telecomCallGetAudioState():
-                ad.log.error("Audio is not in call state")
+    for ad, call_func in zip([ad_caller, ad_callee],
+                                [verify_caller_func, verify_callee_func]):
+        call_ids = ad.droid.telecomCallGetCallIds()
+        new_call_ids = set(call_ids) - set(ad.call_ids)
+        if not new_call_ids:
+            ad.log.error(
+                "No new call ids are found after call establishment")
+            ad.log.error("telecomCallGetCallIds returns %s",
+                            ad.droid.telecomCallGetCallIds())
+            tel_result_wrapper.result_value = CallResult('NO_CALL_ID_FOUND')
+        for new_call_id in new_call_ids:
+            if not wait_for_in_call_active(ad, call_id=new_call_id):
                 tel_result_wrapper.result_value = CallResult(
-                    'AUDIO_STATE_NOT_INCALL_DURING_ESTABLISHMENT')
-
-            if call_func(log, ad):
-                ad.log.info("Call is in %s state", call_func.__name__)
+                    'CALL_STATE_NOT_ACTIVE_DURING_ESTABLISHMENT')
             else:
-                ad.log.error("Call is not in %s state, voice in RAT %s",
-                             call_func.__name__,
-                             ad.droid.telephonyGetCurrentVoiceNetworkType())
-                tel_result_wrapper.result_value = CallResult(
-                    'CALL_DROP_OR_WRONG_STATE_DURING_ESTABLISHMENT')
-        if not tel_result_wrapper:
-            return tel_result_wrapper
+                ad.log.info("callProperties = %s",
+                            ad.droid.telecomCallGetProperties(new_call_id))
 
-        if call_stats_check:
-            voice_type_in_call = check_voice_network_type([ad_caller, ad_callee], voice_init=False)
-            phone_a_call_type = check_call_status(ad_caller,
-                                                  voice_type_init[0],
-                                                  voice_type_in_call[0])
-            result_info["Call Stats"] = phone_a_call_type
-            ad_caller.log.debug("Voice Call Type: %s", phone_a_call_type)
-            phone_b_call_type = check_call_status(ad_callee,
-                                                  voice_type_init[1],
-                                                  voice_type_in_call[1])
-            result_info["Call Stats"] = phone_b_call_type
-            ad_callee.log.debug("Voice Call Type: %s", phone_b_call_type)
+        if not ad.droid.telecomCallGetAudioState():
+            ad.log.error("Audio is not in call state")
+            tel_result_wrapper.result_value = CallResult(
+                'AUDIO_STATE_NOT_INCALL_DURING_ESTABLISHMENT')
 
-        elapsed_time = 0
-        while (elapsed_time < wait_time_in_call):
-            CHECK_INTERVAL = min(CHECK_INTERVAL,
-                                 wait_time_in_call - elapsed_time)
-            time.sleep(CHECK_INTERVAL)
-            elapsed_time += CHECK_INTERVAL
-            time_message = "at <%s>/<%s> second." % (elapsed_time,
-                                                     wait_time_in_call)
-            for ad, call_func in [(ad_caller, verify_caller_func),
-                                  (ad_callee, verify_callee_func)]:
-                if not call_func(log, ad):
-                    ad.log.error(
-                        "NOT in correct %s state at %s, voice in RAT %s",
-                        call_func.__name__, time_message,
-                        ad.droid.telephonyGetCurrentVoiceNetworkType())
-                    tel_result_wrapper.result_value = CallResult(
-                        'CALL_DROP_OR_WRONG_STATE_AFTER_CONNECTED')
-                else:
-                    ad.log.info("In correct %s state at %s",
-                                call_func.__name__, time_message)
-                if not ad.droid.telecomCallGetAudioState():
-                    ad.log.error("Audio is not in call state at %s",
-                                 time_message)
-                    tel_result_wrapper.result_value = CallResult(
-                        'AUDIO_STATE_NOT_INCALL_AFTER_CONNECTED')
-            if not tel_result_wrapper:
-                return tel_result_wrapper
+        if call_func(log, ad):
+            ad.log.info("Call is in %s state", call_func.__name__)
+        else:
+            ad.log.error("Call is not in %s state, voice in RAT %s",
+                            call_func.__name__,
+                            ad.droid.telephonyGetCurrentVoiceNetworkType())
+            tel_result_wrapper.result_value = CallResult(
+                'CALL_DROP_OR_WRONG_STATE_DURING_ESTABLISHMENT')
+    if not tel_result_wrapper:
+        return tel_result_wrapper
 
-        if ad_hangup:
-            if not hangup_call(log, ad_hangup):
-                ad_hangup.log.info("Failed to hang up the call")
-                tel_result_wrapper.result_value = CallResult('CALL_HANGUP_FAIL')
-                return tel_result_wrapper
-    finally:
-        if not tel_result_wrapper:
-            for ad in (ad_caller, ad_callee):
-                last_call_drop_reason(ad, begin_time)
-                try:
-                    if ad.droid.telecomIsInCall():
-                        ad.log.info("In call. End now.")
-                        ad.droid.telecomEndCall()
-                except Exception as e:
-                    log.error(str(e))
+    if call_stats_check:
+        voice_type_in_call = check_voice_network_type([ad_caller, ad_callee], voice_init=False)
+        phone_a_call_type = check_call_status(ad_caller,
+                                                voice_type_init[0],
+                                                voice_type_in_call[0])
+        result_info["Call Stats"] = phone_a_call_type
+        ad_caller.log.debug("Voice Call Type: %s", phone_a_call_type)
+        phone_b_call_type = check_call_status(ad_callee,
+                                                voice_type_init[1],
+                                                voice_type_in_call[1])
+        result_info["Call Stats"] = phone_b_call_type
+        ad_callee.log.debug("Voice Call Type: %s", phone_b_call_type)
 
-        if ad_hangup or not tel_result_wrapper:
-            for ad in (ad_caller, ad_callee):
-                if not wait_for_call_id_clearing(
-                        ad, getattr(ad, "caller_ids", [])):
-                    tel_result_wrapper.result_value = CallResult(
-                        'CALL_ID_CLEANUP_FAIL')
-    return tel_result_wrapper
+    return wait_for_call_end(
+        log,
+        ad_caller,
+        ad_callee,
+        ad_hangup,
+        verify_caller_func,
+        verify_callee_func,
+        begin_time,
+        check_interval=CHECK_INTERVAL,
+        tel_result_wrapper=TelResultWrapper(CallResult('SUCCESS')),
+        wait_time_in_call=WAIT_TIME_IN_CALL)
 
 
 def two_phone_call_leave_voice_mail(
@@ -2439,13 +2399,9 @@
                 ad.log.error("Audio is not in call state at %s", time_message)
                 tel_result_wrapper.result_value = CallResult(
                         'AUDIO_STATE_NOT_INCALL_AFTER_CONNECTED')
-        if not tel_result_wrapper:
-            return tel_result_wrapper
 
-    if ad_hangup:
-        if not hangup_call(log, ad_hangup):
-            ad_hangup.log.info("Failed to hang up the call")
-            tel_result_wrapper.result_value = CallResult('CALL_HANGUP_FAIL')
+        if not tel_result_wrapper:
+            break
 
     if not tel_result_wrapper:
         for ad in (ad_caller, ad_callee):
@@ -2456,6 +2412,12 @@
                     ad.droid.telecomEndCall()
             except Exception as e:
                 log.error(str(e))
+    else:
+        if ad_hangup:
+            if not hangup_call(log, ad_hangup):
+                ad_hangup.log.info("Failed to hang up the call")
+                tel_result_wrapper.result_value = CallResult('CALL_HANGUP_FAIL')
+
     if ad_hangup or not tel_result_wrapper:
         for ad in (ad_caller, ad_callee):
             if not wait_for_call_id_clearing(ad, getattr(ad, "caller_ids", [])):
diff --git a/acts_tests/tests/google/nr/nsa5g/Nsa5gDSDSVoiceTest.py b/acts_tests/tests/google/nr/nsa5g/Nsa5gDSDSVoiceTest.py
index 2e42a12..3544b8d 100644
--- a/acts_tests/tests/google/nr/nsa5g/Nsa5gDSDSVoiceTest.py
+++ b/acts_tests/tests/google/nr/nsa5g/Nsa5gDSDSVoiceTest.py
@@ -19,6 +19,7 @@
 from acts_contrib.test_utils.tel.loggers.telephony_metric_logger import TelephonyMetricLogger
 from acts_contrib.test_utils.tel.tel_defines import WFC_MODE_CELLULAR_PREFERRED
 from acts_contrib.test_utils.tel.tel_defines import WFC_MODE_WIFI_PREFERRED
+from acts_contrib.test_utils.tel.tel_dsds_utils import dsds_long_call_streaming_test
 from acts_contrib.test_utils.tel.tel_dsds_utils import dsds_voice_call_test
 from acts_contrib.test_utils.tel.tel_dsds_utils import enable_slot_after_voice_call_test
 from acts_contrib.test_utils.tel.tel_dsds_utils import enable_slot_after_data_call_test
@@ -2149,4 +2150,708 @@
             wifi_network_ssid=self.wifi_network_ssid,
             wifi_network_pass=self.wifi_network_pass,
             turn_off_wifi_in_the_end=True,
-            turn_off_airplane_mode_in_the_end=True)
\ No newline at end of file
+            turn_off_airplane_mode_in_the_end=True)
+
+    @test_tracker_info(uuid="f07a4924-0752-41fd-8e52-e75c3c78c538")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_esim_mo_5g_nsa_volte_psim_5g_nsa_volte_dds_0(self):
+        """ A MO VoLTE long call at eSIM, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 0)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "5g_volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mo",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="cac09fa6-5db1-4523-910a-7fe9918a04ac")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_esim_mt_5g_nsa_volte_psim_5g_nsa_volte_dds_0(self):
+        """ A MT VoLTE long call at eSIM, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 0)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "5g_volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mt",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="a0039ac0-9d3d-4acf-801b-4b0d01971153")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_esim_mo_volte_psim_5g_nsa_volte_dds_0(self):
+        """ A MO VoLTE long call at eSIM, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 0)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mo",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="9cf03491-df27-4eda-9e3d-7782a44c0674")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_esim_mt_volte_psim_5g_nsa_volte_dds_0(self):
+        """ A MT VoLTE long call at eSIM, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 0)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mt",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="6c8c7e67-3bec-49b4-8164-963e488df14f")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_esim_mo_5g_nsa_volte_psim_volte_dds_0(self):
+        """ A MO VoLTE long call at eSIM, where
+            - pSIM 4G VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 0)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "5g_volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mo",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="9a2bc9a2-18a2-471f-9b21-fd0aea1b126b")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_esim_mt_5g_nsa_volte_psim_volte_dds_0(self):
+        """ A MT VoLTE long call at eSIM, where
+            - pSIM 4G VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 0)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "5g_volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mt",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="c88a0ed6-f8b6-4033-93db-b160c29d4b9e")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_psim_mo_5g_nsa_volte_esim_5g_nsa_volte_dds_1(self):
+        """ A MO VoLTE long call at eSIM, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "5g_volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mo",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="b4aa294d-679d-4a0e-8cc9-9261bfe8b392")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_psim_mt_5g_nsa_volte_esim_5g_nsa_volte_dds_1(self):
+        """ A MT VoLTE long call at eSIM, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "5g_volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mt",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="2e20f05f-9434-410f-a40a-a01c0303d1a0")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_psim_mo_5g_nsa_volte_esim_volte_dds_1(self):
+        """ A MO VoLTE long call at eSIM, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mo",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="3f89b354-0cdc-4522-8a67-76773219e5af")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_psim_mt_5g_nsa_volte_esim_volte_dds_1(self):
+        """ A MT VoLTE long call at eSIM, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mt",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="f18c61c5-3c3b-4645-90eb-e7bdef9b7c74")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_psim_mo_volte_esim_5g_nsa_volte_dds_1(self):
+        """ A MO VoLTE long call at eSIM, where
+            - pSIM 4G VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "5g_volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mo",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="8324ffe2-1332-47fc-af92-a3ed7be9b629")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_psim_mt_volte_esim_5g_nsa_volte_dds_1(self):
+        """ A MT VoLTE long call at eSIM, where
+            - pSIM 4G VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "5g_volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mt",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="e6760078-2a5e-4182-8ba1-57788fc607f1")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_esim_mo_volte_psim_volte_dds_0(self):
+        """ A MO VoLTE long call at eSIM, where
+            - pSIM 4G VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mo",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="c736e4f0-8dbc-480a-8da6-68453cc13d07")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_esim_mt_volte_psim_volte_dds_0(self):
+        """ A MO VoLTE long call at eSIM, where
+            - pSIM 4G VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mt",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="19dc55b5-b989-481d-a980-fcd0ff56abc2")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_psim_mo_volte_esim_volte_dds_1(self):
+        """ A MO VoLTE long call at eSIM, where
+            - pSIM 4G VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mo",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="494e9c90-6c56-4fa1-9fac-ac8f2b1c0dba")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_psim_mt_volte_esim_volte_dds_1(self):
+        """ A MT VoLTE long call at eSIM, where
+            - pSIM 4G VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mt",
+            duration=360,
+            streaming=False)
+
+    @test_tracker_info(uuid="d253553d-7dc9-4e38-8e20-0839326c20aa")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_esim_mo_5g_nsa_volte_psim_5g_nsa_volte_dds_0(self):
+        """ A MO VoLTE long call at eSIM during streaming, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 0)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "5g_volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mo",
+            duration=360,
+            streaming=True)
+
+    @test_tracker_info(uuid="80a201c5-0bfe-4d7f-b08b-52b7c53b6468")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_esim_mt_5g_nsa_volte_psim_5g_nsa_volte_dds_0(self):
+        """ A MT VoLTE long call at eSIM during streaming, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 0)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "5g_volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mt",
+            duration=360,
+            streaming=True)
+
+    @test_tracker_info(uuid="8938575b-2544-4075-9cf9-3d938ad4d9cb")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_esim_mo_volte_psim_5g_nsa_volte_dds_0(self):
+        """ A MO VoLTE long call at eSIM during streaming, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 0)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mo",
+            duration=360,
+            streaming=True)
+
+    @test_tracker_info(uuid="200c7cce-aba2-40f8-a274-9b05177d00e0")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_esim_mt_volte_psim_5g_nsa_volte_dds_0(self):
+        """ A MT VoLTE long call at eSIM during streaming, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 0)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mt",
+            duration=360,
+            streaming=True)
+
+    @test_tracker_info(uuid="26bb9415-44f4-43df-b2e6-abbdfacf33c2")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_esim_mo_5g_nsa_volte_psim_volte_dds_0(self):
+        """ A MO VoLTE long call at eSIM during streaming, where
+            - pSIM 4G VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 0)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "5g_volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mo",
+            duration=360,
+            streaming=True)
+
+    @test_tracker_info(uuid="8a8dc1ca-6a85-4dc8-9e34-e17abe61f7b8")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_esim_mt_5g_nsa_volte_psim_volte_dds_0(self):
+        """ A MT VoLTE long call at eSIM during streaming, where
+            - pSIM 4G VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 0)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "5g_volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mt",
+            duration=360,
+            streaming=True)
+
+    @test_tracker_info(uuid="903a2813-6b27-4020-aaf2-b5ab8b29fa13")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_psim_mo_5g_nsa_volte_esim_5g_nsa_volte_dds_1(self):
+        """ A MO VoLTE long call at eSIM during streaming, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "5g_volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mo",
+            duration=360,
+            streaming=True)
+
+    @test_tracker_info(uuid="33d8ba2c-fa45-4ec0-aef5-b191b6ddd9a6")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_psim_mt_5g_nsa_volte_esim_5g_nsa_volte_dds_1(self):
+        """ A MT VoLTE long call at eSIM during streaming, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "5g_volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mt",
+            duration=360,
+            streaming=True)
+
+    @test_tracker_info(uuid="6db23c84-13d9-47fa-b8f1-45c56e2d6428")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_psim_mo_5g_nsa_volte_esim_volte_dds_1(self):
+        """ A MO VoLTE long call at eSIM during streaming, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mo",
+            duration=360,
+            streaming=True)
+
+    @test_tracker_info(uuid="3a77b38f-c327-4c43-addf-48832bca7148")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_psim_mt_5g_nsa_volte_esim_volte_dds_1(self):
+        """ A MT VoLTE long call at eSIM during streaming, where
+            - pSIM 5G NSA VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["5g_volte", "volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mt",
+            duration=360,
+            streaming=True)
+
+    @test_tracker_info(uuid="2898eb67-3dfe-4322-8c69-817e0a95dfda")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_psim_mo_volte_esim_5g_nsa_volte_dds_1(self):
+        """ A MO VoLTE long call at eSIM during streaming, where
+            - pSIM 4G VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "5g_volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mo",
+            duration=360,
+            streaming=True)
+
+    @test_tracker_info(uuid="780e8187-2068-4eca-a9de-e5f2f3491403")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_psim_mt_volte_esim_5g_nsa_volte_dds_1(self):
+        """ A MT VoLTE long call at eSIM during streaming, where
+            - pSIM 4G VoLTE
+            - eSIM 5G NSA VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "5g_volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mt",
+            duration=360,
+            streaming=True)
+
+    @test_tracker_info(uuid="9b84bd00-fae3-45c0-9e44-dd57d1719bb9")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_esim_mo_volte_psim_volte_dds_0(self):
+        """ A MO VoLTE long call at eSIM during streaming, where
+            - pSIM 4G VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mo",
+            duration=360,
+            streaming=True)
+
+    @test_tracker_info(uuid="813c6059-bcef-42d3-b70b-9b0ba67ffc20")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_esim_mt_volte_psim_volte_dds_0(self):
+        """ A MO VoLTE long call at eSIM during streaming, where
+            - pSIM 4G VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "volte"],
+            test_slot=1,
+            dds_slot=0,
+            direction="mt",
+            duration=360,
+            streaming=True)
+
+    @test_tracker_info(uuid="970b1d31-195b-4599-80bc-bc46ede43a90")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_psim_mo_volte_esim_volte_dds_1(self):
+        """ A MO VoLTE long call at eSIM during streaming, where
+            - pSIM 4G VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mo",
+            duration=360,
+            streaming=True)
+
+    @test_tracker_info(uuid="62843f60-5d1c-44ed-9936-e10d2691e787")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_msim_long_voice_streaming_psim_mt_volte_esim_volte_dds_1(self):
+        """ A MT VoLTE long call at eSIM during streaming, where
+            - pSIM 4G VoLTE
+            - eSIM 4G VoLTE
+            - DDS at pSIM (slot 1)
+
+            After call end will check the eSIM if is attach to the network
+            with assigned RAT successfully and data works fine.
+        """
+        return dsds_long_call_streaming_test(
+            self.log,
+            self.tel_logger,
+            self.android_devices,
+            test_rat=["volte", "volte"],
+            test_slot=0,
+            dds_slot=1,
+            direction="mt",
+            duration=360,
+            streaming=True)
\ No newline at end of file