1 #!/usr/bin/env python3.4 2 # 3 # Copyright 2017 - Google 4 # 5 # Licensed under the Apache License, Version 2.0 (the "License"); 6 # you may not use this file except in compliance with the License. 7 # You may obtain a copy of the License at 8 # 9 # http://www.apache.org/licenses/LICENSE-2.0 10 # 11 # Unless required by applicable law or agreed to in writing, software 12 # distributed under the License is distributed on an "AS IS" BASIS, 13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 # See the License for the specific language governing permissions and 15 # limitations under the License. 16 """ 17 Test Script for Telephony Mobility Stress Test 18 """ 19 20 import collections 21 import random 22 import time 23 from acts.asserts import explicit_pass 24 from acts.asserts import fail 25 from acts.test_decorators import test_tracker_info 26 from acts.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest 27 from acts.test_utils.tel.tel_atten_utils import set_rssi 28 from acts.test_utils.tel.tel_defines import CELL_WEAK_RSSI_VALUE 29 from acts.test_utils.tel.tel_defines import CELL_STRONG_RSSI_VALUE 30 from acts.test_utils.tel.tel_defines import MAX_RSSI_RESERVED_VALUE 31 from acts.test_utils.tel.tel_defines import MIN_RSSI_RESERVED_VALUE 32 from acts.test_utils.tel.tel_defines import WFC_MODE_CELLULAR_PREFERRED 33 from acts.test_utils.tel.tel_defines import WFC_MODE_DISABLED 34 from acts.test_utils.tel.tel_defines import WFC_MODE_WIFI_PREFERRED 35 from acts.test_utils.tel.tel_defines import WFC_MODE_CELLULAR_PREFERRED 36 from acts.test_utils.tel.tel_defines import WIFI_WEAK_RSSI_VALUE 37 from acts.test_utils.tel.tel_test_utils import active_file_download_test 38 from acts.test_utils.tel.tel_test_utils import call_setup_teardown 39 from acts.test_utils.tel.tel_test_utils import ensure_phone_default_state 40 from acts.test_utils.tel.tel_test_utils import ensure_phone_subscription 41 from acts.test_utils.tel.tel_test_utils import ensure_phones_idle 42 from acts.test_utils.tel.tel_test_utils import ensure_wifi_connected 43 from acts.test_utils.tel.tel_test_utils import hangup_call 44 from acts.test_utils.tel.tel_test_utils import is_voice_attached 45 from acts.test_utils.tel.tel_test_utils import run_multithread_func 46 from acts.test_utils.tel.tel_test_utils import set_wfc_mode 47 from acts.test_utils.tel.tel_test_utils import sms_send_receive_verify 48 from acts.test_utils.tel.tel_test_utils import start_qxdm_loggers 49 from acts.test_utils.tel.tel_test_utils import mms_send_receive_verify 50 from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_3g 51 from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_2g 52 from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_csfb 53 from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_iwlan 54 from acts.test_utils.tel.tel_voice_utils import is_phone_in_call_volte 55 from acts.test_utils.tel.tel_voice_utils import phone_setup_csfb 56 from acts.test_utils.tel.tel_voice_utils import phone_setup_iwlan 57 from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_3g 58 from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_2g 59 from acts.test_utils.tel.tel_voice_utils import phone_setup_volte 60 from acts.test_utils.tel.tel_voice_utils import get_current_voice_rat 61 62 from acts.logger import epoch_to_log_line_timestamp 63 from acts.utils import get_current_epoch_time 64 from acts.utils import rand_ascii_str 65 66 from TelWifiVoiceTest import TelWifiVoiceTest 67 from TelWifiVoiceTest import ATTEN_NAME_FOR_WIFI_2G 68 from TelWifiVoiceTest import ATTEN_NAME_FOR_WIFI_5G 69 from TelWifiVoiceTest import ATTEN_NAME_FOR_CELL_3G 70 from TelWifiVoiceTest import ATTEN_NAME_FOR_CELL_4G 71 72 import socket 73 from acts.controllers.sl4a_lib.rpc_client import Sl4aProtocolError 74 75 IGNORE_EXCEPTIONS = (BrokenPipeError, Sl4aProtocolError) 76 EXCEPTION_TOLERANCE = 20 77 78 79 class TelLiveMobilityStressTest(TelWifiVoiceTest): 80 def setup_class(self): 81 super().setup_class() 82 #super(TelWifiVoiceTest, self).setup_class() 83 self.user_params["telephony_auto_rerun"] = False 84 self.max_phone_call_duration = int( 85 self.user_params.get("max_phone_call_duration", 600)) 86 self.max_sleep_time = int(self.user_params.get("max_sleep_time", 120)) 87 self.max_run_time = int(self.user_params.get("max_run_time", 7200)) 88 self.max_sms_length = int(self.user_params.get("max_sms_length", 1000)) 89 self.max_mms_length = int(self.user_params.get("max_mms_length", 160)) 90 self.crash_check_interval = int( 91 self.user_params.get("crash_check_interval", 300)) 92 self.signal_change_interval = int( 93 self.user_params.get("signal_change_interval", 10)) 94 self.signal_change_step = int( 95 self.user_params.get("signal_change_step", 5)) 96 self.min_sms_length = int(self.user_params.get("min_sms_length", 1)) 97 self.min_mms_length = int(self.user_params.get("min_mms_length", 1)) 98 self.min_phone_call_duration = int( 99 self.user_params.get("min_phone_call_duration", 10)) 100 self.dut = self.android_devices[0] 101 self.helper = self.android_devices[1] 102 103 return True 104 105 def on_fail(self, test_name, begin_time): 106 pass 107 108 def _setup_volte_wfc_wifi_preferred(self): 109 return self._wfc_phone_setup( 110 False, WFC_MODE_WIFI_PREFERRED, volte_mode=True) 111 112 def _setup_volte_wfc_cell_preferred(self): 113 return self._wfc_phone_setup( 114 False, WFC_MODE_CELLULAR_PREFERRED, volte_mode=True) 115 116 def _setup_csfb_wfc_wifi_preferred(self): 117 return self._wfc_phone_setup( 118 False, WFC_MODE_WIFI_PREFERRED, volte_mode=False) 119 120 def _setup_csfb_wfc_cell_preferred(self): 121 return self._wfc_phone_setup( 122 False, WFC_MODE_CELLULAR_PREFERRED, volte_mode=False) 123 124 def _setup_volte_wfc_disabled(self): 125 return self._wfc_phone_setup(False, WFC_MODE_DISABLED, volte_mode=True) 126 127 def _setup_csfb_wfc_disabled(self): 128 return self._wfc_phone_setup( 129 False, WFC_MODE_DISABLED, volte_mode=False) 130 131 def _send_message(self, ads): 132 selection = random.randrange(0, 2) 133 message_type_map = {0: "SMS", 1: "MMS"} 134 max_length_map = {0: self.max_sms_length, 1: self.max_mms_length} 135 min_length_map = {0: self.min_sms_length, 1: self.min_mms_length} 136 length = random.randrange(min_length_map[selection], 137 max_length_map[selection] + 1) 138 text = rand_ascii_str(length) 139 message_content_map = {0: [text], 1: [("Mms Message", text, None)]} 140 message_func_map = { 141 0: sms_send_receive_verify, 142 1: mms_send_receive_verify 143 } 144 message_type = message_type_map[selection] 145 self.result_info["Total %s" % message_type] += 1 146 begin_time = get_current_epoch_time() 147 start_qxdm_loggers(self.log, self.android_devices) 148 if not message_func_map[selection](self.log, ads[0], ads[1], 149 message_content_map[selection]): 150 self.log.error("%s of length %s from %s to %s fails", message_type, 151 length, ads[0].serial, ads[1].serial) 152 self.result_info["%s failure" % message_type] += 1 153 if message_type == "SMS" or self.result_info["%s failure" % 154 message_type] == 1: 155 self._take_bug_report("%s_%s_failure" % (self.test_name, 156 message_type), 157 begin_time) 158 return False 159 else: 160 self.log.info("%s of length %s from %s to %s succeed", 161 message_type_map[selection], length, ads[0].serial, 162 ads[1].serial) 163 return True 164 165 def _make_phone_call(self, ads): 166 self.result_info["Total Calls"] += 1 167 begin_time = get_current_epoch_time() 168 start_qxdm_loggers(self.log, self.android_devices) 169 if not call_setup_teardown( 170 self.log, 171 ads[0], 172 ads[1], 173 ad_hangup=ads[random.randrange(0, 2)], 174 wait_time_in_call=random.randrange( 175 self.min_phone_call_duration, 176 self.max_phone_call_duration)): 177 self.log.error("Call setup and teardown failed.") 178 self.result_info["Call Failure"] += 1 179 self._take_bug_report("%s_call_failure" % self.test_name, 180 begin_time) 181 return False 182 self.log.info("Call setup and teardown succeed.") 183 return True 184 185 def crash_check_test(self): 186 failure = 0 187 while time.time() < self.finishing_time: 188 self.dut.log.info(dict(self.result_info)) 189 try: 190 begin_time = get_current_epoch_time() 191 time.sleep(self.crash_check_interval) 192 crash_report = self.dut.check_crash_report( 193 "checking_crash", begin_time, True) 194 if crash_report: 195 self.dut.log.error("Find new crash reports %s", 196 crash_report) 197 failure += 1 198 self.result_info["Crashes"] += 1 199 except IGNORE_EXCEPTION as e: 200 self.log.error("Exception error %s", str(e)) 201 self.result_info["Exception Errors"] += 1 202 if self.result_info["Exception Errors"] > EXCEPTION_TOLERANCE: 203 return False 204 except Exception as e: 205 return False 206 self.dut.log.info("Crashes found: %s", failure) 207 if failure: 208 return False 209 else: 210 return True 211 212 def environment_change_4g_wifi(self): 213 #block cell 3G, WIFI 2G 214 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 0, 215 MIN_RSSI_RESERVED_VALUE) 216 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G], 0, 217 MIN_RSSI_RESERVED_VALUE) 218 while time.time() < self.finishing_time: 219 #set strong wifi 5G and LTE 220 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 0, 221 MAX_RSSI_RESERVED_VALUE) 222 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 0, 223 MAX_RSSI_RESERVED_VALUE) 224 #gratually decrease wifi 5g 225 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 226 self.wifi_rssi_with_no_atten, MIN_RSSI_RESERVED_VALUE, 227 self.signal_change_step, self.signal_change_interval) 228 #gratually increase wifi 5g 229 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 230 MIN_RSSI_RESERVED_VALUE, MAX_RSSI_RESERVED_VALUE, 231 self.signal_change_step, self.signal_change_interval) 232 233 #gratually decrease cell 4G 234 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 235 self.cell_rssi_with_no_atten, CELL_WEAK_RSSI_VALUE, 236 self.signal_change_step, self.signal_change_interval) 237 #gradtually increase cell 4G 238 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 239 MIN_RSSI_RESERVED_VALUE, MAX_RSSI_RESERVED_VALUE, 240 self.signal_change_step, self.signal_change_interval) 241 return "" 242 243 def environment_change_4g_3g(self): 244 #block wifi 2G and 5G 245 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_2G], 0, 246 MIN_RSSI_RESERVED_VALUE) 247 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_WIFI_5G], 0, 248 MIN_RSSI_RESERVED_VALUE) 249 while time.time() < self.finishing_time: 250 #set strong cell 4G and 3G 251 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 0, 252 MAX_RSSI_RESERVED_VALUE) 253 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 0, 254 MAX_RSSI_RESERVED_VALUE) 255 #gratually decrease cell 4G 256 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 257 self.cell_rssi_with_no_atten, MIN_RSSI_RESERVED_VALUE, 258 self.signal_change_step, self.signal_change_interval) 259 #gradtually increase cell 4G 260 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_4G], 261 MIN_RSSI_RESERVED_VALUE, MAX_RSSI_RESERVED_VALUE, 262 self.signal_change_step, self.signal_change_interval) 263 #gratually decrease cell 3G 264 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 265 self.cell_rssi_with_no_atten, MIN_RSSI_RESERVED_VALUE, 266 self.signal_change_step, self.signal_change_interval) 267 #gradtually increase cell 3G 268 set_rssi(self.log, self.attens[ATTEN_NAME_FOR_CELL_3G], 269 MIN_RSSI_RESERVED_VALUE, MAX_RSSI_RESERVED_VALUE, 270 self.signal_change_step, self.signal_change_interval) 271 272 return "" 273 274 def call_test(self): 275 failure = 0 276 total_count = 0 277 while time.time() < self.finishing_time: 278 try: 279 ads = [self.dut, self.helper] 280 random.shuffle(ads) 281 total_count += 1 282 # Current Voice RAT 283 self.dut.log.info("Current Voice RAT is %s", 284 get_current_voice_rat(self.log, self.dut)) 285 self.helper.log.info("Current Voice RAT is %s", 286 get_current_voice_rat( 287 self.log, self.helper)) 288 if not self._make_phone_call(ads): 289 failure += 1 290 self.dut.droid.goToSleepNow() 291 time.sleep(random.randrange(0, self.max_sleep_time)) 292 except IGNORE_EXCEPTIONS as e: 293 self.log.error("Exception error %s", str(e)) 294 self.result_info["Exception Errors"] += 1 295 if self.result_info["Exception Errors"] > EXCEPTION_TOLERANCE: 296 self.log.error("Too many exception errors %s", 297 IGNORE_EXCEPTIONS) 298 return False 299 except Exception as e: 300 self.log.error(e) 301 return False 302 self.dut.log.info("Call test failure: %s/%s", failure, total_count) 303 if failure: 304 return False 305 else: 306 return True 307 308 def message_test(self): 309 failure = 0 310 total_count = 0 311 while time.time() < self.finishing_time: 312 try: 313 ads = [self.dut, self.helper] 314 random.shuffle(ads) 315 total_count += 1 316 if not self._send_message(ads): 317 failure += 1 318 self.dut.droid.goToSleepNow() 319 time.sleep(random.randrange(0, self.max_sleep_time)) 320 except IGNORE_EXCEPTIONS as e: 321 self.log.error("Exception error %s", str(e)) 322 self.result_info["Exception Errors"] += 1 323 if self.result_info["Exception Errors"] > EXCEPTION_TOLERANCE: 324 self.log.error("Too many exception errors %s", 325 IGNORE_EXCEPTIONS) 326 return False 327 except Exception as e: 328 self.log.error(e) 329 return False 330 self.dut.log.info("Messaging test failure: %s/%s", failure, 331 total_count) 332 if failure / total_count > 0.1: 333 return False 334 else: 335 return True 336 337 def data_test(self): 338 failure = 0 339 total_count = 0 340 #file_names = ["5MB", "10MB", "20MB", "50MB", "200MB", "512MB", "1GB"] 341 #wifi download is very slow in lab, limit the file size upto 200MB 342 file_names = ["5MB", "10MB", "20MB", "50MB", "200MB"] 343 while time.time() < self.finishing_time: 344 total_count += 1 345 begin_time = get_current_epoch_time() 346 start_qxdm_loggers(self.log, self.android_devices) 347 try: 348 self.dut.log.info(dict(self.result_info)) 349 self.result_info["Total file download"] += 1 350 selection = random.randrange(0, len(file_names)) 351 file_name = file_names[selection] 352 if not active_file_download_test(self.log, self.dut, 353 file_name): 354 self.result_info["File download failure"] += 1 355 failure += 1 356 if self.result_info["File download failure"] == 1: 357 self._take_bug_report( 358 "%s_file_download_failure" % self.test_name, 359 begin_time) 360 self.dut.droid.goToSleepNow() 361 time.sleep(random.randrange(0, self.max_sleep_time)) 362 except IGNORE_EXCEPTIONS as e: 363 self.log.error("Exception error %s", str(e)) 364 self.result_info["Exception Errors"] += 1 365 if self.result_info["Exception Errors"] > EXCEPTION_TOLERANCE: 366 self.log.error("Too many exception error %s", 367 IGNORE_EXCEPTIONS) 368 return False 369 except Exception as e: 370 self.log.error(e) 371 return False 372 self.dut.log.info("File download test failure: %s/%s", failure, 373 total_count) 374 if failure / total_count > 0.1: 375 return False 376 else: 377 return True 378 379 def parallel_tests(self, change_env_func, setup_func=None): 380 if setup_func and not setup_func(): 381 self.log.error("Test setup %s failed", setup_func.__name__) 382 return False 383 self.result_info = collections.defaultdict(int) 384 self.finishing_time = time.time() + self.max_run_time 385 results = run_multithread_func(self.log, [(self.call_test, []), ( 386 self.message_test, []), (self.data_test, []), ( 387 self.crash_check_test, []), (change_env_func, [])]) 388 result_message = "%s" % dict(self.result_info) 389 self.log.info(result_message) 390 if all(results): 391 explicit_pass(result_message) 392 else: 393 fail(result_message) 394 395 """ Tests Begin """ 396 397 @test_tracker_info(uuid="6fcba97c-3572-47d7-bcac-9608f1aa5304") 398 @TelephonyBaseTest.tel_test_wrap 399 def test_volte_wfc_wifi_preferred_parallel_stress(self): 400 return self.parallel_tests( 401 self.environment_change_4g_wifi, 402 setup_func=self._setup_volte_wfc_wifi_preferred) 403 404 @test_tracker_info(uuid="df78a9a8-2a14-40bf-a7aa-719502f975be") 405 @TelephonyBaseTest.tel_test_wrap 406 def test_volte_wfc_cell_preferred_parallel_stress(self): 407 return self.parallel_tests( 408 self.environment_change_4g_wifi, 409 setup_func=self._setup_volte_wfc_cell_preferred) 410 411 @test_tracker_info(uuid="4cb47315-c420-44c2-ac47-a8bdca6d0e25") 412 @TelephonyBaseTest.tel_test_wrap 413 def test_csfb_wfc_wifi_preferred_parallel_stress(self): 414 return self.parallel_tests( 415 self.environment_change_4g_wifi, 416 setup_func=self._setup_csfb_wfc_wifi_preferred) 417 418 @test_tracker_info(uuid="92821ef7-542a-4139-b3b0-22278e2b06c4") 419 @TelephonyBaseTest.tel_test_wrap 420 def test_csfb_wfc_cell_preferred_parallel_stress(self): 421 return self.parallel_tests( 422 self.self.environment_change_4g_wifi, 423 setup_func=self._setup_csfb_wfc_cell_preferred) 424 425 @test_tracker_info(uuid="dd23923e-ebbc-461e-950a-0657e845eacf") 426 @TelephonyBaseTest.tel_test_wrap 427 def test_4g_volte_3g_parallel_stress(self): 428 return self.parallel_tests( 429 self.environment_change_4g_3g, 430 setup_func=self._setup_volte_wfc_disabled) 431 432 @test_tracker_info(uuid="faef9384-a5b0-4640-8cfa-f9f34ce6d977") 433 @TelephonyBaseTest.tel_test_wrap 434 def test_4g_csfb_3g_parallel_stress(self): 435 return self.parallel_tests( 436 self.environment_change_4g_3g, 437 setup_func=self._setup_csfb_wfc_disabled) 438 439 """ Tests End """ 440