1#!/usr/bin/env python3 2# 3# Copyright 2019 - 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 time 18 19from acts import asserts 20from acts.test_decorators import test_tracker_info 21from acts_contrib.test_utils.wifi.WifiBaseTest import WifiBaseTest 22import acts_contrib.test_utils.wifi.wifi_test_utils as wutils 23 24WifiEnums = wutils.WifiEnums 25NUM_LINK_PROBES = 8 26PROBE_DELAY_SEC = 3 27ATTENUATION = 40 28 29 30class WifiLinkProbeTest(WifiBaseTest): 31 """ 32 Tests sending 802.11 Probe Request frames to the currently connected AP to 33 determine if the uplink to the AP is working. 34 35 Test Bed Requirements: 36 * One Android Device 37 * One Wi-Fi network visible to the device, with an attenuator 38 """ 39 40 def setup_class(self): 41 super().setup_class() 42 43 self.dut = self.android_devices[0] 44 wutils.wifi_test_device_init(self.dut) 45 self.unpack_userparams(req_param_names=[], 46 opt_param_names=["reference_networks"]) 47 48 if "AccessPoint" in self.user_params: 49 self.legacy_configure_ap_and_start() 50 elif "OpenWrtAP" in self.user_params: 51 self.configure_openwrt_ap_and_start(wpa_network=True) 52 53 asserts.assert_true(len(self.reference_networks) > 0, 54 "Need at least one reference network with psk.") 55 self.attenuators = wutils.group_attenuators(self.attenuators) 56 57 def setup_test(self): 58 super().setup_test() 59 self.dut.droid.wakeLockAcquireBright() 60 self.dut.droid.wakeUpNow() 61 wutils.wifi_toggle_state(self.dut, True) 62 self.attenuators[0].set_atten(0) 63 self.attenuators[1].set_atten(0) 64 65 def teardown_test(self): 66 super().teardown_test() 67 self.dut.droid.wakeLockRelease() 68 self.dut.droid.goToSleepNow() 69 wutils.reset_wifi(self.dut) 70 71 def teardown_class(self): 72 if "AccessPoint" in self.user_params: 73 del self.user_params["reference_networks"] 74 75 # HELPER METHODS 76 77 def _test_link_probe_does_not_crash_device(self, network): 78 """ 79 Connect to a network, send link probes, and verify that the device did 80 not crash. Also verify that at least one link probe succeeded. 81 82 Steps: 83 1. Connect to a network. 84 2. Send a few link probes. 85 3. Verify that at least one link probe succeeded. 86 4. Ensure that the device did not crash (by checking that it is 87 connected to the expected network). 88 """ 89 wutils.wifi_connect(self.dut, network, num_of_tries=3) 90 91 results = wutils.send_link_probes( 92 self.dut, NUM_LINK_PROBES, PROBE_DELAY_SEC) 93 94 asserts.assert_true(any(result.is_success for result in results), 95 "Expect at least 1 probe success: " + str(results)) 96 97 wifi_info = self.dut.droid.wifiGetConnectionInfo() 98 expected = network[WifiEnums.SSID_KEY] 99 actual = wifi_info[WifiEnums.SSID_KEY] 100 asserts.assert_equal( 101 expected, actual, 102 "Device did not remain connected after sending link probes!") 103 104 def _test_link_probe_ap_attenuated(self, network): 105 """ 106 Connect to a network, significantly attenuate the signal, and verify 107 that the device did not crash. 108 109 Steps: 110 1. Connect to a network. 111 2. Attenuate the signal. 112 3. Send a few link probes. 113 4. Stop attenuating the signal. 114 5. Ensure that the device did not crash (by checking that it is 115 connected to the expected network). 116 """ 117 wutils.wifi_connect(self.dut, network, num_of_tries=3) 118 self.attenuators[0].set_atten(ATTENUATION) 119 120 wutils.send_link_probes(self.dut, NUM_LINK_PROBES, PROBE_DELAY_SEC) 121 122 # we cannot assert for failed link probe when attenuated, this would 123 # depend too much on the attenuator setup => too flaky 124 125 self.attenuators[0].set_atten(0) 126 time.sleep(PROBE_DELAY_SEC * 3) 127 wifi_info = self.dut.droid.wifiGetConnectionInfo() 128 expected = network[WifiEnums.SSID_KEY] 129 actual = wifi_info[WifiEnums.SSID_KEY] 130 asserts.assert_equal( 131 expected, actual, 132 "Device did not remain connected after sending link probes!") 133 134 # TEST METHODS 135 136 @test_tracker_info(uuid='2afd309b-6bf3-4de4-9d8a-e4d35354a2cb') 137 def test_link_probe_does_not_crash_device_2g(self): 138 network = self.reference_networks[0]["2g"] 139 self._test_link_probe_does_not_crash_device(network) 140 141 @test_tracker_info(uuid='69417a6d-7090-4dd0-81ad-55fa3f12b7b1') 142 def test_link_probe_does_not_crash_device_5g(self): 143 network = self.reference_networks[0]["5g"] 144 self._test_link_probe_does_not_crash_device(network) 145 146 @test_tracker_info(uuid='54b8ffaa-c305-4772-928d-03342c51122d') 147 def test_link_probe_ap_attenuated_2g(self): 148 network = self.reference_networks[0]["2g"] 149 self._test_link_probe_ap_attenuated(network) 150 151 @test_tracker_info(uuid='54e29fa4-ff44-4aad-8999-676b361cacf4') 152 def test_link_probe_ap_attenuated_5g(self): 153 network = self.reference_networks[0]["5g"] 154 self._test_link_probe_ap_attenuated(network) 155 156