1#!/usr/bin/env python3.4
2
3import queue
4import time
5
6import acts.base_test
7import acts.test_utils.wifi.wifi_test_utils as wifi_utils
8import acts.test_utils.tel.tel_test_utils as tele_utils
9import acts.utils
10
11from acts import asserts
12from acts import signals
13from acts.test_decorators import test_tracker_info
14from acts.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
15from acts.test_utils.tel.tel_voice_utils import phone_setup_voice_general
16from acts.test_utils.tel.tel_voice_utils import two_phone_call_short_seq
17
18WifiEnums = wifi_utils.WifiEnums
19
20ATTENUATORS = "attenuators"
21WIFI_SSID = "wifi_network_ssid"
22WIFI_PWD = "wifi_network_pass"
23STRESS_COUNT = "stress_iteration"
24
25class WifiTeleCoexTest(TelephonyBaseTest):
26    """Tests for WiFi, Celular Co-existance."""
27
28
29    def setup_class(self):
30        TelephonyBaseTest.setup_class(self)
31
32        self.dut = self.android_devices[0]
33        wifi_utils.wifi_test_device_init(self.dut)
34        # Set attenuation to 0 on all channels.
35        if getattr(self, ATTENUATORS, []):
36            for a in self.attenuators:
37                a.set_atten(0)
38        self.ads = self.android_devices
39        self.dut = self.android_devices[0]
40        self.wifi_network_ssid = self.user_params.get(WIFI_SSID)
41        self.wifi_network_pass = self.user_params.get(WIFI_PWD)
42        self.network = { WifiEnums.SSID_KEY : self.wifi_network_ssid,
43                         WifiEnums.PWD_KEY : self.wifi_network_pass
44                       }
45        self.stress_count = self.user_params.get(STRESS_COUNT)
46
47
48    def setup_test(self):
49        wifi_utils.wifi_toggle_state(self.dut, True)
50
51
52    def teardown_test(self):
53        wifi_utils.reset_wifi(self.dut)
54
55
56    """Helper Functions"""
57
58
59    def connect_to_wifi(self, ad, network):
60        """Connection logic for open and psk wifi networks.
61
62        Args:
63            ad: Android device object.
64            network: A JSON dict of the WiFi network configuration.
65
66        """
67        ad.ed.clear_all_events()
68        wifi_utils.start_wifi_connection_scan(ad)
69        scan_results = ad.droid.wifiGetScanResults()
70        wifi_utils.assert_network_in_list({WifiEnums.SSID_KEY:
71                self.wifi_network_ssid}, scan_results)
72        wifi_utils.wifi_connect(ad, network)
73        self.log.debug("Connected to %s network on %s device" % (
74                network[WifiEnums.SSID_KEY], ad.serial))
75
76
77    def stress_toggle_wifi(self, stress_count):
78        """Toggle WiFi in a loop.
79
80        Args:
81            stress_count: Number of times to toggle WiFi OFF and ON.
82
83        """
84        for count in range(stress_count):
85            self.log.debug("stress_toggle_wifi: Iteration %d" % count)
86            wifi_utils.toggle_wifi_off_and_on(self.dut)
87
88        if not self.dut.droid.wifiGetisWifiEnabled():
89            raise signals.TestFailure("WiFi did not turn on after toggling it"
90                                      " %d times" % self.stress_count)
91
92
93    def stress_toggle_airplane(self, stress_count):
94        """Toggle Airplane mode in a loop.
95
96        Args:
97            stress_count: Number of times to toggle Airplane mode OFF and ON.
98
99        """
100        for count in range(stress_count):
101            self.log.debug("stress_toggle_airplane: Iteration %d" % count)
102            wifi_utils.toggle_airplane_mode_on_and_off(self.dut)
103
104        if not self.dut.droid.wifiGetisWifiEnabled():
105            raise signals.TestFailure("WiFi did not turn on after toggling it"
106                                      " %d times" % self.stress_count)
107
108
109    def stress_toggle_airplane_and_wifi(self, stress_count):
110        """Toggle Airplane and WiFi modes in a loop.
111
112        Args:
113            stress_count: Number of times to perform Airplane mode ON, WiFi ON,
114                          Airplane mode OFF, in a sequence.
115
116        """
117        for count in range(stress_count):
118            self.log.debug("stress_toggle_airplane_and_wifi: Iteration %d" % count)
119            self.log.debug("Toggling Airplane mode ON")
120            asserts.assert_true(
121                acts.utils.force_airplane_mode(self.dut, True),
122                "Can not turn on airplane mode on: %s" % self.dut.serial)
123            # Sleep for atleast 500ms so that, call to enable wifi is not deferred.
124            time.sleep(1)
125            self.log.debug("Toggling wifi ON")
126            wifi_utils.wifi_toggle_state(self.dut, True)
127            # Sleep for 1s before getting new WiFi state.
128            time.sleep(1)
129            if not self.dut.droid.wifiGetisWifiEnabled():
130                raise signals.TestFailure("WiFi did not turn on after turning ON"
131                    " Airplane mode")
132            asserts.assert_true(
133                acts.utils.force_airplane_mode(self.dut, False),
134                "Can not turn on airplane mode on: %s" % self.dut.serial)
135
136        if not self.dut.droid.wifiGetisWifiEnabled():
137            raise signals.TestFailure("WiFi did not turn on after toggling it"
138                                      " %d times" % self.stress_count)
139
140
141    def setup_cellular_voice_calling(self):
142        """Setup phone for voice general calling and make sure phone is
143           attached to voice."""
144        # Make sure Phone A and B are attached to voice network.
145        for ad in self.ads:
146            if not phone_setup_voice_general(self.log, ad):
147                raise signals.TestFailure("Phone failed to setup for voice"
148                                          " calling serial:%s" % ad.serial)
149        self.log.debug("Finished setting up phones for voice calling")
150
151
152    def validate_cellular_and_wifi(self):
153        """Validate WiFi, make some cellular calls.
154
155        Steps:
156            1. Check if device is still connected to the WiFi network.
157            2. If WiFi looks good, check if deivce is attached to voice.
158            3. Make a short sequence voice call between Phone A and B.
159
160        """
161        # Sleep for 30s before getting new WiFi state.
162        time.sleep(30)
163        wifi_info = self.dut.droid.wifiGetConnectionInfo()
164        if wifi_info[WifiEnums.SSID_KEY] != self.wifi_network_ssid:
165            raise signals.TestFailure("Phone failed to connect to %s network on"
166                                      " %s" % (self.wifi_network_ssid,
167                                      self.dut.serial))
168
169        # Make short call sequence between Phone A and Phone B.
170        two_phone_call_short_seq(self.log, self.ads[0], None, None, self.ads[1],
171                                 None, None)
172
173    """Tests"""
174
175
176    @test_tracker_info(uuid="8b9b6fb9-964b-43e7-b75f-675774ee346f")
177    @TelephonyBaseTest.tel_test_wrap
178    def test_toggle_wifi_call(self):
179        """Test to toggle WiFi and then perform WiFi connection and
180           cellular calls.
181
182        Steps:
183            1. Attach device to voice subscription network.
184            2. Connect to a WiFi network.
185            3. Toggle WiFi OFF and ON.
186            4. Verify device auto-connects to the WiFi network.
187            5. Verify device is attached to voice network.
188            6. Make short sequence voice calls.
189
190        """
191        self.setup_cellular_voice_calling()
192        self.connect_to_wifi(self.dut, self.network)
193        wifi_utils.toggle_wifi_off_and_on(self.dut)
194        self.validate_cellular_and_wifi()
195        return True
196
197
198    @test_tracker_info(uuid="caf22447-6354-4a2e-99e5-0ff235fc8f20")
199    @TelephonyBaseTest.tel_test_wrap
200    def test_toggle_airplane_call(self):
201        """Test to toggle Airplane mode and perform WiFi connection and
202           cellular calls.
203
204        Steps:
205            1. Attach device to voice subscription network.
206            2. Connect to a WiFi network.
207            3. Toggle Airplane mode OFF and ON.
208            4. Verify device auto-connects to the WiFi network.
209            5. Verify device is attached to voice network.
210            6. Make short sequence voice calls.
211
212        """
213        self.setup_cellular_voice_calling()
214        self.connect_to_wifi(self.dut, self.network)
215        wifi_utils.toggle_airplane_mode_on_and_off(self.dut)
216        self.validate_cellular_and_wifi()
217        return True
218
219
220    @test_tracker_info(uuid="dd888b35-f820-409a-89af-4b0f6551e4d6")
221    @TelephonyBaseTest.tel_test_wrap
222    def test_toggle_airplane_and_wifi_call(self):
223        """Test to toggle WiFi in a loop and perform WiFi connection and
224           cellular calls.
225
226        Steps:
227            1. Attach device to voice subscription network.
228            2. Connect to a WiFi network.
229            3. Toggle Airplane mode ON.
230            4. Turn WiFi ON.
231            5. Toggle Airplane mode OFF.
232            3. Verify device auto-connects to the WiFi network.
233            4. Verify device is attached to voice network.
234            5. Make short sequence voice calls.
235
236        """
237        self.setup_cellular_voice_calling()
238        self.connect_to_wifi(self.dut, self.network)
239        self.stress_toggle_airplane_and_wifi(1)
240        self.validate_cellular_and_wifi()
241        return True
242
243
244    @test_tracker_info(uuid="15db5b7e-827e-4bc8-8e77-7fcce343a323")
245    @TelephonyBaseTest.tel_test_wrap
246    def test_stress_toggle_wifi_call(self):
247        """Stress test to toggle WiFi in a loop, then perform WiFi connection
248           and cellular calls.
249
250        Steps:
251            1. Attach device to voice subscription network.
252            2. Connect to a WiFi network.
253            3. Toggle WiFi OFF and ON in a loop.
254            4. Verify device auto-connects to the WiFi network.
255            5. Verify device is attached to voice network.
256            6. Make short sequence voice calls.
257
258        """
259        self.setup_cellular_voice_calling()
260        self.connect_to_wifi(self.dut, self.network)
261        self.stress_toggle_wifi(self.stress_count)
262        self.validate_cellular_and_wifi()
263        return True
264
265
266    @test_tracker_info(uuid="80a2f1bf-5e41-453a-9b8e-be3b41d4d313")
267    @TelephonyBaseTest.tel_test_wrap
268    def test_stress_toggle_airplane_call(self):
269        """Stress test to toggle Airplane mode in a loop, then perform WiFi and
270           cellular calls.
271
272        Steps:
273            1. Attach device to voice subscription network.
274            2. Connect to a WiFi network.
275            3. Toggle Airplane mode OFF and ON in a loop.
276            4. Verify device auto-connects to the WiFi network.
277            5. Verify device is attached to voice network.
278            6. Make short sequence voice calls.
279
280        """
281        self.setup_cellular_voice_calling()
282        self.connect_to_wifi(self.dut, self.network)
283        self.stress_toggle_airplane(self.stress_count)
284        self.validate_cellular_and_wifi()
285        return True
286
287
288    @test_tracker_info(uuid="b88ad3e7-6462-4280-ad57-22d0ac91fdd8")
289    @TelephonyBaseTest.tel_test_wrap
290    def test_stress_toggle_airplane_and_wifi_call(self):
291        """Stress test to toggle Airplane and WiFi mode in a loop, then perform
292           WiFi connection and cellular calls.
293
294        Steps:
295            1. Attach device to voice subscription network.
296            2. Connect to a WiFi network.
297            3. Toggle Airplane mode ON.
298            4. Turn WiFi ON.
299            5. Toggle Airplane mode OFF.
300            6. Repeat 3, 4 & 5, in a loop.
301            7. Verify device auto-connects to the WiFi network.
302            8. Verify device is attached to voice network.
303            9. Make short sequence voice calls.
304
305        """
306        self.setup_cellular_voice_calling()
307        self.connect_to_wifi(self.dut, self.network)
308        self.stress_toggle_airplane_and_wifi(self.stress_count)
309        self.validate_cellular_and_wifi()
310        return True
311