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