summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--acts_tests/tests/google/wifi/WifiCellCoexChannelAvoidTest.py274
1 files changed, 274 insertions, 0 deletions
diff --git a/acts_tests/tests/google/wifi/WifiCellCoexChannelAvoidTest.py b/acts_tests/tests/google/wifi/WifiCellCoexChannelAvoidTest.py
new file mode 100644
index 000000000..6d47ddf6a
--- /dev/null
+++ b/acts_tests/tests/google/wifi/WifiCellCoexChannelAvoidTest.py
@@ -0,0 +1,274 @@
+#!/usr/bin/env python3.4
+#
+# Copyright 2016 - 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 os
+import time
+import re
+import json
+import logging
+import pprint
+
+from acts import asserts
+from acts import utils
+from acts.keys import Config
+from acts.test_decorators import test_tracker_info
+from acts_contrib.test_utils.wifi import wifi_constants
+from acts_contrib.test_utils.wifi import wifi_test_utils as wutils
+from acts_contrib.test_utils.wifi.WifiBaseTest import WifiBaseTest
+from acts_contrib.test_utils.wifi.wifi_constants import\
+ COEX_BAND, COEX_CHANNEL, COEX_POWER_CAP_DBM, KEY_COEX_UNSAFE_CHANNELS, KEY_COEX_RESTRICTIONS
+
+
+WifiEnums = wutils.WifiEnums
+WIFI_CONFIG_APBAND_2G = WifiEnums.WIFI_CONFIG_APBAND_2G
+WIFI_CONFIG_APBAND_5G = WifiEnums.WIFI_CONFIG_APBAND_5G
+WIFI_CONFIG_APBAND_AUTO = WifiEnums.WIFI_CONFIG_APBAND_AUTO
+WPA3_SAE_TRANSITION_SOFTAP = WifiEnums.SoftApSecurityType.WPA3_SAE_TRANSITION
+WPA3_SAE_SOFTAP = WifiEnums.SoftApSecurityType.WPA3_SAE
+WAIT_AFTER_REBOOT = 10
+
+BRIDGED_AP_LAUNCH_INTERVAL_5_SECONDS = 5
+
+
+class WifiCellCoexChannelAvoidTest(WifiBaseTest):
+
+ def __init__(self, configs):
+ super().__init__(configs)
+ self.generate_test_list()
+
+ def generate_test_list(self):
+ """Generates a test list sorted with coex_unsafe_list_sap list.
+ Test with a sorted list can reduce lots of time
+ on switch radio and band start up.
+ """
+ sorted_list = sorted(
+ self.user_params["coex_unsafe_list_sap"], key=lambda radio: radio["band"])
+ for test_item in sorted_list:
+ self.init_test_case(self.coex_unsafechannel_avoidance, test_item)
+ pprint.pprint("self.tests = {}".format(self.tests))
+
+ def init_test_case(self, coex_unsafechannel_avoidance, test_item):
+ """Generates a single test case from the given data.
+
+ Args:
+ coex_unsafechannel_avoidance: The base test case function to run.
+ test_item: test case required info include ["uuid","coex_unsafe_case"]
+ """
+ test_name = test_item["coex_unsafe_case"]
+ test_tracker_uuid = test_item["uuid"]
+ if not test_name.startswith("test_"):
+ test_name = "test_{}".format(test_name)
+ test_case = test_tracker_info(uuid=test_tracker_uuid)(
+ lambda: coex_unsafechannel_avoidance(test_item))
+ setattr(self, test_name, test_case)
+ self.tests.append(test_name)
+
+ def setup_class(self):
+ """It will setup the required dependencies from config file and configure
+ the devices for softap mode testing.
+
+ Returns:
+ True if successfully configured the requirements for testing.
+ """
+ super().setup_class()
+ self.dut = self.android_devices[0]
+ self.dut_client = self.android_devices[1]
+ req_params = ["dbs_supported_models", "sta_concurrency_supported_models",
+ "wifi6_models","coex_unsafe_list_sap"]
+ opt_param = ["reference_networks"]
+ self.unpack_userparams(
+ req_param_names=req_params, opt_param_names=opt_param)
+ if "AccessPoint" in self.user_params:
+ self.legacy_configure_ap_and_start()
+ elif "OpenWrtAP" in self.user_params:
+ self.configure_openwrt_ap_and_start(wpa_network=True)
+ self.wifi_network = self.reference_networks[0]["2g"]
+ # Do a simple version of init - mainly just sync the time and enable
+ # verbose logging. This test will fail if the DUT has a sim and cell
+ # data is disabled. We would also like to test with phones in less
+ # constrained states (or add variations where we specifically
+ # constrain).
+ utils.require_sl4a((self.dut, self.dut_client))
+ utils.sync_device_time(self.dut)
+ utils.sync_device_time(self.dut_client)
+ # Enable verbose logging on the duts
+ self.dut.droid.wifiEnableVerboseLogging(1)
+ asserts.assert_equal(self.dut.droid.wifiGetVerboseLoggingLevel(), 1,
+ "Failed to enable WiFi verbose logging on the softap dut.")
+ self.dut_client.droid.wifiEnableVerboseLogging(1)
+ asserts.assert_equal(self.dut_client.droid.wifiGetVerboseLoggingLevel(), 1,
+ "Failed to enable WiFi verbose logging on the client dut.")
+ wutils.wifi_toggle_state(self.dut, True)
+ wutils.wifi_toggle_state(self.dut_client, True)
+ self.AP_IFACE = 'wlan0'
+ if self.dut.model in self.dbs_supported_models:
+ self.AP_IFACE = 'wlan1'
+ if self.dut.model in self.sta_concurrency_supported_models:
+ self.AP_IFACE = 'wlan2'
+ if len(self.android_devices) > 2:
+ utils.sync_device_time(self.android_devices[2])
+ self.android_devices[2].droid.wifiEnableVerboseLogging(1)
+ asserts.assert_equal(self.android_devices[2].droid.wifiGetVerboseLoggingLevel(), 1,
+ "Failed to enable WiFi verbose logging on the client dut.")
+ self.dut_client_2 = self.android_devices[2]
+
+ def teardown_class(self):
+ super().teardown_class()
+ for ad in self.android_devices:
+ wutils.wifi_toggle_state(ad, True)
+ wutils.reset_wifi(ad)
+ time.sleep(WAIT_AFTER_REBOOT)
+ if self.dut.droid.wifiIsApEnabled():
+ wutils.stop_wifi_tethering(self.dut)
+ if "AccessPoint" in self.user_params:
+ del self.user_params["reference_networks"]
+ del self.user_params["open_network"]
+
+ def setup_test(self):
+ super().setup_test()
+ for ad in self.android_devices:
+ wutils.wifi_toggle_state(ad, True)
+ self.dut.reboot()
+ time.sleep(WAIT_AFTER_REBOOT)
+
+ def teardown_test(self):
+ super().teardown_test()
+ for ad in self.android_devices:
+ wutils.wifi_toggle_state(ad, True)
+ if self.dut.droid.wifiIsApEnabled():
+ wutils.stop_wifi_tethering(self.dut)
+ self.dut.log.debug("Toggling Airplane mode OFF.")
+ asserts.assert_true(utils.force_airplane_mode(self.dut, False),
+ "Can not turn off airplane mode: %s" % self.dut.serial)
+ #reset coexcell setting
+ self.dut.adb.shell('cmd wifi reset-coex-cell-channels')
+
+ """ Helper Functions """
+
+ def coex_unsafe_channel_key(self, unsafe_channel):
+ if COEX_POWER_CAP_DBM in unsafe_channel:
+ return (unsafe_channel[COEX_BAND], unsafe_channel[COEX_CHANNEL],
+ unsafe_channel[COEX_POWER_CAP_DBM])
+ return (unsafe_channel[COEX_BAND], unsafe_channel[COEX_CHANNEL])
+
+ def enable_softap(self, ad, band=None):
+ """ Enable SoftAp of the DUT
+
+ Returns:
+ (freq1, freq2): Integer; a 2G frequency and a 5G frequency if DUT
+ support BridgedAp.
+ freq: Integer; a frequency from SoftAp.
+ None, bandwidth: Just a placeholder, won't be used.
+ """
+ # Enable SoftAp
+ # Create SoftAp config.
+ config = wutils.create_softap_config()
+ # If DUT support BridgedAp, then two BridgedAp instances enabled.
+ if self.dut.droid.wifiIsBridgedApConcurrencySupported():
+ wutils.save_wifi_soft_ap_config(
+ ad,
+ config,
+ bands=[WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G,
+ WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G])
+ # If DUT does not support BridgedAp, 2G OR 5G SoftAp enabled.
+ else:
+ if self.init_softap_band == BAND_2G:
+ band = WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G
+ if self.init_softap_band == BAND_5G:
+ band = WifiEnums.WIFI_CONFIG_SOFTAP_BAND_5G
+ wutils.save_wifi_soft_ap_config(ad,
+ config,
+ band=band)
+ wutils.start_wifi_tethering_saved_config(ad)
+ time.sleep(BRIDGED_AP_LAUNCH_INTERVAL_5_SECONDS)
+
+ # if DUT support BridgedAp:
+ if ad.droid.wifiIsBridgedApConcurrencySupported():
+ callbackId = ad.droid.registerSoftApCallback()
+ infos = wutils.get_current_softap_infos(ad, callbackId, True)
+ ad.droid.unregisterSoftApCallback(callbackId)
+ # if DUT BridgedAp has two instances, return two frequencies.
+ if len(infos) == 2:
+ freq_1 = infos[0]["frequency"]
+ freq_2 = infos[1]["frequency"]
+ self.dut.log.info("DUT connected to AP on freq: {},{}, chan: {} ,{}".
+ format(freq_1, freq_2, WifiEnums.freq_to_channel[freq_1],
+ WifiEnums.freq_to_channel[freq_2]))
+ return freq_1, freq_2
+ # if DUT BridgedAp has only one instances, return the frequency.
+ elif len(infos) == 1:
+ freq = infos[0]["frequency"]
+ self.dut.log.info("DUT connected to AP on freq: {}, chan: {}".
+ format(freq, WifiEnums.freq_to_channel[freq]))
+ return freq
+ else:
+ raise signals.TestFailure("There should be SoftAp instance.")
+ # if DUT does not support BridgedAp:
+ else:
+ # Return SoftAp frequency.
+ callbackId = ad.droid.registerSoftApCallback()
+ freq, bandwidth = wutils.get_current_softap_info(ad,
+ callbackId,
+ True)
+ ad.log.info("SoftAp freq: {}".format(freq))
+ ad.droid.unregisterSoftApCallback(callbackId)
+ self.dut.log.info("DUT connected to AP on freq: {}, chan: {}".
+ format(freq, WifiEnums.freq_to_channel[freq]))
+ return freq, bandwidth
+
+ """ Tests Begin """
+
+ def coex_unsafechannel_avoidance(self, test_item):
+ self.radio = test_item["radio"]
+ self.band = test_item["band"]
+ self.cellchannels = test_item["setcoexcellchannels"]
+ time.sleep(WAIT_AFTER_REBOOT)
+ wutils.set_wifi_country_code(self.dut, country_code='US')
+ asserts.skip_if(not self.dut.droid.isSdkAtLeastS(),
+ "Require SDK at least S to use wifi coex apis.")
+ self.dut.ed.clear_all_events()
+ #Listing the test coex setting from configuration
+ self.dut.log.info("DUT test cellcoex radio:{}, band:{}, channels setting:{}"
+ .format(self.radio, self.band, self.cellchannels))
+ self.dut.adb.shell('cmd wifi set-coex-cell-channels %s %s %s' % (self.radio, self.band,
+ self.cellchannels))
+ self.dut.droid.wifiRegisterCoexCallback()
+ try:
+ # Wait for the immediate callback from registering and store the current values
+ event = self.dut.ed.pop_event("WifiManagerCoexCallback#onCoexUnsafeChannelsChanged", 5)
+ except queue.Empty:
+ asserts.fail("Coex callback event not received after registering.")
+ prev_unsafe_channels = sorted(json.loads(event["data"][KEY_COEX_UNSAFE_CHANNELS]),
+ key=self.coex_unsafe_channel_key)
+ prev_restrictions = sorted(json.loads(event["data"][KEY_COEX_RESTRICTIONS]))
+ unsafe_channels = []
+ for i in range(len(prev_unsafe_channels)):
+ unsafe_channels.append(prev_unsafe_channels[i]['channel'])
+ self.dut.log.info("DUT unsafe channels:{}".format(unsafe_channels))
+ freq1, freq2 = self.enable_softap(self.dut)
+ sapchan1, sapchan2 = WifiEnums.freq_to_channel[freq1], WifiEnums.freq_to_channel[freq2]
+ if sapchan1 in unsafe_channels or sapchan2 in unsafe_channels:
+ asserts.fail("devices hotspot's channel open on current unsafe channels "
+ + str(unsafe_channels))
+ else:
+ pass
+ self.dut.droid.wifiUnregisterCoexCallback()
+ self.dut.adb.shell('cmd wifi reset-coex-cell-channels')
+
+ """ Tests End """
+
+if __name__ == "__main__":
+ pass