blob: 46bef206894b651c95589889c37d3e8a6c7cde44 [file] [log] [blame]
davinkao760fccd2020-02-12 13:00:11 +08001#!/usr/bin/env python3.4
2#
3# Copyright 2020 - 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 Factory Data Reset In Sanity
18"""
19
20import collections
21import time
22
23from acts import signals
24from acts.test_decorators import test_tracker_info
Xianyuan Jia24299b72020-10-21 13:52:47 -070025from acts_contrib.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
26from acts_contrib.test_utils.tel.tel_data_utils import wifi_tethering_setup_teardown
27from acts_contrib.test_utils.tel.tel_defines import CAPABILITY_VOLTE
28from acts_contrib.test_utils.tel.tel_defines import CAPABILITY_WFC
29from acts_contrib.test_utils.tel.tel_defines import CAPABILITY_OMADM
30from acts_contrib.test_utils.tel.tel_defines import MAX_WAIT_TIME_TETHERING_ENTITLEMENT_CHECK
31from acts_contrib.test_utils.tel.tel_defines import NETWORK_SERVICE_DATA
32from acts_contrib.test_utils.tel.tel_defines import GEN_4G
33from acts_contrib.test_utils.tel.tel_defines import TETHERING_MODE_WIFI
34from acts_contrib.test_utils.tel.tel_defines import WAIT_TIME_AFTER_FDR
35from acts_contrib.test_utils.tel.tel_test_utils import call_setup_teardown
36from acts_contrib.test_utils.tel.tel_test_utils import ensure_phone_subscription
37from acts_contrib.test_utils.tel.tel_test_utils import get_model_name
38from acts_contrib.test_utils.tel.tel_test_utils import get_outgoing_voice_sub_id
39from acts_contrib.test_utils.tel.tel_test_utils import is_droid_in_network_generation
40from acts_contrib.test_utils.tel.tel_test_utils import mms_send_receive_verify
41from acts_contrib.test_utils.tel.tel_test_utils import fastboot_wipe
42from acts_contrib.test_utils.tel.tel_test_utils import sms_send_receive_verify
43from acts_contrib.test_utils.tel.tel_test_utils import wait_for_network_generation
44from acts_contrib.test_utils.tel.tel_test_utils import verify_internet_connection
45from acts_contrib.test_utils.tel.tel_test_utils import wait_for_state
46from acts_contrib.test_utils.tel.tel_voice_utils import is_phone_in_call_3g
47from acts_contrib.test_utils.tel.tel_voice_utils import is_phone_in_call_csfb
48from acts_contrib.test_utils.tel.tel_voice_utils import is_phone_in_call_volte
49from acts_contrib.test_utils.tel.tel_voice_utils import phone_idle_volte
50from acts_contrib.test_utils.tel.tel_voice_utils import phone_setup_voice_3g
51from acts_contrib.test_utils.tel.tel_voice_utils import phone_setup_csfb
52from acts_contrib.test_utils.tel.tel_voice_utils import phone_setup_volte
davinkao760fccd2020-02-12 13:00:11 +080053
54from acts.utils import get_current_epoch_time
55from acts.utils import rand_ascii_str
56
57
58class TelLiveStressFdrTest(TelephonyBaseTest):
59 def setup_class(self):
60 TelephonyBaseTest.setup_class(self)
61
62 self.stress_test_number = int(
63 self.user_params.get("stress_test_number", 100))
64 self.skip_reset_between_cases = False
65
66 self.dut = self.android_devices[0]
67 if len(self.android_devices) > 1:
68 self.ad_reference = self.android_devices[1]
69 else:
70 raise signals.TestSkip("Single DUT is not supported")
71 self.user_params["check_crash"] = False
72 self.skip_reset_between_cases = False
73
74 # self.dut_capabilities = self.dut.telephony.get("capabilities", [])
75 sub_id = get_outgoing_voice_sub_id(self.dut)
76 self.dut_capabilities = self.dut.telephony["subscription"][sub_id].get("capabilities", [])
77 self.dut.log.info("dut_capabilitiese: %s", self.dut_capabilities)
78
79 self.dut_wfc_modes = self.dut.telephony.get("wfc_modes", [])
80 self.default_testing_func_names = []
81 for method in ("_check_volte", "_check_csfb",
82 "_check_tethering", "_check_3g"):
83 func = getattr(self, method)
84 try:
85 check_result = func()
86 except Exception as e:
87 self.dut.log.error("%s failed with %s", method, e)
88 check_result = False
89 self.dut.log.info("%s is %s before tests start", method,
90 check_result)
91 if check_result:
92 self.default_testing_func_names.append(method)
93 self.dut.log.info("To be tested: %s", self.default_testing_func_names)
94
95 def teardown_test(self):
96 self._set_volte_provisioning()
97
98 def feature_validator(self, *args):
99 failed_tests = []
100 for method in ("_check_subscription", "_check_data", "_check_mms_mt",
101 "_check_sms_mt", "_check_call_setup_teardown",
102 "_check_sms", "_check_mms"):
103 func = getattr(self, method)
104 if not func():
105 self.log.error("%s failed", method)
106 failed_tests.append(method)
107 for method in args:
108 func = getattr(self, method)
109 try:
110 func_result = func()
111 except Exception as e:
112 self.log.error("%s check failed with %s", method, e)
113 func_result = False
114 if not func_result:
115 self.log.error("%s failed", method)
116 failed_tests.append(method)
117 else:
118 self.log.info("%s succeeded", method)
119 if failed_tests:
120 self.log.error("%s failed", failed_tests)
121 return failed_tests
122
123 def _check_subscription(self):
124 if not ensure_phone_subscription(self.log, self.dut):
125 self.dut.log.error("Subscription check failed")
126 return False
127 else:
128 return True
129
130 def _check_volte_provisioning(self):
131 if CAPABILITY_OMADM in self.dut_capabilities:
132 if not wait_for_state(self.dut.droid.imsIsVolteProvisionedOnDevice,
133 True):
134 self.dut.log.error("VoLTE provisioning is disabled.")
135 return False
136 else:
137 self.dut.log.info("VoLTE provision is enabled")
138 return True
139 return True
140
141 def _set_volte_provisioning(self):
142 if CAPABILITY_OMADM in self.dut_capabilities:
143 provisioned = self.dut.droid.imsIsVolteProvisionedOnDevice()
144 if provisioned:
145 self.dut.log.info("Volte is provioned")
146 return
147 self.dut.log.info("VoLTE provisioning is not set, setting\
148 VoLTE provision")
149 self.dut.droid.imsSetVolteProvisioning(True)
150
151 def _check_call_setup_teardown(self):
152 if not call_setup_teardown(self.log, self.dut, self.ad_reference,
153 self.dut):
154 self.log.error("Phone call test failed.")
155 return False
156 return True
157
158 def _check_sms(self):
159 if not sms_send_receive_verify(self.log, self.dut, self.ad_reference,
160 [rand_ascii_str(180)]):
161 self.log.error("SMS send test failed")
162 return False
163 else:
164 self.log.info("SMS send test passed")
165 return True
166
167 def _check_mms(self):
168 message_array = [("Test Message", rand_ascii_str(180), None)]
169 if not mms_send_receive_verify(self.log, self.dut, self.ad_reference,
170 message_array):
171 self.log.error("MMS test sendfailed")
172 return False
173 else:
174 self.log.info("MMS send test passed")
175 return True
176
177 def _check_sms_mt(self):
178 if not sms_send_receive_verify(self.log, self.ad_reference, self.dut,
179 [rand_ascii_str(180)]):
180 self.log.error("SMS receive test failed")
181 return False
182 else:
183 self.log.info("SMS receive test passed")
184 return True
185
186 def _check_mms_mt(self):
187 message_array = [("Test Message", rand_ascii_str(180), None)]
188 if not mms_send_receive_verify(self.log, self.ad_reference, self.dut,
189 message_array):
190 self.log.error("MMS receive test failed")
191 return False
192 else:
193 self.log.info("MMS receive test passed")
194 return True
195
196 def _check_data(self):
197 if not verify_internet_connection(self.log, self.dut):
198 self.dut.log.error("Data connection is not available.")
199 return False
200 return True
201
202 def _check_lte_data(self):
203 if not is_droid_in_network_generation(self.log, self.dut, GEN_4G,
204 NETWORK_SERVICE_DATA):
205 self.dut.log.error("Data is not on 4G network")
206 return False
207 if not verify_internet_connection(self.log, self.dut):
208 self.log.error("Data not available on cell.")
209 return False
210 return True
211
212 def _check_volte(self):
213 if CAPABILITY_VOLTE in self.dut_capabilities:
214 self._set_volte_provisioning()
215 if not self._check_volte_provisioning():
216 return False
217 self.log.info("Check VoLTE")
218 if not wait_for_state(self.dut.droid.imsIsVolteProvisionedOnDevice,
219 True):
220 self.dut.log.error("VoLTE provisioning is disabled.")
221 return False
222 if not phone_setup_volte(self.log, self.dut):
223 self.log.error("Failed to setup VoLTE.")
224 return False
225 time.sleep(5)
226 if not call_setup_teardown(self.log, self.dut, self.ad_reference,
227 self.dut, is_phone_in_call_volte):
228 self.log.error("VoLTE Call Failed.")
229 return False
230 if not self._check_lte_data():
231 return False
232 else:
233 self.dut.log.info("VoLTE is not supported")
234 return False
235 return True
236
237 def _check_csfb(self):
238 if not phone_setup_csfb(self.log, self.dut):
239 self.log.error("Failed to setup CSFB.")
240 return False
241 if not call_setup_teardown(self.log, self.dut, self.ad_reference,
242 self.dut, is_phone_in_call_csfb):
243 self.dut.log.error("CSFB Call Failed.")
244 return False
245 if not wait_for_network_generation(
246 self.log, self.dut, GEN_4G,
247 voice_or_data=NETWORK_SERVICE_DATA):
248 self.dut.log.error("Data service failed to camp to 4G")
249 return False
250 if not verify_internet_connection(self.log, self.dut):
251 self.log.error("Data not available on cell.")
252 return False
253 return True
254
255 def _check_volte_enabled(self):
256 if phone_idle_volte(self.log, self.dut):
257 self.dut.log.info("VoLTE is enabled")
258 else:
259 self.dut.log.error("VoLTE is not enabled")
260 return False
261 if not call_setup_teardown(self.log, self.dut, self.ad_reference,
262 self.dut, is_phone_in_call_volte):
263 self.log.error("VoLTE Call Failed.")
264 return False
265 if not self._check_lte_data():
266 return False
267 return True
268
269 def _check_csfb_enabled(self):
270 if not call_setup_teardown(self.log, self.dut, self.ad_reference,
271 self.dut, is_phone_in_call_csfb):
272 self.log.error("CSFB Call Failed.")
273 return False
274 if not wait_for_network_generation(
275 self.log, self.dut, GEN_4G,
276 voice_or_data=NETWORK_SERVICE_DATA):
277 self.dut.log.error("Data service failed to camp to 4G")
278 return False
279 if not verify_internet_connection(self.log, self.dut):
280 self.log.error("Data not available on cell.")
281 return False
282 return True
283
284 def _check_3g(self):
285 self.log.info("Check 3G data and CS call")
286 if not phone_setup_voice_3g(self.log, self.dut):
287 self.log.error("Failed to setup 3G")
288 return False
289 if not verify_internet_connection(self.log, self.dut):
290 self.log.error("Data not available on cell.")
291 return False
292 if not call_setup_teardown(self.log, self.dut, self.ad_reference,
293 self.dut, is_phone_in_call_3g):
294 self.log.error("WFC Call Failed.")
295 return False
296 if not sms_send_receive_verify(self.log, self.dut, self.ad_reference,
297 [rand_ascii_str(50)]):
298 self.log.error("SMS failed in 3G")
299 return False
300 return True
301
302 def _check_tethering(self):
303 self.log.info("Check tethering")
304 for retries in range(3):
305 try:
306 if not self.dut.droid.carrierConfigIsTetheringModeAllowed(
307 TETHERING_MODE_WIFI,
308 MAX_WAIT_TIME_TETHERING_ENTITLEMENT_CHECK):
309 self.log.error("Tethering Entitlement check failed.")
310 if retries == 2: return False
311 time.sleep(10)
312 except Exception as e:
313 if retries == 2:
314 self.dut.log.error(e)
315 return False
316 time.sleep(10)
317 if not wifi_tethering_setup_teardown(
318 self.log,
319 self.dut, [self.ad_reference],
320 check_interval=5,
321 check_iteration=1):
322 self.log.error("Tethering check failed.")
323 return False
324 return True
325
326 def _fdr_stress_test(self, *args):
327 """Fdr Reliability Test
328
329 Arguments:
330 function_name: function to be checked
331
332 Expected Results:
333 No crash happens in stress test.
334
335 Returns:
336 True is pass, False if fail.
337 """
338 self.number_of_devices = 2
339 fail_count = collections.defaultdict(int)
340 test_result = True
341
342 for i in range(1, self.stress_test_number + 1):
343 begin_time = get_current_epoch_time()
344 test_name = "%s_iteration_%s" % (self.test_name, i)
345 log_msg = "[Test Case] %s" % test_name
346 self.log.info("%s begin", log_msg)
347 self.dut.droid.logI("%s begin" % log_msg)
348 test_msg = "FDR Stress Test %s Iteration <%s> / <%s>" % (
349 self.test_name, i, self.stress_test_number)
350 self.log.info(test_msg)
351 fastboot_wipe(self.dut)
352 self.log.info("%s wait %s secs for radio up.",
353 self.dut.serial, WAIT_TIME_AFTER_FDR)
354 time.sleep(WAIT_TIME_AFTER_FDR)
355 failed_tests = self.feature_validator(*args)
356 for test in failed_tests:
357 fail_count[test] += 1
358
359 crash_report = self.dut.check_crash_report(
360 "%s_%s" % (self.test_name, i),
361 begin_time,
362 log_crash_report=True)
363 if crash_report:
364 fail_count["crashes"] += 1
365 if failed_tests or crash_report:
366 self.log.error("%s FAIL with %s and crashes %s", test_msg,
367 failed_tests, crash_report)
368 self._take_bug_report(test_name, begin_time)
369 else:
370 self.log.info("%s PASS", test_msg)
371 self.log.info("Total failure count: %s", dict(fail_count))
372 self.log.info("%s end", log_msg)
373 self.dut.droid.logI("%s end" % log_msg)
374
375 for failure, count in fail_count.items():
376 if count:
377 self.log.error("%s failure count = %s in total %s iterations",
378 failure, count, self.stress_test_number)
379 test_result = False
380 return test_result
381
382
383 """ Tests Begin """
384
385
386 @test_tracker_info(uuid="a09a5d44-ffcc-4890-b0ba-a30a75e05fbd")
387 @TelephonyBaseTest.tel_test_wrap
388 def test_fdr_stress_volte(self):
389 """FDR with VoLTE Test
390
391 Steps:
392 1. Fdr DUT.
393 2. Wait for DUT to camp on LTE, Verify Data.
394 3. Check VoLTE is enabled by default, check IMS registration.
395 Wait for DUT report VoLTE enabled, make VoLTE call.
396 And verify VoLTE SMS. (if support VoLTE)
397 4. Check crashes.
398 5. Repeat Step 1~4 for N times.
399
400 Expected Results:
401 No crash happens in stress test.
402
403 Returns:
404 True is pass, False if fail.
405 """
406 if CAPABILITY_VOLTE not in self.dut_capabilities:
407 raise signals.TestSkip("VOLTE is not supported")
408 if not self._check_volte():
409 self.dut.log.error("VoLTE test failed before fdr test")
410 return False
411 func_names = ["_check_volte_enabled"]
412 return self._fdr_stress_test(*func_names)
413
414 """ Tests End """