| #!/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 re |
| import time |
| |
| from acts import asserts |
| from acts import signals |
| from acts.test_decorators import test_tracker_info |
| from acts.test_utils.tel.loggers.protos.telephony_metric_pb2 import \ |
| TelephonyVoiceTestResult |
| from acts.test_utils.tel.loggers.telephony_metric_logger import \ |
| TelephonyMetricLogger |
| from acts.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest |
| from acts.test_utils.tel.tel_defines import CALL_CAPABILITY_MANAGE_CONFERENCE |
| from acts.test_utils.tel.tel_defines import CALL_PROPERTY_CONFERENCE |
| from acts.test_utils.tel.tel_defines import CALL_STATE_ACTIVE |
| from acts.test_utils.tel.tel_defines import CAPABILITY_CONFERENCE |
| from acts.test_utils.tel.tel_defines import WAIT_TIME_IN_CALL |
| from acts.test_utils.tel.tel_defines import INVALID_SUB_ID |
| from acts.test_utils.tel.tel_subscription_utils import \ |
| get_incoming_voice_sub_id |
| from acts.test_utils.tel.tel_subscription_utils import \ |
| get_outgoing_voice_sub_id |
| from acts.test_utils.tel.tel_subscription_utils import get_subid_from_slot_index |
| from acts.test_utils.tel.tel_subscription_utils import set_voice_sub_id |
| from acts.test_utils.tel.tel_subscription_utils import set_dds_on_slot_0 |
| from acts.test_utils.tel.tel_subscription_utils import set_dds_on_slot_1 |
| from acts.test_utils.tel.tel_subscription_utils import \ |
| get_subid_on_same_network_of_host_ad |
| from acts.test_utils.tel.tel_test_utils import call_setup_teardown |
| from acts.test_utils.tel.tel_test_utils import hangup_call |
| from acts.test_utils.tel.tel_test_utils import multithread_func |
| from acts.test_utils.tel.tel_test_utils import num_active_calls |
| from acts.test_utils.tel.tel_test_utils import verify_incall_state |
| from acts.test_utils.tel.tel_test_utils import get_capability_for_subscription |
| from acts.test_utils.tel.tel_test_utils import verify_http_connection |
| from acts.test_utils.tel.tel_test_utils import set_call_waiting |
| from acts.test_utils.tel.tel_test_utils import ensure_phones_idle |
| from acts.test_utils.tel.tel_test_utils import initiate_call |
| from acts.test_utils.tel.tel_test_utils import \ |
| wait_and_reject_call_for_subscription |
| from acts.test_utils.tel.tel_test_utils import erase_call_forwarding_by_mmi |
| from acts.test_utils.tel.tel_test_utils import get_operator_name |
| from acts.test_utils.tel.tel_voice_utils import get_cep_conference_call_id |
| from acts.test_utils.tel.tel_voice_utils import \ |
| three_phone_call_forwarding_short_seq |
| from acts.test_utils.tel.tel_voice_utils import \ |
| three_phone_call_waiting_short_seq |
| from acts.test_utils.tel.tel_voice_utils import swap_calls |
| from acts.test_utils.tel.tel_voice_utils import phone_setup_on_rat |
| from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_on_rat |
| |
| CallResult = TelephonyVoiceTestResult.CallResult.Value |
| |
| class TelLiveGFTDSDSSupplementaryServiceTest(TelephonyBaseTest): |
| def setup_class(self): |
| TelephonyBaseTest.setup_class(self) |
| self.message_lengths = (50, 160, 180) |
| self.tel_logger = TelephonyMetricLogger.for_test_case() |
| self.erase_call_forwarding(self.log, self.android_devices[0]) |
| if not get_capability_for_subscription( |
| self.android_devices[0], |
| CAPABILITY_CONFERENCE, |
| get_outgoing_voice_sub_id(self.android_devices[0])): |
| self.android_devices[0].log.error( |
| "Conference call is not supported, abort test.") |
| raise signals.TestAbortClass( |
| "Conference call is not supported, abort test.") |
| |
| def teardown_test(self): |
| ensure_phones_idle(self.log, self.android_devices) |
| self.erase_call_forwarding(self.log, self.android_devices[0]) |
| set_call_waiting(self.log, self.android_devices[0], enable=1) |
| |
| def _hangup_call(self, ad, device_description='Device'): |
| if not hangup_call(self.log, ad): |
| ad.log.error("Failed to hang up on %s", device_description) |
| return False |
| return True |
| |
| def erase_call_forwarding(self, log, ad): |
| slot0_sub_id = get_subid_from_slot_index(log, ad, 0) |
| slot1_sub_id = get_subid_from_slot_index(log, ad, 1) |
| current_voice_sub_id = get_incoming_voice_sub_id(ad) |
| for sub_id in (slot0_sub_id, slot1_sub_id): |
| set_voice_sub_id(ad, sub_id) |
| get_operator_name(log, ad, sub_id) |
| erase_call_forwarding_by_mmi(log, ad) |
| set_voice_sub_id(ad, current_voice_sub_id) |
| |
| def _three_phone_call_mo_add_mt( |
| self, |
| ads, |
| phone_setups, |
| verify_funcs, |
| reject_once=False): |
| """Use 3 phones to make MO call and MT call. |
| |
| Call from PhoneA to PhoneB, accept on PhoneB. |
| Call from PhoneC to PhoneA, accept on PhoneA. |
| |
| Args: |
| ads: list of ad object. |
| The list should have three objects. |
| phone_setups: list of phone setup functions. |
| The list should have three objects. |
| verify_funcs: list of phone call verify functions. |
| The list should have three objects. |
| |
| Returns: |
| If success, return 'call_AB' id in PhoneA. |
| if fail, return None. |
| """ |
| |
| class _CallException(Exception): |
| pass |
| |
| try: |
| verify_func_a, verify_func_b, verify_func_c = verify_funcs |
| tasks = [] |
| for ad, setup_func in zip(ads, phone_setups): |
| if setup_func is not None: |
| tasks.append((setup_func, (self.log, ad, get_incoming_voice_sub_id(ad)))) |
| if tasks != [] and not multithread_func(self.log, tasks): |
| self.log.error("Phone Failed to Set Up Properly.") |
| raise _CallException("Setup failed.") |
| for ad in ads: |
| ad.droid.telecomCallClearCallList() |
| if num_active_calls(self.log, ad) != 0: |
| ad.log.error("Phone Call List is not empty.") |
| raise _CallException("Clear call list failed.") |
| |
| self.log.info("Step1: Call From PhoneA to PhoneB.") |
| if not call_setup_teardown( |
| self.log, |
| ads[0], |
| ads[1], |
| ad_hangup=None, |
| verify_caller_func=verify_func_a, |
| verify_callee_func=verify_func_b): |
| raise _CallException("PhoneA call PhoneB failed.") |
| |
| calls = ads[0].droid.telecomCallGetCallIds() |
| ads[0].log.info("Calls in PhoneA %s", calls) |
| if num_active_calls(self.log, ads[0]) != 1: |
| raise _CallException("Call list verify failed.") |
| call_ab_id = calls[0] |
| |
| self.log.info("Step2: Call From PhoneC to PhoneA.") |
| if reject_once: |
| self.log.info("Step2-1: Reject incoming call once.") |
| if not initiate_call( |
| self.log, |
| ads[2], |
| ads[0].telephony['subscription'][get_incoming_voice_sub_id( |
| ads[0])]['phone_num']): |
| ads[2].log.error("Initiate call failed.") |
| raise _CallException("Failed to initiate call.") |
| |
| if not wait_and_reject_call_for_subscription( |
| self.log, |
| ads[0], |
| get_incoming_voice_sub_id(ads[0]), |
| incoming_number= \ |
| ads[2].telephony['subscription'][ |
| get_incoming_voice_sub_id( |
| ads[2])]['phone_num']): |
| ads[0].log.error("Reject call fail.") |
| raise _CallException("Failed to reject call.") |
| |
| self._hangup_call(ads[2], "PhoneC") |
| time.sleep(15) |
| |
| if not call_setup_teardown( |
| self.log, |
| ads[2], |
| ads[0], |
| ad_hangup=None, |
| verify_caller_func=verify_func_c, |
| verify_callee_func=verify_func_a): |
| raise _CallException("PhoneA call PhoneC failed.") |
| if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], |
| True): |
| raise _CallException("Not All phones are in-call.") |
| |
| except Exception as e: |
| self.log.error(e) |
| setattr(ads[0], "exception", e) |
| return None |
| |
| return call_ab_id |
| |
| def _test_ims_conference_merge_drop_second_call_from_participant( |
| self, call_ab_id, call_ac_id): |
| """Test conference merge and drop in IMS (VoLTE or WiFi Calling) call. |
| (supporting both cases of CEP enabled and disabled). |
| |
| PhoneA in IMS (VoLTE or WiFi Calling) call with PhoneB. |
| PhoneA in IMS (VoLTE or WiFi Calling) call with PhoneC. |
| Merge calls to conference on PhoneA. |
| Hangup on PhoneC, check call continues between AB. |
| Hangup on PhoneB, check A ends. |
| |
| Args: |
| call_ab_id: call id for call_AB on PhoneA. |
| call_ac_id: call id for call_AC on PhoneA. |
| |
| Returns: |
| True if succeed; |
| False if failed. |
| """ |
| ads = self.android_devices |
| |
| call_conf_id = self._merge_ims_conference_call(call_ab_id, call_ac_id) |
| if call_conf_id is None: |
| return False |
| |
| self.log.info("Step5: End call on PhoneC and verify call continues.") |
| if not self._hangup_call(ads[2], "PhoneC"): |
| return False |
| time.sleep(WAIT_TIME_IN_CALL) |
| calls = ads[0].droid.telecomCallGetCallIds() |
| ads[0].log.info("Calls in PhoneA %s", calls) |
| if not verify_incall_state(self.log, [ads[0], ads[1]], True): |
| return False |
| if not verify_incall_state(self.log, [ads[2]], False): |
| return False |
| |
| self.log.info("Step6: End call on PhoneB and verify PhoneA end.") |
| if not self._hangup_call(ads[1], "PhoneB"): |
| return False |
| time.sleep(WAIT_TIME_IN_CALL) |
| if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], False): |
| return False |
| return True |
| |
| def _merge_ims_conference_call(self, call_ab_id, call_ac_id): |
| """Merge IMS conference call for both cases of CEP enabled and disabled. |
| |
| PhoneA in IMS (VoLTE or WiFi Calling) call with PhoneB. |
| PhoneA in IMS (VoLTE or WiFi Calling) call with PhoneC. |
| Merge calls to conference on PhoneA. |
| |
| Args: |
| call_ab_id: call id for call_AB on PhoneA. |
| call_ac_id: call id for call_AC on PhoneA. |
| |
| Returns: |
| call_id for conference |
| """ |
| ads = self.android_devices |
| self.log.info("Step4: Merge to Conf Call and verify Conf Call.") |
| ads[0].droid.telecomCallJoinCallsInConf(call_ab_id, call_ac_id) |
| time.sleep(WAIT_TIME_IN_CALL) |
| calls = ads[0].droid.telecomCallGetCallIds() |
| ads[0].log.info("Calls in PhoneA %s", calls) |
| |
| call_conf_id = None |
| if num_active_calls(self.log, ads[0]) != 1: |
| ads[0].log.info("Total number of call ids is not 1.") |
| call_conf_id = get_cep_conference_call_id(ads[0]) |
| if call_conf_id is not None: |
| self.log.info("New conference call id is found. CEP enabled.") |
| calls.remove(call_conf_id) |
| if (set(ads[0].droid.telecomCallGetCallChildren( |
| call_conf_id)) != set(calls)): |
| ads[0].log.error( |
| "Children list %s for conference call is not correct.", |
| ads[0].droid.telecomCallGetCallChildren(call_conf_id)) |
| return None |
| |
| if (CALL_PROPERTY_CONFERENCE not in ads[0] |
| .droid.telecomCallGetProperties(call_conf_id)): |
| ads[0].log.error( |
| "Conf call id % properties wrong: %s", call_conf_id, |
| ads[0].droid.telecomCallGetProperties(call_conf_id)) |
| return None |
| |
| if (CALL_CAPABILITY_MANAGE_CONFERENCE not in ads[0] |
| .droid.telecomCallGetCapabilities(call_conf_id)): |
| ads[0].log.error( |
| "Conf call id %s capabilities wrong: %s", call_conf_id, |
| ads[0].droid.telecomCallGetCapabilities(call_conf_id)) |
| return None |
| |
| if (call_ab_id in calls) or (call_ac_id in calls): |
| self.log.error("Previous call ids should not in new call" |
| " list after merge.") |
| return None |
| else: |
| for call_id in calls: |
| if call_id != call_ab_id and call_id != call_ac_id: |
| call_conf_id = call_id |
| self.log.info("CEP not enabled.") |
| |
| if not call_conf_id: |
| self.log.error("Merge call fail, no new conference call id.") |
| raise signals.TestFailure( |
| "Calls were not merged. Failed to merge calls.", |
| extras={"fail_reason": "Calls were not merged." |
| " Failed to merge calls."}) |
| if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True): |
| return False |
| |
| if ads[0].droid.telecomCallGetCallState( |
| call_conf_id) != CALL_STATE_ACTIVE: |
| ads[0].log.error( |
| "Call_ID: %s, state: %s, expected: STATE_ACTIVE", call_conf_id, |
| ads[0].droid.telecomCallGetCallState(call_conf_id)) |
| return None |
| |
| return call_conf_id |
| |
| def _test_wcdma_conference_merge_drop(self, call_ab_id, call_ac_id): |
| """Test conference merge and drop in WCDMA/CSFB_WCDMA call. |
| |
| PhoneA in WCDMA (or CSFB_WCDMA) call with PhoneB. |
| PhoneA in WCDMA (or CSFB_WCDMA) call with PhoneC. |
| Merge calls to conference on PhoneA. |
| Hangup on PhoneC, check call continues between AB. |
| Hangup on PhoneB, check A ends. |
| |
| Args: |
| call_ab_id: call id for call_AB on PhoneA. |
| call_ac_id: call id for call_AC on PhoneA. |
| |
| Returns: |
| True if succeed; |
| False if failed. |
| """ |
| ads = self.android_devices |
| |
| self.log.info("Step4: Merge to Conf Call and verify Conf Call.") |
| ads[0].droid.telecomCallJoinCallsInConf(call_ab_id, call_ac_id) |
| time.sleep(WAIT_TIME_IN_CALL) |
| calls = ads[0].droid.telecomCallGetCallIds() |
| ads[0].log.info("Calls in PhoneA %s", calls) |
| num_calls = num_active_calls(self.log, ads[0]) |
| if num_calls != 3: |
| ads[0].log.error("Total number of call ids is not 3.") |
| if num_calls == 2: |
| if call_ab_id in calls and call_ac_id in calls: |
| ads[0].log.error("Calls were not merged." |
| " Failed to merge calls.") |
| raise signals.TestFailure( |
| "Calls were not merged. Failed to merge calls.", |
| extras={"fail_reason": "Calls were not merged." |
| " Failed to merge calls."}) |
| return False |
| call_conf_id = None |
| for call_id in calls: |
| if call_id != call_ab_id and call_id != call_ac_id: |
| call_conf_id = call_id |
| if not call_conf_id: |
| self.log.error("Merge call fail, no new conference call id.") |
| return False |
| if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], True): |
| return False |
| |
| if ads[0].droid.telecomCallGetCallState( |
| call_conf_id) != CALL_STATE_ACTIVE: |
| ads[0].log.error( |
| "Call_id: %s, state: %s, expected: STATE_ACTIVE", call_conf_id, |
| ads[0].droid.telecomCallGetCallState(call_conf_id)) |
| return False |
| |
| self.log.info("Step5: End call on PhoneC and verify call continues.") |
| if not self._hangup_call(ads[2], "PhoneC"): |
| return False |
| time.sleep(WAIT_TIME_IN_CALL) |
| calls = ads[0].droid.telecomCallGetCallIds() |
| ads[0].log.info("Calls in PhoneA %s", calls) |
| if num_active_calls(self.log, ads[0]) != 1: |
| return False |
| if not verify_incall_state(self.log, [ads[0], ads[1]], True): |
| return False |
| if not verify_incall_state(self.log, [ads[2]], False): |
| return False |
| |
| self.log.info("Step6: End call on PhoneB and verify PhoneA end.") |
| if not self._hangup_call(ads[1], "PhoneB"): |
| return False |
| time.sleep(WAIT_TIME_IN_CALL) |
| if not verify_incall_state(self.log, [ads[0], ads[1], ads[2]], False): |
| return False |
| return True |
| |
| def _test_msim_call_forwarding( |
| self, |
| caller_slot, |
| callee_slot, |
| forwarded_callee_slot, |
| dds_slot, |
| caller_rat=["", ""], |
| callee_rat=["", ""], |
| forwarded_callee_rat=["", ""], |
| call_forwarding_type="unconditional"): |
| """Make MO voice call to the primary device at specific slot in specific |
| RAT with DDS at specific slot, and then forwarded to 3rd device with |
| specific call forwarding type. |
| |
| 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. Register and enable call forwarding with specifc type. |
| 5. Make voice call to the primary device and wait for being forwarded |
| to 3rd device. |
| |
| Args: |
| caller_slot: Slot of 2nd device making MO call (0 or 1) |
| callee_slot: Slot of primary device receiving and forwarding MT call |
| (0 or 1) |
| forwarded_callee_slot: Slot of 3rd device receiving forwarded call. |
| dds_slot: Preferred data slot |
| caller_rat: RAT for both slots of the 2nd device |
| callee_rat: RAT for both slots of the primary device |
| forwarded_callee_rat: RAT for both slots of the 3rd device |
| call_forwarding_type: |
| "unconditional" |
| "busy" |
| "not_answered" |
| "not_reachable" |
| |
| Returns: |
| True or False |
| """ |
| ads = self.android_devices |
| |
| ad_caller = ads[1] |
| ad_callee = ads[0] |
| ad_forwarded_callee = ads[2] |
| |
| if callee_slot is not None: |
| callee_sub_id = get_subid_from_slot_index( |
| self.log, ad_callee, callee_slot) |
| if callee_sub_id == INVALID_SUB_ID: |
| ad_callee.log.warning( |
| "Failed to get sub ID at slot %s.", callee_slot) |
| return False |
| callee_other_sub_id = get_subid_from_slot_index( |
| self.log, ad_callee, 1-callee_slot) |
| set_voice_sub_id(ad_callee, callee_sub_id) |
| else: |
| callee_sub_id, _, _ = get_subid_on_same_network_of_host_ad(ads) |
| if callee_sub_id == INVALID_SUB_ID: |
| ad_callee.log.warning( |
| "Failed to get sub ID at slot %s.", callee_slot) |
| return False |
| callee_slot = "auto" |
| set_voice_sub_id(ad_callee, callee_sub_id) |
| ad_callee.log.info( |
| "Sub ID for incoming call at slot %s: %s", |
| callee_slot, get_incoming_voice_sub_id(ad_callee)) |
| |
| if caller_slot is not None: |
| caller_sub_id = get_subid_from_slot_index( |
| self.log, ad_caller, caller_slot) |
| if caller_sub_id == INVALID_SUB_ID: |
| ad_caller.log.warning( |
| "Failed to get sub ID at slot %s.", caller_slot) |
| return False |
| caller_other_sub_id = get_subid_from_slot_index( |
| self.log, ad_caller, 1-caller_slot) |
| set_voice_sub_id(ad_caller, caller_sub_id) |
| else: |
| _, caller_sub_id, _ = get_subid_on_same_network_of_host_ad(ads) |
| if caller_sub_id == INVALID_SUB_ID: |
| ad_caller.log.warning( |
| "Failed to get sub ID at slot %s.", caller_slot) |
| return False |
| caller_slot = "auto" |
| set_voice_sub_id(ad_caller, caller_sub_id) |
| ad_caller.log.info( |
| "Sub ID for outgoing call at slot %s: %s", |
| caller_slot, get_outgoing_voice_sub_id(ad_caller)) |
| |
| if forwarded_callee_slot is not None: |
| forwarded_callee_sub_id = get_subid_from_slot_index( |
| self.log, ad_forwarded_callee, forwarded_callee_slot) |
| if forwarded_callee_sub_id == INVALID_SUB_ID: |
| ad_forwarded_callee.log.warning( |
| "Failed to get sub ID at slot %s.", forwarded_callee_slot) |
| return False |
| forwarded_callee_other_sub_id = get_subid_from_slot_index( |
| self.log, ad_forwarded_callee, 1-forwarded_callee_slot) |
| set_voice_sub_id( |
| ad_forwarded_callee, forwarded_callee_sub_id) |
| else: |
| _, _, forwarded_callee_sub_id = \ |
| get_subid_on_same_network_of_host_ad(ads) |
| if forwarded_callee_sub_id == INVALID_SUB_ID: |
| ad_forwarded_callee.log.warning( |
| "Failed to get sub ID at slot %s.", forwarded_callee_slot) |
| return False |
| forwarded_callee_slot = "auto" |
| set_voice_sub_id( |
| ad_forwarded_callee, forwarded_callee_sub_id) |
| ad_forwarded_callee.log.info( |
| "Sub ID for incoming call at slot %s: %s", |
| forwarded_callee_slot, |
| get_incoming_voice_sub_id(ad_forwarded_callee)) |
| |
| 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 caller_slot == 1: |
| phone_setup_on_rat( |
| self.log, |
| ad_caller, |
| caller_rat[0], |
| caller_other_sub_id) |
| |
| elif caller_slot == 0: |
| phone_setup_on_rat( |
| self.log, |
| ad_caller, |
| caller_rat[1], |
| caller_other_sub_id) |
| else: |
| phone_setup_on_rat( |
| self.log, |
| ad_caller, |
| 'general') |
| |
| if callee_slot == 1: |
| phone_setup_on_rat( |
| self.log, |
| ad_callee, |
| callee_rat[0], |
| callee_other_sub_id) |
| |
| elif callee_slot == 0: |
| phone_setup_on_rat( |
| self.log, |
| ad_callee, |
| callee_rat[1], |
| callee_other_sub_id) |
| else: |
| phone_setup_on_rat( |
| self.log, |
| ad_callee, |
| 'general') |
| |
| if forwarded_callee_slot == 1: |
| phone_setup_on_rat( |
| self.log, |
| ad_forwarded_callee, |
| forwarded_callee_rat[0], |
| forwarded_callee_other_sub_id) |
| |
| elif forwarded_callee_slot == 0: |
| phone_setup_on_rat( |
| self.log, |
| ad_forwarded_callee, |
| forwarded_callee_rat[1], |
| forwarded_callee_other_sub_id) |
| else: |
| phone_setup_on_rat( |
| self.log, |
| ad_forwarded_callee, |
| 'general') |
| |
| if caller_slot == 0 or caller_slot == 1: |
| caller_phone_setup_func = phone_setup_on_rat( |
| self.log, ad_caller, caller_rat[caller_slot], only_return_fn=True) |
| else: |
| caller_phone_setup_func = phone_setup_on_rat( |
| self.log, ad_caller, 'general', only_return_fn=True) |
| |
| callee_phone_setup_func = phone_setup_on_rat( |
| self.log, ad_callee, callee_rat[callee_slot], only_return_fn=True) |
| |
| if forwarded_callee_slot == 0 or forwarded_callee_slot == 1: |
| forwarded_callee_phone_setup_func = phone_setup_on_rat( |
| self.log, |
| ad_forwarded_callee, |
| forwarded_callee_rat[forwarded_callee_slot], |
| only_return_fn=True) |
| else: |
| forwarded_callee_phone_setup_func = phone_setup_on_rat( |
| self.log, |
| ad_forwarded_callee, |
| 'general', |
| only_return_fn=True) |
| |
| self.log.info("Step 3: Set up phones in desired RAT.") |
| tasks = [(caller_phone_setup_func, (self.log, ad_caller, caller_sub_id)), |
| (callee_phone_setup_func, (self.log, ad_callee, callee_sub_id)), |
| (forwarded_callee_phone_setup_func, |
| (self.log, ad_forwarded_callee, forwarded_callee_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."}) |
| |
| is_callee_in_call = is_phone_in_call_on_rat( |
| self.log, ad_callee, callee_rat[callee_slot], only_return_fn=True) |
| |
| is_call_waiting = re.search( |
| "call_waiting (True (\d)|False)", call_forwarding_type, re.I) |
| if is_call_waiting: |
| if is_call_waiting.group(1) == "False": |
| call_waiting = False |
| scenario = None |
| else: |
| call_waiting = True |
| scenario = int(is_call_waiting.group(2)) |
| |
| self.log.info( |
| "Step 4: Make voice call with call waiting enabled = %s.", |
| call_waiting) |
| result = three_phone_call_waiting_short_seq( |
| self.log, |
| ads[0], |
| None, |
| is_callee_in_call, |
| ads[1], |
| ads[2], |
| call_waiting=call_waiting, scenario=scenario) |
| else: |
| self.log.info( |
| "Step 4: Make voice call with call forwarding %s.", |
| call_forwarding_type) |
| result = three_phone_call_forwarding_short_seq( |
| self.log, |
| ads[0], |
| None, |
| is_callee_in_call, |
| ads[1], |
| ads[2], |
| call_forwarding_type=call_forwarding_type) |
| |
| if not result: |
| if is_call_waiting: |
| pass |
| else: |
| self.log.error( |
| "Failed to make MO call from %s slot %s to %s slot %s" |
| " and forward to %s slot %s", |
| ad_caller.serial, |
| caller_slot, |
| ad_callee.serial, |
| callee_slot, |
| ad_forwarded_callee.serial, |
| forwarded_callee_slot) |
| |
| return result |
| |
| def _test_msim_call_voice_conf( |
| self, |
| host_slot, |
| p1_slot, |
| p2_slot, |
| dds_slot, |
| host_rat=["volte", "volte"], |
| p1_rat="", |
| p2_rat="", |
| merge=True, |
| disable_cw=False): |
| """Make a voice conference call 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 and make 3-way voice call. |
| 5. Swap calls. |
| 6. Merge calls. |
| |
| Args: |
| host_slot: Slot on the primary device to host the comference call. |
| 0 or 1 (0 for pSIM or 1 for eSIM) |
| p1_slot: Slot on the participant device for the call |
| p2_slot: Slot on another participant device for the call |
| dds_slot: Preferred data slot |
| host_rat: RAT for both slots of the primary device |
| p1_rat: RAT for both slots of the participant device |
| p2_rat: RAT for both slots of another participant device |
| merge: True for merging 2 calls into the conference call. False for |
| not merging 2 separated call. |
| disable_cw: True for disabling call waiting and False on the |
| contrary. |
| |
| Returns: |
| True of False |
| """ |
| ads = self.android_devices |
| ad_host = ads[0] |
| ad_p1 = ads[1] |
| ad_p2 = ads[2] |
| |
| if host_slot is not None: |
| host_sub_id = get_subid_from_slot_index( |
| self.log, ad_host, host_slot) |
| if host_sub_id == INVALID_SUB_ID: |
| ad_host.log.warning("Failed to get sub ID at slot.", host_slot) |
| return False |
| host_other_sub_id = get_subid_from_slot_index( |
| self.log, ad_host, 1-host_slot) |
| set_voice_sub_id(ad_host, host_sub_id) |
| else: |
| host_sub_id, _, _ = get_subid_on_same_network_of_host_ad(ads) |
| if host_sub_id == INVALID_SUB_ID: |
| ad_host.log.warning("Failed to get sub ID at slot.", host_slot) |
| return False |
| host_slot = "auto" |
| set_voice_sub_id(ad_host, host_sub_id) |
| |
| ad_host.log.info("Sub ID for outgoing call at slot %s: %s", |
| host_slot, get_outgoing_voice_sub_id(ad_host)) |
| |
| if p1_slot is not None: |
| p1_sub_id = get_subid_from_slot_index(self.log, ad_p1, p1_slot) |
| if p1_sub_id == INVALID_SUB_ID: |
| ad_p1.log.warning("Failed to get sub ID at slot %s.", p1_slot) |
| return False |
| set_voice_sub_id(ad_p1, p1_sub_id) |
| else: |
| _, p1_sub_id, _ = get_subid_on_same_network_of_host_ad(ads) |
| if p1_sub_id == INVALID_SUB_ID: |
| ad_p1.log.warning("Failed to get sub ID at slot %s.", p1_slot) |
| return False |
| p1_slot = "auto" |
| set_voice_sub_id(ad_p1, p1_sub_id) |
| ad_p1.log.info("Sub ID for incoming call at slot %s: %s", |
| p1_slot, get_incoming_voice_sub_id(ad_p1)) |
| |
| if p2_slot is not None: |
| p2_sub_id = get_subid_from_slot_index(self.log, ad_p2, p2_slot) |
| if p2_sub_id == INVALID_SUB_ID: |
| ad_p2.log.warning("Failed to get sub ID at slot %s.", p2_slot) |
| return False |
| set_voice_sub_id(ad_p2, p2_sub_id) |
| else: |
| _, _, p2_sub_id = get_subid_on_same_network_of_host_ad(ads) |
| if p2_sub_id == INVALID_SUB_ID: |
| ad_p2.log.warning("Failed to get sub ID at slot %s.", p2_slot) |
| return False |
| p2_slot = "auto" |
| set_voice_sub_id(ad_p2, p2_sub_id) |
| ad_p2.log.info("Sub ID for incoming call at slot %s: %s", |
| p2_slot, get_incoming_voice_sub_id(ad_p2)) |
| |
| 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 disable_cw: |
| if not set_call_waiting(self.log, ad_host, enable=0): |
| return False |
| else: |
| if not set_call_waiting(self.log, ad_host, enable=1): |
| return False |
| |
| if host_slot == 1: |
| phone_setup_on_rat( |
| self.log, |
| ad_host, |
| host_rat[0], |
| host_other_sub_id) |
| |
| elif host_slot == 0: |
| phone_setup_on_rat( |
| self.log, |
| ad_host, |
| host_rat[1], |
| host_other_sub_id) |
| |
| host_phone_setup_func = phone_setup_on_rat( |
| self.log, ad_host, host_rat[host_slot], only_return_fn=True) |
| |
| is_host_in_call = is_phone_in_call_on_rat( |
| self.log, ad_host, host_rat[host_slot], only_return_fn=True) |
| |
| if p1_rat: |
| p1_phone_setup_func = phone_setup_on_rat( |
| self.log, ad_p1, p1_rat, only_return_fn=True) |
| is_p1_in_call = is_phone_in_call_on_rat( |
| self.log, ad_p1, p1_rat, only_return_fn=True) |
| else: |
| p1_phone_setup_func = phone_setup_on_rat( |
| self.log, ad_p1, 'general', only_return_fn=True) |
| is_p1_in_call = is_phone_in_call_on_rat( |
| self.log, ad_p1, 'general', only_return_fn=True) |
| |
| if p2_rat: |
| p2_phone_setup_func = phone_setup_on_rat( |
| self.log, ad_p2, p2_rat, only_return_fn=True) |
| is_p2_in_call = is_phone_in_call_on_rat( |
| self.log, ad_p2, p2_rat, only_return_fn=True) |
| else: |
| p2_phone_setup_func = phone_setup_on_rat( |
| self.log, ad_p2, 'general', only_return_fn=True) |
| is_p2_in_call = is_phone_in_call_on_rat( |
| self.log, ad_p2, 'general', only_return_fn=True) |
| |
| self.log.info("Step 3: Set up phone in desired RAT and make 3-way" |
| " voice call.") |
| call_ab_id = self._three_phone_call_mo_add_mt( |
| [ad_host, ad_p1, ad_p2], |
| [host_phone_setup_func, p1_phone_setup_func, p2_phone_setup_func], [ |
| is_host_in_call, is_p1_in_call, |
| is_p2_in_call |
| ]) |
| |
| if call_ab_id is None: |
| if disable_cw: |
| set_call_waiting(self.log, ad_host, enable=1) |
| if str(getattr(ad_host, "exception", None)) == \ |
| "PhoneA call PhoneC failed.": |
| ads[0].log.info("PhoneA failed to call PhoneC due to call" |
| " waiting being disabled.") |
| delattr(ad_host, "exception") |
| return True |
| self.log.error("Failed to get call_ab_id") |
| return False |
| else: |
| if disable_cw: |
| return False |
| |
| calls = ads[0].droid.telecomCallGetCallIds() |
| ads[0].log.info("Calls in PhoneA %s", calls) |
| if num_active_calls(self.log, ads[0]) != 2: |
| return False |
| if calls[0] == call_ab_id: |
| call_ac_id = calls[1] |
| else: |
| call_ac_id = calls[0] |
| |
| if call_ac_id is None: |
| self.log.error("Failed to get call_ac_id") |
| return False |
| |
| num_swaps = 2 |
| self.log.info("Step 4: Begin Swap x%s test.", num_swaps) |
| if not swap_calls(self.log, ads, call_ab_id, call_ac_id, |
| num_swaps): |
| self.log.error("Swap test failed.") |
| return False |
| |
| if not merge: |
| result = True |
| if not self._hangup_call(ads[1], "PhoneB"): |
| result = False |
| if not self._hangup_call(ads[2], "PhoneC"): |
| result = False |
| return result |
| else: |
| self.log.info("Step 5: Merge calls.") |
| if host_rat[host_slot] == "volte": |
| return self._test_ims_conference_merge_drop_second_call_from_participant( |
| call_ab_id, call_ac_id) |
| else: |
| return self._test_wcdma_conference_merge_drop( |
| call_ab_id, call_ac_id) |
| |
| @test_tracker_info(uuid="ccaeff83-4b8c-488a-8c7f-6bb019528bf8") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_volte_psim_dds_slot_0(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 0, |
| None, |
| 0, |
| callee_rat=["volte", "volte"], |
| call_forwarding_type="unconditional") |
| |
| @test_tracker_info(uuid="a132bfa6-d545-4970-9a39-55aea7477f8c") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_volte_psim_dds_slot_1(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 0, |
| None, |
| 1, |
| callee_rat=["volte", "volte"], |
| call_forwarding_type="unconditional") |
| |
| @test_tracker_info(uuid="71a4db8a-d20f-4fcb-ac5f-5fe6b9fa36f5") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_volte_esim_dds_slot_0(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 1, |
| None, |
| 0, |
| callee_rat=["volte", "volte"], |
| call_forwarding_type="unconditional") |
| |
| @test_tracker_info(uuid="50b064e7-4bf6-4bb3-aed1-e4d78b0b6195") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_volte_esim_dds_slot_1(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 1, |
| None, |
| 1, |
| callee_rat=["volte", "volte"], |
| call_forwarding_type="unconditional") |
| |
| |
| |
| @test_tracker_info(uuid="b1cfe07f-f4bf-49c4-95f1-f0973f32940e") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_volte_csfb_psim_dds_slot_0(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 0, |
| None, |
| 0, |
| callee_rat=["volte", "csfb"], |
| call_forwarding_type="unconditional") |
| |
| @test_tracker_info(uuid="668bd2c6-beee-4c38-a9e5-8b0cc5937c28") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_volte_csfb_psim_dds_slot_1(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 0, |
| None, |
| 1, |
| callee_rat=["volte", "csfb"], |
| call_forwarding_type="unconditional") |
| |
| @test_tracker_info(uuid="d69e86f3-f279-4cc8-8c1f-8a9dce0acfdf") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_volte_csfb_esim_dds_slot_0(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 1, |
| None, |
| 0, |
| callee_rat=["volte", "csfb"], |
| call_forwarding_type="unconditional") |
| |
| @test_tracker_info(uuid="6156c374-7b07-473b-84f7-45de633f9681") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_volte_csfb_esim_dds_slot_1(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 1, |
| None, |
| 1, |
| callee_rat=["volte", "csfb"], |
| call_forwarding_type="unconditional") |
| |
| |
| |
| @test_tracker_info(uuid="29e36a21-9c94-418b-8628-e601e56fb168") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_csfb_volte_psim_dds_slot_0(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 0, |
| None, |
| 0, |
| callee_rat=["csfb", "volte"], |
| call_forwarding_type="unconditional") |
| |
| @test_tracker_info(uuid="36ebf549-e64e-4093-bebf-c9ca56289477") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_csfb_volte_psim_dds_slot_1(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 0, |
| None, |
| 1, |
| callee_rat=["csfb", "volte"], |
| call_forwarding_type="unconditional") |
| |
| @test_tracker_info(uuid="cfb973d7-aa3b-4e59-9f00-501e42c99947") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_csfb_volte_esim_dds_slot_0(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 1, |
| None, |
| 0, |
| callee_rat=["csfb", "volte"], |
| call_forwarding_type="unconditional") |
| |
| @test_tracker_info(uuid="a347c3db-e128-4deb-9009-c8b8e8145f67") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_csfb_volte_esim_dds_slot_1(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 1, |
| None, |
| 1, |
| callee_rat=["csfb", "volte"], |
| call_forwarding_type="unconditional") |
| |
| |
| |
| @test_tracker_info(uuid="7040e929-eb1d-4dc6-a404-2c185dc8a0a0") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_csfb_psim_dds_slot_0(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 0, |
| None, |
| 0, |
| callee_rat=["csfb", "csfb"], |
| call_forwarding_type="unconditional") |
| |
| @test_tracker_info(uuid="b88a2ce3-74c7-41df-8114-71b6c3d0b050") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_csfb_psim_dds_slot_1(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 0, |
| None, |
| 1, |
| callee_rat=["csfb", "csfb"], |
| call_forwarding_type="unconditional") |
| |
| @test_tracker_info(uuid="0ffd2391-ec5a-4a48-b0a8-fceba0c922d3") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_csfb_esim_dds_slot_0(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 1, |
| None, |
| 0, |
| callee_rat=["csfb", "csfb"], |
| call_forwarding_type="unconditional") |
| |
| @test_tracker_info(uuid="44937439-2d0a-4aea-bb4d-263e5ed634b4") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_msim_call_forwarding_unconditional_csfb_esim_dds_slot_1(self): |
| return self._test_msim_call_forwarding( |
| None, |
| 1, |
| None, |
| 1, |
| callee_rat=["csfb", "csfb"], |
| call_forwarding_type="unconditional") |
| |
| |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="73ac948b-5260-44f1-a0a6-e4a410cb3283") |
| def test_msim_voice_conf_call_host_volte_psim_dds_slot_0(self): |
| return self._test_msim_call_voice_conf( |
| 0, None, None, 0, host_rat=["volte", "volte"]) |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="75d7fb2c-aa62-4b4f-9e70-8f6b1647f816") |
| def test_msim_voice_conf_call_host_volte_psim_dds_slot_1(self): |
| return self._test_msim_call_voice_conf( |
| 0, None, None, 1, host_rat=["volte", "volte"]) |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="2343369e-0240-4adc-bc01-7c08f9327737") |
| def test_msim_voice_conf_call_host_volte_esim_dds_slot_0(self): |
| return self._test_msim_call_voice_conf( |
| 1, None, None, 0, host_rat=["volte", "volte"]) |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="3a28e621-1d47-432c-a7e8-20d2d9f82588") |
| def test_msim_voice_conf_call_host_volte_esim_dds_slot_1(self): |
| return self._test_msim_call_voice_conf( |
| 1, None, None, 1, host_rat=["volte", "volte"]) |
| |
| |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="378f24cf-bb96-45e1-8150-02f08d7417b6") |
| def test_msim_voice_conf_call_host_volte_csfb_psim_dds_slot_0(self): |
| return self._test_msim_call_voice_conf( |
| 0, None, None, 0, host_rat=["volte", "csfb"]) |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="e3fdf5ec-eafe-4825-acd3-5d4ff03df1d2") |
| def test_msim_voice_conf_call_host_volte_csfb_psim_dds_slot_1(self): |
| return self._test_msim_call_voice_conf( |
| 0, None, None, 1, host_rat=["volte", "csfb"]) |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="221da988-e8c7-43e5-ae3a-414e8f01e872") |
| def test_msim_voice_conf_call_host_volte_csfb_esim_dds_slot_0(self): |
| return self._test_msim_call_voice_conf( |
| 1, None, None, 0, host_rat=["volte", "csfb"]) |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="ea5f0254-59b8-4f63-8a4a-6f0ecb55ddbf") |
| def test_msim_voice_conf_call_host_volte_csfb_esim_dds_slot_1(self): |
| return self._test_msim_call_voice_conf( |
| 1, None, None, 1, host_rat=["volte", "csfb"]) |
| |
| |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="90abbc8a-d492-45f9-9919-fae7e44c877a") |
| def test_msim_voice_conf_call_host_csfb_volte_psim_dds_slot_0(self): |
| return self._test_msim_call_voice_conf( |
| 0, None, None, 0, host_rat=["csfb", "volte"]) |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="da98268a-a94a-4fc7-8fb9-8e8573baed50") |
| def test_msim_voice_conf_call_host_csfb_volte_psim_dds_slot_1(self): |
| return self._test_msim_call_voice_conf( |
| 0, None, None, 1, host_rat=["csfb", "volte"]) |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="df46bcf5-48a3-466f-ba37-9519f5a671cf") |
| def test_msim_voice_conf_call_host_csfb_volte_esim_dds_slot_0(self): |
| return self._test_msim_call_voice_conf( |
| 1, None, None, 0, host_rat=["csfb", "volte"]) |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="f0c82ae0-c659-45e3-9a00-419e2da55739") |
| def test_msim_voice_conf_call_host_csfb_volte_esim_dds_slot_1(self): |
| return self._test_msim_call_voice_conf( |
| 1, None, None, 1, host_rat=["csfb", "volte"]) |
| |
| |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="4831c07a-9a38-4ccd-8fa0-beaf52a2751e") |
| def test_msim_voice_conf_call_host_csfb_psim_dds_slot_0(self): |
| return self._test_msim_call_voice_conf( |
| 0, None, None, 0, host_rat=["csfb", "csfb"]) |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="79cbf768-88ea-4d03-b798-2097789ee456") |
| def test_msim_voice_conf_call_host_csfb_psim_dds_slot_1(self): |
| return self._test_msim_call_voice_conf( |
| 0, None, None, 1, host_rat=["csfb", "csfb"]) |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="68b0a15f-62e4-419d-948a-d74d763a736c") |
| def test_msim_voice_conf_call_host_csfb_esim_dds_slot_0(self): |
| return self._test_msim_call_voice_conf( |
| 1, None, None, 0, host_rat=["csfb", "csfb"]) |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="a93af289-98a8-4d4b-bdbd-54478f273fea") |
| def test_msim_voice_conf_call_host_csfb_esim_dds_slot_1(self): |
| return self._test_msim_call_voice_conf( |
| 1, None, None, 1, host_rat=["csfb", "csfb"]) |
| |
| |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="43e450c8-8a0b-4dfc-8c59-d0865c4c6399") |
| def test_msim_call_waiting_volte_psim_dds_slot_0(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 0, |
| host_rat=["volte", "volte"], |
| merge=False, disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 0, |
| host_rat=["volte", "volte"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="7d05525e-8fcf-4630-9248-22803a14209d") |
| def test_msim_call_waiting_volte_psim_dds_slot_1(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 1, |
| host_rat=["volte", "volte"], |
| merge=False, |
| disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 1, |
| host_rat=["volte", "volte"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="caec880c-948a-4fcd-b57e-e64fd3048b08") |
| def test_msim_call_waiting_volte_esim_dds_slot_0(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 0, |
| host_rat=["volte", "volte"], |
| merge=False, |
| disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 0, |
| host_rat=["volte", "volte"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="72ec685d-6c36-40cd-81fd-dd97e32b1e48") |
| def test_msim_call_waiting_volte_esim_dds_slot_1(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 1, |
| host_rat=["volte", "volte"], |
| merge=False, |
| disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 1, |
| host_rat=["volte", "volte"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |
| |
| |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="3cef5c80-b15f-45fa-8376-5252e61d7849") |
| def test_msim_call_waiting_volte_csfb_psim_dds_slot_0(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 0, |
| host_rat=["volte", "csfb"], |
| merge=False, |
| disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 0, |
| host_rat=["volte", "csfb"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="5da5c799-5349-4cf3-b683-c7372aadfdfa") |
| def test_msim_call_waiting_volte_csfb_psim_dds_slot_1(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 1, |
| host_rat=["volte", "csfb"], |
| merge=False, |
| disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 1, |
| host_rat=["volte", "csfb"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="30c06bb3-a62f-4dba-90c2-1b00c515034a") |
| def test_msim_call_waiting_volte_csfb_esim_dds_slot_0(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 0, |
| host_rat=["volte", "csfb"], |
| merge=False, |
| disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 0, |
| host_rat=["volte", "csfb"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="d2b0fdb1-5ea6-4958-a34f-6f701801e3c9") |
| def test_msim_call_waiting_volte_csfb_esim_dds_slot_1(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 1, |
| host_rat=["volte", "csfb"], |
| merge=False, |
| disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 1, |
| host_rat=["volte", "csfb"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |
| |
| |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="b239d4be-9a36-4791-84df-ecebae645c84") |
| def test_msim_call_waiting_csfb_volte_psim_dds_slot_0(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 0, |
| host_rat=["csfb", "volte"], |
| merge=False, |
| disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 0, |
| host_rat=["csfb", "volte"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="51a368e6-83d8-46af-8a85-56aaed787f9f") |
| def test_msim_call_waiting_csfb_volte_psim_dds_slot_1(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 1, |
| host_rat=["csfb", "volte"], |
| merge=False, |
| disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 1, |
| host_rat=["csfb", "volte"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="73646014-1ead-4bd9-bd8f-2c21da3d596a") |
| def test_msim_call_waiting_csfb_volte_esim_dds_slot_0(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 0, |
| host_rat=["csfb", "volte"], |
| merge=False, |
| disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 0, |
| host_rat=["csfb", "volte"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="0d520b78-20b8-4be7-833a-40179114cbce") |
| def test_msim_call_waiting_csfb_volte_esim_dds_slot_1(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 1, |
| host_rat=["csfb", "volte"], |
| merge=False, |
| disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 1, |
| host_rat=["csfb", "volte"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="0544abec-7a59-4de0-be45-0b9b9d706b17") |
| def test_msim_call_waiting_csfb_psim_dds_slot_0(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 0, |
| host_rat=["csfb", "csfb"], |
| merge=False, |
| disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 0, |
| host_rat=["csfb", "csfb"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="4329319b-0503-4c51-8792-2f36090b8071") |
| def test_msim_call_waiting_csfb_psim_dds_slot_1(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 1, |
| host_rat=["csfb", "csfb"], |
| merge=False, |
| disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 0, |
| None, |
| None, |
| 1, |
| host_rat=["csfb", "csfb"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="d612ce5c-b4cd-490c-bc6c-7f67c25264aa") |
| def test_msim_call_waiting_csfb_esim_dds_slot_0(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 0, |
| host_rat=["csfb", "csfb"], |
| merge=False, |
| disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 0, |
| host_rat=["csfb", "csfb"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |
| |
| @TelephonyBaseTest.tel_test_wrap |
| @test_tracker_info(uuid="fb4869da-a346-4275-a742-d2c653bfc39a") |
| def test_msim_call_waiting_csfb_esim_dds_slot_1(self): |
| result = True |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 1, |
| host_rat=["csfb", "csfb"], |
| merge=False, |
| disable_cw=False): |
| result = False |
| if not self._test_msim_call_voice_conf( |
| 1, |
| None, |
| None, |
| 1, |
| host_rat=["csfb", "csfb"], |
| merge=False, |
| disable_cw=True): |
| result = False |
| return result |