#!/usr/bin/env python3
#
#   Copyright 2022 - The Android Open Source Project
#
#   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
import datetime
from acts import asserts
from acts.test_decorators import test_tracker_info
from acts.libs.utils.multithread import multithread_func
from acts_contrib.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
from acts_contrib.test_utils.tel.GFTInOutBaseTest import GFTInOutBaseTest
from acts_contrib.test_utils.tel.gft_inout_utils import mo_voice_call
from acts_contrib.test_utils.tel.tel_test_utils import wait_for_ims_registered
from acts_contrib.test_utils.tel.tel_data_utils import active_file_download_test
from acts_contrib.test_utils.tel.tel_test_utils import ensure_phones_idle
from acts_contrib.test_utils.tel.tel_data_utils import wait_for_cell_data_connection

from acts_contrib.test_utils.tel.tel_subscription_utils import set_dds_on_slot
from acts_contrib.test_utils.tel.tel_subscription_utils import set_message_subid
from acts_contrib.test_utils.tel.tel_subscription_utils import set_voice_sub_id

from acts_contrib.test_utils.tel.gft_inout_defines import VOICE_CALL
from acts_contrib.test_utils.tel.gft_inout_defines import VOLTE_CALL
from acts_contrib.test_utils.tel.gft_inout_defines import CSFB_CALL
from acts_contrib.test_utils.tel.gft_inout_defines import WFC_CALL
from acts_contrib.test_utils.tel.gft_inout_defines import NO_SERVICE_POWER_LEVEL
from acts_contrib.test_utils.tel.gft_inout_defines import IN_SERVICE_POWER_LEVEL
from acts_contrib.test_utils.tel.gft_inout_utils import check_ims_state
from acts_contrib.test_utils.tel.tel_test_utils import wait_for_network_service

IDLE_CASE = 1
DATA_TRANSFER_CASE = 2
DATA_OFF_CASE = 3
IN_CALL_CASE = 4
CALL_DATA_CASE = 5
_VOLTE = "volte"


class TelLabGFTDSDSInOutServiceTest(GFTInOutBaseTest):
    def __init__(self, controllers):
        GFTInOutBaseTest.__init__(self, controllers)
        self.my_error_msg = ""

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

    def _dsds_in_out_service_test(self, case=IDLE_CASE, loop=1, idle_time=60, dds_slot=0,
        voice_slot=0, sms_slot=0, psim_rat=_VOLTE , esim_rat=_VOLTE):
        '''
            b/201599180
            Move UE from coverage area to no service area and UE shows no service
            Wait for a period of time, then re-enter coverage area

            Args:
                case: include IDLE_CAS, DATA_TRANSFER_CASE, DATA_OFF_CASE,
                    IN_CALL_CASE, CALL_DATA_CASE
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
                dds_slot: Preferred data slot
                voice_slot: Preferred voice slot
                sms_slot: Preferred SMS slot
                psim_rat: RAT on psim
                esim_rat: RAT on esim
            Returns:
                True if pass; False if fail
            Raises:
                TestFailure if not success.
        '''
        tasks = [(set_dds_on_slot, (ad, dds_slot )) for ad in self.android_devices]
        if not multithread_func(self.log, tasks):
            asserts.skip("Fail to to set up DDS")
        tasks = [(set_voice_sub_id, (ad, voice_slot )) for ad in self.android_devices]
        if not multithread_func(self.log, tasks):
            asserts.skip("Fail to to set voice to slot %s" %voice_slot)
        tasks = [(set_message_subid, (ad, sms_slot )) for ad in self.android_devices]
        if multithread_func(self.log, tasks):
            asserts.skip("Fail to to set up sms to slot %s" %sms_slot)
        if multithread_func(self.log, tasks):
            for x in range (loop):
                self.log.info("%s loop: %s/%s" %(self.current_test_name,x+1, loop))
                if case == IDLE_CASE:
                    asserts.assert_true(self._dsds_in_out_service_idle_test(idle_time),
                        "Fail: %s." %("_dsds_in_out_service_idle_test failure"),
                        extras={"failure_cause": self.my_error_msg})
                elif case == DATA_TRANSFER_CASE:
                    asserts.assert_true(self._dsds_in_out_service_data_transfer_test(idle_time),
                        "Fail: %s." %("_dsds_in_out_service_data_transfer_test failure"),
                        extras={"failure_cause": self.my_error_msg})
                elif case == DATA_OFF_CASE:
                    asserts.assert_true(self._dsds_in_out_service_data_off_test(idle_time),
                        "Fail: %s." %("_dsds_in_out_service_data_off_test failure"),
                        extras={"failure_cause": self.my_error_msg})
                elif case == IN_CALL_CASE:
                    asserts.assert_true(self._dsds_in_out_service_in_call_test(case, voice_slot,
                        sms_slot,idle_time),
                        "Fail: %s." %("_dsds_in_out_service_in_call_test failure"),
                        extras={"failure_cause": self.my_error_msg})
                elif case == CALL_DATA_CASE:
                    asserts.assert_true(self._dsds_in_out_service_in_call_transfer_test(case,
                        voice_slot,sms_slot, idle_time), "Fail: %s."
                        %("_dsds_in_out_service_in_call_transfer_test failure"),
                        extras={"failure_cause": self.my_error_msg})

                tasks = [(wait_for_network_service, (self.log, ad, ))
                    for ad in self.android_devices]
                if not multithread_func(self.log, tasks):
                    asserts.assert_true(False, "Fail: %s." %("wait_for_network_service failure"),
                        extras={"failure_cause": self.my_error_msg})
                tasks = [(self.verify_device_status, (ad, VOICE_CALL))
                    for ad in self.android_devices]
                asserts.assert_true(multithread_func(self.log, tasks),
                    "Fail: %s." %("verify_device_status failure"),
                    extras={"failure_cause": self.my_error_msg})
        return True

    def _dsds_in_out_service_idle_test(self, idle_time=60):
        '''
            (1) UE is in idle
            (2) Move UE from coverage area to no service area and UE shows no service
            (3) Wait for a period of time, then re-enter coverage area

            Args:
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        return self._in_out_service_idle(idle_time)


    def _dsds_in_out_service_in_call_transfer_test(self, idle_time=60):
        '''
            (1) UE is performing data transfer (E.g. Use FTP or browse tools)
            (2) UE makes a MO call
            (3) Move UE from coverage area to no service area and UE shows no service
            (4) Wait for a period of time, then re-enter coverage area

            Args:
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        error_msg = ""
        tasks_a = [(active_file_download_test, (self.log, ad, )) for ad in self.android_devices]
        tasks_b= [(mo_voice_call, (self.log, ad, VOICE_CALL, False)) for ad in self.android_devices]
        tasks_b.extend(tasks_a)
        if not multithread_func(self.log, tasks_b):
            error_msg = "fail to perfrom data transfer/voice call"
            self.my_error_msg += error_msg
            return False
        self._in_out_service_idle(idle_time)
        return True

    def _dsds_in_out_service_in_call_test(self, idle_time=60):
        '''
            (1) UE is in call
            (2) Move UE from coverage area to no service area and UE shows no service
            (3) Wait for a period of time, then re-enter coverage area

            Args:
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        error_msg = ""
        tasks = [(mo_voice_call, (self.log, ad, VOICE_CALL, False)) for ad in self.android_devices]
        if not multithread_func(self.log, tasks):
            error_msg = "MO voice call fail"
            self.my_error_msg += error_msg
            self.log.error(error_msg)
            return False
        return self._in_out_service_idle(idle_time)

    def _dsds_in_out_service_data_off_test(self, idle_time=60):
        '''
            (1) Disable UE mobile data
            (2) Move UE from coverage area to no service area and UE shows no service
            (3) Wait for a period of time, then re-enter coverage area

            Args:
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        for ad in self.android_devices:
            ad.log.info("Turn off mobile data")
            ad.droid.telephonyToggleDataConnection(False)
            if not wait_for_cell_data_connection(self.log, ad, False):
                self.my_error_msg += "fail to turn off mobile data"
                return False
        self._in_out_service_idle(idle_time)
        for ad in self.android_devices:
            ad.log.info("Turn on mobile data")
            ad.droid.telephonyToggleDataConnection(True)
            #If True, it will wait for status to be DATA_STATE_CONNECTED
            if not wait_for_cell_data_connection(self.log, ad, True):
                self.my_error_msg += "fail to turn on mobile data"
                return False
        return True

    def _dsds_in_out_service_data_transfer_test(self, idle_time=60, file_name="10MB"):
        '''
            (1) UE is performing data transfer (E.g. Use FTP or browse tools)
            (2) Move UE from coverage area to no service area and UE shows no service
            (3) Wait for 1 min, then re-enter coverage area

            Args:
                idle_time: idle time at no service area
                file_name:
            Returns:
                True if pass; False if fail
            Raises:
                TestFailure if not success.
        '''
        tasks_a = [(self._in_out_service_idle, (idle_time))]
        tasks_b = [(active_file_download_test, (self.log, ad, file_name))
            for ad in self.android_devices]
        tasks_b.extend(tasks_a)
        if not multithread_func(self.log, tasks_b):
            error_msg = " data transfer fail. "
            self.my_error_msg +=  error_msg
            self.log.error(error_msg)
        tasks = [(self.verify_device_status, (ad, VOICE_CALL))
            for ad in self.android_devices]
        asserts.assert_true(multithread_func(self.log, tasks), "Fail: %s."
            %("verify_device_status failure"), extras={"failure_cause":
            self.my_error_msg})
        return True

    def _in_out_service_idle(self, idle_time):
        '''
            adjust cellular signal

            Args:
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        self.adjust_cellular_signal(NO_SERVICE_POWER_LEVEL)
        time.sleep(idle_time)
        self.adjust_cellular_signal(IN_SERVICE_POWER_LEVEL)
        return True



    @test_tracker_info(uuid="053465d8-a682-404c-a0fb-8e79f6ca581d")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_idle_msim_4g_esim_4g_dds_sim1_1min(self, loop=50, idle_time=60):
        '''
            1.8.17 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary idle mode - 1 min

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IDLE_CASE, loop, idle_time, 0)


    @test_tracker_info(uuid="1ba35ced-41d1-456d-84e2-a40a0d7402b2")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_idle_msim_4g_esim_4g_dds_sim2_1min(self, loop=50, idle_time=60):
        '''
            1.8.18 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary idle mode - 1 min

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IDLE_CASE, loop, idle_time, 1)

    @test_tracker_info(uuid="53697dd9-a2f6-4eb5-8b2c-5c9f2a5417ad")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_idle_msim_4g_esim_4g_dds_sim1_2min(self, loop=1,
        idle_time=120):
        '''
            1.8.19 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service
            Stationary idle mode - 2 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IDLE_CASE, loop, idle_time, 0)

    @test_tracker_info(uuid="f329bb22-c74f-4688-9983-eaf88131a630")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_idle_msim_4g_esim_4g_dds_sim2_2min(self, loop=1,
        idle_time=120):
        '''
            1.8.20 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary idle mode - 2 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IDLE_CASE, loop, idle_time, 1)

    @test_tracker_info(uuid="4d8cba59-921b-441c-94dc-8c43a12593ea")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_idle_msim_4g_esim_4g_dds_sim1_5min(self, loop=1,
        idle_time=300):
        '''
            1.8.21 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary idle mode - 5 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IDLE_CASE, loop, idle_time, 0)

    @test_tracker_info(uuid="dfb3646f-b21f-41f4-a70b-f7ca93ff56ec")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_idle_msim_4g_esim_4g_dds_sim2_5min(self, loop=1,
        idle_time=300):
        '''
            1.8.22 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary idle mode - 5 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IDLE_CASE, loop, idle_time, 1)


    @test_tracker_info(uuid="95e026e1-8f3e-4b9e-8d13-96a2d3be2d23")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_idle_msim_4g_esim_4g_dds_sim1_10min(self, loop=1,
        idle_time=600):
        '''
            1.8.23 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary idle mode - 10 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IDLE_CASE, loop, idle_time, 0)

    @test_tracker_info(uuid="935ed9be-94ef-4f46-b742-4bfac16b876d")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_idle_msim_4g_esim_4g_dds_sim2_10min(self, loop=1,
        idle_time=600):
        '''
            1.8.24 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary idle mode - 10 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IDLE_CASE, loop, idle_time, 1)


    @test_tracker_info(uuid="919e478e-6ea4-4bdc-b7d8-0252c7fa1510")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_data_transfer_msim_4g_esim_4g_dds_sim1_1min(
        self, loop=20, idle_time=60):
        '''
            1.8.25 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary data transfer - 1 min

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(DATA_TRANSFER_CASE, loop, idle_time, 0)

    @test_tracker_info(uuid="0826b234-7619-4ad9-b1e9-81d4d7e51be4")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_data_transfer_msim_4g_esim_4g_dds_sim2_1min(
        self, loop=20, idle_time=60):
        '''
            1.8.26 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary data transfer - 1 min

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(DATA_TRANSFER_CASE, loop, idle_time, 1)


    @test_tracker_info(uuid="baf5a72d-2a44-416b-b50d-80a4e6d75373")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_data_transfer_msim_4g_esim_4g_dds_sim1_2min(
        self, loop=20, idle_time=120):
        '''
            1.8.27 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary data transfer - 2 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(DATA_TRANSFER_CASE, loop, idle_time, 0)


    @test_tracker_info(uuid="e74bbe30-6ced-4122-8088-3f7f7bcd35d1")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_data_transfer_msim_4g_esim_4g_dds_sim2_2min(
        self, loop=20, idle_time=120):
        '''
            1.8.28 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary data transfer - 2 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(DATA_TRANSFER_CASE, loop, idle_time, 1)


    @test_tracker_info(uuid="d605bdc1-c262-424b-aa05-dd64db0f150d")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_data_transfer_msim_4g_esim_4g_dds_sim1_5min(
        self, loop=20, idle_time=300):
        '''
            1.8.29 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary data transfer - 5 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(DATA_TRANSFER_CASE, loop, idle_time, 0)


    @test_tracker_info(uuid="590f6292-c19e-44f9-9050-8e4ad6ef0047")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_data_transfer_msim_4g_esim_4g_dds_sim2_5min(
        self, loop=20, idle_time=300):
        '''
            1.8.30 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary data transfer - 5 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(DATA_TRANSFER_CASE, loop, idle_time, 1)


    @test_tracker_info(uuid="6d4c631d-d4b1-4974-bcf5-f63d655a43d8")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_data_transfer_msim_4g_esim_4g_dds_sim1_10min(
        self, loop=20, idle_time=600):
        '''
            1.8.31 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary data transfer - 10 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(DATA_TRANSFER_CASE, loop, idle_time, 0)

    @test_tracker_info(uuid="ec4c4b08-d306-4d95-af07-485953afe741")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_data_transfer_msim_4g_esim_4g_dds_sim2_10min(
        self, loop=20, idle_time=600):
        '''
            1.8.32 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary data transfer - 10 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(DATA_TRANSFER_CASE, loop, idle_time, 1)



    @test_tracker_info(uuid="9a3827bd-132b-42de-968d-802b7e2e22cc")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_data_off_msim_4g_esim_4g_dds_sim1_1min(self, loop=50, idle_time=60):
        '''
            1.8.33 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary data off - 1 min

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(DATA_OFF_CASE, loop, idle_time, 0)

    @test_tracker_info(uuid="4c42e33b-188c-4c62-8def-f47c46a07555")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_data_off_msim_4g_esim_4g_dds_sim1_2min(self, loop=50, idle_time=120):
        '''
            1.8.34 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary data off - 2 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(DATA_OFF_CASE, loop, idle_time, 0)

    @test_tracker_info(uuid="d40ee1cb-0e63-43f4-8b45-6a3a9bc1fcaa")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_data_off_msim_4g_esim_4g_dds_sim1_5min(self, loop=10, idle_time=300):
        '''
            1.8.35 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary data off - 5 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(DATA_OFF_CASE, loop, idle_time, dds_slot=0)


    @test_tracker_info(uuid="a0bb09bf-36c2-45cc-91d3-5441fd90a2ee")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_data_off_msim_4g_esim_4g_dds_sim1_10min(self, loop=10, idle_time=600):
        '''
            1.8.36 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary data off - 10 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(DATA_OFF_CASE, loop, idle_time, dds_slot=0)


    @test_tracker_info(uuid="d267f0bb-427a-4bed-9d78-20dbc193588f")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_in_call_msim_4g_esim_4g_dds_sim1_call_sim1_1min(self, loop=10, idle_time=60):
        '''
            1.8.37 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall - 1 min

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IN_CALL_CASE, loop, idle_time, dds_slot=0,
            voice_slot=0, sms_slot=0)

    @test_tracker_info(uuid="f0fcfc8f-4867-4b3c-94b8-4b406fa4ce8f")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_in_call_msim_4g_esim_4g_dds_sim2_call_sim2_1min(self, loop=10, idle_time=60):
        '''
            1.8.38 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall - 1 min

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IN_CALL_CASE, loop, idle_time,
            dds_slot=1, voice_slot=1, sms_slot=1)

    @test_tracker_info(uuid="5f96c891-fdb3-4367-afba-539eeb57ff0f")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_in_call_msim_4g_esim_4g_dds_sim1_call_sim1_2min(self, loop=10, idle_time=120):
        '''
            1.8.39 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall - 2 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IN_CALL_CASE, loop, idle_time,
            dds_slot=0, voice_slot=0, sms_slot=0)


    @test_tracker_info(uuid="3920a8b7-492b-4bc4-9b3d-6d7df9861934")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_in_call_msim_4g_esim_4g_dds_sim2_call_sim2_2min(self, loop=10, idle_time=120):
        '''
            1.8.40 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall - 2 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IN_CALL_CASE, loop, idle_time,
            dds_slot=1, voice_slot=1, sms_slot=1)


    @test_tracker_info(uuid="b8fac57b-fdf8-48e6-a51f-349a512d2df7")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_in_call_msim_4g_esim_4g_dds_sim1_call_sim1_5min(self, loop=10, idle_time=300):
        '''
            1.8.41 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall - 5 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IN_CALL_CASE, loop, idle_time,
            dds_slot=0, voice_slot=0, sms_slot=0)

    @test_tracker_info(uuid="0f0f7749-5cf8-4030-aae5-d28cb3a26d9b")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_in_call_msim_4g_esim_4g_dds_sim2_call_sim2_5min(self, loop=10,
        idle_time=300):
        '''
            1.8.42 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall - 5 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IN_CALL_CASE, loop, idle_time,
            dds_slot=1, voice_slot=1, sms_slot=1)


    @test_tracker_info(uuid="53c8bc90-b9a6-46c7-a412-fe5b9f8df3c3")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_in_call_msim_4g_esim_4g_dds_sim1_call_sim1_10min(self, loop=10,
        idle_time=600):
        '''
            1.8.43 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall - 10 mins
            (1) SIM1 (pSIM): Carrier1, VoLTE
            (2) SIM2 (eSIM): Carrier2, VoLTE
            (3) DDS (Data preferred) on SIM1
            (4) Call/SMS Preference: on SIM1
            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IN_CALL_CASE, loop, idle_time,
            dds_slot=0, voice_slot=0, sms_slot=0)

    @test_tracker_info(uuid="cff1893e-ea14-4e32-83ae-9116ffd96da4")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_in_call_msim_4g_esim_4g_dds_sim2_call_sim2_10min(self, loop=10,
        idle_time=600):
        '''
            1.8.44 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall - 10 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(IN_CALL_CASE, loop, idle_time,
            dds_slot=1, voice_slot=1, sms_slot=1)


    @test_tracker_info(uuid="a73d70d2-d5dd-4901-8cfe-6e54bdd4ddc3")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_call_data_msim_4g_esim_4g_dds_sim1_call_sim1_1min(self, loop=10,
        idle_time=60):
        '''
            1.8.45 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall + data transfer - 1 min

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(CALL_DATA_CASE, loop, idle_time,
            dds_slot=0, voice_slot=0, sms_slot=0)


    @test_tracker_info(uuid="6d331e0e-368d-4752-810c-ad497ccb0001")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_call_data_msim_4g_esim_4g_dds_sim2_call_sim2_1min(self, loop=10, idle_time=60):
        '''
            1.8.46 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall + data transfer - 1 min

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(CALL_DATA_CASE, loop, idle_time,
            dds_slot=1, voice_slot=1, sms_slot=1)



    @test_tracker_info(uuid="2b4c5912-f654-45ad-8195-284c602c194f")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_call_data_msim_4g_esim_4g_dds_sim1_call_sim1_2min(self, loop=10,
        idle_time=120):
        '''
            1.8.47 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall + data transfer - 2 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(CALL_DATA_CASE, loop, idle_time,
            dds_slot=0, voice_slot=0, sms_slot=0)


    @test_tracker_info(uuid="d0428b18-6c5b-42d9-96fd-423a0512b95e")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_call_data_msim_4g_esim_4g_dds_sim2_call_sim2_2min(self, loop=10,
        idle_time=120):
        '''
            1.8.48 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall + data transfer - 2 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(CALL_DATA_CASE, loop, idle_time,
            dds_slot=1, voice_slot=1, sms_slot=1)



    @test_tracker_info(uuid="66b2ec18-d2f8-46b3-8626-0688f4f7c0dc")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_call_data_msim_4g_esim_4g_dds_sim1_call_sim1_5min(self, loop=10,
        idle_time=300):
        '''
            1.8.49 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall + data transfer - 5 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(CALL_DATA_CASE, loop, idle_time,
            dds_slot=0, voice_slot=0, sms_slot=0)


    @test_tracker_info(uuid="4634689f-3ab5-4826-9057-668b0fe15402")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_call_data_msim_4g_esim_4g_dds_sim2_call_sim2_5min(self, loop=10,
        idle_time=300):
        '''
            1.8.50 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall + data transfer - 5 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(CALL_DATA_CASE, loop, idle_time,
            dds_slot=1, voice_slot=1, sms_slot=1)


    @test_tracker_info(uuid="5a097f66-dbd4-49d4-957c-d0e9584de36b")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_call_data_msim_4g_esim_4g_dds_sim1_call_sim1_10min(self, loop=10,
        idle_time=600):
        '''
            1.8.51 - [DDS:SIM1][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall + data transfer - 10 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(CALL_DATA_CASE, loop, idle_time,
            dds_slot=0, voice_slot=0, sms_slot=0)


    @test_tracker_info(uuid="d99c0700-27b1-4b0c-881b-ccf908a70287")
    @TelephonyBaseTest.tel_test_wrap
    def test_in_out_call_data_msim_4g_esim_4g_dds_sim2_call_sim2_10min(self, loop=10,
        idle_time=600):
        '''
            1.8.52 - [DDS:SIM2][SIM1:VoLTE, SIM2:VoLTE] In/Out service -
            Stationary incall + data transfer - 10 mins

            Args:
                loop: repeat this test cases for how many times
                idle_time: idle time at no service area
            Returns:
                True if pass; False if fail
        '''
        loop = self.user_params.get("4g_dsds_io_cycle", 1)
        return self._dsds_in_out_service_test(CALL_DATA_CASE, loop, idle_time,
            dds_slot=1, voice_slot=1, sms_slot=1)