| #!/usr/bin/env python3 |
| # |
| # Copyright 2021 - 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 datetime import datetime |
| |
| from acts.test_decorators import test_tracker_info |
| 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_data_utils import airplane_mode_test |
| from acts_contrib.test_utils.tel.tel_data_utils import reboot_test |
| from acts_contrib.test_utils.tel.tel_defines import WFC_MODE_CELLULAR_PREFERRED |
| from acts_contrib.test_utils.tel.tel_defines import WFC_MODE_WIFI_PREFERRED |
| from acts_contrib.test_utils.tel.tel_defines import MAX_WAIT_TIME_WIFI_CONNECTION |
| from acts_contrib.test_utils.tel.tel_logging_utils import start_pixellogger_always_on_logging |
| from acts_contrib.test_utils.tel.tel_logging_utils import wait_for_log |
| from acts_contrib.test_utils.tel.tel_subscription_utils import get_slot_index_from_voice_sub_id |
| from acts_contrib.test_utils.tel.tel_subscription_utils import get_all_sub_id |
| from acts_contrib.test_utils.tel.tel_voice_utils import is_phone_in_call_volte |
| from acts_contrib.test_utils.tel.tel_voice_utils import is_phone_in_call_iwlan |
| from acts_contrib.test_utils.tel.tel_voice_utils import phone_setup_iwlan |
| from acts_contrib.test_utils.tel.tel_voice_utils import phone_setup_iwlan_for_subscription |
| from acts_contrib.test_utils.tel.tel_voice_utils import phone_setup_volte_for_subscription |
| from acts_contrib.test_utils.tel.tel_voice_utils import phone_idle_volte |
| from acts_contrib.test_utils.tel.tel_voice_utils import phone_idle_iwlan |
| from acts_contrib.test_utils.tel.tel_voice_utils import two_phone_call_short_seq |
| from acts_contrib.test_utils.tel.tel_parse_utils import print_nested_dict |
| from acts_contrib.test_utils.tel.tel_parse_utils import parse_ims_reg |
| from acts_contrib.test_utils.tel.tel_parse_utils import ON_IMS_MM_TEL_CONNECTED_4G_SLOT0 |
| from acts_contrib.test_utils.tel.tel_parse_utils import ON_IMS_MM_TEL_CONNECTED_4G_SLOT1 |
| from acts_contrib.test_utils.tel.tel_parse_utils import ON_IMS_MM_TEL_CONNECTED_IWLAN_SLOT0 |
| from acts_contrib.test_utils.tel.tel_parse_utils import ON_IMS_MM_TEL_CONNECTED_IWLAN_SLOT1 |
| from acts_contrib.test_utils.tel.tel_test_utils import hangup_call |
| from acts_contrib.test_utils.tel.tel_test_utils import verify_internet_connection |
| from acts_contrib.test_utils.tel.tel_test_utils import check_is_wifi_connected |
| from acts_contrib.test_utils.tel.tel_test_utils import toggle_airplane_mode |
| from acts_contrib.test_utils.tel.tel_test_utils import set_wfc_mode |
| from acts_contrib.test_utils.tel.tel_test_utils import wait_for_network_service |
| from acts.utils import get_current_epoch_time |
| |
| SETUP_PHONE_FAIL = 'SETUP_PHONE_FAIL' |
| VERIFY_NETWORK_FAIL = 'VERIFY_NETWORK_FAIL' |
| VERIFY_INTERNET_FAIL = 'VERIFY_INTERNET_FAIL' |
| TOGGLE_OFF_APM_FAIL = 'TOGGLE_OFF_APM_FAIL' |
| |
| CALCULATE_EVERY_N_CYCLES = 10 |
| |
| def test_result(result_list, cycle, min_fail=0, failrate=0): |
| failure_count = len(list(filter(lambda x: (x != True), result_list))) |
| if failure_count >= min_fail: |
| if failure_count >= cycle * failrate: |
| return False |
| return True |
| |
| def wait_for_wifi_disconnected(ad, wifi_ssid): |
| """Wait until Wifi is disconnected. |
| |
| Args: |
| ad: Android object |
| wifi_ssid: to specify the Wifi AP which should be disconnected. |
| |
| Returns: |
| True if Wifi is disconnected before time-out. Otherwise False. |
| """ |
| wait_time = 0 |
| while wait_time < MAX_WAIT_TIME_WIFI_CONNECTION: |
| if check_is_wifi_connected(ad.log, ad, wifi_ssid): |
| ad.droid.wifiToggleState(False) |
| time.sleep(3) |
| wait_time = wait_time + 3 |
| else: |
| ad.log.info('Wifi is disconnected.') |
| return True |
| |
| if check_is_wifi_connected(ad.log, ad, wifi_ssid): |
| ad.log.error('Wifi still is connected to %s.', wifi_ssid) |
| return False |
| else: |
| ad.log.info('Wifi is disconnected.') |
| return True |
| |
| class TelLiveRilImsKpiTest(TelephonyBaseTest): |
| def setup_class(self): |
| TelephonyBaseTest.setup_class(self) |
| start_pixellogger_always_on_logging(self.android_devices[0]) |
| self.tel_logger = TelephonyMetricLogger.for_test_case() |
| self.user_params["telephony_auto_rerun"] = 0 |
| self.reboot_4g_test_cycle = self.user_params.get( |
| 'reboot_4g_test_cycle', 1) |
| self.reboot_iwlan_test_cycle = self.user_params.get( |
| 'reboot_iwlan_test_cycle', 1) |
| self.cycle_apm_4g_test_cycle = self.user_params.get( |
| 'cycle_apm_4g_test_cycle', 1) |
| self.cycle_wifi_in_apm_mode_test_cycle = self.user_params.get( |
| 'cycle_wifi_in_apm_mode_test_cycle', 1) |
| self.ims_handover_4g_to_iwlan_with_voice_call_wfc_wifi_preferred_test_cycle = self.user_params.get( |
| 'ims_handover_4g_to_iwlan_with_voice_call_wfc_wifi_preferred_test_cycle', 1) |
| self.ims_handover_4g_to_iwlan_wfc_wifi_preferred_test_cycle = self.user_params.get( |
| 'ims_handover_4g_to_iwlan_wfc_wifi_preferred_test_cycle', 1) |
| self.ims_handover_iwlan_to_4g_wfc_wifi_preferred_test_cycle = self.user_params.get( |
| 'ims_handover_iwlan_to_4g_wfc_wifi_preferred_test_cycle', 1) |
| self.ims_handover_iwlan_to_4g_with_voice_call_wfc_wifi_preferred_test_cycle = self.user_params.get( |
| 'ims_handover_iwlan_to_4g_with_voice_call_wfc_wifi_preferred_test_cycle', 1) |
| self.ims_handover_iwlan_to_4g_wfc_cellular_preferred_test_cycle = self.user_params.get( |
| 'ims_handover_iwlan_to_4g_wfc_cellular_preferred_test_cycle', 1) |
| self.ims_handover_iwlan_to_4g_with_voice_call_wfc_cellular_preferred_test_cycle = self.user_params.get( |
| 'ims_handover_iwlan_to_4g_with_voice_call_wfc_cellular_preferred_test_cycle', 1) |
| |
| def teardown_test(self): |
| for ad in self.android_devices: |
| toggle_airplane_mode(self.log, ad, False) |
| |
| @test_tracker_info(uuid="d6a59a3c-2bbc-4ed3-a41e-4492b4ab8a50") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_reboot_4g(self): |
| """Reboot UE and measure bootup IMS registration time on LTE. |
| |
| Test steps: |
| 1. Enable VoLTE at all slots and ensure IMS is registered over LTE |
| cellular network at all slots. |
| 2. Reboot UE. |
| 3. Parse logcat to calculate IMS registration time on LTE after |
| bootup. |
| """ |
| ad = self.android_devices[0] |
| cycle = self.reboot_4g_test_cycle |
| voice_slot = get_slot_index_from_voice_sub_id(ad) |
| |
| if getattr(ad, 'dsds', False): |
| the_other_slot = 1 - voice_slot |
| else: |
| the_other_slot = None |
| |
| result = [] |
| search_intervals = [] |
| exit_due_to_high_fail_rate = False |
| for attempt in range(cycle): |
| _continue = True |
| self.log.info( |
| '==================> Reboot on LTE %s/%s <==================', |
| attempt+1, |
| cycle) |
| |
| sub_id_list = get_all_sub_id(ad) |
| for sub_id in sub_id_list: |
| if not phone_setup_volte_for_subscription(self.log, ad, sub_id): |
| result.append(SETUP_PHONE_FAIL) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if not wait_for_network_service(self.log, ad): |
| result.append(VERIFY_NETWORK_FAIL) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| begin_time = datetime.now() |
| if reboot_test(self.log, ad): |
| result.append(True) |
| else: |
| result.append(False) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| end_time = datetime.now() |
| search_intervals.append([begin_time, end_time]) |
| |
| if (attempt+1) % CALCULATE_EVERY_N_CYCLES == 0 or ( |
| attempt == cycle - 1) or exit_due_to_high_fail_rate: |
| |
| ad.log.info( |
| '====== Test result of IMS bootup registration at slot %s ' |
| '======', |
| voice_slot) |
| ad.log.info(result) |
| |
| for slot in [voice_slot, the_other_slot]: |
| if slot is None: |
| continue |
| |
| ims_reg, parsing_fail, avg_ims_reg_duration = parse_ims_reg( |
| ad, search_intervals, '4g', 'reboot', slot=slot) |
| ad.log.info( |
| '====== IMS bootup registration at slot %s ======', slot) |
| for msg in ims_reg: |
| print_nested_dict(ad, msg) |
| |
| ad.log.info( |
| '====== Attempt of parsing fail at slot %s ======' % slot) |
| for msg in parsing_fail: |
| ad.log.info(msg) |
| |
| ad.log.warning('====== Summary ======') |
| ad.log.warning( |
| '%s/%s cycles failed.', |
| (len(result) - result.count(True)), |
| len(result)) |
| for attempt, value in enumerate(result): |
| if value is not True: |
| ad.log.warning('Cycle %s: %s', attempt+1, value) |
| try: |
| fail_rate = ( |
| len(result) - result.count(True))/len(result) |
| ad.log.info( |
| 'Fail rate of IMS bootup registration at slot %s: %s', |
| slot, |
| fail_rate) |
| except Exception as e: |
| ad.log.error( |
| 'Fail rate of IMS bootup registration at slot %s: ' |
| 'ERROR (%s)', |
| slot, |
| e) |
| |
| ad.log.info( |
| 'Number of trials with valid parsed logs: %s', |
| len(ims_reg)) |
| ad.log.info( |
| 'Average IMS bootup registration time at slot %s: %s', |
| slot, |
| avg_ims_reg_duration) |
| |
| if exit_due_to_high_fail_rate: |
| break |
| |
| return test_result(result, cycle) |
| |
| @test_tracker_info(uuid="c97dd2f2-9e8a-43d4-9352-b53abe5ac6a4") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_reboot_iwlan(self): |
| """Reboot UE and measure bootup IMS registration time over iwlan. |
| |
| Test steps: |
| 1. Enable VoLTE at all slots; enable WFC and set WFC mode to |
| Wi-Fi-preferred mode; connect Wi-Fi and ensure IMS is registered |
| at all slots over iwlan. |
| 2. Reboot UE. |
| 3. Parse logcat to calculate IMS registration time over iwlan after |
| bootup. |
| """ |
| ad = self.android_devices[0] |
| cycle = self.reboot_iwlan_test_cycle |
| voice_slot = get_slot_index_from_voice_sub_id(ad) |
| |
| if getattr(ad, 'dsds', False): |
| the_other_slot = 1 - voice_slot |
| else: |
| the_other_slot = None |
| |
| result = [] |
| search_intervals = [] |
| exit_due_to_high_fail_rate = False |
| for attempt in range(cycle): |
| _continue = True |
| self.log.info( |
| '==================> Reboot on iwlan %s/%s <==================', |
| attempt+1, |
| cycle) |
| |
| sub_id_list = get_all_sub_id(ad) |
| for sub_id in sub_id_list: |
| if not phone_setup_iwlan_for_subscription( |
| self.log, |
| ad, |
| sub_id, |
| False, |
| WFC_MODE_WIFI_PREFERRED, |
| self.wifi_network_ssid, |
| self.wifi_network_pass): |
| |
| result.append(SETUP_PHONE_FAIL) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| wait_for_wifi_disconnected(ad, self.wifi_network_ssid) |
| |
| if _continue: |
| if not verify_internet_connection(self.log, ad): |
| result.append(VERIFY_INTERNET_FAIL) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| begin_time = datetime.now() |
| if reboot_test(self.log, ad, wifi_ssid=self.wifi_network_ssid): |
| result.append(True) |
| else: |
| result.append(False) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| end_time = datetime.now() |
| search_intervals.append([begin_time, end_time]) |
| |
| if (attempt+1) % CALCULATE_EVERY_N_CYCLES == 0 or ( |
| attempt == cycle - 1) or exit_due_to_high_fail_rate: |
| |
| ad.log.info( |
| '====== Test result of IMS bootup registration at slot %s ' |
| '======', |
| voice_slot) |
| ad.log.info(result) |
| |
| for slot in [voice_slot, the_other_slot]: |
| if slot is None: |
| continue |
| |
| ims_reg, parsing_fail, avg_ims_reg_duration = parse_ims_reg( |
| ad, search_intervals, 'iwlan', 'reboot', slot=slot) |
| ad.log.info( |
| '====== IMS bootup registration at slot %s ======', slot) |
| for msg in ims_reg: |
| print_nested_dict(ad, msg) |
| |
| ad.log.info( |
| '====== Attempt of parsing fail at slot %s ======' % slot) |
| for msg in parsing_fail: |
| ad.log.info(msg) |
| |
| ad.log.warning('====== Summary ======') |
| ad.log.warning( |
| '%s/%s cycles failed.', |
| (len(result) - result.count(True)), |
| len(result)) |
| for attempt, value in enumerate(result): |
| if value is not True: |
| ad.log.warning('Cycle %s: %s', attempt+1, value) |
| |
| try: |
| fail_rate = ( |
| len(result) - result.count(True))/len(result) |
| ad.log.info( |
| 'Fail rate of IMS bootup registration at slot %s: %s', |
| slot, |
| fail_rate) |
| except Exception as e: |
| ad.log.error( |
| 'Fail rate of IMS bootup registration at slot %s: ' |
| 'ERROR (%s)', |
| slot, |
| e) |
| |
| ad.log.info( |
| 'Number of trials with valid parsed logs: %s', |
| len(ims_reg)) |
| ad.log.info( |
| 'Average IMS bootup registration time at slot %s: %s', |
| slot, avg_ims_reg_duration) |
| if exit_due_to_high_fail_rate: |
| break |
| |
| return test_result(result, cycle) |
| |
| @test_tracker_info(uuid="45ed4572-7de9-4e1b-b2ec-58dea722fa3e") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_cycle_airplane_mode_4g(self): |
| """Cycle airplane mode and measure IMS registration time on LTE |
| |
| Test steps: |
| 1. Enable VoLTE at all slots and ensure IMS is registered on LTE at |
| all slots. |
| 2. Cycle airplane mode. |
| 3. Parse logcat to calculate IMS registration time right after |
| recovery of cellular service. |
| """ |
| ad = self.android_devices[0] |
| cycle = self.cycle_apm_4g_test_cycle |
| voice_slot = get_slot_index_from_voice_sub_id(ad) |
| |
| if getattr(ad, 'dsds', False): |
| the_other_slot = 1 - voice_slot |
| else: |
| the_other_slot = None |
| |
| result = [] |
| search_intervals = [] |
| exit_due_to_high_fail_rate = False |
| for attempt in range(cycle): |
| _continue = True |
| self.log.info( |
| '============> Cycle airplane mode on LTE %s/%s <============', |
| attempt+1, |
| cycle) |
| |
| sub_id_list = get_all_sub_id(ad) |
| for sub_id in sub_id_list: |
| if not phone_setup_volte_for_subscription(self.log, ad, sub_id): |
| result.append(SETUP_PHONE_FAIL) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if not wait_for_network_service(self.log, ad): |
| result.append(VERIFY_NETWORK_FAIL) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| begin_time = datetime.now() |
| if airplane_mode_test(self.log, ad): |
| result.append(True) |
| else: |
| result.append(False) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| end_time = datetime.now() |
| search_intervals.append([begin_time, end_time]) |
| |
| if (attempt+1) % CALCULATE_EVERY_N_CYCLES == 0 or ( |
| attempt == cycle - 1) or exit_due_to_high_fail_rate: |
| |
| ad.log.info( |
| '====== Test result of IMS registration at slot %s ======', |
| voice_slot) |
| ad.log.info(result) |
| |
| for slot in [voice_slot, the_other_slot]: |
| if slot is None: |
| continue |
| |
| ims_reg, parsing_fail, avg_ims_reg_duration = parse_ims_reg( |
| ad, search_intervals, '4g', 'apm', slot=slot) |
| ad.log.info( |
| '====== IMS registration at slot %s ======', slot) |
| for msg in ims_reg: |
| print_nested_dict(ad, msg) |
| |
| ad.log.info( |
| '====== Attempt of parsing fail at slot %s ======' % slot) |
| for msg in parsing_fail: |
| ad.log.info(msg) |
| |
| ad.log.warning('====== Summary ======') |
| ad.log.warning('%s/%s cycles failed.', (len(result) - result.count(True)), len(result)) |
| for attempt, value in enumerate(result): |
| if value is not True: |
| ad.log.warning('Cycle %s: %s', attempt+1, value) |
| |
| try: |
| fail_rate = ( |
| len(result) - result.count(True))/len(result) |
| ad.log.info( |
| 'Fail rate of IMS registration at slot %s: %s', |
| slot, |
| fail_rate) |
| except Exception as e: |
| ad.log.error( |
| 'Fail rate of IMS registration at slot %s: ' |
| 'ERROR (%s)', |
| slot, |
| e) |
| |
| ad.log.info( |
| 'Number of trials with valid parsed logs: %s', |
| len(ims_reg)) |
| ad.log.info( |
| 'Average IMS registration time at slot %s: %s', |
| slot, avg_ims_reg_duration) |
| |
| if exit_due_to_high_fail_rate: |
| break |
| |
| return test_result(result, cycle) |
| |
| @test_tracker_info(uuid="915c9403-8bbc-45c7-be53-8b0de4191716") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_cycle_wifi_in_apm_mode(self): |
| """Cycle Wi-Fi in airplane mode and measure IMS registration time over |
| iwlan. |
| |
| Test steps: |
| 1. Enable VoLTE; enable WFC and set WFC mode to Wi-Fi-preferred mode; |
| turn on airplane mode and connect Wi-Fi to ensure IMS is |
| registered over iwlan. |
| 2. Cycle Wi-Fi. |
| 3. Parse logcat to calculate IMS registration time right after |
| recovery of Wi-Fi connection in airplane mode. |
| """ |
| ad = self.android_devices[0] |
| cycle = self.cycle_wifi_in_apm_mode_test_cycle |
| voice_slot = get_slot_index_from_voice_sub_id(ad) |
| |
| result = [] |
| search_intervals = [] |
| exit_due_to_high_fail_rate = False |
| for attempt in range(cycle): |
| _continue = True |
| self.log.info( |
| '============> Cycle WiFi in airplane mode %s/%s <============', |
| attempt+1, |
| cycle) |
| |
| begin_time = datetime.now() |
| |
| if not wait_for_wifi_disconnected(ad, self.wifi_network_ssid): |
| result.append(False) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if not phone_setup_iwlan( |
| self.log, |
| ad, |
| True, |
| WFC_MODE_WIFI_PREFERRED, |
| self.wifi_network_ssid, |
| self.wifi_network_pass): |
| |
| result.append(False) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if not verify_internet_connection(self.log, ad): |
| result.append(VERIFY_INTERNET_FAIL) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if not wait_for_wifi_disconnected( |
| ad, self.wifi_network_ssid): |
| result.append(False) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| result.append(True) |
| end_time = datetime.now() |
| search_intervals.append([begin_time, end_time]) |
| |
| if (attempt+1) % CALCULATE_EVERY_N_CYCLES == 0 or ( |
| attempt == cycle - 1) or exit_due_to_high_fail_rate: |
| |
| ad.log.info( |
| '====== Test result of IMS registration at slot %s ======', |
| voice_slot) |
| ad.log.info(result) |
| |
| ims_reg, parsing_fail, avg_ims_reg_duration = parse_ims_reg( |
| ad, search_intervals, 'iwlan', 'apm') |
| ad.log.info( |
| '====== IMS registration at slot %s ======', voice_slot) |
| for msg in ims_reg: |
| ad.log.info(msg) |
| |
| ad.log.info( |
| '====== Attempt of parsing fail at slot %s ======' % voice_slot) |
| for msg in parsing_fail: |
| ad.log.info(msg) |
| |
| ad.log.warning('====== Summary ======') |
| ad.log.warning( |
| '%s/%s cycles failed.', |
| (len(result) - result.count(True)), |
| len(result)) |
| for attempt, value in enumerate(result): |
| if value is not True: |
| ad.log.warning('Cycle %s: %s', attempt+1, value) |
| |
| try: |
| fail_rate = (len(result) - result.count(True))/len(result) |
| ad.log.info( |
| 'Fail rate of IMS registration at slot %s: %s', |
| voice_slot, |
| fail_rate) |
| except Exception as e: |
| ad.log.error( |
| 'Fail rate of IMS registration at slot %s: ERROR (%s)', |
| voice_slot, |
| e) |
| |
| ad.log.info( |
| 'Number of trials with valid parsed logs: %s', len(ims_reg)) |
| ad.log.info( |
| 'Average IMS registration time at slot %s: %s', |
| voice_slot, avg_ims_reg_duration) |
| |
| if exit_due_to_high_fail_rate: |
| break |
| toggle_airplane_mode(self.log, ad, False) |
| return test_result(result, cycle) |
| |
| def ims_handover_4g_to_iwlan_wfc_wifi_preferred(self, voice_call=False): |
| """Connect WFC to make IMS registration hand over from LTE to iwlan in |
| Wi-Fi-preferred mode. Measure IMS handover time. |
| |
| Test steps: |
| 1. Enable WFC and set WFC mode to Wi-Fi-preferred mode. |
| 2. Ensure Wi-Fi are disconnected and all cellular services are |
| available. |
| 3. (Optional) Make a VoLTE call and keep the call active. |
| 4. Connect Wi-Fi. The IMS registration should hand over from LTE |
| to iwlan. |
| 5. Parse logcat to calculate the IMS handover time. |
| |
| Args: |
| voice_call: True if an active VoLTE call is desired in the background |
| during IMS handover procedure. Otherwise False. |
| """ |
| ad = self.android_devices[0] |
| if voice_call: |
| cycle = self.ims_handover_4g_to_iwlan_with_voice_call_wfc_wifi_preferred_test_cycle |
| else: |
| cycle = self.ims_handover_4g_to_iwlan_wfc_wifi_preferred_test_cycle |
| |
| voice_slot = get_slot_index_from_voice_sub_id(ad) |
| |
| result = [] |
| search_intervals = [] |
| exit_due_to_high_fail_rate = False |
| |
| if not set_wfc_mode(self.log, ad, WFC_MODE_WIFI_PREFERRED): |
| return False |
| |
| for attempt in range(cycle): |
| _continue = True |
| self.log.info( |
| '======> IMS handover from LTE to iwlan in WFC wifi-preferred ' |
| 'mode %s/%s <======', |
| attempt+1, |
| cycle) |
| |
| begin_time = datetime.now() |
| |
| if not wait_for_wifi_disconnected(ad, self.wifi_network_ssid): |
| result.append(False) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if not wait_for_network_service( |
| self.log, |
| ad, |
| wifi_connected=False, |
| ims_reg=True): |
| |
| result.append(False) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if voice_call: |
| ad_mt = self.android_devices[1] |
| call_params = [( |
| ad, |
| ad_mt, |
| None, |
| is_phone_in_call_volte, |
| None)] |
| call_result = two_phone_call_short_seq( |
| self.log, |
| ad, |
| phone_idle_volte, |
| is_phone_in_call_volte, |
| ad_mt, |
| None, |
| None, |
| wait_time_in_call=30, |
| call_params=call_params) |
| self.tel_logger.set_result(call_result.result_value) |
| if not call_result: |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if not phone_setup_iwlan( |
| self.log, |
| ad, |
| False, |
| WFC_MODE_WIFI_PREFERRED, |
| self.wifi_network_ssid, |
| self.wifi_network_pass): |
| |
| result.append(False) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if voice_slot == 0: |
| ims_pattern = ON_IMS_MM_TEL_CONNECTED_IWLAN_SLOT0 |
| else: |
| ims_pattern = ON_IMS_MM_TEL_CONNECTED_IWLAN_SLOT1 |
| |
| if wait_for_log(ad, ims_pattern, begin_time=begin_time): |
| ad.log.info( |
| 'IMS registration is handed over from LTE to iwlan.') |
| else: |
| ad.log.error( |
| 'IMS registration is NOT yet handed over from LTE to ' |
| 'iwlan.') |
| |
| if voice_call: |
| hangup_call(self.log, ad) |
| |
| if _continue: |
| if not verify_internet_connection(self.log, ad): |
| result.append(VERIFY_INTERNET_FAIL) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if not wait_for_wifi_disconnected( |
| ad, self.wifi_network_ssid): |
| result.append(False) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if voice_slot == 0: |
| ims_pattern = ON_IMS_MM_TEL_CONNECTED_4G_SLOT0 |
| else: |
| ims_pattern = ON_IMS_MM_TEL_CONNECTED_4G_SLOT1 |
| |
| if wait_for_log(ad, ims_pattern, begin_time=begin_time): |
| ad.log.info( |
| 'IMS registration is handed over from iwlan to LTE.') |
| else: |
| ad.log.error( |
| 'IMS registration is NOT yet handed over from iwlan to ' |
| 'LTE.') |
| |
| if _continue: |
| result.append(True) |
| end_time = datetime.now() |
| search_intervals.append([begin_time, end_time]) |
| |
| if (attempt+1) % CALCULATE_EVERY_N_CYCLES == 0 or ( |
| attempt == cycle - 1) or exit_due_to_high_fail_rate: |
| |
| ad.log.info( |
| '====== Test result of IMS registration at slot %s ======', |
| voice_slot) |
| ad.log.info(result) |
| |
| ims_reg, parsing_fail, avg_ims_reg_duration = parse_ims_reg( |
| ad, search_intervals, 'iwlan', 'apm') |
| ad.log.info( |
| '====== IMS registration at slot %s ======', voice_slot) |
| for msg in ims_reg: |
| ad.log.info(msg) |
| |
| ad.log.info( |
| '====== Attempt of parsing fail at slot %s ======' % voice_slot) |
| for msg in parsing_fail: |
| ad.log.info(msg) |
| |
| ad.log.warning('====== Summary ======') |
| ad.log.warning( |
| '%s/%s cycles failed.', |
| (len(result) - result.count(True)), |
| len(result)) |
| for attempt, value in enumerate(result): |
| if value is not True: |
| ad.log.warning('Cycle %s: %s', attempt+1, value) |
| |
| try: |
| fail_rate = (len(result) - result.count(True))/len(result) |
| ad.log.info( |
| 'Fail rate of IMS registration at slot %s: %s', |
| voice_slot, |
| fail_rate) |
| except Exception as e: |
| ad.log.error( |
| 'Fail rate of IMS registration at slot %s: ERROR (%s)', |
| voice_slot, |
| e) |
| |
| ad.log.info( |
| 'Number of trials with valid parsed logs: %s',len(ims_reg)) |
| ad.log.info( |
| 'Average IMS registration time at slot %s: %s', |
| voice_slot, avg_ims_reg_duration) |
| |
| if exit_due_to_high_fail_rate: |
| break |
| |
| return test_result(result, cycle) |
| |
| @test_tracker_info(uuid="e3d1aaa8-f673-4a2b-adb1-cfa525a4edbd") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_ims_handover_4g_to_iwlan_with_voice_call_wfc_wifi_preferred(self): |
| """Connect WFC to make IMS registration hand over from LTE to iwlan in |
| Wi-Fi-preferred mode. Measure IMS handover time. |
| |
| Test steps: |
| 1. Enable WFC and set WFC mode to Wi-Fi-preferred mode. |
| 2. Ensure Wi-Fi are disconnected and all cellular services are |
| available. |
| 3. Make a VoLTE call and keep the call active. |
| 4. Connect Wi-Fi. The IMS registration should hand over from LTE |
| to iwlan. |
| 5. Parse logcat to calculate the IMS handover time. |
| """ |
| return self.ims_handover_4g_to_iwlan_wfc_wifi_preferred(True) |
| |
| @test_tracker_info(uuid="bd86fb46-04bd-4642-923a-747e6c9d4282") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_ims_handover_4g_to_iwlan_wfc_wifi_preferred(self): |
| """Connect WFC to make IMS registration hand over from LTE to iwlan in |
| Wi-Fi-preferred mode. Measure IMS handover time. |
| |
| Test steps: |
| 1. Enable WFC and set WFC mode to Wi-Fi-preferred mode. |
| 2. Ensure Wi-Fi are disconnected and all cellular services are |
| available. |
| 3. Connect Wi-Fi. The IMS registration should hand over from LTE |
| to iwlan. |
| 4. Parse logcat to calculate the IMS handover time. |
| """ |
| return self.ims_handover_4g_to_iwlan_wfc_wifi_preferred(False) |
| |
| def ims_handover_iwlan_to_4g_wfc_wifi_preferred(self, voice_call=False): |
| """Disconnect Wi-Fi to make IMS registration hand over from iwlan to LTE |
| in Wi-Fi-preferred mode. Measure IMS handover time. |
| |
| Test steps: |
| 1. Enable WFC, set WFC mode to Wi-Fi-preferred mode, and then |
| connect Wi-Fi to let IMS register over iwlan. |
| 2. (Optional) Make a WFC call and keep the call active. |
| 3. Disconnect Wi-Fi. The IMS registration should hand over from iwlan |
| to LTE. |
| 4. Parse logcat to calculate the IMS handover time. |
| |
| Args: |
| voice_call: True if an active WFC call is desired in the background |
| during IMS handover procedure. Otherwise False. |
| """ |
| ad = self.android_devices[0] |
| if voice_call: |
| cycle = self.ims_handover_iwlan_to_4g_with_voice_call_wfc_wifi_preferred_test_cycle |
| else: |
| cycle = self.ims_handover_iwlan_to_4g_wfc_wifi_preferred_test_cycle |
| voice_slot = get_slot_index_from_voice_sub_id(ad) |
| |
| result = [] |
| search_intervals = [] |
| exit_due_to_high_fail_rate = False |
| for attempt in range(cycle): |
| _continue = True |
| self.log.info( |
| '======> IMS handover from iwlan to LTE in WFC wifi-preferred ' |
| 'mode %s/%s <======', |
| attempt+1, |
| cycle) |
| |
| begin_time = datetime.now() |
| |
| if not phone_setup_iwlan( |
| self.log, |
| ad, |
| False, |
| WFC_MODE_WIFI_PREFERRED, |
| self.wifi_network_ssid, |
| self.wifi_network_pass): |
| |
| result.append(False) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| wait_for_wifi_disconnected(ad, self.wifi_network_ssid) |
| |
| if _continue: |
| if voice_slot == 0: |
| ims_pattern = ON_IMS_MM_TEL_CONNECTED_IWLAN_SLOT0 |
| else: |
| ims_pattern = ON_IMS_MM_TEL_CONNECTED_IWLAN_SLOT1 |
| |
| if wait_for_log(ad, ims_pattern, begin_time=begin_time): |
| ad.log.info( |
| 'IMS registration is handed over from LTE to iwlan.') |
| else: |
| ad.log.error( |
| 'IMS registration is NOT yet handed over from LTE to ' |
| 'iwlan.') |
| |
| if _continue: |
| if not verify_internet_connection(self.log, ad): |
| result.append(VERIFY_INTERNET_FAIL) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if voice_call: |
| ad_mt = self.android_devices[1] |
| call_params = [( |
| ad, |
| ad_mt, |
| None, |
| is_phone_in_call_iwlan, |
| None)] |
| call_result = two_phone_call_short_seq( |
| self.log, |
| ad, |
| phone_idle_iwlan, |
| is_phone_in_call_iwlan, |
| ad_mt, |
| None, |
| None, |
| wait_time_in_call=30, |
| call_params=call_params) |
| self.tel_logger.set_result(call_result.result_value) |
| if not call_result: |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if not wait_for_wifi_disconnected( |
| ad, self.wifi_network_ssid): |
| result.append(False) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if voice_slot == 0: |
| ims_pattern = ON_IMS_MM_TEL_CONNECTED_4G_SLOT0 |
| else: |
| ims_pattern = ON_IMS_MM_TEL_CONNECTED_4G_SLOT1 |
| |
| if wait_for_log(ad, ims_pattern, begin_time=begin_time): |
| ad.log.info( |
| 'IMS registration is handed over from iwlan to LTE.') |
| else: |
| ad.log.error( |
| 'IMS registration is NOT yet handed over from iwlan to ' |
| 'LTE.') |
| |
| if voice_call: |
| hangup_call(self.log, ad) |
| |
| if _continue: |
| if not wait_for_network_service( |
| self.log, |
| ad, |
| wifi_connected=False, |
| ims_reg=True): |
| |
| result.append(False) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| result.append(True) |
| end_time = datetime.now() |
| search_intervals.append([begin_time, end_time]) |
| |
| if (attempt+1) % CALCULATE_EVERY_N_CYCLES == 0 or ( |
| attempt == cycle - 1) or exit_due_to_high_fail_rate: |
| |
| ad.log.info( |
| '====== Test result of IMS registration at slot %s ======', |
| voice_slot) |
| ad.log.info(result) |
| |
| ims_reg, parsing_fail, avg_ims_reg_duration = parse_ims_reg( |
| ad, search_intervals, '4g', 'wifi_off') |
| ad.log.info( |
| '====== IMS registration at slot %s ======', voice_slot) |
| for msg in ims_reg: |
| ad.log.info(msg) |
| |
| ad.log.info( |
| '====== Attempt of parsing fail at slot %s ======' % voice_slot) |
| for msg in parsing_fail: |
| ad.log.info(msg) |
| |
| ad.log.warning('====== Summary ======') |
| ad.log.warning( |
| '%s/%s cycles failed.', |
| (len(result) - result.count(True)), |
| len(result)) |
| for attempt, value in enumerate(result): |
| if value is not True: |
| ad.log.warning('Cycle %s: %s', attempt+1, value) |
| |
| try: |
| fail_rate = (len(result) - result.count(True))/len(result) |
| ad.log.info( |
| 'Fail rate of IMS registration at slot %s: %s', |
| voice_slot, |
| fail_rate) |
| except Exception as e: |
| ad.log.error( |
| 'Fail rate of IMS registration at slot %s: ERROR (%s)', |
| voice_slot, |
| e) |
| |
| ad.log.info( |
| 'Number of trials with valid parsed logs: %s', len(ims_reg)) |
| ad.log.info( |
| 'Average IMS registration time at slot %s: %s', |
| voice_slot, avg_ims_reg_duration) |
| |
| if exit_due_to_high_fail_rate: |
| break |
| |
| return test_result(result, cycle) |
| |
| @test_tracker_info(uuid="6ce623a6-7ef9-42db-8099-d5c449e70bff") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_ims_handover_iwlan_to_4g_wfc_wifi_preferred(self): |
| """Disconnect Wi-Fi to make IMS registration hand over from iwlan to LTE |
| in Wi-Fi-preferred mode. Measure IMS handover time. |
| |
| Test steps: |
| 1. Enable WFC, set WFC mode to Wi-Fi-preferred mode, and then |
| connect Wi-Fi to let IMS register over iwlan. |
| 2. Disconnect Wi-Fi. The IMS registration should hand over from iwlan |
| to LTE. |
| 3. Parse logcat to calculate the IMS handover time. |
| """ |
| return self.ims_handover_iwlan_to_4g_wfc_wifi_preferred(False) |
| |
| @test_tracker_info(uuid="b965ab09-d8b1-423f-bb98-2cdd43babbe3") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_ims_handover_iwlan_to_4g_with_voice_call_wfc_wifi_preferred(self): |
| """Disconnect Wi-Fi to make IMS registration hand over from iwlan to LTE |
| in Wi-Fi-preferred mode. Measure IMS handover time. |
| |
| Test steps: |
| 1. Enable WFC, set WFC mode to Wi-Fi-preferred mode, and then |
| connect Wi-Fi to let IMS register over iwlan. |
| 2. Make a WFC call and keep the call active. |
| 3. Disconnect Wi-Fi. The IMS registration should hand over from iwlan |
| to LTE. |
| 4. Parse logcat to calculate the IMS handover time. |
| """ |
| return self.ims_handover_iwlan_to_4g_wfc_wifi_preferred(True) |
| |
| def ims_handover_iwlan_to_4g_wfc_cellular_preferred(self, voice_call=False): |
| """Turn off airplane mode to make IMS registration hand over from iwlan to LTE |
| in WFC cellular-preferred mode. Measure IMS handover time. |
| |
| Test steps: |
| 1. Enable WFC, set WFC mode to cellular-preferred mode, turn on |
| airplane mode and then connect Wi-Fi to let IMS register over |
| iwlan. |
| 2. (Optional) Make a WFC call and keep the call active. |
| 3. Turn off airplane mode. The IMS registration should hand over |
| from iwlan to LTE. |
| 4. Parse logcat to calculate the IMS handover time. |
| |
| Args: |
| voice_call: True if an active WFC call is desired in the background |
| during IMS handover procedure. Otherwise False. |
| """ |
| ad = self.android_devices[0] |
| if voice_call: |
| cycle = self.ims_handover_iwlan_to_4g_with_voice_call_wfc_cellular_preferred_test_cycle |
| else: |
| cycle = self.ims_handover_iwlan_to_4g_wfc_cellular_preferred_test_cycle |
| |
| voice_slot = get_slot_index_from_voice_sub_id(ad) |
| |
| result = [] |
| search_intervals = [] |
| exit_due_to_high_fail_rate = False |
| for attempt in range(cycle): |
| _continue = True |
| |
| self.log.info( |
| '======> IMS handover from iwlan to LTE in WFC ' |
| 'cellular-preferred mode %s/%s <======', |
| attempt+1, |
| cycle) |
| |
| begin_time = datetime.now() |
| |
| if not phone_setup_iwlan( |
| self.log, |
| ad, |
| True, |
| WFC_MODE_CELLULAR_PREFERRED, |
| self.wifi_network_ssid, |
| self.wifi_network_pass): |
| |
| result.append(False) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| toggle_airplane_mode(self.log, ad, False) |
| |
| if _continue: |
| if voice_slot == 0: |
| ims_pattern = ON_IMS_MM_TEL_CONNECTED_IWLAN_SLOT0 |
| else: |
| ims_pattern = ON_IMS_MM_TEL_CONNECTED_IWLAN_SLOT1 |
| |
| if wait_for_log(ad, ims_pattern, begin_time=begin_time): |
| ad.log.info( |
| 'IMS registration is handed over from LTE to iwlan.') |
| else: |
| ad.log.error( |
| 'IMS registration is NOT yet handed over from LTE to ' |
| 'iwlan.') |
| |
| if _continue: |
| if not verify_internet_connection(self.log, ad): |
| result.append(VERIFY_INTERNET_FAIL) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if voice_call: |
| ad_mt = self.android_devices[1] |
| call_params = [( |
| ad, |
| ad_mt, |
| None, |
| is_phone_in_call_iwlan, |
| None)] |
| call_result = two_phone_call_short_seq( |
| self.log, |
| ad, |
| phone_idle_iwlan, |
| is_phone_in_call_iwlan, |
| ad_mt, |
| None, |
| None, |
| wait_time_in_call=30, |
| call_params=call_params) |
| self.tel_logger.set_result(call_result.result_value) |
| if not call_result: |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if not toggle_airplane_mode(self.log, ad, False): |
| result.append(TOGGLE_OFF_APM_FAIL) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| if voice_slot == 0: |
| ims_pattern = ON_IMS_MM_TEL_CONNECTED_4G_SLOT0 |
| else: |
| ims_pattern = ON_IMS_MM_TEL_CONNECTED_4G_SLOT1 |
| |
| if wait_for_log(ad, ims_pattern, begin_time=begin_time): |
| ad.log.info( |
| 'IMS registration is handed over from iwlan to LTE.') |
| else: |
| ad.log.error( |
| 'IMS registration is NOT yet handed over from iwlan to ' |
| 'LTE.') |
| |
| if voice_call: |
| hangup_call(self.log, ad) |
| |
| if _continue: |
| if not wait_for_network_service( |
| self.log, |
| ad, |
| wifi_connected=True, |
| wifi_ssid=self.wifi_network_ssid, |
| ims_reg=True): |
| |
| result.append(False) |
| self._take_bug_report( |
| self.test_name, begin_time=get_current_epoch_time()) |
| _continue = False |
| if not test_result(result, cycle, 10, 0.1): |
| exit_due_to_high_fail_rate = True |
| |
| if _continue: |
| result.append(True) |
| end_time = datetime.now() |
| search_intervals.append([begin_time, end_time]) |
| |
| if (attempt+1) % CALCULATE_EVERY_N_CYCLES == 0 or ( |
| attempt == cycle - 1) or exit_due_to_high_fail_rate: |
| |
| ad.log.info( |
| '====== Test result of IMS registration at slot %s ======', |
| voice_slot) |
| ad.log.info(result) |
| |
| ims_reg, parsing_fail, avg_ims_reg_duration = parse_ims_reg( |
| ad, search_intervals, '4g', 'apm') |
| ad.log.info( |
| '====== IMS registration at slot %s ======', voice_slot) |
| for msg in ims_reg: |
| ad.log.info(msg) |
| |
| ad.log.info( |
| '====== Attempt of parsing fail at slot %s ======' % voice_slot) |
| for msg in parsing_fail: |
| ad.log.info(msg) |
| |
| ad.log.warning('====== Summary ======') |
| ad.log.warning( |
| '%s/%s cycles failed.', |
| (len(result) - result.count(True)), |
| len(result)) |
| for attempt, value in enumerate(result): |
| if value is not True: |
| ad.log.warning('Cycle %s: %s', attempt+1, value) |
| |
| try: |
| fail_rate = (len(result) - result.count(True))/len(result) |
| ad.log.info( |
| 'Fail rate of IMS registration at slot %s: %s', |
| voice_slot, |
| fail_rate) |
| except Exception as e: |
| ad.log.error( |
| 'Fail rate of IMS registration at slot %s: ERROR (%s)', |
| voice_slot, |
| e) |
| |
| ad.log.info( |
| 'Number of trials with valid parsed logs: %s', len(ims_reg)) |
| ad.log.info( |
| 'Average IMS registration time at slot %s: %s', |
| voice_slot, avg_ims_reg_duration) |
| |
| if exit_due_to_high_fail_rate: |
| break |
| |
| return test_result(result, cycle) |
| |
| @test_tracker_info(uuid="ce69fac3-931b-4177-82ea-dbae50b2b310") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_ims_handover_iwlan_to_4g_wfc_cellular_preferred(self): |
| """Turn off airplane mode to make IMS registration hand over from iwlan to LTE |
| in WFC cellular-preferred mode. Measure IMS handover time. |
| |
| Test steps: |
| 1. Enable WFC, set WFC mode to cellular-preferred mode, turn on |
| airplane mode and then connect Wi-Fi to let IMS register over |
| iwlan. |
| 2. Turn off airplane mode. The IMS registration should hand over |
| from iwlan to LTE. |
| 3. Parse logcat to calculate the IMS handover time. |
| """ |
| return self.ims_handover_iwlan_to_4g_wfc_cellular_preferred(False) |
| |
| @test_tracker_info(uuid="0ac7d43e-34e6-4ea3-92f4-e413e90a8bc1") |
| @TelephonyBaseTest.tel_test_wrap |
| def test_ims_handover_iwlan_to_4g_with_voice_call_wfc_cellular_preferred(self): |
| """Turn off airplane mode to make IMS registration hand over from iwlan to LTE |
| in WFC cellular-preferred mode. Measure IMS handover time. |
| |
| Test steps: |
| 1. Enable WFC, set WFC mode to cellular-preferred mode, turn on |
| airplane mode and then connect Wi-Fi to let IMS register over |
| iwlan. |
| 2. Make a WFC call and keep the call active. |
| 3. Turn off airplane mode. The IMS registration should hand over |
| from iwlan to LTE. |
| 4. Parse logcat to calculate the IMS handover time. |
| """ |
| return self.ims_handover_iwlan_to_4g_wfc_cellular_preferred(True) |