def test_lte_wfc_enabled_wifi_connected_toggle_volte(self): """Test for WiFi Calling settings: LTE + VoLTE Enabled + WiFi Connected + WFC enabled, toggle VoLTE setting Steps: 1. Setup DUT Idle, LTE network type, VoLTE enabled. 2. Make sure DUT WiFi connected, WFC enabled (WiFi Preferred). Verify DUT WFC available, report iwlan rat. 3. Disable VoLTE on DUT, verify in 2 minutes period, DUT does not lost WiFi Calling, DUT still report WFC available, rat iwlan. 4. Enable VoLTE on DUT, verify in 2 minutes period, DUT does not lost WiFi Calling, DUT still report WFC available, rat iwlan. Expected Results: 2. DUT WiFi Calling feature bit return True, network rat is iwlan. 3. DUT WiFi Calling feature bit return True, network rat is iwlan. 4. DUT WiFi Calling feature bit return True, network rat is iwlan. """ if not phone_setup_volte(self.log, self.dut): self.dut.log.error("Failed to setup VoLTE.") return False if not self.change_ims_setting(False, True, True, True, self.default_wfc_mode): return False if not self.change_ims_setting(False, True, False, True, None): return False return self.change_ims_setting(False, True, True, True, None)
def test_lte_volte_wfc_enabled_reset_wifi_stress(self): """Test for WiFi Calling settings: LTE + VoLTE Enabled + WFC enabled, Reset WiFi Stress test Steps: 1. Setup DUT Idle, LTE network type, VoLTE enabled. 2. Make sure DUT WiFi disconnected, WFC enabled (WiFi Preferred). 3. DUT connect WiFi, verify DUT WFC available, report iwlan rat. 4. DUT Reset WiFi, verify DUT WFC unavailable, not report iwlan rat. 5. Verify DUT report VoLTE available. 6. Repeat steps 3~5 for N times. Expected Results: 3. DUT WiFi Calling feature bit return True, network rat is iwlan. 4. DUT WiFi Calling feature bit return False, network rat is not iwlan. 5. DUT report VoLTE available. """ if not phone_setup_volte(self.log, self.ad): self.log.error("Failed to setup VoLTE") return False set_wfc_mode(self.log, self.ad, WFC_MODE_WIFI_PREFERRED) for i in range(1, self.stress_test_number + 1): self.log.info("Start Iteration {}.".format(i)) result = self._wifi_connected_enable_wfc_teardown_wfc( tear_down_operation=self._TEAR_DOWN_OPERATION_RESET_WIFI, initial_setup_wifi=True, initial_setup_wfc_mode=None, check_volte_after_wfc_disabled=True) if not result: self.log.error("Test Failed in iteration: {}.".format(i)) return False return True
def test_lte_volte_wfc_cellular_preferred_to_wifi_preferred(self): """Test for WiFi Calling settings: LTE + VoLTE Enabled + WiFi Connected + Cellular Preferred, change WFC to WiFi Preferred Steps: 1. Setup DUT Idle, LTE network type, VoLTE enabled. 2. Make sure DUT WiFi connected, WFC is set to Cellular Preferred. Verify DUT WFC not available. 3. Change WFC setting to WiFi Preferred. 4. Verify DUT report WFC available. Expected Results: 2. DUT WiFi Calling feature bit return False, network rat is not iwlan. 4. DUT WiFI Calling feature bit return True, network rat is iwlan. """ if WFC_MODE_WIFI_PREFERRED not in self.dut_wfc_modes: raise signals.TestSkip("WFC_MODE_WIFI_PREFERRED is not supported") if WFC_MODE_CELLULAR_PREFERRED not in self.dut_wfc_modes: raise signals.TestSkip( "WFC_MODE_CELLULAR_PREFERRED is not supported") if not phone_setup_volte(self.log, self.dut): self.dut.log.error("Failed to setup VoLTE.") return False if not self.change_ims_setting(False, True, True, True, WFC_MODE_CELLULAR_PREFERRED): return False return self.change_ims_setting(False, True, True, True, WFC_MODE_WIFI_PREFERRED)
def test_lte_volte_wfc_cellular_preferred_to_wifi_preferred(self): """Test for WiFi Calling settings: LTE + VoLTE Enabled + WiFi Connected + Cellular Preferred, change WFC to WiFi Preferred Steps: 1. Setup DUT Idle, LTE network type, VoLTE enabled. 2. Make sure DUT WiFi connected, WFC is set to Cellular Preferred. Verify DUT WFC not available. 3. Change WFC setting to WiFi Preferred. 4. Verify DUT report WFC available. Expected Results: 2. DUT WiFi Calling feature bit return False, network rat is not iwlan. 4. DUT WiFI Calling feature bit return True, network rat is iwlan. """ if not phone_setup_volte(self.log, self.ad): self.log.error("Failed to setup VoLTE.") return False return self._wifi_connected_set_wfc_mode_change_wfc_mode( WFC_MODE_CELLULAR_PREFERRED, WFC_MODE_WIFI_PREFERRED, False, True, check_volte_after_wfc_disabled=True)
def test_lte_volte_wifi_connected_toggle_wfc(self): """Test for WiFi Calling settings: LTE + VoLTE Enabled + WiFi Connected, Toggling WFC Steps: 1. Setup DUT Idle, LTE network type, VoLTE enabled. 2. Make sure DUT WiFi connected, WFC disabled. 3. Set DUT WFC enabled (WiFi Preferred), verify DUT WFC available, report iwlan rat. 4. Set DUT WFC disabled, verify DUT WFC unavailable, not report iwlan rat. Expected Results: 3. DUT WiFi Calling feature bit return True, network rat is iwlan. 4. DUT WiFi Calling feature bit return False, network rat is not iwlan. """ if not phone_setup_volte(self.log, self.ad): self.log.error("Failed to setup VoLTE") return False return self._wifi_connected_enable_wfc_teardown_wfc( tear_down_operation=self._TEAR_DOWN_OPERATION_DISABLE_WFC, initial_setup_wifi=True, initial_setup_wfc_mode=WFC_MODE_WIFI_PREFERRED, check_volte_after_wfc_disabled=True)
def _setup_lte_volte_enabled(self): for ad in self.android_devices: if not phone_setup_volte(self.log, ad): ad.log.error("Phone failed to enable VoLTE.") return False ad.log.info("Phone VOLTE is enabled successfully.") return True
def test_lte_volte_wifi_connected_toggle_wfc(self): """Test for WiFi Calling settings: LTE + VoLTE Enabled + WiFi Connected, Toggling WFC Steps: 1. Setup DUT Idle, LTE network type, VoLTE enabled. 2. Make sure DUT WiFi connected, WFC disabled. 3. Set DUT WFC enabled (WiFi Preferred), verify DUT WFC available, report iwlan rat. 4. Set DUT WFC disabled, verify DUT WFC unavailable, not report iwlan rat. Expected Results: 3. DUT WiFi Calling feature bit return True, network rat is iwlan. 4. DUT WiFi Calling feature bit return False, network rat is not iwlan. """ if not phone_setup_volte(self.log, self.dut): self.log.error("Failed to setup VoLTE") return False if not self.change_ims_setting(False, True, True, True, self.default_wfc_mode): return False if not self.change_ims_setting(False, True, True, False, None): return False return self.change_ims_setting(False, True, True, True, None)
def _setup_phone_active_call_wfc(self, ad, ssid, password, airplane_mode, wfc_mode, setup_volte=False): if setup_volte and (not phone_setup_volte(self.log, ad)): self.log.error("Phone failed to setup VoLTE.") return False if not phone_setup_iwlan(self.log, ad, airplane_mode, wfc_mode, ssid, password): self.log.error("DUT Failed to Set Up WiFi Calling") return False ensure_phones_idle(self.log, [ad, self.android_devices[1]]) if not phone_idle_iwlan(self.log, ad): self.log.error("DUT not in WFC enabled state.") return False if not call_setup_teardown(self.log, ad, self.android_devices[1], ad_hangup=None, verify_caller_func=is_phone_in_call_iwlan): self.log.error("Setup Call failed.") return False ad.droid.goToSleepNow() return True
def setup_volte(self): if CAPABILITY_VOLTE not in self.dut_capabilities: raise signals.TestSkip("VoLTE is not supported, abort test.") if not phone_setup_volte(self.log, self.dut): self.dut.log.error("Phone failed to enable VoLTE.") raise signals.TestFailure("Failed to enable VoLTE") self.dut.log.info("Phone VOLTE is enabled successfully.") return True
def _idle_wfc_2g_lte(ad): if not phone_setup_volte(self.log, ad): self.log.error("Phone failed to setup VoLTE.") return False if not phone_setup_iwlan( self.log, ad, False, WFC_MODE_WIFI_PREFERRED, self.wifi_network_ssid_2g, self.wifi_network_pass_2g): self.log.error("Phone failed to setup WFC.") return False ad.droid.goToSleepNow() return True
def _check_volte(self, ad, ad_reference): if (CAPABILITY_VOLTE in device_capabilities[self.dut_model] and CAPABILITY_VOLTE in operator_capabilities[self.dut_operator]): self.log.info("Check VoLTE") if not phone_setup_volte(self.log, ad): self.log.error("Failed to setup VoLTE.") return False if not call_setup_teardown(self.log, ad, ad_reference, ad, is_phone_in_call_volte): self.log.error("VoLTE Call Failed.") return False if not sms_send_receive_verify(self.log, ad, ad_reference, [rand_ascii_str(50)]): self.log.error("SMS failed") return False return True
def test_lte_wfc_enabled_wifi_connected_toggle_volte(self): """Test for WiFi Calling settings: LTE + VoLTE Enabled + WiFi Connected + WFC enabled, toggle VoLTE setting Steps: 1. Setup DUT Idle, LTE network type, VoLTE enabled. 2. Make sure DUT WiFi connected, WFC enabled (WiFi Preferred). Verify DUT WFC available, report iwlan rat. 3. Disable VoLTE on DUT, verify in 2 minutes period, DUT does not lost WiFi Calling, DUT still report WFC available, rat iwlan. 4. Enable VoLTE on DUT, verify in 2 minutes period, DUT does not lost WiFi Calling, DUT still report WFC available, rat iwlan. Expected Results: 2. DUT WiFi Calling feature bit return True, network rat is iwlan. 3. DUT WiFi Calling feature bit return True, network rat is iwlan. 4. DUT WiFi Calling feature bit return True, network rat is iwlan. """ if not phone_setup_volte(self.log, self.ad): self.log.error("Failed to setup VoLTE.") return False if not phone_setup_iwlan(self.log, self.ad, False, WFC_MODE_WIFI_PREFERRED, self.wifi_network_ssid, self.wifi_network_pass): self.log.error("Failed to setup WFC.") return False # Turn Off VoLTE, then Turn On VoLTE for i in range(2): if not toggle_volte(self.log, self.ad): self.log.error("Failed to toggle VoLTE.") return False if wait_for_wfc_disabled(self.log, self.ad): self.log.error("WFC is not available.") return False if not is_droid_in_rat_family(self.log, self.ad, RAT_FAMILY_WLAN, NETWORK_SERVICE_DATA): self.log.error("Data Rat is not iwlan.") return False return True
def test_lte_volte_wfc_wifi_preferred_to_cellular_preferred_stress(self): """Test for WiFi Calling settings: LTE + VoLTE Enabled + WiFi Connected + WiFi Preferred, change WFC to Cellular Preferred stress Steps: 1. Setup DUT Idle, LTE network type, VoLTE enabled. 2. Make sure DUT WiFi connected, WFC is set to WiFi Preferred. Verify DUT WFC available, report iwlan rat. 3. Change WFC setting to Cellular Preferred. 4. Verify DUT report WFC not available. 5. Verify DUT report VoLTE available. 6. Repeat steps 3~5 for N times. Expected Results: 2. DUT WiFi Calling feature bit return True, network rat is iwlan. 4. DUT WiFI Calling feature bit return False, network rat is not iwlan. 5. DUT report VoLTE available. """ if not phone_setup_volte(self.log, self.ad): self.log.error("Failed to setup VoLTE.") return False if not ensure_wifi_connected(self.log, self.ad, self.wifi_network_ssid, self.wifi_network_pass): self.log.error("Failed to connect WiFi") return False for i in range(1, self.stress_test_number + 1): self.log.info("Start Iteration {}.".format(i)) result = self._wifi_connected_set_wfc_mode_change_wfc_mode( WFC_MODE_WIFI_PREFERRED, WFC_MODE_CELLULAR_PREFERRED, True, False, initial_setup_wifi=False, check_volte_after_wfc_disabled=True) if not result: self.log.error("Test Failed in iteration: {}.".format(i)) return False return True
def _check_volte(self): if CAPABILITY_VOLTE in self.dut_capabilities: self._set_volte_provisioning() if not self._check_volte_provisioning(): return False self.log.info("Check VoLTE") if not wait_for_state(self.dut.droid.imsIsVolteProvisionedOnDevice, True): self.dut.log.error("VoLTE provisioning is disabled.") return False if not phone_setup_volte(self.log, self.dut): self.log.error("Failed to setup VoLTE.") return False time.sleep(5) if not call_setup_teardown(self.log, self.dut, self.ad_reference, self.dut, is_phone_in_call_volte): self.log.error("VoLTE Call Failed.") return False if not self._check_lte_data(): return False else: self.dut.log.info("VoLTE is not supported") return False return True
def _prefnetwork_mode_change(self, sub_id): # ModePref change to non-LTE begin_time = get_device_epoch_time(self.dut) start_qxdm_loggers(self.log, self.android_devices) self.result_info["Network Change Request Total"] += 1 test_name = "%s_network_change_iter_%s" % ( self.test_name, self.result_info["Network Change Request Total"]) log_msg = "[Test Case] %s" % test_name self.log.info("%s begin", log_msg) self.dut.droid.logI("%s begin" % log_msg) network_preference_list = [ NETWORK_MODE_TDSCDMA_GSM_WCDMA, NETWORK_MODE_WCDMA_ONLY, NETWORK_MODE_GLOBAL, NETWORK_MODE_CDMA, NETWORK_MODE_GSM_ONLY ] network_preference = random.choice(network_preference_list) set_preferred_network_mode_pref(self.log, self.dut, sub_id, network_preference) time.sleep(WAIT_TIME_AFTER_MODE_CHANGE) self.dut.log.info("Current Voice RAT is %s", get_current_voice_rat(self.log, self.dut)) # ModePref change back to with LTE if not phone_setup_volte(self.log, self.dut): self.dut.log.error("Phone failed to enable VoLTE.") self.result_info["VoLTE Setup Failure"] += 1 self.dut.droid.logI("%s end" % log_msg) self.dut.log.info("%s end", log_msg) try: self._ad_take_extra_logs(self.dut, test_name, begin_time) self._ad_take_bugreport(self.dut, test_name, begin_time) except Exception as e: self.log.exception(e) return False else: self.result_info["VoLTE Setup Success"] += 1 return True
def _setup_lte_volte_enabled(self): if not phone_setup_volte(self.log, self.dut): self.dut.log.error("Phone failed to enable VoLTE.") return False self.dut.log.info("Phone VOLTE is enabled successfully.") return True
def _telephony_bootup_time_test(self, **kwargs): """Telephony Bootup Perf Test Arguments: check_lte_data: whether to check the LTE data. check_volte: whether to check Voice over LTE. check_wfc: whether to check Wifi Calling. Expected Results: Time Returns: True is pass, False if fail. """ ad = self.dut toggle_airplane_mode(self.log, ad, False) if not phone_setup_volte(self.log, ad): ad.log.error("Failed to setup VoLTE.") return False fail_count = collections.defaultdict(int) test_result = True keyword_time_dict = {} for i in range(1, self.stress_test_number + 1): ad.log.info("Telephony Bootup Time Test %s Iteration: %d / %d", self.test_name, i, self.stress_test_number) ad.log.info("reboot!") ad.reboot() iteration_result = "pass" time.sleep(30) text_search_mapping = { 'boot_complete': "processing action (sys.boot_completed=1)", 'Voice_Reg': "< VOICE_REGISTRATION_STATE {.regState = REG_HOME", 'Data_Reg': "< DATA_REGISTRATION_STATE {.regState = REG_HOME", 'Data_Call_Up': "onSetupConnectionCompleted result=SUCCESS", 'VoLTE_Enabled': "isVolteEnabled=true", } text_obj_mapping = { "boot_complete": None, "Voice_Reg": None, "Data_Reg": None, "Data_Call_Up": None, "VoLTE_Enabled": None, } blocked_for_calculate = ["boot_complete"] for tel_state in text_search_mapping: dict_match = ad.search_logcat(text_search_mapping[tel_state]) if len(dict_match) != 0: text_obj_mapping[tel_state] = dict_match[0]['datetime_obj'] else: ad.log.error("Cannot Find Text %s in logcat", text_search_mapping[tel_state]) blocked_for_calculate.append(tel_state) for tel_state in text_search_mapping: if tel_state not in blocked_for_calculate: time_diff = text_obj_mapping[tel_state] - \ text_obj_mapping['boot_complete'] if time_diff.seconds > 100: continue if tel_state in keyword_time_dict: keyword_time_dict[tel_state].append(time_diff.seconds) else: keyword_time_dict[tel_state] = [ time_diff.seconds, ] ad.log.info("Telephony Bootup Time Test %s Iteration: %d / %d %s", self.test_name, i, self.stress_test_number, iteration_result) for tel_state in text_search_mapping: if tel_state not in blocked_for_calculate: avg_time = self._get_list_average(keyword_time_dict[tel_state]) if avg_time < 12.0: ad.log.info("Average %s for %d iterations = %.2f seconds", tel_state, self.stress_test_number, avg_time) else: ad.log.error("Average %s for %d iterations = %.2f seconds", tel_state, self.stress_test_number, avg_time) fail_count[tel_state] += 1 ad.log.info("Bootup Time Dict {}".format(keyword_time_dict)) for failure, count in fail_count.items(): if count: ad.log.error("%d %d failures in %d iterations", count, failure, self.stress_test_number) test_result = False return test_result
def _idle_lte_volte_enabled(ad): if not phone_setup_volte(self.log, ad): self.log.error("Phone failed to setup VoLTE.") return False ad.droid.goToSleepNow() return True
def _telephony_bootup_time_test(self): """Telephony Bootup Perf Test Arguments: check_lte_data: whether to check the LTE data. check_volte: whether to check Voice over LTE. check_wfc: whether to check Wifi Calling. Expected Results: Time Returns: True is pass, False if fail. """ self.number_of_devices = 1 ad = self.dut toggle_airplane_mode(self.log, ad, False) if not phone_setup_volte(self.log, ad): ad.log.error("Failed to setup VoLTE.") return False fail_count = collections.defaultdict(int) test_result = True keyword_time_dict = {} text_search_mapping = { 'boot_complete': "ModemService: Received: android.intent.action.BOOT_COMPLETED", 'Voice_Reg': "< VOICE_REGISTRATION_STATE {.regState = REG_HOME", 'Data_Reg': "< DATA_REGISTRATION_STATE {.regState = REG_HOME", 'Data_Call_Up': "onSetupConnectionCompleted result=SUCCESS", 'VoLTE_Enabled': "isVolteEnabled=true", } text_obj_mapping = { "boot_complete": None, "Voice_Reg": None, "Data_Reg": None, "Data_Call_Up": None, "VoLTE_Enabled": None, } blocked_for_calculate = ["boot_complete"] for i in range(1, self.stress_test_number + 1): ad.log.info("Telephony Bootup Time Test %s Iteration: %d / %d", self.test_name, i, self.stress_test_number) begin_time = get_current_epoch_time() ad.log.debug("Begin Time is %s", begin_time) ad.log.info("reboot!") reboot_device(ad) iteration_result = "pass" time.sleep(WAIT_TIME_FOR_BOOT_COMPLETE) dict_match = ad.search_logcat(text_search_mapping['boot_complete'], begin_time=begin_time) if len(dict_match) != 0: text_obj_mapping['boot_complete'] = dict_match[0][ 'datetime_obj'] ad.log.debug("Datetime for boot_complete is %s", text_obj_mapping['boot_complete']) bootup_time = dict_match[0]['datetime_obj'].strftime('%s') bootup_time = int(bootup_time) * 1000 ad.log.info("Bootup Time is %d", bootup_time) else: ad.log.error("TERMINATE- boot_complete not seen in logcat") return False for tel_state in text_search_mapping: if tel_state == "boot_complete": continue dict_match = ad.search_logcat(text_search_mapping[tel_state], begin_time=bootup_time) if len(dict_match) != 0: text_obj_mapping[tel_state] = dict_match[0]['datetime_obj'] ad.log.debug("Datetime for %s is %s", tel_state, text_obj_mapping[tel_state]) else: ad.log.error("Cannot Find Text %s in logcat", text_search_mapping[tel_state]) blocked_for_calculate.append(tel_state) ad.log.debug("New Blocked %s", blocked_for_calculate) ad.log.info("List Blocked %s", blocked_for_calculate) for tel_state in text_search_mapping: if tel_state not in blocked_for_calculate: time_diff = text_obj_mapping[tel_state] - \ text_obj_mapping['boot_complete'] ad.log.info("Time Diff is %d for %s", time_diff.seconds, tel_state) if tel_state in keyword_time_dict: keyword_time_dict[tel_state].append(time_diff.seconds) else: keyword_time_dict[tel_state] = [ time_diff.seconds, ] ad.log.debug("Keyword Time Dict %s", keyword_time_dict) ad.log.info("Telephony Bootup Time Test %s Iteration: %d / %d %s", self.test_name, i, self.stress_test_number, iteration_result) ad.log.info("Final Keyword Time Dict %s", keyword_time_dict) for tel_state in text_search_mapping: if tel_state not in blocked_for_calculate: avg_time = self._get_list_average(keyword_time_dict[tel_state]) if avg_time < 12.0: ad.log.info("Average %s for %d iterations = %.2f seconds", tel_state, self.stress_test_number, avg_time) else: ad.log.error("Average %s for %d iterations = %.2f seconds", tel_state, self.stress_test_number, avg_time) fail_count[tel_state] += 1 ad.log.info("Bootup Time Dict: %s", keyword_time_dict) ad.log.info("fail_count: %s", dict(fail_count)) for failure, count in fail_count.items(): if count: ad.log.error("%s %s failures in %s iterations", count, failure, self.stress_test_number) test_result = False return test_result