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)
Example #6
0
 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)
Example #8
0
 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
Example #10
0
 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
Example #14
0
 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
Example #15
0
    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
Example #18
0
 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