#!/usr/bin/env python3
#
#   Copyright 2020 - Google
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.

import time

from acts import asserts
from acts import signals
from acts.test_decorators import test_tracker_info
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.TelephonyBaseTest import TelephonyBaseTest
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
from acts_contrib.test_utils.tel.tel_defines import INVALID_SUB_ID
from acts_contrib.test_utils.tel.tel_subscription_utils import \
    get_incoming_voice_sub_id
from acts_contrib.test_utils.tel.tel_subscription_utils import get_subid_from_slot_index
from acts_contrib.test_utils.tel.tel_subscription_utils import \
    get_outgoing_message_sub_id
from acts_contrib.test_utils.tel.tel_subscription_utils import get_default_data_sub_id
from acts_contrib.test_utils.tel.tel_subscription_utils import set_message_subid
from acts_contrib.test_utils.tel.tel_subscription_utils import set_subid_for_data
from acts_contrib.test_utils.tel.tel_subscription_utils import set_voice_sub_id
from acts_contrib.test_utils.tel.tel_subscription_utils import set_dds_on_slot_0
from acts_contrib.test_utils.tel.tel_subscription_utils import set_dds_on_slot_1
from acts_contrib.test_utils.tel.tel_subscription_utils import \
    get_subid_on_same_network_of_host_ad
from acts_contrib.test_utils.tel.tel_test_utils import multithread_func
from acts_contrib.test_utils.tel.tel_test_utils import \
    sms_send_receive_verify_for_subscription
from acts_contrib.test_utils.tel.tel_test_utils import \
    sms_in_collision_send_receive_verify_for_subscription
from acts_contrib.test_utils.tel.tel_test_utils import \
    sms_rx_power_off_multiple_send_receive_verify_for_subscription
from acts_contrib.test_utils.tel.tel_test_utils import \
    voice_call_in_collision_with_mt_sms_msim
from acts_contrib.test_utils.tel.tel_test_utils import mms_send_receive_verify
from acts_contrib.test_utils.tel.tel_test_utils import verify_http_connection
from acts_contrib.test_utils.tel.tel_test_utils import log_messaging_screen_shot
from acts_contrib.test_utils.tel.tel_test_utils import ensure_phones_idle
from acts_contrib.test_utils.tel.tel_test_utils import get_slot_index_from_subid
from acts_contrib.test_utils.tel.tel_voice_utils import \
    phone_setup_voice_general_for_subscription
from acts_contrib.test_utils.tel.tel_voice_utils import phone_setup_on_rat
from acts_contrib.test_utils.tel.tel_voice_utils import is_phone_in_call_on_rat
from acts.utils import rand_ascii_str

CallResult = TelephonyVoiceTestResult.CallResult.Value

class TelLiveGFTDSDSMessageTest(TelephonyBaseTest):
    def setup_class(self):
        TelephonyBaseTest.setup_class(self)
        self.message_lengths = (50, 160, 180)
        self.tel_logger = TelephonyMetricLogger.for_test_case()

    def teardown_test(self):
        ensure_phones_idle(self.log, self.android_devices)

    def _msim_message_test(
        self,
        ad_mo,
        ad_mt,
        mo_sub_id,
        mt_sub_id, msg="SMS",
        max_wait_time=MAX_WAIT_TIME_SMS_RECEIVE,
        expected_result=True):
        """Make MO/MT SMS/MMS at specific slot.

        Args:
            ad_mo: Android object of the device sending SMS/MMS
            ad_mt: Android object of the device receiving SMS/MMS
            mo_sub_id: Sub ID of MO device
            mt_sub_id: Sub ID of MT device
            max_wait_time: Max wait time before SMS/MMS is received.
            expected_result: True for successful sending/receiving and False on
                             the contrary

        Returns:
            True if the result matches expected_result and False on the
            contrary.
        """

        if msg == "SMS":
            for length in self.message_lengths:
                message_array = [rand_ascii_str(length)]
                if not sms_send_receive_verify_for_subscription(
                    self.log,
                    ad_mo,
                    ad_mt,
                    mo_sub_id,
                    mt_sub_id,
                    message_array,
                    max_wait_time):
                    ad_mo.log.warning(
                        "%s of length %s test failed", msg, length)
                    return False
                else:
                    ad_mo.log.info(
                        "%s of length %s test succeeded", msg, length)
            self.log.info("%s test of length %s characters succeeded.",
                msg, self.message_lengths)

        elif msg == "MMS":
            for length in self.message_lengths:
                message_array = [("Test Message", rand_ascii_str(length), None)]

                if not mms_send_receive_verify(
                    self.log,
                    ad_mo,
                    ad_mt,
                    message_array,
                    max_wait_time,
                    expected_result):
                    self.log.warning("%s of body length %s test failed",
                        msg, length)
                    return False
                else:
                    self.log.info(
                        "%s of body length %s test succeeded", msg, length)
            self.log.info("%s test of body lengths %s succeeded",
                          msg, self.message_lengths)
        return True

    def _msim_sms_collision_test(
        self,
        ad_mo,
        ad_mo2,
        ad_mt,
        ad_mt2,
        mo1_sub_id,
        mo2_sub_id,
        mt_sub_id,
        mt2_sub_id):
        """Send 2 SMS' at the same time. SMS collision can be met when both SMS'
        are sent to the same recipient.

        Args:
            ad_mo: Android object of the device sending SMS
            ad_mo2: Android object of the device sending SMS
            ad_mt: Android object of the device receiving SMS
            ad_mt2: Android object of the device receiving SMS
            mo1_sub_id: Sub ID of ad_mo
            mo2_sub_id: Sub ID of ad_mo2
            mt_sub_id: Sub ID of ad_mt
            mt2_sub_id: Sub ID of ad_mt2

        Returns:
            True if both SMS' are sent and received successfully and False on
            the contrary.
        """
        for length in self.message_lengths:
            message_array = [rand_ascii_str(length)]
            message_array2 = [rand_ascii_str(length)]
            if not sms_in_collision_send_receive_verify_for_subscription(
                self.log,
                ad_mo,
                ad_mo2,
                ad_mt,
                ad_mt2,
                mo1_sub_id,
                mo2_sub_id,
                mt_sub_id,
                mt2_sub_id,
                message_array,
                message_array2):
                self.log.warning(
                    "Test of SMS collision with length %s failed", length)
                return False
            else:
                self.log.info(
                    "Test of SMS collision with length %s succeeded", length)
        self.log.info(
            "Test of SMS collision with lengths %s characters succeeded.",
            self.message_lengths)
        return True

    def _msim_rx_power_off_multiple_sms_test(
        self,
        ad_mo,
        ad_mo2,
        ad_mt,
        mo1_sub_id,
        mo2_sub_id,
        mt_sub_id,
        mt2_sub_id,
        num_array_message,
        num_array_message2):
        """Power off the recipient and then send 2 SMS'. Make sure all SMS' can
        be received correctly after the recipient is poweron on again.

        Args:
            ad_mo: Android object of the device sending SMS
            ad_mo2: Android object of the device sending SMS
            ad_mt: Android object of the device receiving SMS
            mo1_sub_id: Sub ID of ad_mo
            mo2_sub_id: Sub ID of ad_mo2
            mt_sub_id: Sub ID of ad_mt
            mt2_sub_id: Sub ID of ad_mt2
            num_array_message: Number of messages to be sent by ad_mo
            num_array_message2: Number of messages to be sent by ad_mo2

        Returns:
            True if all SMS' are sent and received successfully and False on
            the contrary.
        """
        for length in self.message_lengths:
            if not sms_rx_power_off_multiple_send_receive_verify_for_subscription(
                self.log,
                ad_mo,
                ad_mo2,
                ad_mt,
                mo1_sub_id,
                mo2_sub_id,
                mt_sub_id,
                mt2_sub_id,
                length,
                length,
                num_array_message,
                num_array_message2):
                self.log.warning(
                    "Test of multiple SMS with length %s during rx power off"
                    " failed.", length)
                return False
            else:
                self.log.info(
                    "Test of multiple SMS with length %s during rx power off"
                    " succeeded.", length)
        self.log.info(
            "Test of multiple SMS with lengths %s characters during rx power"
            "off succeeded.", self.message_lengths)
        return True


    def _test_msim_message(
            self,
            mo_slot,
            mt_slot,
            dds_slot,
            msg="SMS",
            mo_rat=["", ""],
            mt_rat=["", ""],
            direction="mo",
            expected_result=True):
        """Make MO/MT SMS/MMS at specific slot in specific RAT with DDS at
        specific slot.

        Test step:
        1. Get sub IDs of specific slots of both MO and MT devices.
        2. Switch DDS to specific slot.
        3. Check HTTP connection after DDS switch.
        4. Set up phones in desired RAT.
        5. Send SMS/MMS.

        Args:
            mo_slot: Slot sending MO SMS (0 or 1)
            mt_slot: Slot receiving MT SMS (0 or 1)
            dds_slot: Preferred data slot
            mo_rat: RAT for both slots of MO device
            mt_rat: RAT for both slots of MT device
            direction: "mo" or "mt"
            expected_result: True of False

        Returns:
            TestFailure if failed.
        """
        ads = self.android_devices

        if direction == "mo":
            ad_mo = ads[0]
            ad_mt = ads[1]
        else:
            ad_mo = ads[1]
            ad_mt = ads[0]

        if mo_slot is not None:
            mo_sub_id = get_subid_from_slot_index(self.log, ad_mo, mo_slot)
            if mo_sub_id == INVALID_SUB_ID:
                ad_mo.log.warning("Failed to get sub ID at slot %s.", mo_slot)
                return False
            mo_other_sub_id = get_subid_from_slot_index(
                self.log, ad_mo, 1-mo_slot)
            set_message_subid(ad_mo, mo_sub_id)
        else:
            _, mo_sub_id, _ = get_subid_on_same_network_of_host_ad(
                ads, type="sms")
            if mo_sub_id == INVALID_SUB_ID:
                ad_mo.log.warning("Failed to get sub ID at slot %s.", mo_slot)
                return False
            mo_slot = "auto"
            set_message_subid(ad_mo, mo_sub_id)
            if msg == "MMS":
                set_subid_for_data(ad_mo, mo_sub_id)
                ad_mo.droid.telephonyToggleDataConnection(True)
        ad_mo.log.info("Sub ID for outgoing %s at slot %s: %s", msg, mo_slot,
            get_outgoing_message_sub_id(ad_mo))

        if mt_slot is not None:
            mt_sub_id = get_subid_from_slot_index(self.log, ad_mt, mt_slot)
            if mt_sub_id == INVALID_SUB_ID:
                ad_mt.log.warning("Failed to get sub ID at slot %s.", mt_slot)
                return False
            mt_other_sub_id = get_subid_from_slot_index(
                self.log, ad_mt, 1-mt_slot)
            set_message_subid(ad_mt, mt_sub_id)
        else:
            _, mt_sub_id, _ = get_subid_on_same_network_of_host_ad(
                ads, type="sms")
            if mt_sub_id == INVALID_SUB_ID:
                ad_mt.log.warning("Failed to get sub ID at slot %s.", mt_slot)
                return False
            mt_slot = "auto"
            set_message_subid(ad_mt, mt_sub_id)
            if msg == "MMS":
                set_subid_for_data(ad_mt, mt_sub_id)
                ad_mt.droid.telephonyToggleDataConnection(True)
        ad_mt.log.info("Sub ID for incoming %s at slot %s: %s", msg, mt_slot,
            get_outgoing_message_sub_id(ad_mt))

        self.log.info("Step 1: Switch DDS.")
        if dds_slot:
            if not set_dds_on_slot_1(ads[0]):
                self.log.warning(
                    "Failed to set DDS at eSIM on %s", ads[0].serial)
                return False
        else:
            if not set_dds_on_slot_0(ads[0]):
                self.log.warning(
                    "Failed to set DDS at pSIM on %s", ads[0].serial)
                return False

        self.log.info("Step 2: Check HTTP connection after DDS switch.")
        if not verify_http_connection(self.log,
           ads[0],
           url="https://www.google.com",
           retry=5,
           retry_interval=15,
           expected_state=True):

            self.log.error("Failed to verify http connection.")
            return False
        else:
            self.log.info("Verify http connection successfully.")

        if mo_slot == 0 or mo_slot == 1:
            phone_setup_on_rat(self.log, ad_mo, mo_rat[1-mo_slot], mo_other_sub_id)
        else:
            phone_setup_on_rat(self.log, ad_mo, 'general', sub_id_type='sms')

        if mt_slot == 0 or mt_slot == 1:
            phone_setup_on_rat(self.log, ad_mt, mt_rat[1-mt_slot], mt_other_sub_id)
        else:
            phone_setup_on_rat(self.log, ad_mt, 'general', sub_id_type='sms')

        if mo_slot == 0 or mo_slot == 1:
            mo_phone_setup_func = phone_setup_on_rat(
                self.log,
                ad_mo,
                mo_rat[mo_slot],
                only_return_fn=True)
        else:
            mo_phone_setup_func = phone_setup_voice_general_for_subscription

        if mt_slot == 0 or mt_slot == 1:
            mt_phone_setup_func = phone_setup_on_rat(
                self.log,
                ad_mt,
                mt_rat[mt_slot],
                only_return_fn=True)
        else:
            mt_phone_setup_func = phone_setup_voice_general_for_subscription

        self.log.info("Step 3: Set up phones in desired RAT.")
        tasks = [(mo_phone_setup_func, (self.log, ad_mo, mo_sub_id)),
                 (mt_phone_setup_func, (self.log, ad_mt, mt_sub_id))]
        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)
        self.log.info("Step 4: Send %s.", msg)

        if msg == "MMS":
            for ad, current_data_sub_id, current_msg_sub_id in [
                [ ads[0],
                  get_default_data_sub_id(ads[0]),
                  get_outgoing_message_sub_id(ads[0]) ],
                [ ads[1],
                  get_default_data_sub_id(ads[1]),
                  get_outgoing_message_sub_id(ads[1]) ]]:
                if current_data_sub_id != current_msg_sub_id:
                    ad.log.warning(
                        "Current data sub ID (%s) does not match message"
                        " sub ID (%s). MMS should NOT be sent.",
                        current_data_sub_id,
                        current_msg_sub_id)
                    expected_result = False

        result = self._msim_message_test(ad_mo, ad_mt, mo_sub_id, mt_sub_id,
            msg=msg, expected_result=expected_result)

        if not result:
            log_messaging_screen_shot(ad_mo, test_name="%s_tx" % msg)
            log_messaging_screen_shot(ad_mt, test_name="%s_rx" % msg)

        return result


    def _test_msim_voice_call_in_collision_with_mt_sms(
            self,
            mo_voice_slot,
            mt_sms_slot,
            dds_slot,
            rat=["", ""],
            call_direction="mo"):
        """Make MO/MT voice call in collision with MT SMS at specific slot in
        specific RAT with DDS at specific slot.

        Args:
            mo_voice_slot: Slot for voice call. 0 for pSIM or 1 for eSIM
            mt_sms_slot: Slot for MT SMS. 0 for pSIM or 1 for eSIM
            dds_slot: Preferred data slot
            rat: RAT for both slots of the primary device
            call_direction: "mo" or "mt"

        Returns:
            True or False
        """
        ads = self.android_devices
        ad = ads[0]
        ad_mo_sms = ads[2]
        ad_mt_voice = ads[1]

        mo_voice_sub_id = get_subid_from_slot_index(self.log, ad, mo_voice_slot)
        if mo_voice_sub_id == INVALID_SUB_ID:
            ad.log.warning("Failed to get sub ID ar slot %s.", mo_voice_slot)
            return False
        mo_voice_other_sub_id = get_subid_from_slot_index(
            self.log, ad, 1-mo_voice_slot)
        set_voice_sub_id(ad, mo_voice_sub_id)

        _, mt_voice_sub_id, _ = get_subid_on_same_network_of_host_ad(ads)
        set_voice_sub_id(ad_mt_voice, mt_voice_sub_id)
        ad_mt_voice.log.info("Sub ID for incoming call at slot %s: %s",
            get_slot_index_from_subid(self.log, ad_mt_voice, mt_voice_sub_id),
            get_incoming_voice_sub_id(ad_mt_voice))

        set_message_subid(
            ad, get_subid_from_slot_index(self.log, ad, mt_sms_slot))

        self.log.info("Step 1: Switch DDS.")
        if dds_slot:
            if not set_dds_on_slot_1(ads[0]):
                ads[0].log.warning("Failed to set DDS at eSIM.")
                return False
        else:
            if not set_dds_on_slot_0(ads[0]):
                ads[0].log.warning("Failed to set DDS at pSIM.")
                return False

        self.log.info("Step 2: Check HTTP connection after DDS switch.")
        if not verify_http_connection(self.log,
           ads[0],
           url="https://www.google.com",
           retry=5,
           retry_interval=15,
           expected_state=True):

            self.log.error("Failed to verify http connection.")
            return False
        else:
            self.log.info("Verify http connection successfully.")

        phone_setup_on_rat(
            self.log, ad, rat[1-mo_voice_slot], mo_voice_other_sub_id)
        phone_setup_on_rat(self.log, ad, 'general')
        phone_setup_on_rat(self.log, ad_mt_voice, 'general')
        phone_setup_on_rat(self.log, ad_mo_sms, 'general', sub_id_type='sms')

        if mo_voice_slot == 0 or mo_voice_slot == 1:
            mo_phone_setup_func = phone_setup_on_rat(
                self.log,
                ad,
                rat[mo_voice_slot],
                only_return_fn=True)

        is_mo_in_call = is_phone_in_call_on_rat(
            self.log, ad, rat[mo_voice_slot], only_return_fn=True)

        self.log.info("Step 3: Set up the phone in desired RAT.")
        tasks = [(mo_phone_setup_func, (self.log, ad, mo_voice_sub_id))]
        if not multithread_func(self.log, tasks):
            self.log.error("Phone Failed to Set Up Properly.")
            self.tel_logger.set_result(CallResult("CALL_SETUP_FAILURE"))
            raise signals.TestFailure("Failed",
                extras={"fail_reason": "Phone Failed to Set Up Properly."})

        self.log.info("Step 4: Make a MO voice call in collision with MT SMS.")
        result = voice_call_in_collision_with_mt_sms_msim(
            self.log,
            ad,
            ad_mo_sms,
            ad_mt_voice,
            get_subid_from_slot_index(self.log, ad, mt_sms_slot),
            get_outgoing_message_sub_id(ad_mo_sms),
            mo_voice_sub_id,
            mt_voice_sub_id,
            [rand_ascii_str(50)],
            ad,
            is_mo_in_call,
            None,
            call_direction)

        call_result = True
        sms_result = True

        try:
            self.tel_logger.set_result(result.result_value)
            if not result:
                call_result = False
        except:
            sms_result = False

        extras = {}
        if not sms_result:
            log_messaging_screen_shot(ad_mo_sms, test_name="sms_tx")
            log_messaging_screen_shot(ad, test_name="sms_rx")
            extras = {"sms_fail_reason": "SMS failed"}

        if not call_result:
            self.log.error(
                "Failed to make MO call from %s slot %s to %s slot %s",
                ad.serial,
                mo_voice_slot,
                ad_mt_voice.serial,
                get_slot_index_from_subid(
                    self.log, ad_mt_voice, mt_voice_sub_id))
            extras = {"call_fail_reason": str(result.result_value)}

        if not sms_result or not call_result:
            raise signals.TestFailure("Failed", extras=extras)

        return True

    def multiple_mt_sms(
        self,
        slot_0_nw_gen="volte",
        slot_1_nw_gen="volte",
        power_off=False):
        """Receive multiple MT SMS' at the same time at specific slot in specific
        RAT to make SMS collision.

        Args:
            slot_0_nw_gen: Network generation (RAT) at pSIM
            slot_1_nw_gen: Network generation (RAT) at eSIM
            power_off: True if MT SMS' have to be sent when target DUT is
            power-off.

        Returns:
            True of False
        """
        ad = self.android_devices[0]
        slot_0_subid = get_subid_from_slot_index(ad.log, ad, 0)
        slot_1_subid = get_subid_from_slot_index(ad.log, ad, 1)

        if slot_0_subid == INVALID_SUB_ID or slot_1_subid == INVALID_SUB_ID:
            self.log.error("Not all slots have valid sub ID.")
            raise signals.TestFailure("Failed",
                extras={"fail_reason": "Not all slots have valid sub ID"})

        slot0_phone_setup_func = phone_setup_on_rat(
            self.log,
            ad,
            slot_0_nw_gen,
            only_return_fn=True)

        tasks = [(slot0_phone_setup_func, (self.log, ad, slot_0_subid))]
        if not multithread_func(self.log, tasks):
            self.log.error("Phone Failed to Set Up Properly.")
            self.tel_logger.set_result(CallResult("CALL_SETUP_FAILURE"))
            raise signals.TestFailure("Failed",
                extras={"fail_reason": "Phone Failed to Set Up Properly."})

        slot1_phone_setup_func = phone_setup_on_rat(
            self.log,
            ad,
            slot_1_nw_gen,
            only_return_fn=True)

        tasks = [(slot1_phone_setup_func, (self.log, ad, slot_1_subid))]
        if not multithread_func(self.log, tasks):
            self.log.error("Phone Failed to Set Up Properly.")
            self.tel_logger.set_result(CallResult("CALL_SETUP_FAILURE"))
            raise signals.TestFailure("Failed",
                extras={"fail_reason": "Phone Failed to Set Up Properly."})

        ad_host = self.android_devices[0]
        ad_mo_1 = self.android_devices[1]
        ad_mo_2 = self.android_devices[2]

        for host_sub_id in [
            [slot_0_subid, slot_1_subid],
            [slot_1_subid, slot_0_subid]]:
            _, mo1_sub_id, _ = get_subid_on_same_network_of_host_ad(
                self.android_devices, host_sub_id=host_sub_id[0])
            set_message_subid(ad_mo_1, mo1_sub_id)

            _, _, mo2_sub_id = get_subid_on_same_network_of_host_ad(
                self.android_devices, host_sub_id=host_sub_id[1])
            set_message_subid(ad_mo_2, mo2_sub_id)

            if power_off:
                res = self._msim_rx_power_off_multiple_sms_test(
                    ad_mo_1,
                    ad_mo_2,
                    ad_host,
                    mo1_sub_id,
                    mo2_sub_id,
                    host_sub_id[0],
                    host_sub_id[1],
                    5,
                    5)
            else:
                res = self._msim_sms_collision_test(
                    ad_mo_1,
                    ad_mo_2,
                    ad_host,
                    ad_host,
                    mo1_sub_id,
                    mo2_sub_id,
                    host_sub_id[0],
                    host_sub_id[1])

            if not res:
                log_messaging_screen_shot(
                    ad_host, test_name="sms rx subid: %s" % host_sub_id[0])
                log_messaging_screen_shot(
                    ad_host, test_name="sms rx subid: %s" % host_sub_id[1])
                log_messaging_screen_shot(
                    ad_mo_1, test_name="sms tx subid: %s" % mo1_sub_id)
                log_messaging_screen_shot(
                    ad_mo_2, test_name="sms tx subid: %s" % mo2_sub_id)

                return False
        return True

    @test_tracker_info(uuid="4ae61fdf-2078-4e50-ae03-cb2e9299ce8d")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_volte_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["volte", "volte"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="0e8801f8-7203-45ba-aff3-cb667fd538e1")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_volte_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["volte", "volte"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="d54c2b4e-2e32-49f0-9536-879eb6f6577e")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_volte_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["volte", "volte"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="feed9119-df31-46f7-afd8-addf4052422a")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_volte_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["volte", "volte"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="1da9965c-c863-4e6e-9374-a082fa16d6fd")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_volte_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["volte", "volte"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="64aec600-851f-4bde-b66c-130c69d1d5b6")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_volte_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["volte", "volte"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="9ce40c2c-3a59-4612-a0cc-4fcba887856c")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_volte_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["volte", "volte"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="4e46081d-733d-47d9-be4d-9e492de38bcd")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_volte_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["volte", "volte"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="5ede96ed-78b5-4cfb-94a3-44c34d610bef")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_volte_csfb_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["volte", "csfb"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="ae681d36-e450-4453-88a8-e9abf4bdf723")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_volte_csfb_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["volte", "csfb"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="6490abf9-7fc9-4168-ba20-7da0cb18d96e")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_volte_csfb_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["volte", "csfb"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="71590c9e-add0-4cbb-a530-07f58d26d954")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_volte_csfb_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["volte", "csfb"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="1b033914-8a26-48e0-829a-c85b5a93ce42")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_volte_csfb_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["volte", "csfb"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="15ebac40-5dc3-47ee-a787-ae6f9d71aff6")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_volte_csfb_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["volte", "csfb"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="b38390d2-b5ab-414b-9c61-2324395a56a6")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_volte_csfb_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["volte", "csfb"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="1c4a3a34-800a-4117-8c32-b6ec7d58a5cb")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_volte_csfb_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["volte", "csfb"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="c7645032-8006-448e-ae3e-86c9223482cf")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_csfb_volte_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["csfb", "volte"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="a4455da1-6314-4d2e-a6eb-c7e063a5fd10")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_csfb_volte_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["csfb", "volte"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="60828bcc-0111-4d97-ac01-b43ff9c33b11")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_csfb_volte_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["csfb", "volte"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="d0f04ab9-c1fe-41b1-8ffc-7bf7cbb408ea")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_csfb_volte_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["csfb", "volte"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="97ad2e6f-8b71-49d4-870c-2f4438351880")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_csfb_volte_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["csfb", "volte"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="8353bce2-a800-440c-9822-a922343d0ff5")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_csfb_volte_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["csfb", "volte"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="7659d23d-8cf4-4ace-8e53-b26fc2fca38c")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_csfb_volte_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["csfb", "volte"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="91577f12-4a0e-4743-82bc-1b7581a6940d")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_csfb_volte_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["csfb", "volte"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="a5f2c1b0-5ae7-4187-ad63-4782dc47f62b")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_volte_3g_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["volte", "3g"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="0c983462-5372-4aae-a484-53da4d2b9553")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_volte_3g_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["volte", "3g"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="8266aaac-9d67-42c3-9260-d80c377b1ef9")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_volte_3g_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["volte", "3g"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="d6ae749b-5e69-489e-8fda-fcb38aaa6cb0")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_volte_3g_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["volte", "3g"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="f4985e53-d530-491c-94cd-51ba22a34eff")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_volte_3g_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["volte", "3g"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="b4fc2379-6937-404a-a659-249c1ccf9dd0")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_volte_3g_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["volte", "3g"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="e1027a25-b19f-4fb7-bfb9-79919e380c25")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_volte_3g_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["volte", "3g"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="7cf99f83-0542-42c8-8e72-1653e381aa6c")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_volte_3g_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["volte", "3g"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="c1084606-a63b-41da-a0cb-2db972b6a8ce")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_3g_volte_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["3g", "volte"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="4806716c-047a-4a33-a317-97d3cce5d2ca")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_3g_volte_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["3g", "volte"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="2877ff0b-d567-4683-baa3-20e254ed025c")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_3g_volte_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["3g", "volte"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="6bf3ea1b-e75c-4844-a311-5a18b1b7a1b8")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_3g_volte_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["3g", "volte"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="fb7bf8b2-fa44-4e05-a0ab-16e7b1907e6b")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_3g_volte_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["3g", "volte"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="d9090125-61cb-4ef5-97de-06c2ec8529bd")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_3g_volte_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["3g", "volte"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="d764c5ea-a34a-4b29-ab50-63bd63ebe5c4")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_3g_volte_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["3g", "volte"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="fe7d2f8c-eeb6-4ae9-a57d-1636d3153d2b")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_3g_volte_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["3g", "volte"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="b9a5cb40-4986-4811-90e7-628d1729ccb2")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_csfb_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["csfb", "csfb"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="220665c1-4c63-4450-b8bb-17fc6df24498")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_csfb_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["csfb", "csfb"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="968217a6-320f-41f0-b401-7c377309d983")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_csfb_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["csfb", "csfb"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="c6a5bf63-af40-4619-a0eb-0d1835fde36c")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_csfb_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["csfb", "csfb"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="ea9f4e72-0dea-4f5f-b5ff-4a0bad0d29a0")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_csfb_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["csfb", "csfb"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="4eb935f0-2b11-4b2d-8faa-9a022e36813a")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_csfb_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["csfb", "csfb"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="765e31fd-b412-43a8-a6a8-5d3ae66cab18")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_csfb_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["csfb", "csfb"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="bc6ada03-6a5e-4fe7-80c4-3aebc9fa426f")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_csfb_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["csfb", "csfb"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="a42994d0-bdb3-487e-98f2-665899d3edba")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_csfb_3g_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["csfb", "3g"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="d8ef0ac8-9cb1-4f32-8211-84dee563af00")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_csfb_3g_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["csfb", "3g"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="f4eb2254-5148-4cf9-b53f-56d8665de645")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_csfb_3g_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["csfb", "3g"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="fd546290-f7e7-47ff-b165-a9bb01e91c64")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_csfb_3g_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["csfb", "3g"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="d6994024-e845-48e2-9cd6-d72e97480a8a")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_csfb_3g_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["csfb", "3g"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="c816165e-49d8-4d0a-8bb5-e64ad910a55a")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_csfb_3g_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["csfb", "3g"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="647d546f-b325-4b91-be84-0bedf5a33210")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_csfb_3g_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["csfb", "3g"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="98b7e161-4953-4566-a96c-21545bf05e51")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_csfb_3g_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["csfb", "3g"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="9a3d1330-e70e-4ac0-a8bc-fec5710a8dcd")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_3g_csfb_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["3g", "csfb"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="51b4edd3-a867-409e-b367-2fd8cf0eb4a6")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_3g_csfb_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["3g", "csfb"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="dba9cb2b-84bd-47db-a5a6-826e54a1bbeb")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_3g_csfb_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["3g", "csfb"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="263494aa-f3c4-450e-b5bf-b9331d9c9dd8")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_3g_csfb_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["3g", "csfb"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="7ba231b8-edc9-4f64-ba7e-5f0360c4eed5")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_3g_csfb_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["3g", "csfb"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="ca1e9c35-07f2-4e32-8a59-61efc37f11a4")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_3g_csfb_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["3g", "csfb"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="f19252c0-8ff6-4267-adcd-f676407333e6")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_3g_csfb_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["3g", "csfb"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="34ef2001-d80d-4818-b458-1e8a9556e5cd")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_3g_csfb_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["3g", "csfb"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="947ceba7-9aeb-402c-ba36-4856bc4352eb")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_3g_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["3g", "3g"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="9f9677e1-1215-49ed-a671-22e7779659a9")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_3g_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["3g", "3g"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="f77112c8-85e8-4584-a0b7-bba11c23be7d")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_3g_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["3g", "3g"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="facc19fd-7846-488e-9cf1-755f81d0fee2")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_3g_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["3g", "3g"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="5a26f35e-c038-409e-8941-7e0b475ebda8")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_3g_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["3g", "3g"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="c303aa26-0fd0-44d7-b2fc-32782deaf5ea")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mo_3g_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["3g", "3g"], msg="SMS", direction="mo")

    @test_tracker_info(uuid="45cbddd3-889d-46ab-8d7f-9dd971287155")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_3g_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["3g", "3g"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="7dacd6b2-9d21-4c4d-bec4-fdfe685cdce8")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_sms_mt_3g_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["3g", "3g"], msg="SMS", direction="mt")

    @test_tracker_info(uuid="24268e9f-b047-4c67-92f9-22e0bd8b3a11")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_volte_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["volte", "volte"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="1d72b01d-5ca7-4899-ae57-ecbeff09bc39")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_volte_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["volte", "volte"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="ca2ad510-7f5e-49e4-861e-d433f86c2237")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_volte_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["volte", "volte"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="63a0480a-18dd-43e5-82e9-45e008346ea9")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_volte_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["volte", "volte"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="5e51f0d9-f1b6-4bfe-88ab-f28ebaa6ee55")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_volte_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["volte", "volte"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="fcc7e8aa-41a4-48a1-9586-d6080c77a79b")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_volte_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["volte", "volte"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="f633bf56-2d15-462b-994d-e9294d87ca23")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_volte_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["volte", "volte"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="3c336061-32cf-4e9a-bb1e-b54e3357e644")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_volte_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["volte", "volte"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="50ee8103-0196-4194-b982-9d07c68e57e4")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_volte_csfb_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["volte", "csfb"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="ec09405d-b12d-405c-9bfd-ba3eb20eb752")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_volte_csfb_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["volte", "csfb"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="26bea731-b653-4e9f-98d1-1b290b959bfc")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_volte_csfb_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["volte", "csfb"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="ecc010da-1798-4da3-b041-13e2b2547548")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_volte_csfb_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["volte", "csfb"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="cf4c5bd0-525a-497a-a0f8-17acd9dbeabd")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_volte_csfb_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["volte", "csfb"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="603f22db-913b-4ad3-b148-7c6d3624bc09")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_volte_csfb_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["volte", "csfb"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="561efaf1-7fe4-4196-991e-d03eee28fb4e")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_volte_csfb_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["volte", "csfb"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="6f383ef0-d99a-4a3d-b137-e24fa03306b9")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_volte_csfb_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["volte", "csfb"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="eeaa1262-c2a0-4f47-baa5-7435fa9e9315")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_csfb_volte_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["csfb", "volte"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="478f5497-cc21-4634-8b97-df70dbe286c0")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_csfb_volte_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["csfb", "volte"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="1c4af9c6-87d6-438c-aba7-70d8bb4b357e")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_csfb_volte_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["csfb", "volte"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="825daee3-db6c-404a-a454-cea98182bf5a")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_csfb_volte_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["csfb", "volte"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="50fe9f3e-eae1-4a01-8655-02340f85037a")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_csfb_volte_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["csfb", "volte"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="bae89139-f73f-4a06-bb65-a0bae385fae9")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_csfb_volte_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["csfb", "volte"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="42e897e3-4411-45a0-bf62-3ea6f59c2617")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_csfb_volte_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["csfb", "volte"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="9847b0c8-517e-42ea-9306-8a4a1cd46cd8")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_csfb_volte_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["csfb", "volte"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="5057f8e4-19e7-42c0-bc63-1678d8ce1504")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_volte_3g_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["volte", "3g"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="52bb44ae-0263-4415-8a61-337a8f990f8b")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_volte_3g_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["volte", "3g"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="deb00e73-b63a-4ed8-8b7f-953704b5d783")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_volte_3g_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["volte", "3g"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="e0aa9846-2c02-4ba1-aeef-08a673c497ae")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_volte_3g_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["volte", "3g"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="ef06ae23-6f52-4c3b-b228-5c95ed780cd2")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_volte_3g_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["volte", "3g"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="69a62cd6-290b-4e58-81ff-0b35ac82262c")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_volte_3g_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["volte", "3g"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="645cef41-ddf8-49b4-8a58-2da019883f32")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_volte_3g_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["volte", "3g"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="b0b8aac3-cc85-47d9-828a-8016138fe466")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_volte_3g_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["volte", "3g"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="1dcebefb-3338-4550-96fa-07b64493db1c")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_3g_volte_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["3g", "volte"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="3d06854e-5b86-46fb-9ca2-a217b026733d")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_3g_volte_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["3g", "volte"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="0c0f72bc-4076-411d-8a8d-fc6ae414a73a")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_3g_volte_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["3g", "volte"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="b63211fa-baf0-4dff-bd18-d7f80e85e551")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_3g_volte_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["3g", "volte"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="80c2fe4d-e87a-45d7-9b83-23863e75cd94")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_3g_volte_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["3g", "volte"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="84be29a1-0b29-4785-baaa-6cf84c503fa6")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_3g_volte_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["3g", "volte"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="591d2948-2257-4a46-8ccb-5c628d85fc43")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_3g_volte_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["3g", "volte"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="67e4dae5-8ca5-475f-af0e-f91b89df68ed")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_3g_volte_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["3g", "volte"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="35d33d3e-f618-4ce1-8b40-3dac0ef2731a")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_csfb_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["csfb", "csfb"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="179e49c7-7066-4285-9b5b-3ef639d8c5e4")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_csfb_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["csfb", "csfb"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="09d6954f-d760-47e5-8667-3ed317fdbfbc")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_csfb_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["csfb", "csfb"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="80f8c18f-2bd6-4310-be39-472d7a24e08a")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_csfb_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["csfb", "csfb"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="b700d261-7616-4226-95cc-59ec54cc2678")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_csfb_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["csfb", "csfb"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="5cb2cc81-bf3e-4025-b85b-2bf1a4797e41")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_csfb_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["csfb", "csfb"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="1af2ac12-4d2d-4a36-8c46-8b3013eadab2")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_csfb_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["csfb", "csfb"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="66d8108e-8dd9-42e3-b2cd-49a538beecf6")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_csfb_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["csfb", "csfb"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="a35df875-72eb-43d7-874c-a7b3f0aea2a9")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_csfb_3g_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["csfb", "3g"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="cf718bda-75d6-4906-a33e-110610b01d4d")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_csfb_3g_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["csfb", "3g"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="342cbc1a-7151-425c-9bd6-81808a5eb7e6")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_csfb_3g_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["csfb", "3g"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="01e33aa4-27a9-48fd-b9e8-313980d06b0d")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_csfb_3g_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["csfb", "3g"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="fe527335-731e-49a5-a07e-f4999c536153")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_csfb_3g_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["csfb", "3g"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="1c56f866-3b3c-45c0-9c13-face44246aca")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_csfb_3g_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["csfb", "3g"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="4affd77a-afdc-4ac9-ba8a-a3599efe1e96")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_csfb_3g_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["csfb", "3g"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="8440c05e-28d9-45c7-b32e-127f240d12f0")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_csfb_3g_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["csfb", "3g"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="a53ebb84-945e-4068-a78a-fd78362e8073")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_3g_csfb_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["3g", "csfb"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="23bedcbc-7c09-430d-a162-04de75244fd8")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_3g_csfb_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["3g", "csfb"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="e1e1ef53-d91b-4b10-9bd6-e065ca48ab94")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_3g_csfb_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["3g", "csfb"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="e813ae3b-b875-43f6-a055-d2119cec9786")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_3g_csfb_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["3g", "csfb"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="d5863aab-a46a-4363-8bf8-5dcfc29a9055")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_3g_csfb_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["3g", "csfb"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="79a0bd58-0de0-471e-9e53-9cc655700428")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_3g_csfb_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["3g", "csfb"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="e9a340f4-22a7-4786-bb5b-370295324d5a")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_3g_csfb_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["3g", "csfb"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="8a261b43-2532-4c47-ac0c-3a5dd0d51b69")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_3g_csfb_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["3g", "csfb"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="2efdf7da-d2ec-4580-a164-5f7b740f9ac6")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_3g_psim_dds_slot_0(self):
        return self._test_msim_message(
            0, None, 0, mo_rat=["3g", "3g"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="459e9b40-ad4e-4a89-ac89-f3c8ec472d3f")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_3g_psim_dds_slot_1(self):
        return self._test_msim_message(
            0, None, 1, mo_rat=["3g", "3g"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="130a0e85-1653-4ddf-81b9-dadd26dde1e3")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_3g_psim_dds_slot_0(self):
        return self._test_msim_message(
            None, 0, 0, mt_rat=["3g", "3g"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="e81f0b33-38b3-4a4d-9e05-fb44a689230b")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_3g_psim_dds_slot_1(self):
        return self._test_msim_message(
            None, 0, 1, mt_rat=["3g", "3g"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="61894370-93b5-4ab5-80c7-d50948d38471")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_3g_esim_dds_slot_0(self):
        return self._test_msim_message(
            1, None, 0, mo_rat=["3g", "3g"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="8d41ee9a-fed9-4472-ada7-007e56690c67")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mo_3g_esim_dds_slot_1(self):
        return self._test_msim_message(
            1, None, 1, mo_rat=["3g", "3g"], msg="MMS", direction="mo")

    @test_tracker_info(uuid="6aa41641-2619-48f6-8c5f-1c06260f0e28")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_3g_esim_dds_slot_0(self):
        return self._test_msim_message(
            None, 1, 0, mt_rat=["3g", "3g"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="94d8e05d-eb99-4a71-be00-e725cbd05cae")
    @TelephonyBaseTest.tel_test_wrap
    def test_msim_mms_mt_3g_esim_dds_slot_1(self):
        return self._test_msim_message(
            None, 1, 1, mt_rat=["3g", "3g"], msg="MMS", direction="mt")

    @test_tracker_info(uuid="207a23b7-17f1-4e27-892d-6c276f463b07")
    @TelephonyBaseTest.tel_test_wrap
    def test_sms_mo_mt_at_the_same_time(
        self,
        slot_0_nw_gen="volte",
        slot_1_nw_gen="volte"):
        ad = self.android_devices[0]
        slot_0_subid = get_subid_from_slot_index(ad.log, ad, 0)
        slot_1_subid = get_subid_from_slot_index(ad.log, ad, 1)

        if slot_0_subid == INVALID_SUB_ID or slot_1_subid == INVALID_SUB_ID:
            self.log.error("Not all slots have valid sub ID.")
            raise signals.TestFailure("Failed",
                extras={"fail_reason": "Not all slots have valid sub ID"})

        slot0_phone_setup_func = phone_setup_on_rat(
            self.log,
            ad,
            slot_0_nw_gen,
            only_return_fn=True)

        tasks = [(slot0_phone_setup_func, (self.log, ad, slot_0_subid))]
        if not multithread_func(self.log, tasks):
            self.log.error("Phone Failed to Set Up Properly.")
            self.tel_logger.set_result(CallResult("CALL_SETUP_FAILURE"))
            raise signals.TestFailure("Failed",
                extras={"fail_reason": "Phone Failed to Set Up Properly."})

        slot1_phone_setup_func = phone_setup_on_rat(
            self.log,
            ad,
            slot_1_nw_gen,
            only_return_fn=True)

        tasks = [(slot1_phone_setup_func, (self.log, ad, slot_1_subid))]
        if not multithread_func(self.log, tasks):
            self.log.error("Phone Failed to Set Up Properly.")
            self.tel_logger.set_result(CallResult("CALL_SETUP_FAILURE"))
            raise signals.TestFailure("Failed",
                extras={"fail_reason": "Phone Failed to Set Up Properly."})

        ad_host = self.android_devices[0]
        ad_mt = self.android_devices[1]
        ad_mo = self.android_devices[2]

        for ads in [[slot_0_subid, slot_1_subid], [slot_1_subid, slot_0_subid]]:
            set_message_subid(ad_host, ads[0])
            _, mt_sub_id, _ = get_subid_on_same_network_of_host_ad(
                self.android_devices, host_sub_id=ads[0])

            _, _, mo_sub_id = get_subid_on_same_network_of_host_ad(
                self.android_devices, host_sub_id=ads[1])
            set_message_subid(ad_mo, mo_sub_id)

            res = self._msim_sms_collision_test(
                ad_host,
                ad_mo,
                ad_mt,
                ad_host,
                ads[0],
                mo_sub_id,
                mt_sub_id,
                ads[1])

            if not res:
                log_messaging_screen_shot(
                    ad_host,
                    test_name="sms tx subid: %s; sms rx subid: %s" % (
                        ads[0], ads[1]))
                log_messaging_screen_shot(
                    ad_mo, test_name="sms tx subid: %s" % mo_sub_id)
                log_messaging_screen_shot(
                    ad_mt, test_name="sms rx subid: %s" % mt_sub_id)

                return False

    @test_tracker_info(uuid="e0483de8-f760-4e40-a451-a867c7f94d3a")
    @TelephonyBaseTest.tel_test_wrap
    def test_sms_mt_at_both_slots_at_the_same_time(
        self,
        slot_0_nw_gen="volte",
        slot_1_nw_gen="volte"):
        return self.multiple_mt_sms(
            slot_0_nw_gen="volte",
            slot_1_nw_gen="volte",
            power_off=False)

    @test_tracker_info(uuid="6594e5b5-6baf-4f1e-865b-0ea70ef23aee")
    @TelephonyBaseTest.tel_test_wrap
    def test_sms_mt_at_both_slots_when_power_off(
        self,
        slot_0_nw_gen="volte",
        slot_1_nw_gen="volte"):
        return self.multiple_mt_sms(
            slot_0_nw_gen="volte",
            slot_1_nw_gen="volte",
            power_off=True)

    @test_tracker_info(uuid="13dfe0a1-c393-4c1a-b636-ac39d47a70b5")
    @TelephonyBaseTest.tel_test_wrap
    def test_interworking_between_mo_voice_call_in_collision_with_mt_sms(self):
        result = True
        self.log.info("Scenario 1: MO voice call at slot 0 & MT SMS at slot 0")
        if not self._test_msim_voice_call_in_collision_with_mt_sms(
            0, 0, 0, rat=["volte", "volte"], call_direction="mo"):
            result =  False
        self.log.info("Scenario 2: MO voice call at slot 0 & MT SMS at slot 1")
        if not self._test_msim_voice_call_in_collision_with_mt_sms(
            0, 1, 0, rat=["volte", "volte"], call_direction="mo"):
            result =  False
        self.log.info("Scenario 3: MO voice call at slot 1 & MT SMS at slot 0")
        if not self._test_msim_voice_call_in_collision_with_mt_sms(
            1, 0, 0, rat=["volte", "volte"], call_direction="mo"):
            result =  False
        self.log.info("Scenario 1: MO voice call at slot 1 & MT SMS at slot 1")
        if not self._test_msim_voice_call_in_collision_with_mt_sms(
            1, 1, 0, rat=["volte", "volte"], call_direction="mo"):
            result =  False
        return result

    @test_tracker_info(uuid="a5c90676-c2ba-4ac6-b639-8f895d98480c")
    @TelephonyBaseTest.tel_test_wrap
    def test_interworking_between_mt_voice_call_in_collision_with_mt_sms(self):
        result = True
        self.log.info("Scenario 1: MT voice call at slot 0 & MT SMS at slot 0")
        if not self._test_msim_voice_call_in_collision_with_mt_sms(
            0, 0, 0, rat=["volte", "volte"], call_direction="mt"):
            result =  False
        self.log.info("Scenario 2: MT voice call at slot 0 & MT SMS at slot 1")
        if not self._test_msim_voice_call_in_collision_with_mt_sms(
            0, 1, 0, rat=["volte", "volte"], call_direction="mt"):
            result =  False
        self.log.info("Scenario 3: MT voice call at slot 1 & MT SMS at slot 0")
        if not self._test_msim_voice_call_in_collision_with_mt_sms(
            1, 0, 0, rat=["volte", "volte"], call_direction="mt"):
            result =  False
        self.log.info("Scenario 4: MT voice call at slot 1 & MT SMS at slot 1")
        if not self._test_msim_voice_call_in_collision_with_mt_sms(
            1, 1, 0, rat=["volte", "volte"], call_direction="mt"):
            result =  False
        return result