• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python3.4
2#
3#   Copyright 2018 - 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
17import itertools
18import pprint
19import queue
20import time
21
22import acts.base_test
23import acts.signals as signals
24import acts.test_utils.wifi.wifi_test_utils as wutils
25import acts.utils
26
27from acts import asserts
28from acts.test_decorators import test_tracker_info
29from acts.test_utils.wifi.WifiBaseTest import WifiBaseTest
30
31WifiEnums = wutils.WifiEnums
32# Default timeout used for reboot, toggle WiFi and Airplane mode,
33# for the system to settle down after the operation.
34DEFAULT_TIMEOUT = 10
35WIFICOND_KILL_SHELL_COMMAND = "killall wificond"
36WIFI_VENDOR_HAL_KILL_SHELL_COMMAND = "killall android.hardware.wifi@1.0-service vendor.google.wifi_ext@1.0-service-vendor"
37SUPPLICANT_KILL_SHELL_COMMAND = "killall wpa_supplicant"
38
39class WifiCrashTest(WifiBaseTest):
40    """Crash Tests for wifi stack.
41
42    Test Bed Requirement:
43    * One Android device
44    * One Wi-Fi network visible to the device.
45    """
46
47    def __init__(self, controllers):
48        WifiBaseTest.__init__(self, controllers)
49
50    def setup_class(self):
51        self.dut = self.android_devices[0]
52        wutils.wifi_test_device_init(self.dut)
53        req_params = []
54        opt_param = ["reference_networks"]
55        self.unpack_userparams(
56            req_param_names=req_params, opt_param_names=opt_param)
57
58        if "AccessPoint" in self.user_params:
59            self.legacy_configure_ap_and_start()
60
61        asserts.assert_true(
62            len(self.reference_networks) > 0,
63            "Need at least one reference network with psk.")
64        self.network = self.reference_networks[0]["2g"]
65
66    def setup_test(self):
67        self.dut.droid.wakeLockAcquireBright()
68        self.dut.droid.wakeUpNow()
69        wutils.wifi_toggle_state(self.dut, True)
70
71    def teardown_test(self):
72        self.dut.droid.wakeLockRelease()
73        self.dut.droid.goToSleepNow()
74        wutils.reset_wifi(self.dut)
75
76    def on_fail(self, test_name, begin_time):
77        self.dut.take_bug_report(test_name, begin_time)
78        self.dut.cat_adb_log(test_name, begin_time)
79
80    def teardown_class(self):
81        if "AccessPoint" in self.user_params:
82            del self.user_params["reference_networks"]
83
84    """Helper Functions"""
85
86    """Tests"""
87    @test_tracker_info(uuid="b87fd23f-9bfc-406b-a5b2-17ce6be6c780")
88    def test_wifi_framework_crash_reconnect(self):
89        """Connect to a network, crash framework, then ensure
90        we connect back to the previously connected network.
91
92        Steps:
93        1. Connect to a network.
94        2. Restart framework.
95        3. Reconnect to the previous network.
96
97        """
98        wutils.wifi_connect(self.dut, self.network, num_of_tries=3)
99        # Restart framework
100        self.log.info("Crashing framework")
101        self.dut.restart_runtime()
102        # We won't get the disconnect broadcast because framework crashed.
103        # wutils.wait_for_disconnect(self.dut)
104        time.sleep(DEFAULT_TIMEOUT)
105        wifi_info = self.dut.droid.wifiGetConnectionInfo()
106        if wifi_info[WifiEnums.SSID_KEY] != self.network[WifiEnums.SSID_KEY]:
107            raise signals.TestFailure("Device did not connect to the"
108                                      " network after crashing framework.")
109
110    @test_tracker_info(uuid="33f9e4f6-29b8-4116-8f9b-5b13d93b4bcb")
111    def test_wifi_cond_crash_reconnect(self):
112        """Connect to a network, crash wificond, then ensure
113        we connect back to the previously connected network.
114
115        Steps:
116        1. Connect to a network.
117        2. Crash wificond.
118        3. Ensure we get a disconnect.
119        4. Ensure we reconnect to the previous network.
120
121        """
122        wutils.wifi_connect(self.dut, self.network, num_of_tries=3)
123        # Restart wificond
124        self.log.info("Crashing wificond")
125        self.dut.adb.shell(WIFICOND_KILL_SHELL_COMMAND)
126        wutils.wait_for_disconnect(self.dut)
127        time.sleep(DEFAULT_TIMEOUT)
128        wifi_info = self.dut.droid.wifiGetConnectionInfo()
129        if wifi_info[WifiEnums.SSID_KEY] != self.network[WifiEnums.SSID_KEY]:
130            raise signals.TestFailure("Device did not connect to the"
131                                      " network after crashing wificond.")
132
133    @test_tracker_info(uuid="463e3d7b-b0b7-4843-b83b-5613a71ae2ac")
134    def test_wifi_vendorhal_crash_reconnect(self):
135        """Connect to a network, crash wifi HAL, then ensure
136        we connect back to the previously connected network.
137
138        Steps:
139        1. Connect to a network.
140        2. Crash wifi HAL.
141        3. Ensure we get a disconnect.
142        4. Ensure we reconnect to the previous network.
143
144        """
145        wutils.wifi_connect(self.dut, self.network, num_of_tries=3)
146        # Restart wificond
147        self.log.info("Crashing wifi HAL")
148        self.dut.adb.shell(WIFI_VENDOR_HAL_KILL_SHELL_COMMAND)
149        wutils.wait_for_disconnect(self.dut)
150        time.sleep(DEFAULT_TIMEOUT)
151        wifi_info = self.dut.droid.wifiGetConnectionInfo()
152        if wifi_info[WifiEnums.SSID_KEY] != self.network[WifiEnums.SSID_KEY]:
153            raise signals.TestFailure("Device did not connect to the"
154                                      " network after crashing wifi HAL.")
155
156    @test_tracker_info(uuid="7c5cd1fc-8f8d-494c-beaf-4eb61b48917b")
157    def test_wpa_supplicant_crash_reconnect(self):
158        """Connect to a network, crash wpa_supplicant, then ensure
159        we connect back to the previously connected network.
160
161        Steps:
162        1. Connect to a network.
163        2. Crash wpa_supplicant.
164        3. Ensure we get a disconnect.
165        4. Ensure we reconnect to the previous network.
166
167        """
168        wutils.wifi_connect(self.dut, self.network, num_of_tries=3)
169        # Restart wificond
170        self.log.info("Crashing wpa_supplicant")
171        self.dut.adb.shell(SUPPLICANT_KILL_SHELL_COMMAND)
172        wutils.wait_for_disconnect(self.dut)
173        time.sleep(DEFAULT_TIMEOUT)
174        wifi_info = self.dut.droid.wifiGetConnectionInfo()
175        if wifi_info[WifiEnums.SSID_KEY] != self.network[WifiEnums.SSID_KEY]:
176            raise signals.TestFailure("Device did not connect to the"
177                                      " network after crashing wpa_supplicant.")
178