1#!/usr/bin/env python3
2#
3#   Copyright 2021 - The Android Open Source Project
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
18import time
19import datetime
20import logging
21
22from acts import asserts
23from acts.test_decorators import test_info
24from acts.test_decorators import test_tracker_info
25
26from acts.base_test import BaseTestClass
27from acts_contrib.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
28from acts_contrib.test_utils.tel.GFTInOutBaseTest import GFTInOutBaseTest
29
30from acts_contrib.test_utils.tel.tel_test_utils import get_service_state_by_adb
31from acts_contrib.test_utils.tel.tel_test_utils import multithread_func
32from acts_contrib.test_utils.tel.tel_test_utils import run_multithread_func
33from acts_contrib.test_utils.tel.tel_test_utils import ensure_wifi_connected
34from acts_contrib.test_utils.tel.tel_test_utils import get_screen_shot_log
35from acts_contrib.test_utils.tel.tel_test_utils import get_screen_shot_logs
36from acts_contrib.test_utils.tel.tel_test_utils import log_screen_shot
37from acts_contrib.test_utils.tel.tel_test_utils import hangup_call
38from acts_contrib.test_utils.tel.tel_test_utils import active_file_download_test
39
40from acts_contrib.test_utils.tel.tel_data_utils import wait_for_cell_data_connection
41from acts_contrib.test_utils.tel.gft_inout_utils import check_no_service_time
42from acts_contrib.test_utils.tel.gft_inout_utils import check_back_to_service_time
43from acts_contrib.test_utils.tel.gft_inout_utils import mo_voice_call
44from acts_contrib.test_utils.tel.gft_inout_utils import get_voice_call_type
45
46from acts_contrib.test_utils.tel.tel_defines import DATA_STATE_CONNECTED
47from acts_contrib.test_utils.tel.tel_defines import DATA_STATE_DISCONNECTED
48from acts_contrib.test_utils.tel.tel_defines import SERVICE_STATE_EMERGENCY_ONLY
49from acts_contrib.test_utils.tel.tel_defines import SERVICE_STATE_IN_SERVICE
50from acts_contrib.test_utils.tel.tel_defines import SERVICE_STATE_UNKNOWN
51from acts_contrib.test_utils.tel.tel_defines import SERVICE_STATE_OUT_OF_SERVICE
52from acts_contrib.test_utils.tel.tel_defines import SERVICE_STATE_POWER_OFF
53
54from acts_contrib.test_utils.tel.gft_inout_defines import VOICE_CALL
55from acts_contrib.test_utils.tel.gft_inout_defines import VOLTE_CALL
56from acts_contrib.test_utils.tel.gft_inout_defines import CSFB_CALL
57from acts_contrib.test_utils.tel.gft_inout_defines import WFC_CALL
58from acts_contrib.test_utils.tel.gft_inout_defines import NO_SERVICE_POWER_LEVEL
59from acts_contrib.test_utils.tel.gft_inout_defines import IN_SERVICE_POWER_LEVEL
60from acts_contrib.test_utils.tel.gft_inout_defines import NO_SERVICE_AREA
61from acts_contrib.test_utils.tel.gft_inout_defines import IN_SERVICE_AREA
62from acts_contrib.test_utils.tel.gft_inout_defines import WIFI_AREA
63from acts_contrib.test_utils.tel.gft_inout_defines import NO_WIFI_AREA
64from acts_contrib.test_utils.tel.gft_inout_defines import NO_SERVICE_TIME
65from acts_contrib.test_utils.tel.gft_inout_defines import WAIT_FOR_SERVICE_TIME
66
67
68IDLE_CASE = 1
69DATA_TRANSFER_CASE = 2
70PDP_OFF_CASE = 3
71IN_CALL_CASE = 4
72CALL_DATA_CASE = 5
73
74class TelLabGFTInOutServiceTest(GFTInOutBaseTest):
75    def __init__(self, controllers):
76        GFTInOutBaseTest.__init__(self, controllers)
77        self.my_error_msg = ""
78
79    def setup_test(self):
80        self.adjust_cellular_signal(IN_SERVICE_POWER_LEVEL)
81        self.adjust_wifi_signal(IN_SERVICE_POWER_LEVEL)
82        GFTInOutBaseTest.setup_test(self)
83        self.check_network()
84        self.my_error_msg = ""
85
86
87    @test_tracker_info(uuid="c602e556-8273-4c75-b8fa-4d51ba514654")
88    @TelephonyBaseTest.tel_test_wrap
89    def test_in_out_no_service_idle_1min(self, idle_time=60):
90        """ UE is in idle
91            Move UE from coverage area to no service area and UE shows no service
92            Wait for 1 min, then re-enter coverage area
93
94            Args:
95                idle_time: idle time in service area
96
97            Returns:
98                True if pass; False if fail.
99        """
100        return self._test_in_out_service_idle(idle_time)
101
102    @test_tracker_info(uuid="c602e556-8273-4c75-b8fa-4d51ba514654")
103    @TelephonyBaseTest.tel_test_wrap
104    def test_in_out_no_service_idle_2min(self, idle_time=120):
105        """ UE is in idle
106            Move UE from coverage area to no service area and UE shows no service
107            Wait for 2 min, then re-enter coverage area
108
109            Args:
110                idle_time: idle time in service area
111
112            Returns:
113                True if pass; False if fail.
114        """
115        return self._test_in_out_service_idle(idle_time)
116
117
118    @test_tracker_info(uuid="1d437482-caff-4695-9f3f-f3daf6793540")
119    @TelephonyBaseTest.tel_test_wrap
120    def test_in_out_no_service_idle_5min(self, idle_time=300):
121        """ UE is in idle
122            Move UE from coverage area to no service area and UE shows no service
123            Wait for 5 min, then re-enter coverage area
124
125            Args:
126                loop: cycle
127                idle_time: idle time in service area
128
129            Returns:
130                True if pass; False if fail.
131        """
132        return self._test_in_out_service_idle(idle_time)
133
134    @test_tracker_info(uuid="339b4bf5-57a1-48f0-b26a-83a7db21b08b")
135    @TelephonyBaseTest.tel_test_wrap
136    def test_in_out_no_service_idle_10min(self, idle_time=600):
137        """ UE is in idle
138            Move UE from coverage area to no service area and UE shows no service
139            Wait for 10 min, then re-enter coverage area
140
141            Args:
142                loop: cycle
143                idle_time: idle time in service area
144
145            Returns:
146                True if pass; False if fail.
147        """
148        return self._test_in_out_service_idle(idle_time)
149
150
151    @test_tracker_info(uuid="65ebac02-8d5a-48c2-bd26-6d931d6048f1")
152    @TelephonyBaseTest.tel_test_wrap
153    def test_in_out_no_service_data_transfer_1min(self, idle_time=60):
154        """ In/Out service - Stationary data transfer - 1 min
155            UE is performing data transfer (E.g. Use FTP or browse tools)
156            move UE from coverage area to no service area and UE shows no service
157            Wait for 1 min, then re-enter coverage area
158
159            Args:
160                idle_time: idle time in service area
161
162            Returns:
163                True if pass; False if fail.
164        """
165        return self._test_in_out_service_idle(idle_time, DATA_TRANSFER_CASE)
166
167
168    @test_tracker_info(uuid="ec3e7de4-bcf6-4a8a-ae04-868bd7925191")
169    @TelephonyBaseTest.tel_test_wrap
170    def test_in_out_no_service_data_transfer_2min(self, idle_time=120):
171        """ In/Out service - Stationary data transfer - 2 min
172
173            Args:
174                idle_time: idle time in service area
175
176            Returns:
177                True if pass; False if fail.
178        """
179        return self._test_in_out_service_idle(idle_time, DATA_TRANSFER_CASE)
180
181
182    @test_tracker_info(uuid="8bd7017d-0a88-4423-a94b-1e37060bba1d")
183    @TelephonyBaseTest.tel_test_wrap
184    def test_in_out_no_service_data_transfer_5min(self, idle_time=300):
185        """ In/Out service - Stationary data transfer - 5 min
186
187            Args:
188                idle_time: idle time in service area
189
190            Returns:
191                True if pass; False if fail.
192        """
193        return self._test_in_out_service_idle(idle_time, DATA_TRANSFER_CASE)
194
195
196    @test_tracker_info(uuid="c3b9c52d-41d3-449c-99ff-4bb830ca0219")
197    @TelephonyBaseTest.tel_test_wrap
198    def test_in_out_no_service_data_transfer_10min(self, idle_time=600):
199        """ In/Out service - Stationary data transfer - 10 min
200
201            Args:
202                idle_time: idle time in service area
203                file_name: download filename
204
205            Returns:
206                True if pass; False if fail.
207        """
208        return self._test_in_out_service_idle(idle_time, DATA_TRANSFER_CASE)
209
210
211    @test_tracker_info(uuid="86a6b3b3-e754-4bde-b418-d4273b1ad907")
212    @TelephonyBaseTest.tel_test_wrap
213    def test_in_out_service_incall_1min(self, idle_time=60):
214        """ In/Out service - Stationary incall - 1 min
215
216            Args:
217                idle_time: idle time in service area
218
219            Returns:
220                True if pass; False if fail.
221        """
222        return self._test_in_out_service_idle(idle_time, IN_CALL_CASE)
223
224
225    @test_tracker_info(uuid="0f8772cd-6f86-48eb-b583-4cbaf80a21a9")
226    @TelephonyBaseTest.tel_test_wrap
227    def test_in_out_service_incall_2min(self, idle_time=120):
228        """ In/Out service - Stationary incall - 2 min
229
230            Args:
231                idle_time: idle time in service area
232
233            Returns:
234                True if pass; False if fail.
235        """
236        return self._test_in_out_service_idle(idle_time, IN_CALL_CASE)
237
238
239    @test_tracker_info(uuid="11f24c0f-db33-4eb3-b847-9aed447eb820")
240    @TelephonyBaseTest.tel_test_wrap
241    def test_in_out_service_incall_5min(self, idle_time=300):
242        """ In/Out service - Stationary incall - 5 min
243
244            Args:
245                idle_time: idle time in service area
246
247            Returns:
248                True if pass; False if fail.
249        """
250        return self._test_in_out_service_idle(idle_time, IN_CALL_CASE)
251
252
253    @test_tracker_info(uuid="e318921b-de6b-428b-b2c4-3db7786d7558")
254    @TelephonyBaseTest.tel_test_wrap
255    def test_in_out_service_incall_10min(self, idle_time=600):
256        """ In/Out service - Stationary incall - 10 min
257
258            Args:
259                idle_time: idle time in service area
260
261            Returns:
262                True if pass; False if fail.
263        """
264        return self._test_in_out_service_idle(idle_time, IN_CALL_CASE)
265
266
267    @test_tracker_info(uuid="f6cf0019-e123-4ebd-990b-0fa5b236840c")
268    @TelephonyBaseTest.tel_test_wrap
269    def test_in_out_service_call_date_1min(self, idle_time=60):
270        """ In/Out service - Stationary incall + data transfer - 1 mins
271
272            Args:
273                idle_time: idle time in service area
274
275            Returns:
276                True if pass; False if fail.
277        """
278        return self._test_in_out_service_idle(idle_time, CALL_DATA_CASE)
279
280
281    @test_tracker_info(uuid="2f49a9de-0383-4ec6-a8ee-c62f52ea0cf2")
282    @TelephonyBaseTest.tel_test_wrap
283    def test_in_out_service_call_date_2min(self, idle_time=120):
284        """ In/Out service - Stationary incall + data transfer - 2 mins
285
286            Args:
287                idle_time: idle time in service area
288
289            Returns:
290                True if pass; False if fail.
291        """
292        return self._test_in_out_service_idle(idle_time, CALL_DATA_CASE)
293
294
295    @test_tracker_info(uuid="73a6eedb-791f-4486-b815-8067a95efd5c")
296    @TelephonyBaseTest.tel_test_wrap
297    def test_in_out_service_call_date_5min(self, idle_time=300):
298        """ In/Out service - Stationary incall + data transfer - 5 mins
299
300            Args:
301                idle_time: idle time in service area
302
303            Returns:
304                True if pass; False if fail.
305        """
306        return self._test_in_out_service_idle(idle_time, CALL_DATA_CASE)
307
308    @test_tracker_info(uuid="5cfbc90a-97e1-43e9-a69e-4ce2815c544d")
309    @TelephonyBaseTest.tel_test_wrap
310    def test_in_out_service_call_date_10min(self, idle_time=600):
311        """ In/Out service - Stationary incall + data transfer - 10 mins
312
313            Args:
314                idle_time: idle time in service area
315
316            Returns:
317                True if pass; False if fail.
318        """
319        return self._test_in_out_service_idle(idle_time, CALL_DATA_CASE)
320
321
322
323    @test_tracker_info(uuid="c70180c9-5a36-4dc5-9ccc-3e6c0b5e6d37")
324    @TelephonyBaseTest.tel_test_wrap
325    def test_in_out_service_pdp_off_1min(self, idle_time=60):
326        """ In/Out service - Stationary data off - 1 min
327            Disable UE mobile data
328            Move UE from coverage area to no service area and UE shows no service
329            Wait for 1 min, then re-enter coverage area
330
331            Args:
332                idle_time: idle time in service area
333
334            Returns:
335                True if pass; False if fail.
336        """
337        return self._test_in_out_service_idle(idle_time, PDP_OFF_CASE)
338
339
340    @test_tracker_info(uuid="50cc8e73-d96f-45a6-91cd-bf51de5241d2")
341    @TelephonyBaseTest.tel_test_wrap
342    def test_in_out_service_pdp_off_2min(self, idle_time=120):
343        """ In/Out service - Stationary data off - 2 min
344
345            Args:
346                idle_time: idle time in service area
347
348            Returns:
349                True if pass; False if fail.
350        """
351        return self._test_in_out_service_idle(idle_time, PDP_OFF_CASE)
352
353
354    @test_tracker_info(uuid="1f25d40c-1bfe-4d18-b57c-d7be69664f0d")
355    @TelephonyBaseTest.tel_test_wrap
356    def test_in_out_service_pdp_off_5min(self, idle_time=300):
357        """ In/Out service - Stationary data off - 5 min
358
359            Args:
360                idle_time: idle time in service area
361
362            Returns:
363                True if pass; False if fail.
364        """
365        return self._test_in_out_service_idle(idle_time, PDP_OFF_CASE)
366
367
368    @test_tracker_info(uuid="b076b0d0-a105-4be9-aa0b-db0d782f70f2")
369    @TelephonyBaseTest.tel_test_wrap
370    def test_in_out_service_pdp_off_10min(self, idle_time=600):
371        """ In/Out service - Stationary data off - 10 min
372
373            Args:
374                idle_time: idle time in service area
375
376            Returns:
377                True if pass; False if fail.
378        """
379        return self._test_in_out_service_idle(idle_time, PDP_OFF_CASE)
380
381
382
383    def _test_in_out_service_idle(self, idle_time, case= IDLE_CASE, loop=1):
384        """ UE is in idle
385            Move UE from coverage area to no service area and UE shows no service
386            Args:
387                idle_time: idle time in service area
388                case: include IDLE_CAS, DATA_TRANSFER_CASE, PDP_OFF_CASE,
389                    IN_CALL_CASE, CALL_DATA_CASE
390                loop: cycle
391            Returns:
392                True if pass; False if fail.
393        """
394        test_result = True
395        if 'autoio_cycle' in self.user_params:
396            loop = self.user_params.get('autoio_cycle')
397
398        for x in range (loop):
399            self.log.info("%s loop: %s/%s" %(self.current_test_name,x+1, loop))
400            if case == IDLE_CASE:
401                if not self._in_out_service_idle_only(idle_time):
402                    test_result = False
403            elif case == DATA_TRANSFER_CASE:
404                if not self._data_transfer_mode(idle_time):
405                    test_result = False
406            elif case == PDP_OFF_CASE:
407                if not self._in_out_service_pdp_off(idle_time):
408                    test_result = False
409            elif case == IN_CALL_CASE:
410                if not self._in_call_in_out_service(idle_time):
411                    test_result = False
412            elif case == CALL_DATA_CASE:
413                if not self._call_data_in_out_service(idle_time):
414                    test_result = False
415            asserts.assert_true(test_result, "Fail: %s." %(self.my_error_msg),
416                extras={"failure_cause": self.my_error_msg})
417        return test_result
418
419
420    def _in_out_service_idle_only(self, no_service_time=60, check_back_to_service=True,
421        check_no_service=True):
422        """ Move UE from coverage area to no service area and UE shows no service
423            Wait for no_service_time sec , then re-enter coverage area
424
425            Args:
426                no_service_time: stay at no service area time in sec
427                check_back_to_service: check device is back to service flag
428                check_no_service: check device is no service flag
429
430            Returns:
431                True if pass; False if fail.
432        """
433        test_result = True
434        error_msg = ""
435        for ad in self.android_devices:
436            network_type = ad.droid.telephonyGetNetworkType()
437            service_state = get_service_state_by_adb(self.log,ad)
438            ad.log.info("service_state=%s. network_type=%s"
439                %(service_state ,network_type))
440            if service_state != SERVICE_STATE_IN_SERVICE:
441                error_msg = "Device is not ready for test. Service_state=%s." %(service_state)
442                ad.log.info("Device is not ready for test. Service_state=%s." %(service_state))
443                self.my_error_msg += error_msg
444                return False
445
446        self.log.info("Move UE from coverage area to no service area")
447        self.adjust_cellular_signal(NO_SERVICE_POWER_LEVEL)
448
449        if check_no_service:
450            tasks = [(check_no_service_time, (ad, )) for ad in self.android_devices]
451            if not multithread_func(self.log, tasks):
452                self.check_network()
453                error_msg = "Device does not become no service"
454                self.my_error_msg += error_msg
455                self.log.info(error_msg)
456                return False
457            else:
458                self.log.info("wait for %s sec in no/limited service area" %(no_service_time))
459                time.sleep(no_service_time)
460        self.log.info("Move UE back to service area")
461        self.adjust_cellular_signal(IN_SERVICE_POWER_LEVEL)
462        if check_back_to_service:
463            test_result = self._check_after_no_service()
464        return test_result
465
466    def _data_transfer_mode(self, idle_time, file_name="10MB"):
467        """ Download file and in/out service
468
469            Args:
470                idle_time: stay at no service area time in sec
471                file_name: file to be download
472
473            Returns:
474                True if pass; False if fail.
475        """
476        error_msg =""
477        tasks_a = [(self._in_out_service_idle_only, (idle_time, False,))]
478        tasks_b = [(active_file_download_test, (self.log, ad, file_name))
479            for ad in self.android_devices]
480        tasks_b.extend(tasks_a)
481        if not multithread_func(self.log, tasks_b):
482            error_msg = " data transfer fail. "
483            self.my_error_msg +=  error_msg
484            self.log.info(error_msg)
485            return False
486        return self._check_after_no_service()
487
488    def _in_out_service_pdp_off(self, idle_time):
489        """ UE is in idle
490            Disable UE mobile data
491            Move UE from coverage area to no/limited service area
492            enable UE mobile data
493            After UE show no service, re-enter coverage area
494
495            Args:
496                idle_time: idle time in service area
497
498            Returns:
499                True if pass; False if fail.
500        """
501        error_msg =""
502        for ad in self.android_devices:
503            ad.log.info("Turn off mobile data")
504            ad.droid.telephonyToggleDataConnection(False)
505            if not wait_for_cell_data_connection(self.log, ad, False):
506                self.my_error_msg += "fail to turn off mobile data"
507                return False
508
509        if not self._in_out_service_idle_only(idle_time, False):
510            return False
511
512        for ad in self.android_devices:
513            ad.log.info("Turn on mobile data")
514            ad.droid.telephonyToggleDataConnection(True)
515            #If True, it will wait for status to be DATA_STATE_CONNECTED
516            if not wait_for_cell_data_connection(self.log, ad, True):
517                self.my_error_msg += "fail to turn on mobile data"
518                return False
519        return self._check_after_no_service()
520
521    def _in_call_in_out_service(self, idle_time):
522        """ UE is in call
523            Move UE from coverage area to no/limited service area
524            After UE show no service, re-enter coverage area
525
526            Args:
527                idle_time: idle time in service area
528
529            Returns:
530                True if pass; False if fail.
531        """
532        error_msg = ""
533        tasks = [(mo_voice_call, (self.log, ad, VOICE_CALL, False)) for ad in self.android_devices]
534        if not multithread_func(self.log, tasks):
535            error_msg = "MO voice call fail"
536            self.my_error_msg += error_msg
537            self.log.info(error_msg)
538            return False
539
540        if not self._in_out_service_idle_only(idle_time, False):
541            return False
542        return self._check_after_no_service()
543
544    def _call_data_in_out_service(self, idle_time):
545        """ UE is performing data transfer (E.g. Use FTP or browse tools)
546            UE makes a MO call
547            Move UE from coverage area to no/limited service area
548            After UE show no service, re-enter coverage area
549
550            Args:
551                idle_time: idle time in service area
552
553            Returns:
554                True if pass; False if fail.
555        """
556        tasks_a = [(active_file_download_test, (self.log, ad, )) for ad in self.android_devices]
557        tasks_b= [(mo_voice_call, (self.log, ad, VOICE_CALL, False)) for ad in self.android_devices]
558        tasks_b.extend(tasks_a)
559        if not multithread_func(self.log, tasks_b):
560            error_msg = "fail to perfrom data transfer/voice call"
561            self.my_error_msg += error_msg
562            return False
563
564        if not self._in_out_service_idle_only(idle_time, False):
565            return False
566        return self._check_after_no_service()
567
568    def _check_after_no_service(self):
569        """ check device is back to service or not
570
571            Returns:
572                True if pass; False if fail.
573        """
574        tasks = [(check_back_to_service_time, (ad,)) for ad in self.android_devices]
575        if not multithread_func(self.log, tasks):
576            error_msg = "Device is not back to the service"
577            self.my_error_msg += error_msg
578            self.log.info(error_msg)
579            return False
580        return True
581