#!/usr/bin/env python3
#
#   Copyright 2019 - 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.

from acts import asserts
from acts import utils

from acts.controllers.access_point import setup_ap
from acts.controllers.ap_lib import hostapd_ap_preset
from acts.controllers.ap_lib import hostapd_constants
from acts_contrib.test_utils.abstract_devices.wlan_device import create_wlan_device
from acts_contrib.test_utils.abstract_devices.wlan_device_lib.AbstractDeviceWlanDeviceBaseTest import AbstractDeviceWlanDeviceBaseTest
from acts_contrib.test_utils.wifi.WifiBaseTest import WifiBaseTest


class WlanPhyComplianceABGTest(AbstractDeviceWlanDeviceBaseTest):
    """Tests for validating 11a, 11b, and 11g PHYS.

    Test Bed Requirement:
    * One Android device or Fuchsia device
    * One Access Point
    """

    def setup_class(self):
        super().setup_class()
        if 'dut' in self.user_params:
            if self.user_params['dut'] == 'fuchsia_devices':
                self.dut = create_wlan_device(self.fuchsia_devices[0])
            elif self.user_params['dut'] == 'android_devices':
                self.dut = create_wlan_device(self.android_devices[0])
            else:
                raise ValueError('Invalid DUT specified in config. (%s)' %
                                 self.user_params['dut'])
        else:
            # Default is an android device, just like the other tests
            self.dut = create_wlan_device(self.android_devices[0])

        self.access_point = self.access_points[0]
        open_network = self.get_open_network(False, [])
        open_network_min_len = self.get_open_network(
            False, [],
            ssid_length_2g=hostapd_constants.AP_SSID_MIN_LENGTH_2G,
            ssid_length_5g=hostapd_constants.AP_SSID_MIN_LENGTH_5G)
        open_network_max_len = self.get_open_network(
            False, [],
            ssid_length_2g=hostapd_constants.AP_SSID_MAX_LENGTH_2G,
            ssid_length_5g=hostapd_constants.AP_SSID_MAX_LENGTH_5G)
        self.open_network_2g = open_network['2g']
        self.open_network_5g = open_network['5g']
        self.open_network_max_len_2g = open_network_max_len['2g']
        self.open_network_max_len_2g['SSID'] = (
            self.open_network_max_len_2g['SSID'][3:])
        self.open_network_max_len_5g = open_network_max_len['5g']
        self.open_network_max_len_5g['SSID'] = (
            self.open_network_max_len_5g['SSID'][3:])
        self.open_network_min_len_2g = open_network_min_len['2g']
        self.open_network_min_len_2g['SSID'] = (
            self.open_network_min_len_2g['SSID'][3:])
        self.open_network_min_len_5g = open_network_min_len['5g']
        self.open_network_min_len_5g['SSID'] = (
            self.open_network_min_len_5g['SSID'][3:])

        self.utf8_ssid_2g = '2𝔤_𝔊𝔬𝔬𝔤𝔩𝔢'
        self.utf8_ssid_5g = '5𝔤_𝔊𝔬𝔬𝔤𝔩𝔢'

        self.utf8_ssid_2g_french = 'Château du Feÿ'
        self.utf8_password_2g_french = 'du Feÿ Château'

        self.utf8_ssid_2g_german = 'Rat für Straßenatlas'
        self.utf8_password_2g_german = 'für Straßenatlas Rat'

        self.utf8_ssid_2g_dutch = 'Die niet óúd, is níéuw!'
        self.utf8_password_2g_dutch = 'niet óúd, is níéuw! Die'

        self.utf8_ssid_2g_swedish = 'Det är femtioåtta'
        self.utf8_password_2g_swedish = 'femtioåtta Det är'

        self.utf8_ssid_2g_norwegian = 'Curaçao ØÆ æ å å å'
        self.utf8_password_2g_norwegian = 'ØÆ Curaçao æ å å å'

        #Danish and Norwegian has the same alphabet
        self.utf8_ssid_2g_danish = self.utf8_ssid_2g_norwegian
        self.utf8_password_2g_danish = self.utf8_password_2g_norwegian

        self.utf8_ssid_2g_japanese = 'あなた　はお母さん'
        self.utf8_password_2g_japanese = 'そっくりね。あな'

        self.utf8_ssid_2g_spanish = '¡No á,é,í,ó,ú,ü,ñ,¿,¡'
        self.utf8_password_2g_spanish = 'á,é,í,ó,ú,ü,ñ,¿,¡ ¡No'

        self.utf8_ssid_2g_italian = 'caffè Pinocchio è italiano?'
        self.utf8_password_2g_italian = 'Pinocchio è italiano? caffè'

        self.utf8_ssid_2g_korean = 'ㅘㅙㅚㅛㅜㅝㅞㅟㅠ'
        self.utf8_password_2g_korean = 'ㅜㅝㅞㅟㅠㅘㅙㅚㅛ'

        self.access_point.stop_all_aps()

    def setup_test(self):
        if hasattr(self, "android_devices"):
            for ad in self.android_devices:
                ad.droid.wakeLockAcquireBright()
                ad.droid.wakeUpNow()
        self.dut.wifi_toggle_state(True)

    def teardown_test(self):
        if hasattr(self, "android_devices"):
            for ad in self.android_devices:
                ad.droid.wakeLockRelease()
                ad.droid.goToSleepNow()
        self.dut.turn_location_off_and_scan_toggle_off()
        self.dut.disconnect()
        self.dut.reset_wifi()
        self.access_point.stop_all_aps()

    def on_fail(self, test_name, begin_time):
        super().on_fail(test_name, begin_time)
        self.access_point.stop_all_aps()

    def test_associate_11b_only_long_preamble(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 preamble=False)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_short_preamble(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 preamble=True)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_minimal_beacon_interval(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 beacon_interval=15)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_maximum_beacon_interval(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 beacon_interval=1024)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_frag_threshold_430(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 frag_threshold=430)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_rts_threshold_256(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 rts_threshold=256)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_rts_256_frag_430(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 rts_threshold=256,
                 frag_threshold=430)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_high_dtim_low_beacon_interval(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 dtim_period=3,
                 beacon_interval=100)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_low_dtim_high_beacon_interval(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 dtim_period=1,
                 beacon_interval=300)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_WMM_with_default_values(self):
        setup_ap(
            access_point=self.access_point,
            profile_name='whirlwind_11ab_legacy',
            channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
            ssid=self.open_network_2g['SSID'],
            force_wmm=True,
            additional_ap_parameters=hostapd_constants.WMM_11B_DEFAULT_PARAMS)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_WMM_with_non_default_values(self):
        setup_ap(
            access_point=self.access_point,
            profile_name='whirlwind_11ab_legacy',
            channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
            ssid=self.open_network_2g['SSID'],
            force_wmm=True,
            additional_ap_parameters=hostapd_constants.WMM_NON_DEFAULT_PARAMS)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_WMM_ACM_on_BK(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_11B_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_WMM_ACM_on_BE(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_11B_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BE)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_WMM_ACM_on_VI(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_11B_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_VI)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_WMM_ACM_on_VO(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_11B_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_VO)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_WMM_ACM_on_BK_BE_VI(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_11B_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK, hostapd_constants.WMM_ACM_BE,
            hostapd_constants.WMM_ACM_VI)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_WMM_ACM_on_BK_BE_VO(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_11B_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK, hostapd_constants.WMM_ACM_BE,
            hostapd_constants.WMM_ACM_VO)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_WMM_ACM_on_BK_VI_VO(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_11B_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK, hostapd_constants.WMM_ACM_VI,
            hostapd_constants.WMM_ACM_VO)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_WMM_ACM_on_BE_VI_VO(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_11B_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BE, hostapd_constants.WMM_ACM_VI,
            hostapd_constants.WMM_ACM_VO)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_country_code(self):
        country_info = utils.merge_dicts(
            hostapd_constants.ENABLE_IEEE80211D,
            hostapd_constants.COUNTRY_STRING['ALL'],
            hostapd_constants.COUNTRY_CODE['UNITED_STATES'])
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=country_info)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_non_country_code(self):
        country_info = utils.merge_dicts(
            hostapd_constants.ENABLE_IEEE80211D,
            hostapd_constants.COUNTRY_STRING['ALL'],
            hostapd_constants.COUNTRY_CODE['NON_COUNTRY'])
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=country_info)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_hidden_ssid(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 hidden=True)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_vendor_ie_in_beacon_correct_length(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=hostapd_constants.
                 VENDOR_IE['correct_length_beacon'])
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_vendor_ie_in_beacon_zero_length(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=hostapd_constants.
                 VENDOR_IE['zero_length_beacon_without_data'])
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_vendor_ie_in_assoc_correct_length(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=hostapd_constants.
                 VENDOR_IE['correct_length_association_response'])
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11b_only_with_vendor_ie_in_assoc_zero_length(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=hostapd_constants.VENDOR_IE[
                     'zero_length_association_'
                     'response_without_data'])
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_long_preamble(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 preamble=False)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_short_preamble(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 preamble=True)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_minimal_beacon_interval(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 beacon_interval=15)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_maximum_beacon_interval(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 beacon_interval=1024)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_frag_threshold_430(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 frag_threshold=430)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_rts_threshold_256(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 rts_threshold=256)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_rts_256_frag_430(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 rts_threshold=256,
                 frag_threshold=430)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_high_dtim_low_beacon_interval(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 dtim_period=3,
                 beacon_interval=100)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_low_dtim_high_beacon_interval(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 dtim_period=1,
                 beacon_interval=300)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_WMM_with_default_values(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=hostapd_constants.
                 WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_WMM_with_non_default_values(self):
        setup_ap(
            access_point=self.access_point,
            profile_name='whirlwind_11ab_legacy',
            channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
            ssid=self.open_network_5g['SSID'],
            force_wmm=True,
            additional_ap_parameters=hostapd_constants.WMM_NON_DEFAULT_PARAMS)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_WMM_ACM_on_BK(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_WMM_ACM_on_BE(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BE)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_WMM_ACM_on_VI(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_VI)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_WMM_ACM_on_VO(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_VO)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_WMM_ACM_on_BK_BE_VI(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK, hostapd_constants.WMM_ACM_BE,
            hostapd_constants.WMM_ACM_VI)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_WMM_ACM_on_BK_BE_VO(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK, hostapd_constants.WMM_ACM_BE,
            hostapd_constants.WMM_ACM_VO)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_WMM_ACM_on_BK_VI_VO(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK, hostapd_constants.WMM_ACM_VI,
            hostapd_constants.WMM_ACM_VO)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_WMM_ACM_on_BE_VI_VO(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BE, hostapd_constants.WMM_ACM_VI,
            hostapd_constants.WMM_ACM_VO)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_country_code(self):
        country_info = utils.merge_dicts(
            hostapd_constants.ENABLE_IEEE80211D,
            hostapd_constants.COUNTRY_STRING['ALL'],
            hostapd_constants.COUNTRY_CODE['UNITED_STATES'])
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 additional_ap_parameters=country_info)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_non_country_code(self):
        country_info = utils.merge_dicts(
            hostapd_constants.ENABLE_IEEE80211D,
            hostapd_constants.COUNTRY_STRING['ALL'],
            hostapd_constants.COUNTRY_CODE['NON_COUNTRY'])
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 additional_ap_parameters=country_info)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_hidden_ssid(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 hidden=True)
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_vendor_ie_in_beacon_correct_length(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 additional_ap_parameters=hostapd_constants.
                 VENDOR_IE['correct_length_beacon'])
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_vendor_ie_in_beacon_zero_length(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 additional_ap_parameters=hostapd_constants.
                 VENDOR_IE['zero_length_beacon_without_data'])
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_vendor_ie_in_assoc_correct_length(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 additional_ap_parameters=hostapd_constants.
                 VENDOR_IE['correct_length_association_response'])
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11a_only_with_vendor_ie_in_assoc_zero_length(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_5g['SSID'],
                 additional_ap_parameters=hostapd_constants.VENDOR_IE[
                     'zero_length_association_'
                     'response_without_data'])
        asserts.assert_true(self.dut.associate(self.open_network_5g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_long_preamble(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 preamble=False,
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_short_preamble(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 preamble=True,
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_minimal_beacon_interval(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 beacon_interval=15,
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_maximum_beacon_interval(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 beacon_interval=1024,
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_frag_threshold_430(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 frag_threshold=430,
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_rts_threshold_256(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 rts_threshold=256,
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_rts_256_frag_430(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 rts_threshold=256,
                 frag_threshold=430,
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_high_dtim_low_beacon_interval(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 dtim_period=3,
                 beacon_interval=100,
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_low_dtim_high_beacon_interval(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 dtim_period=1,
                 beacon_interval=300,
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_WMM_with_default_values(self):
        data_rates = utils.merge_dicts(
            hostapd_constants.OFDM_DATA_RATES,
            hostapd_constants.OFDM_ONLY_BASIC_RATES,
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_WMM_with_non_default_values(self):
        data_rates = utils.merge_dicts(
            hostapd_constants.OFDM_DATA_RATES,
            hostapd_constants.OFDM_ONLY_BASIC_RATES,
            hostapd_constants.WMM_NON_DEFAULT_PARAMS)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_WMM_ACM_on_BK(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK, data_rates)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_WMM_ACM_on_BE(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BE, data_rates)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_WMM_ACM_on_VI(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_VI, data_rates)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_WMM_ACM_on_VO(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_VO, data_rates)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_WMM_ACM_on_BK_BE_VI(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK, hostapd_constants.WMM_ACM_BE,
            hostapd_constants.WMM_ACM_VI, data_rates)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_WMM_ACM_on_BK_BE_VO(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK, hostapd_constants.WMM_ACM_BE,
            hostapd_constants.WMM_ACM_VO, data_rates)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_WMM_ACM_on_BK_VI_VO(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK, hostapd_constants.WMM_ACM_VI,
            hostapd_constants.WMM_ACM_VO, data_rates)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_WMM_ACM_on_BE_VI_VO(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BE, hostapd_constants.WMM_ACM_VI,
            hostapd_constants.WMM_ACM_VO, data_rates)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_country_code(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        country_info = utils.merge_dicts(
            hostapd_constants.ENABLE_IEEE80211D,
            hostapd_constants.COUNTRY_STRING['ALL'],
            hostapd_constants.COUNTRY_CODE['UNITED_STATES'], data_rates)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=country_info)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_non_country_code(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        country_info = utils.merge_dicts(
            hostapd_constants.ENABLE_IEEE80211D,
            hostapd_constants.COUNTRY_STRING['ALL'],
            hostapd_constants.COUNTRY_CODE['NON_COUNTRY'], data_rates)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=country_info)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_hidden_ssid(self):
        data_rates = utils.merge_dicts(hostapd_constants.OFDM_DATA_RATES,
                                       hostapd_constants.OFDM_ONLY_BASIC_RATES)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 hidden=True,
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_vendor_ie_in_beacon_correct_length(self):
        data_rates = utils.merge_dicts(
            hostapd_constants.OFDM_DATA_RATES,
            hostapd_constants.OFDM_ONLY_BASIC_RATES,
            hostapd_constants.VENDOR_IE['correct_length_beacon'])
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_vendor_ie_in_beacon_zero_length(self):
        data_rates = utils.merge_dicts(
            hostapd_constants.OFDM_DATA_RATES,
            hostapd_constants.OFDM_ONLY_BASIC_RATES,
            hostapd_constants.VENDOR_IE['zero_length_beacon_without_data'])
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_vendor_ie_in_assoc_correct_length(self):
        data_rates = utils.merge_dicts(
            hostapd_constants.OFDM_DATA_RATES,
            hostapd_constants.OFDM_ONLY_BASIC_RATES,
            hostapd_constants.VENDOR_IE['correct_length_association_response'])
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_vendor_ie_in_assoc_zero_length(self):
        data_rates = utils.merge_dicts(
            hostapd_constants.OFDM_DATA_RATES,
            hostapd_constants.OFDM_ONLY_BASIC_RATES,
            hostapd_constants.VENDOR_IE['correct_length_association_response'],
            hostapd_constants.VENDOR_IE['zero_length_association_'
                                        'response_without_data'])
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_only_long_preamble(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 preamble=False)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_short_preamble(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 preamble=True)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_minimal_beacon_interval(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 beacon_interval=15)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_maximum_beacon_interval(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 beacon_interval=1024)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_frag_threshold_430(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 frag_threshold=430)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_rts_threshold_256(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 rts_threshold=256)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_rts_256_frag_430(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 rts_threshold=256,
                 frag_threshold=430)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_high_dtim_low_beacon_interval(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 dtim_period=3,
                 beacon_interval=100)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_low_dtim_high_beacon_interval(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 dtim_period=1,
                 beacon_interval=300)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_with_WMM_with_default_values(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=hostapd_constants.
                 WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_with_WMM_with_non_default_values(self):
        setup_ap(
            access_point=self.access_point,
            profile_name='whirlwind_11ag_legacy',
            channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
            ssid=self.open_network_2g['SSID'],
            force_wmm=True,
            additional_ap_parameters=hostapd_constants.WMM_NON_DEFAULT_PARAMS)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_with_WMM_ACM_on_BK(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_with_WMM_ACM_on_BE(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BE)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_with_WMM_ACM_on_VI(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_VI)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_with_WMM_ACM_on_VO(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_VO)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_with_WMM_ACM_on_BK_BE_VI(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK, hostapd_constants.WMM_ACM_BE,
            hostapd_constants.WMM_ACM_VI)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_with_WMM_ACM_on_BK_BE_VO(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK, hostapd_constants.WMM_ACM_BE,
            hostapd_constants.WMM_ACM_VO)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_with_WMM_ACM_on_BK_VI_VO(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BK, hostapd_constants.WMM_ACM_VI,
            hostapd_constants.WMM_ACM_VO)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_with_WMM_ACM_on_BE_VI_VO(self):
        wmm_acm_bits_enabled = utils.merge_dicts(
            hostapd_constants.WMM_PHYS_11A_11G_11N_11AC_DEFAULT_PARAMS,
            hostapd_constants.WMM_ACM_BE, hostapd_constants.WMM_ACM_VI,
            hostapd_constants.WMM_ACM_VO)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 force_wmm=True,
                 additional_ap_parameters=wmm_acm_bits_enabled)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_with_country_code(self):
        country_info = utils.merge_dicts(
            hostapd_constants.ENABLE_IEEE80211D,
            hostapd_constants.COUNTRY_STRING['ALL'],
            hostapd_constants.COUNTRY_CODE['UNITED_STATES'])
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=country_info)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_with_non_country_code(self):
        country_info = utils.merge_dicts(
            hostapd_constants.ENABLE_IEEE80211D,
            hostapd_constants.COUNTRY_STRING['ALL'],
            hostapd_constants.COUNTRY_CODE['NON_COUNTRY'])
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=country_info)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_only_with_hidden_ssid(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 hidden=True)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_with_vendor_ie_in_beacon_correct_length(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=hostapd_constants.
                 VENDOR_IE['correct_length_beacon'])
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11bg_with_vendor_ie_in_beacon_zero_length(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=hostapd_constants.
                 VENDOR_IE['zero_length_beacon_without_data'])
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_vendor_ie_in_assoc_correct_length(self):
        data_rates = utils.merge_dicts(
            hostapd_constants.OFDM_DATA_RATES,
            hostapd_constants.OFDM_ONLY_BASIC_RATES,
            hostapd_constants.VENDOR_IE['correct_length_association_response'])
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_associate_11g_only_with_vendor_ie_in_assoc_zero_length(self):
        data_rates = utils.merge_dicts(
            hostapd_constants.OFDM_DATA_RATES,
            hostapd_constants.OFDM_ONLY_BASIC_RATES,
            hostapd_constants.VENDOR_IE['correct_length_association_response'],
            hostapd_constants.VENDOR_IE['zero_length_association_'
                                        'response_without_data'])
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ag_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_2g['SSID'],
                 additional_ap_parameters=data_rates)
        asserts.assert_true(self.dut.associate(self.open_network_2g['SSID']),
                            'Failed to associate.')

    def test_minimum_ssid_length_2g_11n_20mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_min_len_2g['SSID'])
        asserts.assert_true(
            self.dut.associate(self.open_network_min_len_2g['SSID']),
            'Failed to associate.')

    def test_minimum_ssid_length_5g_11ac_80mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_min_len_5g['SSID'])
        asserts.assert_true(
            self.dut.associate(self.open_network_min_len_5g['SSID']),
            'Failed to associate.')

    def test_maximum_ssid_length_2g_11n_20mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.open_network_max_len_2g['SSID'])
        asserts.assert_true(
            self.dut.associate(self.open_network_max_len_2g['SSID']),
            'Failed to associate.')

    def test_maximum_ssid_length_5g_11ac_80mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.open_network_max_len_5g['SSID'])
        asserts.assert_true(
            self.dut.associate(self.open_network_max_len_5g['SSID']),
            'Failed to associate.')

    def test_ssid_with_UTF8_characters_2g_11n_20mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.utf8_ssid_2g)
        asserts.assert_true(self.dut.associate(self.utf8_ssid_2g),
                            'Failed to associate.')

    def test_ssid_with_UTF8_characters_5g_11ac_80mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=self.utf8_ssid_5g)
        asserts.assert_true(self.dut.associate(self.utf8_ssid_5g),
                            'Failed to associate.')

    def test_ssid_with_UTF8_characters_french_2g_11n_20mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.utf8_ssid_2g_french)
        asserts.assert_true(self.dut.associate(self.utf8_ssid_2g_french),
                            'Failed to associate.')

    def test_ssid_with_UTF8_characters_german_2g_11n_20mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.utf8_ssid_2g_german)
        asserts.assert_true(self.dut.associate(self.utf8_ssid_2g_german),
                            'Failed to associate.')

    def test_ssid_with_UTF8_characters_dutch_2g_11n_20mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.utf8_ssid_2g_dutch)
        asserts.assert_true(self.dut.associate(self.utf8_ssid_2g_dutch),
                            'Failed to associate.')

    def test_ssid_with_UTF8_characters_swedish_2g_11n_20mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.utf8_ssid_2g_swedish)
        asserts.assert_true(self.dut.associate(self.utf8_ssid_2g_swedish),
                            'Failed to associate.')

    def test_ssid_with_UTF8_characters_norwegian_2g_11n_20mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.utf8_ssid_2g_norwegian)
        asserts.assert_true(self.dut.associate(self.utf8_ssid_2g_norwegian),
                            'Failed to associate.')

    def test_ssid_with_UTF8_characters_danish_2g_11n_20mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.utf8_ssid_2g_danish)
        asserts.assert_true(self.dut.associate(self.utf8_ssid_2g_danish),
                            'Failed to associate.')

    def test_ssid_with_UTF8_characters_japanese_2g_11n_20mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.utf8_ssid_2g_japanese)
        asserts.assert_true(self.dut.associate(self.utf8_ssid_2g_japanese),
                            'Failed to associate.')

    def test_ssid_with_UTF8_characters_spanish_2g_11n_20mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.utf8_ssid_2g_spanish)
        asserts.assert_true(self.dut.associate(self.utf8_ssid_2g_spanish),
                            'Failed to associate.')

    def test_ssid_with_UTF8_characters_italian_2g_11n_20mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.utf8_ssid_2g_italian)
        asserts.assert_true(self.dut.associate(self.utf8_ssid_2g_italian),
                            'Failed to associate.')

    def test_ssid_with_UTF8_characters_korean_2g_11n_20mhz(self):
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind_11ab_legacy',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_2G,
                 ssid=self.utf8_ssid_2g_korean)

        asserts.assert_true(self.dut.associate(self.utf8_ssid_2g_korean),
                            'Failed to associate.')
