#!/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

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.tel import tel_test_utils as tel_utils
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

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


class WifiSoftApTest(WifiBaseTest):

    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"]
        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]
        self.country_code = wutils.WifiEnums.CountryCode.US
        if hasattr(self, "country_code_file"):
            if isinstance(self.country_code_file, list):
                self.country_code_file = self.country_code_file[0]
            if not os.path.isfile(self.country_code_file):
                self.country_code_file = os.path.join(
                    self.user_params[Config.key_config_path.value],
                    self.country_code_file)
            self.country_code = utils.load_config(
                self.country_code_file)["country"]

    def teardown_class(self):
        if self.dut.droid.wifiIsApEnabled():
            wutils.stop_wifi_tethering(self.dut)
        wutils.reset_wifi(self.dut)
        wutils.reset_wifi(self.dut_client)
        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)
        if "chan_13" in self.test_name and "OpenWrtAP" in self.user_params:
            self.access_points[0].close()
            self.configure_openwrt_ap_and_start(wpa_network=True,
                                                channel_2g=13)
            self.wifi_network = self.reference_networks[0]["2g"]
            for ad in self.android_devices:
                wutils.set_wifi_country_code(
                        ad, wutils.WifiEnums.CountryCode.AUSTRALIA)

    def teardown_test(self):
        super().teardown_test()
        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)
        if self.dut.droid.wifiIsApEnabled():
            wutils.stop_wifi_tethering(self.dut)
        if "chan_13" in self.test_name and "OpenWrtAP" in self.user_params:
            self.access_points[0].close()
            self.configure_openwrt_ap_and_start(wpa_network=True)
            self.wifi_network = self.reference_networks[0]["2g"]
            for ad in self.android_devices:
                wutils.set_wifi_country_code(ad, self.country_code)

    """ Helper Functions """
    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 confirm_softap_in_scan_results(self, ap_ssid):
        """Confirm the ap started by wifi tethering is seen in scan results.

        Args:
            ap_ssid: SSID of the ap we are looking for.
        """
        wutils.start_wifi_connection_scan_and_ensure_network_found(
            self.dut_client, ap_ssid);

    def confirm_softap_not_in_scan_results(self, ap_ssid):
        """Confirm the ap started by wifi tethering is not seen in scan results.

        Args:
            ap_ssid: SSID of the ap we are looking for.
        """
        wutils.start_wifi_connection_scan_and_ensure_network_not_found(
            self.dut_client, ap_ssid);

    def check_cell_data_and_enable(self):
        """Make sure that cell data is enabled if there is a sim present.

        If a sim is active, cell data needs to be enabled to allow provisioning
        checks through (when applicable).  This is done to relax hardware
        requirements on DUTs - without this check, running this set of tests
        after other wifi tests may cause failures.
        """
        # We do have a sim.  Make sure data is enabled so we can tether.
        if not self.dut.droid.telephonyIsDataEnabled():
            self.dut.log.info("need to enable data")
            self.dut.droid.telephonyToggleDataConnection(True)
            asserts.assert_true(self.dut.droid.telephonyIsDataEnabled(),
                                "Failed to enable cell data for softap dut.")

    def validate_full_tether_startup(self, band=None, hidden=None,
                                     test_ping=False, test_clients=None,
                                     security=None):
        """Test full startup of wifi tethering

        1. Report current state.
        2. Switch to AP mode.
        3. verify SoftAP active.
        4. Shutdown wifi tethering.
        5. verify back to previous mode.
        """
        initial_wifi_state = self.dut.droid.wifiCheckState()
        initial_cell_state = tel_utils.is_sim_ready(self.log, self.dut)
        self.dut.log.info("current state: %s", initial_wifi_state)
        self.dut.log.info("is sim ready? %s", initial_cell_state)
        if initial_cell_state:
            self.check_cell_data_and_enable()
        config = self.create_softap_config()
        wutils.start_wifi_tethering(self.dut,
                                    config[wutils.WifiEnums.SSID_KEY],
                                    config[wutils.WifiEnums.PWD_KEY],
                                    band,
                                    hidden,
                                    security)
        if hidden:
            # First ensure it's not seen in scan results.
            self.confirm_softap_not_in_scan_results(
                config[wutils.WifiEnums.SSID_KEY])
            # If the network is hidden, it should be saved on the client to be
            # seen in scan results.
            config[wutils.WifiEnums.HIDDEN_KEY] = True
            ret = self.dut_client.droid.wifiAddNetwork(config)
            asserts.assert_true(ret != -1, "Add network %r failed" % config)
            self.dut_client.droid.wifiEnableNetwork(ret, 0)
        self.confirm_softap_in_scan_results(config[wutils.WifiEnums.SSID_KEY])
        if test_ping:
            self.validate_ping_between_softap_and_client(config)
        if test_clients:
            if len(self.android_devices) > 2:
                self.validate_ping_between_two_clients(config)
        wutils.stop_wifi_tethering(self.dut)
        asserts.assert_false(self.dut.droid.wifiIsApEnabled(),
                             "SoftAp is still reported as running")
        if initial_wifi_state:
            wutils.wait_for_wifi_state(self.dut, True)
        elif self.dut.droid.wifiCheckState():
            asserts.fail("Wifi was disabled before softap and now it is enabled")

    def validate_ping_between_softap_and_client(self, config):
        """Test ping between softap and its client.

        Connect one android device to the wifi hotspot.
        Verify they can ping each other.

        Args:
            config: wifi network config with SSID, password
        """
        wutils.wifi_connect(self.dut_client, config, check_connectivity=False)

        dut_ip = self.dut.droid.connectivityGetIPv4Addresses(self.AP_IFACE)[0]
        dut_client_ip = self.dut_client.droid.connectivityGetIPv4Addresses('wlan0')[0]
        wutils.verify_11ax_softap(self.dut, self.dut_client, self.wifi6_models)

        self.dut.log.info("Try to ping %s" % dut_client_ip)
        asserts.assert_true(
            utils.adb_shell_ping(self.dut, count=10, dest_ip=dut_client_ip, timeout=20),
            "%s ping %s failed" % (self.dut.serial, dut_client_ip))

        self.dut_client.log.info("Try to ping %s" % dut_ip)
        asserts.assert_true(
            utils.adb_shell_ping(self.dut_client, count=10, dest_ip=dut_ip, timeout=20),
            "%s ping %s failed" % (self.dut_client.serial, dut_ip))

        wutils.stop_wifi_tethering(self.dut)

    def validate_ping_between_two_clients(self, config):
        """Test ping between softap's clients.

        Connect two android device to the wifi hotspot.
        Verify the clients can ping each other.

        Args:
            config: wifi network config with SSID, password
        """
        # Connect DUT to Network
        ad1 = self.dut_client
        ad2 = self.android_devices[2]

        wutils.wifi_connect(ad1, config, check_connectivity=False)
        wutils.wifi_connect(ad2, config, check_connectivity=False)
        ad1_ip = ad1.droid.connectivityGetIPv4Addresses('wlan0')[0]
        ad2_ip = ad2.droid.connectivityGetIPv4Addresses('wlan0')[0]

        # Ping each other
        ad1.log.info("Try to ping %s" % ad2_ip)
        asserts.assert_true(
            utils.adb_shell_ping(ad1, count=10, dest_ip=ad2_ip, timeout=20),
            "%s ping %s failed" % (ad1.serial, ad2_ip))

        ad2.log.info("Try to ping %s" % ad1_ip)
        asserts.assert_true(
            utils.adb_shell_ping(ad2, count=10, dest_ip=ad1_ip, timeout=20),
            "%s ping %s failed" % (ad2.serial, ad1_ip))

    def validate_softap_after_reboot(self, band, security, hidden=False):
        config = self.create_softap_config()
        softap_config = config.copy()
        softap_config[WifiEnums.AP_BAND_KEY] = band
        softap_config[WifiEnums.SECURITY] = security
        if hidden:
            softap_config[WifiEnums.HIDDEN_KEY] = hidden
        asserts.assert_true(
            self.dut.droid.wifiSetWifiApConfiguration(softap_config),
            "Failed to update WifiAp Configuration")
        self.dut.reboot()
        time.sleep(WAIT_AFTER_REBOOT)
        wutils.start_wifi_tethering_saved_config(self.dut)
        wutils.connect_to_wifi_network(self.dut_client, config, hidden=hidden)

    """ Tests Begin """

    @test_tracker_info(uuid="495f1252-e440-461c-87a7-2c45f369e129")
    def test_check_wifi_tethering_supported(self):
        """Test check for wifi tethering support.

         1. Call method to check if wifi hotspot is supported
        """
        # TODO(silberst): wifiIsPortableHotspotSupported() is currently failing.
        # Remove the extra check and logging when b/30800811 is resolved
        hotspot_supported = self.dut.droid.wifiIsPortableHotspotSupported()
        tethering_supported = self.dut.droid.connectivityIsTetheringSupported()
        self.log.info(
            "IsPortableHotspotSupported: %s, IsTetheringSupported %s." % (
            hotspot_supported, tethering_supported))
        asserts.assert_true(hotspot_supported,
                            "DUT should support wifi tethering but is reporting false.")
        asserts.assert_true(tethering_supported,
                            "DUT should also support wifi tethering when called from ConnectivityManager")

    @test_tracker_info(uuid="09c19c35-c708-48a5-939b-ac2bbb403d54")
    def test_full_tether_startup(self):
        """Test full startup of wifi tethering in default band.

        1. Report current state.
        2. Switch to AP mode.
        3. verify SoftAP active.
        4. Shutdown wifi tethering.
        5. verify back to previous mode.
        """
        self.validate_full_tether_startup()

    @test_tracker_info(uuid="6437727d-7db1-4f69-963e-f26a7797e47f")
    def test_full_tether_startup_2G(self):
        """Test full startup of wifi tethering in 2G band.

        1. Report current state.
        2. Switch to AP mode.
        3. verify SoftAP active.
        4. Shutdown wifi tethering.
        5. verify back to previous mode.
        """
        self.validate_full_tether_startup(WIFI_CONFIG_APBAND_2G)

    @test_tracker_info(uuid="970272fa-1302-429b-b261-51efb4dad779")
    def test_full_tether_startup_5G(self):
        """Test full startup of wifi tethering in 5G band.

        1. Report current state.
        2. Switch to AP mode.
        3. verify SoftAP active.
        4. Shutdown wifi tethering.
        5. verify back to previous mode.
        """
        self.validate_full_tether_startup(WIFI_CONFIG_APBAND_5G)

    @test_tracker_info(uuid="f76ed37a-519a-48b4-b260-ee3fc5a9cae0")
    def test_full_tether_startup_auto(self):
        """Test full startup of wifi tethering in auto-band.

        1. Report current state.
        2. Switch to AP mode.
        3. verify SoftAP active.
        4. Shutdown wifi tethering.
        5. verify back to previous mode.
        """
        self.validate_full_tether_startup(WIFI_CONFIG_APBAND_AUTO)

    @test_tracker_info(uuid="d26ee4df-5dcb-4191-829f-05a10b1218a7")
    def test_full_tether_startup_2G_hidden(self):
        """Test full startup of wifi tethering in 2G band using hidden AP.

        1. Report current state.
        2. Switch to AP mode.
        3. verify SoftAP active.
        4. Shutdown wifi tethering.
        5. verify back to previous mode.
        """
        self.validate_full_tether_startup(WIFI_CONFIG_APBAND_2G, True)

    @test_tracker_info(uuid="229cd585-a789-4c9a-8948-89fa72de9dd5")
    def test_full_tether_startup_5G_hidden(self):
        """Test full startup of wifi tethering in 5G band using hidden AP.

        1. Report current state.
        2. Switch to AP mode.
        3. verify SoftAP active.
        4. Shutdown wifi tethering.
        5. verify back to previous mode.
        """
        self.validate_full_tether_startup(WIFI_CONFIG_APBAND_5G, True)

    @test_tracker_info(uuid="d546a143-6047-4ffd-b3c6-5ec81a38001f")
    def test_full_tether_startup_auto_hidden(self):
        """Test full startup of wifi tethering in auto-band using hidden AP.

        1. Report current state.
        2. Switch to AP mode.
        3. verify SoftAP active.
        4. Shutdown wifi tethering.
        5. verify back to previous mode.
        """
        self.validate_full_tether_startup(WIFI_CONFIG_APBAND_AUTO, True)

    @test_tracker_info(uuid="25996696-e9c8-4cd3-816a-44536166e69f")
    def test_full_tether_startup_wpa3(self):
        """Test full startup of softap in default band and wpa3 security.

        Steps:
        1. Configure softap in default band and wpa3 security.
        2. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA3 softAp")
        self.validate_full_tether_startup(security=WPA3_SAE_SOFTAP)

    @test_tracker_info(uuid="65ecdd4b-857e-4bda-87e7-3db578cee7aa")
    def test_full_tether_startup_2G_wpa3(self):
        """Test full startup of softap in 2G band and wpa3 security.

        Steps:
        1. Configure softap in 2G band and wpa3 security.
        2. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA3 softAp")
        self.validate_full_tether_startup(
            WIFI_CONFIG_APBAND_2G, security=WPA3_SAE_SOFTAP)

    @test_tracker_info(uuid="dbc788dc-bf11-48aa-b88f-c2ee767cd13d")
    def test_full_tether_startup_5G_wpa3(self):
        """Test full startup of softap in 5G band and wpa3 security.

        Steps:
        1. Configure softap in 5G band and wpa3 security.
        2. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA3 softAp")
        self.validate_full_tether_startup(
            WIFI_CONFIG_APBAND_5G, security=WPA3_SAE_SOFTAP)

    @test_tracker_info(uuid="1192c522-824a-4a79-a6cd-bd63b7d19e82")
    def test_full_tether_startup_auto_wpa3(self):
        """Test full startup of softap in auto band and wpa3 security.

        Steps:
        1. Configure softap in auto band and wpa3 security.
        2. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA3 softAp")
        self.validate_full_tether_startup(
            WIFI_CONFIG_APBAND_AUTO, security=WPA3_SAE_SOFTAP)

    @test_tracker_info(uuid="120d2dcb-ded6-40d3-854c-366c200c8deb")
    def test_full_tether_startup_hidden_wpa3(self):
        """Test full startup of hidden softap in default band and wpa3 security.

        Steps:
        1. Configure hidden softap in default band and wpa3 security.
        2. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA3 softAp")
        self.validate_full_tether_startup(security=WPA3_SAE_SOFTAP, hidden=True)

    @test_tracker_info(uuid="82fc2329-480b-4cab-bf9d-e1c397673e4a")
    def test_full_tether_startup_2G_hidden_wpa3(self):
        """Test full startup of hidden softap in 2G band and wpa3 security.

        Steps:
        1. Configure hidden softap in 2G band and wpa3 security.
        2. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA3 softAp")
        self.validate_full_tether_startup(
            WIFI_CONFIG_APBAND_2G, True, security=WPA3_SAE_SOFTAP)

    @test_tracker_info(uuid="0da2958e-de0b-4567-aff1-d4ba5439eb4e")
    def test_full_tether_startup_5G_hidden_wpa3(self):
        """Test full startup of hidden softap in 5G band and wpa3 security.

        Steps:
        1. Configure hidden softap in 5G band and wpa3 security.
        2. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA3 softAp")
        self.validate_full_tether_startup(
            WIFI_CONFIG_APBAND_5G, True, security=WPA3_SAE_SOFTAP)

    @test_tracker_info(uuid="1412f928-e89b-4e84-8ad0-1b14e936b239")
    def test_full_tether_startup_auto_hidden_wpa3(self):
        """Test full startup of hidden softap in auto band and wpa3 security.

        Steps:
        1. Configure hidden softap in auto band and wpa3 security.
        2. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA3 softAp")
        self.validate_full_tether_startup(
            WIFI_CONFIG_APBAND_AUTO, True, security=WPA3_SAE_SOFTAP)

    @test_tracker_info(uuid="e1433f7e-57f6-4475-822c-754d77817bbc")
    def test_full_tether_startup_wpa2_wpa3(self):
        """Test full startup of softap in default band and wpa2/wpa3 security.

        Steps:
        1. Configure softap in default band and wpa2/wpa3 security.
        2. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA2/WPA3 softAp")
        self.validate_full_tether_startup(security=WPA3_SAE_TRANSITION_SOFTAP)

    @test_tracker_info(uuid="8f55209f-0b9a-4600-a416-84d075c349af")
    def test_full_tether_startup_2G_wpa2_wpa3(self):
        """Test full startup of softap in 2G band and wpa2/wpa3 security.

        Steps:
        1. Configure softap in default band and wpa2/wpa3 security.
        2. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA2/WPA3 softAp")
        self.validate_full_tether_startup(
            WIFI_CONFIG_APBAND_2G, security=WPA3_SAE_TRANSITION_SOFTAP)

    @test_tracker_info(uuid="3d54b7c5-cc34-473f-b484-fc3bf1773a90")
    def test_full_tether_startup_5G_wpa2_wpa3(self):
        """Test full startup of softap in 5G band and wpa2/wpa3 security.

        Steps:
        1. Configure softap in default band and wpa2/wpa3 security.
        2. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA2/WPA3 softAp")
        self.validate_full_tether_startup(
            WIFI_CONFIG_APBAND_5G, security=WPA3_SAE_TRANSITION_SOFTAP)

    @test_tracker_info(uuid="f07bedd2-d768-497d-8922-2e5fe1cd9365")
    def test_full_tether_startup_auto_wpa2_wpa3(self):
        """Test full startup of softap in auto band and wpa2/wpa3 security.

        Steps:
        1. Configure softap in default band and wpa2/wpa3 security.
        2. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA2/WPA3 softAp")
        self.validate_full_tether_startup(
            WIFI_CONFIG_APBAND_AUTO, security=WPA3_SAE_TRANSITION_SOFTAP)

    @test_tracker_info(uuid="9a54f97f-eaca-4a64-ad20-f9e52f8b16a1")
    def test_full_tether_startup_2G_hidden_wpa2_wpa3(self):
        """Test full startup of hidden softap in 2G band and wpa2/wpa3.

        Steps:
        1. Configure hidden softap in 2G band and wpa2/wpa3 security.
        2. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA2/WPA3 softAp")
        self.validate_full_tether_startup(
            WIFI_CONFIG_APBAND_2G, True, security=WPA3_SAE_TRANSITION_SOFTAP)

    @test_tracker_info(uuid="1baef45f-c6c9-46bc-8227-1aacf410e60d")
    def test_full_tether_startup_5G_hidden_wpa2_wpa3(self):
        """Test full startup of hidden softap in 5G band and wpa2/wpa3 security.

        Steps:
        1. Configure hidden softap in 5G band and wpa2/wpa3 security.
        2. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA2/WPA3 softAp")
        self.validate_full_tether_startup(
            WIFI_CONFIG_APBAND_5G, True, security=WPA3_SAE_TRANSITION_SOFTAP)

    @test_tracker_info(uuid="1976ac84-f967-4961-bdb9-4fcfe297fe22")
    def test_full_tether_startup_auto_hidden_wpa2_wpa3(self):
        """Test full startup of hidden softap in auto band and wpa2/wpa3.

        Steps:
        1. Configure hidden softap in auto band and wpa2/wpa3 security.
        2. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA3 softAp")
        self.validate_full_tether_startup(
            WIFI_CONFIG_APBAND_AUTO, True, security=WPA3_SAE_TRANSITION_SOFTAP)

    @test_tracker_info(uuid="dd4c79dc-169f-4d8f-a700-95ba2923af35")
    def test_softap_wpa3_2g_after_reboot(self):
        """Test full startup of softap in 2G band, wpa3 security after reboot.

        Steps:
        1. Save softap in 2G band and wpa3 security.
        2. Reboot device and start softap.
        3. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA3 softAp")
        self.validate_softap_after_reboot(
            WIFI_CONFIG_APBAND_2G, WPA3_SAE_SOFTAP, False)

    @test_tracker_info(uuid="02f080d8-91e7-4363-a291-da3c87e74758")
    def test_softap_wpa3_5g_after_reboot(self):
        """Test full startup of softap in 5G band, wpa3 security after reboot.

        Steps:
        1. Save softap in 5G band and wpa3 security.
        2. Reboot device and start softap.
        3. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA3 softAp")
        self.validate_softap_after_reboot(
            WIFI_CONFIG_APBAND_5G, WPA3_SAE_SOFTAP, False)

    @test_tracker_info(uuid="2224f94e-88e8-4ebf-bbab-f78ab24cefda")
    def test_softap_wpa2_wpa3_2g_after_reboot(self):
        """Test softap in 2G band, wpa2/wpa3 security after reboot.

        Steps:
        1. Save softap in 2G band and wpa2/wpa3 security.
        2. Reboot device and start softap.
        3. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA2/WPA3 softAp")
        self.validate_softap_after_reboot(
            WIFI_CONFIG_APBAND_2G, WPA3_SAE_TRANSITION_SOFTAP, False)

    @test_tracker_info(uuid="320643e2-9e13-4c8c-a2cb-1903b6bd3741")
    def test_softap_wpa2_wpa3_5g_after_reboot(self):
        """Test softap in 5G band, wpa2/wpa3 security after reboot.

        Steps:
        1. Save softap in 5G band and wpa2/wpa3 security.
        2. Reboot device and start softap.
        3. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA2/WPA3 softAp")
        self.validate_softap_after_reboot(
            WIFI_CONFIG_APBAND_5G, WPA3_SAE_TRANSITION_SOFTAP, False)

    @test_tracker_info(uuid="52005efc-45a2-41df-acd1-5fd551e88a3c")
    def test_softap_wpa3_2g_hidden_after_reboot(self):
        """Test hidden softap in 2G band, wpa3 security after reboot.

        Steps:
        1. Save hidden softap in 2G band and wpa3 security.
        2. Reboot device and start softap.
        3. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA3 softAp")
        self.validate_softap_after_reboot(
            WIFI_CONFIG_APBAND_2G, WPA3_SAE_SOFTAP, True)

    @test_tracker_info(uuid="78e07c03-f628-482d-b78b-84bdfba0bfaf")
    def test_softap_wpa3_5g_hidden_after_reboot(self):
        """Test hidden softap in 5G band, wpa3 security after reboot.

        Steps:
        1. Save hidden softap in 5G band and wpa3 security.
        2. Reboot device and start softap.
        3. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA3 softAp")
        self.validate_softap_after_reboot(
            WIFI_CONFIG_APBAND_5G, WPA3_SAE_SOFTAP, True)

    @test_tracker_info(uuid="749ba522-dd1f-459a-81bd-957943201c32")
    def test_softap_wpa2_wpa3_2g_hidden_after_reboot(self):
        """Test hidden softap in 2G band, wpa2/wpa3 security after reboot.

        Steps:
        1. Save hidden softap in 2G band and wpa2/wpa3 security.
        2. Reboot device and start softap.
        3. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA2/WPA3 softAp")
        self.validate_softap_after_reboot(
            WIFI_CONFIG_APBAND_2G, WPA3_SAE_TRANSITION_SOFTAP, True)

    @test_tracker_info(uuid="638f1456-8556-448d-8cad-63e6b72337ca")
    def test_softap_wpa2_wpa3_5g_hidden_after_reboot(self):
        """Test hidden softap in 5G band, wpa2/wpa3 security after reboot.

        Steps:
        1. Save hidden softap in 5G band and wpa2/wpa3 security.
        2. Reboot device and start softap.
        3. Verify dut client connects to the softap.
        """
        asserts.skip_if(self.dut.model not in self.sta_concurrency_supported_models,
                        "DUT does not support WPA2/WPA3 softAp")
        self.validate_softap_after_reboot(
            WIFI_CONFIG_APBAND_5G, WPA3_SAE_TRANSITION_SOFTAP, True)

    @test_tracker_info(uuid="b2f75330-bf33-4cdd-851a-de390f891ef7")
    def test_tether_startup_while_connected_to_a_network(self):
        """Test full startup of wifi tethering in auto-band while the device
        is connected to a network.

        1. Connect to an open network.
        2. Turn on AP mode (in auto band).
        3. Verify SoftAP active.
        4. Make a client connect to the AP.
        5. Shutdown wifi tethering.
        6. Ensure that the client disconnected.
        """
        wutils.wifi_toggle_state(self.dut, True)
        wutils.wifi_connect(self.dut, self.wifi_network)
        config = self.create_softap_config()
        wutils.start_wifi_tethering(self.dut,
                                    config[wutils.WifiEnums.SSID_KEY],
                                    config[wutils.WifiEnums.PWD_KEY],
                                    WIFI_CONFIG_APBAND_AUTO)
        asserts.assert_true(self.dut.droid.wifiIsApEnabled(),
                             "SoftAp is not reported as running")
        # local hotspot may not have internet connectivity
        self.confirm_softap_in_scan_results(config[wutils.WifiEnums.SSID_KEY])
        wutils.wifi_connect(self.dut_client, config, check_connectivity=False)
        wutils.verify_11ax_softap(self.dut, self.dut_client, self.wifi6_models)
        wutils.stop_wifi_tethering(self.dut)
        wutils.wait_for_disconnect(self.dut_client)

    @test_tracker_info(uuid="f2cf56ad-b8b9-43b6-ab15-a47b1d96b92e")
    def test_full_tether_startup_2G_with_airplane_mode_on(self):
        """Test full startup of wifi tethering in 2G band with
        airplane mode on.

        1. Turn on airplane mode.
        2. Report current state.
        3. Switch to AP mode.
        4. verify SoftAP active.
        5. Shutdown wifi tethering.
        6. verify back to previous mode.
        7. Turn off airplane mode.
        """
        self.dut.log.debug("Toggling Airplane mode ON.")
        asserts.assert_true(utils.force_airplane_mode(self.dut, True),
                            "Can not turn on airplane mode: %s" % self.dut.serial)
        wutils.wifi_toggle_state(self.dut, True)
        self.validate_full_tether_startup(WIFI_CONFIG_APBAND_2G)

    @test_tracker_info(uuid="883dd5b1-50c6-4958-a50f-bb4bea77ccaf")
    def test_full_tether_startup_2G_one_client_ping_softap(self):
        """(AP) 1 Device can connect to 2G hotspot

        Steps:
        1. Turn on DUT's 2G softap
        2. Client connects to the softap
        3. Client and DUT ping each other
        """
        self.validate_full_tether_startup(WIFI_CONFIG_APBAND_2G, test_ping=True)

    @test_tracker_info(uuid="6604e848-99d6-422c-9fdc-2882642438b6")
    def test_full_tether_startup_5G_one_client_ping_softap(self):
        """(AP) 1 Device can connect to 5G hotspot

        Steps:
        1. Turn on DUT's 5G softap
        2. Client connects to the softap
        3. Client and DUT ping each other
        """
        self.validate_full_tether_startup(WIFI_CONFIG_APBAND_5G, test_ping=True)

    @test_tracker_info(uuid="17725ecd-f900-4cf7-8b2d-d7515b0a595c")
    def test_softap_2G_two_clients_ping_each_other(self):
        """Test for 2G hotspot with 2 clients

        1. Turn on 2G hotspot
        2. Two clients connect to the hotspot
        3. Two clients ping each other
        """
        asserts.skip_if(len(self.android_devices) < 3,
                        "No extra android devices. Skip test")
        self.validate_full_tether_startup(WIFI_CONFIG_APBAND_2G, test_clients=True)

    @test_tracker_info(uuid="98c09888-1021-4f79-9065-b3cf9b132146")
    def test_softap_5G_two_clients_ping_each_other(self):
        """Test for 5G hotspot with 2 clients

        1. Turn on 5G hotspot
        2. Two clients connect to the hotspot
        3. Two clients ping each other
        """
        asserts.skip_if(len(self.android_devices) < 3,
                        "No extra android devices. Skip test")
        self.validate_full_tether_startup(WIFI_CONFIG_APBAND_5G, test_clients=True)

    @test_tracker_info(uuid="b991129e-030a-4998-9b08-0687270bec24")
    def test_number_of_softap_clients(self):
        """Test for number of softap clients to be updated correctly

        1. Turn of hotspot
        2. Register softap callback
        3. Let client connect to the hotspot
        4. Register second softap callback
        5. Force client connect/disconnect to hotspot
        6. Unregister second softap callback
        7. Force second client connect to hotspot (if supported)
        8. Turn off hotspot
        9. Verify second softap callback doesn't respond after unregister
        """
        config = wutils.start_softap_and_verify(self, WIFI_CONFIG_APBAND_AUTO)
        # Register callback after softap enabled to avoid unnecessary callback
        # impact the test
        callbackId = self.dut.droid.registerSoftApCallback()
        # Verify clients will update immediately after register callback
        wutils.wait_for_expected_number_of_softap_clients(
                self.dut, callbackId, 0)
        wutils.wait_for_expected_softap_state(self.dut, callbackId,
                wifi_constants.WIFI_AP_ENABLED_STATE)

        # Force DUTs connect to Network
        wutils.wifi_connect(self.dut_client, config,
                check_connectivity=False)
        wutils.wait_for_expected_number_of_softap_clients(
                self.dut, callbackId, 1)

        # Register another callback to verify multi callback clients case
        callbackId_2 = self.dut.droid.registerSoftApCallback()
        # Verify clients will update immediately after register callback
        wutils.wait_for_expected_number_of_softap_clients(
                self.dut, callbackId_2, 1)
        wutils.wait_for_expected_softap_state(self.dut, callbackId_2,
                wifi_constants.WIFI_AP_ENABLED_STATE)

        # Client Off/On Wifi to verify number of softap clients will be updated
        wutils.toggle_wifi_and_wait_for_reconnection(self.dut_client, config)

        wutils.wait_for_expected_number_of_softap_clients(self.dut,
                callbackId, 0)
        wutils.wait_for_expected_number_of_softap_clients(self.dut,
                callbackId_2, 0)
        wutils.wait_for_expected_number_of_softap_clients(self.dut,
                callbackId, 1)
        wutils.wait_for_expected_number_of_softap_clients(self.dut,
                callbackId_2, 1)

        # Unregister callbackId_2 to verify multi callback clients case
        self.dut.droid.unregisterSoftApCallback(callbackId_2)

        if len(self.android_devices) > 2:
            wutils.wifi_connect(self.android_devices[2], config,
                    check_connectivity=False)
            wutils.wait_for_expected_number_of_softap_clients(
                    self.dut, callbackId, 2)

        # Turn off softap when clients connected
        wutils.stop_wifi_tethering(self.dut)
        wutils.wait_for_disconnect(self.dut_client)
        if len(self.android_devices) > 2:
            wutils.wait_for_disconnect(self.android_devices[2])

        # Verify client number change back to 0 after softap stop if client
        # doesn't disconnect before softap stop
        wutils.wait_for_expected_softap_state(self.dut, callbackId,
                wifi_constants.WIFI_AP_DISABLING_STATE)
        wutils.wait_for_expected_softap_state(self.dut, callbackId,
                wifi_constants.WIFI_AP_DISABLED_STATE)
        wutils.wait_for_expected_number_of_softap_clients(
                self.dut, callbackId, 0)
        # Unregister callback
        self.dut.droid.unregisterSoftApCallback(callbackId)

        # Check no any callbackId_2 event after unregister
        asserts.assert_equal(
                wutils.get_current_number_of_softap_clients(
                self.dut, callbackId_2), None)

    @test_tracker_info(uuid="35bc4ba1-bade-42ee-a563-0c73afb2402a")
    def test_softap_auto_shut_off(self):
        """Test for softap auto shut off

        1. Turn off hotspot
        2. Register softap callback
        3. Let client connect to the hotspot
        4. Start wait [wifi_constants.DEFAULT_SOFTAP_TIMEOUT_S] seconds
        5. Check hotspot doesn't shut off
        6. Let client disconnect to the hotspot
        7. Start wait [wifi_constants.DEFAULT_SOFTAP_TIMEOUT_S] seconds
        8. Check hotspot auto shut off
        """
        config = wutils.start_softap_and_verify(self, WIFI_CONFIG_APBAND_AUTO)
        # Register callback after softap enabled to avoid unnecessary callback
        # impact the test
        callbackId = self.dut.droid.registerSoftApCallback()
        # Verify clients will update immediately after register callback
        wutils.wait_for_expected_number_of_softap_clients(self.dut,
                callbackId, 0)
        wutils.wait_for_expected_softap_state(self.dut, callbackId,
                wifi_constants.WIFI_AP_ENABLED_STATE)

        # Force DUTs connect to Network
        wutils.wifi_connect(self.dut_client, config, check_connectivity=False)
        wutils.wait_for_expected_number_of_softap_clients(
                self.dut, callbackId, 1)

        self.dut.log.info("Start waiting %s seconds with 1 clients ",
                wifi_constants.DEFAULT_SOFTAP_TIMEOUT_S*1.1)
        time.sleep(wifi_constants.DEFAULT_SOFTAP_TIMEOUT_S*1.1)

        # When client connected, softap should keep as enabled
        asserts.assert_true(self.dut.droid.wifiIsApEnabled(),
                "SoftAp is not reported as running")

        wutils.wifi_toggle_state(self.dut_client, False)
        wutils.wait_for_expected_number_of_softap_clients(self.dut,
                callbackId, 0)
        self.dut.log.info("Start waiting %s seconds with 0 client",
                wifi_constants.DEFAULT_SOFTAP_TIMEOUT_S*1.1)
        time.sleep(wifi_constants.DEFAULT_SOFTAP_TIMEOUT_S*1.1)
        # Softap should stop since no client connected
        # doesn't disconnect before softap stop
        wutils.wait_for_expected_softap_state(self.dut, callbackId,
                wifi_constants.WIFI_AP_DISABLING_STATE)
        wutils.wait_for_expected_softap_state(self.dut, callbackId,
                wifi_constants.WIFI_AP_DISABLED_STATE)
        asserts.assert_false(self.dut.droid.wifiIsApEnabled(),
                "SoftAp is not reported as running")
        self.dut.droid.unregisterSoftApCallback(callbackId)

    @test_tracker_info(uuid="3a10c7fd-cd8d-4d46-9d12-88a68640e060")
    def test_softap_auto_shut_off_with_customized_timeout(self):
        """Test for softap auto shut off
        1. Turn on hotspot
        2. Register softap callback
        3. Backup original shutdown timeout value
        4. Set up test_shutdown_timeout_value
        5. Let client connect to the hotspot
        6. Start wait test_shutdown_timeout_value * 1.1 seconds
        7. Check hotspot doesn't shut off
        8. Let client disconnect to the hotspot
        9. Start wait test_shutdown_timeout_value seconds
        10. Check hotspot auto shut off
        """
        # Backup config
        original_softap_config = self.dut.droid.wifiGetApConfiguration()
        # This config only included SSID and Password which used for connection
        # only.
        config = wutils.start_softap_and_verify(self, WIFI_CONFIG_APBAND_AUTO)

        # Get current configuration to use for update configuration
        current_softap_config = self.dut.droid.wifiGetApConfiguration()
        # Register callback after softap enabled to avoid unnecessary callback
        # impact the test
        callbackId = self.dut.droid.registerSoftApCallback()
        # Verify clients will update immediately after register callback
        wutils.wait_for_expected_number_of_softap_clients(self.dut,
                callbackId, 0)
        wutils.wait_for_expected_softap_state(self.dut, callbackId,
                wifi_constants.WIFI_AP_ENABLED_STATE)

        # Setup shutdown timeout value
        test_shutdown_timeout_value_s = 10
        wutils.save_wifi_soft_ap_config(self.dut, current_softap_config,
            shutdown_timeout_millis=test_shutdown_timeout_value_s * 1000)
        # Force DUTs connect to Network
        wutils.wifi_connect(self.dut_client, config, check_connectivity=False)
        wutils.wait_for_expected_number_of_softap_clients(
                self.dut, callbackId, 1)

        self.dut.log.info("Start waiting %s seconds with 1 clients ",
                test_shutdown_timeout_value_s * 1.1)
        time.sleep(test_shutdown_timeout_value_s * 1.1)

        # When client connected, softap should keep as enabled
        asserts.assert_true(self.dut.droid.wifiIsApEnabled(),
                "SoftAp is not reported as running")

        wutils.wifi_toggle_state(self.dut_client, False)
        wutils.wait_for_expected_number_of_softap_clients(self.dut,
                callbackId, 0)
        self.dut.log.info("Start waiting %s seconds with 0 client",
                test_shutdown_timeout_value_s * 1.1)
        time.sleep(test_shutdown_timeout_value_s * 1.1)
        # Softap should stop since no client connected
        # doesn't disconnect before softap stop
        wutils.wait_for_expected_softap_state(self.dut, callbackId,
                wifi_constants.WIFI_AP_DISABLING_STATE)
        wutils.wait_for_expected_softap_state(self.dut, callbackId,
                wifi_constants.WIFI_AP_DISABLED_STATE)
        asserts.assert_false(self.dut.droid.wifiIsApEnabled(),
                "SoftAp is not reported as running")
        self.dut.droid.unregisterSoftApCallback(callbackId)

        # Restore config
        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)

    @test_tracker_info(uuid="a9444699-f0d3-4ac3-922b-05e9d4f67968")
    def test_softap_configuration_update(self):
      """Test for softap configuration update
        1. Get current softap configuration
        2. Update to Open Security configuration
        3. Update to WPA2_PSK configuration
        4. Update to Multi-Channels, Mac Randomization off,
           bridged_shutdown off, 11ax off configuration which are introduced in S.
        5. Restore the configuration
      """
      # Backup config
      original_softap_config = self.dut.droid.wifiGetApConfiguration()
      wutils.save_wifi_soft_ap_config(self.dut, {"SSID":"ACTS_TEST"},
          band=WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G, hidden=False,
          security=WifiEnums.SoftApSecurityType.OPEN, password="",
          channel=11, max_clients=0, shutdown_timeout_enable=False,
          shutdown_timeout_millis=0, client_control_enable=True,
          allowedList=[], blockedList=[])

      wutils.save_wifi_soft_ap_config(self.dut, {"SSID":"ACTS_TEST"},
          band=WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G, hidden=True,
          security=WifiEnums.SoftApSecurityType.WPA2, password="12345678",
          channel=0, max_clients=1, shutdown_timeout_enable=True,
          shutdown_timeout_millis=10000, client_control_enable=False,
          allowedList=["aa:bb:cc:dd:ee:ff"], blockedList=["11:22:33:44:55:66"])

      if self.dut.droid.isSdkAtLeastS():
          wutils.save_wifi_soft_ap_config(self.dut, {"SSID":"ACTS_TEST"},
              channel_frequencys=[2412,5745],
              mac_randomization_setting = wifi_constants.SOFTAP_RANDOMIZATION_NONE,
              bridged_opportunistic_shutdown_enabled=False,
              ieee80211ax_enabled=False)

      # Restore config
      wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)

    @test_tracker_info(uuid="8a5d81fa-649c-4679-a823-5cef50828a94")
    def test_softap_client_control(self):
        """Test Client Control feature
        1. Check SoftApCapability to make sure feature is supported
        2. Backup config
        3. Setup configuration which used to start softap
        4. Register callback after softap enabled
        5. Trigger client connect to softap
        6. Verify blocking event
        7. Add client into allowed list
        8. Verify client connected
        9. Restore Config
        """
        # Register callback to check capability first
        callbackId = self.dut.droid.registerSoftApCallback()
        # Check capability first to make sure DUT support this test.
        capabilityEventStr = wifi_constants.SOFTAP_CALLBACK_EVENT + str(
            callbackId) + wifi_constants.SOFTAP_CAPABILITY_CHANGED
        capability = self.dut.ed.pop_event(capabilityEventStr, 10)
        asserts.skip_if(not capability['data'][wifi_constants
            .SOFTAP_CAPABILITY_FEATURE_CLIENT_CONTROL],
            "Client control isn't supported, ignore test")

        # Unregister callback before start test to avoid
        # unnecessary callback impact the test
        self.dut.droid.unregisterSoftApCallback(callbackId)

        # start the test

        # Backup config
        original_softap_config = self.dut.droid.wifiGetApConfiguration()
        # Setup configuration which used to start softap
        wutils.save_wifi_soft_ap_config(self.dut, {"SSID":"ACTS_TEST"},
            band=WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G, hidden=False,
            security=WifiEnums.SoftApSecurityType.WPA2, password="12345678",
            client_control_enable=True)

        wutils.start_wifi_tethering_saved_config(self.dut)
        current_softap_config = self.dut.droid.wifiGetApConfiguration()
        # Register callback after softap enabled to avoid unnecessary callback
        # impact the test
        callbackId = self.dut.droid.registerSoftApCallback()

        # Verify clients will update immediately after register callback
        wutils.wait_for_expected_number_of_softap_clients(self.dut,
                callbackId, 0)
        wutils.wait_for_expected_softap_state(self.dut, callbackId,
                wifi_constants.WIFI_AP_ENABLED_STATE)

        # Trigger client connection
        self.dut_client.droid.wifiConnectByConfig(current_softap_config)

        eventStr = wifi_constants.SOFTAP_CALLBACK_EVENT + str(
            callbackId) + wifi_constants.SOFTAP_BLOCKING_CLIENT_CONNECTING
        blockedClient = self.dut.ed.pop_event(eventStr, 10)
        asserts.assert_equal(blockedClient['data'][wifi_constants.
            SOFTAP_BLOCKING_CLIENT_REASON_KEY],
            wifi_constants.SAP_CLIENT_BLOCK_REASON_CODE_BLOCKED_BY_USER,
            "Blocked reason code doesn't match")

        # Update configuration, add client into allowed list
        wutils.save_wifi_soft_ap_config(self.dut, current_softap_config,
            allowedList=[blockedClient['data'][wifi_constants.
            SOFTAP_BLOCKING_CLIENT_WIFICLIENT_KEY]])

        # Wait configuration updated
        time.sleep(3)
        # Trigger connection again
        self.dut_client.droid.wifiConnectByConfig(current_softap_config)

        # Verify client connected
        wutils.wait_for_expected_number_of_softap_clients(self.dut,
                callbackId, 1)

        # Restore config
        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)

        # Unregister callback
        self.dut.droid.unregisterSoftApCallback(callbackId)

    @test_tracker_info(uuid="d0b61b58-fa2b-4ced-bc52-3366cb826e79")
    def test_softap_max_client_setting(self):
        """Test Client Control feature
        1. Check device number and capability to make sure feature is supported
        2. Backup config
        3. Setup configuration which used to start softap
        4. Register callback after softap enabled
        5. Trigger client connect to softap
        6. Verify blocking event
        7. Extend max client setting
        8. Verify client connected
        9. Restore Config
        """
        asserts.skip_if(len(self.android_devices) < 3,
                        "Device less than 3, skip the test.")
        # Register callback to check capability first
        callbackId = self.dut.droid.registerSoftApCallback()
        # Check capability first to make sure DUT support this test.
        capabilityEventStr = wifi_constants.SOFTAP_CALLBACK_EVENT + str(
            callbackId) + wifi_constants.SOFTAP_CAPABILITY_CHANGED
        capability = self.dut.ed.pop_event(capabilityEventStr, 10)
        asserts.skip_if(not capability['data'][wifi_constants
            .SOFTAP_CAPABILITY_FEATURE_CLIENT_CONTROL],
            "Client control isn't supported, ignore test")

        # Unregister callback before start test to avoid
        # unnecessary callback impact the test
        self.dut.droid.unregisterSoftApCallback(callbackId)

        # Backup config
        original_softap_config = self.dut.droid.wifiGetApConfiguration()
        # Setup configuration which used to start softap
        wutils.save_wifi_soft_ap_config(self.dut, {"SSID":"ACTS_TEST"},
            band=WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G, hidden=False,
            security=WifiEnums.SoftApSecurityType.WPA2, password="12345678",
            max_clients=1)

        wutils.start_wifi_tethering_saved_config(self.dut)
        current_softap_config = self.dut.droid.wifiGetApConfiguration()
        # Register callback again after softap enabled to avoid
        # unnecessary callback impact the test
        callbackId = self.dut.droid.registerSoftApCallback()

        # Verify clients will update immediately after register calliback
        wutils.wait_for_expected_number_of_softap_clients(self.dut,
                callbackId, 0)
        wutils.wait_for_expected_softap_state(self.dut, callbackId,
                wifi_constants.WIFI_AP_ENABLED_STATE)

        # Trigger client connection
        self.dut_client.droid.wifiConnectByConfig(current_softap_config)
        self.dut_client_2.droid.wifiConnectByConfig(current_softap_config)
        # Wait client connect
        time.sleep(3)

        # Verify one client connected and one blocked due to max client
        eventStr = wifi_constants.SOFTAP_CALLBACK_EVENT + str(
            callbackId) + wifi_constants.SOFTAP_BLOCKING_CLIENT_CONNECTING
        blockedClient = self.dut.ed.pop_event(eventStr, 10)
        asserts.assert_equal(blockedClient['data'][wifi_constants.
            SOFTAP_BLOCKING_CLIENT_REASON_KEY],
            wifi_constants.SAP_CLIENT_BLOCK_REASON_CODE_NO_MORE_STAS,
            "Blocked reason code doesn't match")
        wutils.wait_for_expected_number_of_softap_clients(self.dut,
                callbackId, 1)

        # Update configuration, extend client to 2
        wutils.save_wifi_soft_ap_config(self.dut, current_softap_config,
            max_clients=2)

        # Wait configuration updated
        time.sleep(3)
        # Trigger connection again
        self.dut_client_2.droid.wifiConnectByConfig(current_softap_config)
        # Wait client connect
        time.sleep(3)
        # Verify client connected
        wutils.wait_for_expected_number_of_softap_clients(self.dut,
                callbackId, 2)

        # Restore config
        wutils.save_wifi_soft_ap_config(self.dut, original_softap_config)

        # Unregister callback
        self.dut.droid.unregisterSoftApCallback(callbackId)

    @test_tracker_info(uuid="07b4e5b3-48ce-49b9-a83e-3e288bb88e91")
    def test_softap_5g_preferred_country_code_de(self):
        """Verify softap works when set to 5G preferred band
           with country code 'DE'.

        Steps:
            1. Set country code to Germany
            2. Save a softap configuration set to 5G preferred band.
            3. Start softap and verify it works
            4. Verify a client device can connect to it.
        """
        wutils.set_wifi_country_code(
            self.dut, wutils.WifiEnums.CountryCode.GERMANY)
        sap_config = self.create_softap_config()
        wifi_network = sap_config.copy()
        sap_config[
            WifiEnums.AP_BAND_KEY] = WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G
        sap_config[WifiEnums.SECURITY] = WifiEnums.SoftApSecurityType.WPA2
        asserts.assert_true(
            self.dut.droid.wifiSetWifiApConfiguration(sap_config),
            "Failed to set WifiAp Configuration")
        wutils.start_wifi_tethering_saved_config(self.dut)
        softap_conf = self.dut.droid.wifiGetApConfiguration()
        self.log.info("softap conf: %s" % softap_conf)
        sap_band = softap_conf[WifiEnums.AP_BAND_KEY]
        asserts.assert_true(
            sap_band == WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G_5G,
            "Soft AP didn't start in 5G preferred band")
        wutils.connect_to_wifi_network(self.dut_client, wifi_network)
        wutils.verify_11ax_softap(self.dut, self.dut_client, self.wifi6_models)

    @test_tracker_info(uuid="dbcd653c-ec65-400f-a6ce-77bb13add473")
    def test_softp_2g_channel_when_connected_to_chan_13(self):
        """Verify softAp 2G channel when connected to network on channel 13.

        Steps:
            1. Configure AP in channel 13 on 2G band and connect DUT to it.
            2. Start softAp on DUT on 2G band.
            3. Verify softAp is started on channel 13.
        """
        asserts.skip_if("OpenWrtAP" not in self.user_params,
                        "Need openwrt AP to configure channel 13.")
        wutils.connect_to_wifi_network(self.dut, self.wifi_network)
        sap_config = self.create_softap_config()
        sap_config[WifiEnums.AP_BAND_KEY] = WifiEnums.WIFI_CONFIG_SOFTAP_BAND_2G
        asserts.assert_true(
            self.dut.droid.wifiSetWifiApConfiguration(sap_config),
            "Failed to set WifiAp Configuration")
        wutils.start_wifi_tethering_saved_config(self.dut)
        softap_conf = self.dut.droid.wifiGetApConfiguration()
        self.log.info("softap conf: %s" % softap_conf)
        wutils.connect_to_wifi_network(self.dut_client, sap_config)
        softap_channel = self.dut_client.droid.wifiGetConnectionInfo(
                )
        conn_info = self.dut_client.droid.wifiGetConnectionInfo()
        self.log.info("Wifi connection info on dut_client: %s" % conn_info)
        softap_channel = wutils.WifiEnums.freq_to_channel[conn_info["frequency"]]
        asserts.assert_true(softap_channel == 13,
                            "Dut client did not connect to softAp on channel 13")

    """ Tests End """


if __name__ == "__main__":
    pass
