#!/usr/bin/env python3.4 # # Copyright 2018 - The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import time import acts.base_test import acts_contrib.test_utils.wifi.wifi_test_utils as wutils import acts_contrib.test_utils.tel.tel_test_utils as tutils from acts import asserts from acts import signals from acts import utils from acts.test_decorators import test_tracker_info from acts_contrib.test_utils.bt.bt_test_utils import enable_bluetooth from acts_contrib.test_utils.bt.bt_test_utils import pair_pri_to_sec from acts_contrib.test_utils.bt.bt_test_utils import clear_bonded_devices from acts_contrib.test_utils.wifi.WifiBaseTest import WifiBaseTest from acts_contrib.test_utils.tel.tel_test_utils import WIFI_CONFIG_APBAND_2G from acts_contrib.test_utils.tel.tel_test_utils import WIFI_CONFIG_APBAND_5G WifiEnums = wutils.WifiEnums WAIT_FOR_AUTO_CONNECT = 40 WAIT_BEFORE_CONNECTION = 30 DEFAULT_TIMEOUT = 10 PING_ADDR = 'www.google.com' BAND_2GHZ = 0 BAND_5GHZ = 1 WIFI_NETWORK_AP_CHANNEL_2G = 1 WIFI_NETWORK_AP_CHANNEL_5G = 36 class WifiBtStressCoexTest(WifiBaseTest): """WiFi BT Coex Stress test class. Test Bed Requirement: * Two Android device * One Android device with simulator BT branch code * Several Wi-Fi networks visible to the device, including an open Wi-Fi network. """ def __init__(self, configs): super().__init__(configs) self.enable_packet_log = True def setup_class(self): super().setup_class() self.dut = self.android_devices[0] if len(self.android_devices) > 1: self.dut_client = self.android_devices[1] self.headset = self.android_devices[2] else: self.dut_client = None wutils.wifi_test_device_init(self.dut) req_params = [] opt_param = [ "open_network", "reference_networks", "iperf_server_address", "stress_count", "stress_hours", "attn_vals", "pno_interval", "iperf_server_port", "dbs_supported_models", "sta_sta_supported_models" ] self.unpack_userparams(req_param_names=req_params, opt_param_names=opt_param) self.ap_iface = 'wlan0' if self.dut.model in self.dbs_supported_models: self.ap_iface = 'wlan1' if self.dut.model in self.sta_sta_supported_models: self.ap_iface = 'wlan2' if "AccessPoint" in self.user_params: self.legacy_configure_ap_and_start(ap_count=2) elif "OpenWrtAP" in self.user_params: self.configure_openwrt_ap_and_start(open_network=True, wpa_network=True, ap_count=2) asserts.assert_true( len(self.reference_networks) > 0, "Need at least one reference network with psk.") self.wpa_2g = self.reference_networks[0]["2g"] self.wpa_5g = self.reference_networks[0]["5g"] self.open_2g = self.open_network[0]["2g"] self.open_5g = self.open_network[0]["5g"] self.networks = [self.wpa_2g, self.wpa_5g, self.open_2g, self.open_5g] def setup_test(self): super().setup_test() self.dut.droid.wakeLockAcquireBright() self.dut.droid.wakeUpNow() wutils.wifi_toggle_state(self.dut_client, True) def teardown_test(self): super().teardown_test() if self.dut.droid.wifiIsApEnabled(): wutils.stop_wifi_tethering(self.dut) self.dut.droid.wakeLockRelease() self.dut.droid.goToSleepNow() wutils.reset_wifi(self.dut) wutils.reset_wifi(self.dut_client) clear_bonded_devices(self.dut) clear_bonded_devices(self.headset) def teardown_class(self): wutils.reset_wifi(self.dut) if "AccessPoint" in self.user_params: del self.user_params["reference_networks"] del self.user_params["open_network"] """Helper Functions""" def scan_and_connect_by_ssid(self, ad, network): """Scan for network and connect using network information. Args: network: A dictionary representing the network to connect to. """ ssid = network[WifiEnums.SSID_KEY] wutils.start_wifi_connection_scan_and_ensure_network_found(ad, ssid) wutils.wifi_connect(ad, network, num_of_tries=3) def scan_and_connect_by_id(self, network, net_id): """Scan for network and connect using network id. Args: net_id: Integer specifying the network id of the network. """ ssid = network[WifiEnums.SSID_KEY] wutils.start_wifi_connection_scan_and_ensure_network_found( self.dut, ssid) wutils.wifi_connect_by_id(self.dut, net_id) def run_ping(self, sec): """Run ping for given number of seconds. Args: sec: Time in seconds to run the ping traffic. """ self.log.info("Running ping for %d seconds" % sec) result = self.dut.adb.shell("ping -w %d %s" % (sec, PING_ADDR), timeout=sec + 1) self.log.debug("Ping Result = %s" % result) if "100% packet loss" in result: raise signals.TestFailure("100% packet loss during ping") def create_softap_config(self): """Create a softap config with ssid and password.""" ap_ssid = "softap_" + utils.rand_ascii_str(8) ap_password = utils.rand_ascii_str(8) self.dut.log.info("softap setup: %s %s", ap_ssid, ap_password) config = {wutils.WifiEnums.SSID_KEY: ap_ssid} config[wutils.WifiEnums.PWD_KEY] = ap_password return config def start_softap_and_verify(self, band, check_connectivity=True): """Test startup of softap. 1. Bring up AP mode. 2. Verify SoftAP active using the client device. Args: band: wifi band to start soft ap on check_connectivity: If set, verify internet connectivity Returns: config """ config = self.create_softap_config() wutils.start_wifi_tethering(self.dut, config[WifiEnums.SSID_KEY], config[WifiEnums.PWD_KEY], band) for ad in self.android_devices[1:]: wutils.connect_to_wifi_network( ad, config, check_connectivity=check_connectivity) return config def verify_softap_full_on_off(self, network, softap_band): """Bring up AP mode and verify ap mode Args: softap_band: wifi band to start soft ap on network: android_device to connect ap with security type """ self.start_softap_and_verify(softap_band) wutils.stop_wifi_tethering(self.dut) def connect_BT_paired(self, dut, headset): """Start to pairing the simulator BT device. Args: dut: Android device initiating connection headset: Android device accepting connection """ enable_bluetooth(dut.droid, dut.ed) enable_bluetooth(headset.droid, headset.ed) time.sleep(DEFAULT_TIMEOUT) pair_pri_to_sec(dut, headset) """Tests""" @test_tracker_info(uuid="4bacb48d-1e31-4561-b7b3-8e86478a82b3") def test_wifi_on_off_with_2g(self): """Test wifi on/off state by connection to 2G network followed with BT paired. """ wutils.wifi_toggle_state(self.dut, True) self.scan_and_connect_by_ssid(self.dut, self.wpa_2g) self.connect_BT_paired(self.dut, self.headset) time.sleep(5) for count in range(self.stress_count): """Test toggling wifi""" try: self.log.debug("Going from on to off.") wutils.wifi_toggle_state(self.dut, False) self.log.debug("Going from off to on.") startTime = time.time() wutils.wifi_toggle_state(self.dut, True) startup_time = time.time() - startTime self.log.debug("WiFi was enabled on the device in %s s." % startup_time) except: raise signals.TestFailure(details="", extras={ "Iterations": "%d" % self.stress_count, "Pass": "%d" % count }) raise signals.TestPass(details="", extras={ "Iterations": "%d" % self.stress_count, "Pass": "%d" % (count + 1) }) @test_tracker_info(uuid="ed5b77ff-8a64-4ea7-a481-96ad3a3b91d0") def test_wifi_on_off_with_5g(self): """Test wifi on/off state by connection to 5G network followed with BT paired. """ wutils.wifi_toggle_state(self.dut, True) self.scan_and_connect_by_ssid(self.dut, self.wpa_5g) self.connect_BT_paired(self.dut, self.headset) time.sleep(5) for count in range(self.stress_count): """Test toggling wifi""" try: self.log.debug("Going from on to off.") wutils.wifi_toggle_state(self.dut, False) self.log.debug("Going from off to on.") startTime = time.time() wutils.wifi_toggle_state(self.dut, True) startup_time = time.time() - startTime self.log.debug("WiFi was enabled on the device in %s s." % startup_time) except: raise signals.TestFailure(details="", extras={ "Iterations": "%d" % self.stress_count, "Pass": "%d" % count }) raise signals.TestPass(details="", extras={ "Iterations": "%d" % self.stress_count, "Pass": "%d" % (count + 1) }) @test_tracker_info(uuid="cc132d79-d0ea-4f99-ba6f-0f6fbd21eba0") def test_2g_sta_mode_and_hotspot_5g_on_off_stress_bt_paired(self): """Tests connect to 2G network followed by SoftAp on 5G with BT paired. """ wutils.wifi_toggle_state(self.dut, True) self.scan_and_connect_by_ssid(self.dut, self.open_2g) self.connect_BT_paired(self.dut, self.headset) time.sleep(5) for count in range(self.stress_count): """Test toggling softap""" self.log.info("Iteration %d", count + 1) self.verify_softap_full_on_off(self.open_2g, WIFI_CONFIG_APBAND_5G) @test_tracker_info(uuid="de3903ec-9484-4302-814a-2027631d6ddb") def test_2g_sta_mode_and_hotspot_2g_on_off_stress_bt_paired(self): """Tests connect to 2G network followed by SoftAp on 2G with BT paired. """ wutils.wifi_toggle_state(self.dut, True) self.scan_and_connect_by_ssid(self.dut, self.open_2g) self.connect_BT_paired(self.dut, self.headset) time.sleep(5) for count in range(self.stress_count): """Test toggling softap""" self.log.info("Iteration %d", count + 1) self.verify_softap_full_on_off(self.open_2g, WIFI_CONFIG_APBAND_2G) @test_tracker_info(uuid="42a27ff4-aeb7-45f1-909b-e9695035fb95") def test_5g_sta_mode_and_hotspot_2g_on_off_stress_bt_paired(self): """Tests connect to 5G network followed by SoftAp on 2G with BT paired. """ wutils.wifi_toggle_state(self.dut, True) self.scan_and_connect_by_ssid(self.dut, self.open_5g) self.connect_BT_paired(self.dut, self.headset) time.sleep(5) for count in range(self.stress_count): """Test toggling softap""" self.log.info("Iteration %d", count + 1) self.verify_softap_full_on_off(self.open_2g, WIFI_CONFIG_APBAND_2G) @test_tracker_info(uuid="bae3c34b-34dd-47e4-8a6b-3b2dd97e169e") def test_5g_sta_mode_and_hotspot_5g_on_off_stress_bt_paired(self): """Tests connect to 5G network followed by SoftAp on 5G with BT paired. """ wutils.wifi_toggle_state(self.dut, True) self.scan_and_connect_by_ssid(self.dut, self.open_5g) self.connect_BT_paired(self.dut, self.headset) time.sleep(5) for count in range(self.stress_count): """Test toggling softap""" self.log.info("Iteration %d", count + 1) self.verify_softap_full_on_off(self.open_2g, WIFI_CONFIG_APBAND_5G) @test_tracker_info(uuid="4f39304b-18a1-4c54-8fa1-072ef3c1688d") def test_2g_hotspot_on_off_with_bt_paired(self): """Tests followed by turn on/off SoftAp on 2G with BT paired. """ wutils.wifi_toggle_state(self.dut, True) self.connect_BT_paired(self.dut, self.headset) time.sleep(5) for count in range(self.stress_count): """Test toggling softap""" self.log.info("Iteration %d", count + 1) softap_config = wutils.create_softap_config() wutils.start_wifi_tethering( self.dut, softap_config[wutils.WifiEnums.SSID_KEY], softap_config[wutils.WifiEnums.PWD_KEY], wutils.WifiEnums.WIFI_CONFIG_APBAND_2G) config = { "SSID": softap_config[wutils.WifiEnums.SSID_KEY], "password": softap_config[wutils.WifiEnums.PWD_KEY] } wutils.wifi_toggle_state(self.dut_client, True) wutils.connect_to_wifi_network(self.dut_client, config, check_connectivity=False) # Ping the DUT dut_addr = self.dut.droid.connectivityGetIPv4Addresses( self.ap_iface)[0] asserts.assert_true( utils.adb_shell_ping(self.dut_client, count=10, dest_ip=dut_addr, timeout=20), "%s ping %s failed" % (self.dut_client.serial, dut_addr)) wutils.wifi_toggle_state(self.dut_client, True) wutils.stop_wifi_tethering(self.dut) @test_tracker_info(uuid="a6b1fa3d-be1f-4039-807b-4f117681b2dc") def test_5g_hotspot_on_off_with_bt_paired(self): """Tests followed by turn on/off SoftAp on 5G with BT paired. """ wutils.wifi_toggle_state(self.dut, True) self.connect_BT_paired(self.dut, self.headset) time.sleep(5) for count in range(self.stress_count): """Test toggling softap""" self.log.info("Iteration %d", count + 1) softap_config = wutils.create_softap_config() wutils.start_wifi_tethering( self.dut, softap_config[wutils.WifiEnums.SSID_KEY], softap_config[wutils.WifiEnums.PWD_KEY], wutils.WifiEnums.WIFI_CONFIG_APBAND_5G) config = { "SSID": softap_config[wutils.WifiEnums.SSID_KEY], "password": softap_config[wutils.WifiEnums.PWD_KEY] } wutils.wifi_toggle_state(self.dut_client, True) wutils.connect_to_wifi_network(self.dut_client, config, check_connectivity=False) # Ping the DUT dut_addr = self.dut.droid.connectivityGetIPv4Addresses( self.ap_iface)[0] asserts.assert_true( utils.adb_shell_ping(self.dut_client, count=10, dest_ip=dut_addr, timeout=20), "%s ping %s failed" % (self.dut_client.serial, dut_addr)) wutils.wifi_toggle_state(self.dut_client, True) wutils.stop_wifi_tethering(self.dut)