# Copyright 2024 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

NAME = 'network_WiFi_BluetoothLoadPerf.ble_keyboard_load.11ax'
METADATA = {
        'contacts': ['chromeos-wifi-champs@google.com'],
        # ChromeOS > Platform > Connectivity > WiFi
        'bug_component': 'b:893827',
        # Network: open HE80 802.11ax
        'criteria': ('Ensure compliance with criteria for receiving and '
                     'transmitting specified throughput, latency, and drop '
                     'rate on a DUT during operation with a BLE keyboard '
                     'load.'),
        'hw_agnostic': False,
}
ATTRIBUTES = 'suite:bluetooth_wifi_coex'
TEST_TYPE = 'Server'
DEPENDENCIES = ('wificell, working_bluetooth_btpeer:1, '
                'peripheral_wifi_state:WORKING, '
                'wifi_router_models:OPENWRT[Ubiquiti_Unifi_6_Lite]')

from autotest_lib.server import utils
from autotest_lib.server.cros.network import hostap_config

args_dict = utils.args_to_dict(args)


def run(machine):
    host = hosts.create_host(machine)
    n_caps = [
            hostap_config.HostapConfig.N_CAPABILITY_HT40_PLUS,
            hostap_config.HostapConfig.N_CAPABILITY_LDPC
    ]
    ac_caps = [
            hostap_config.HostapConfig.AC_CAPABILITY_SHORT_GI_80,
            hostap_config.HostapConfig.AC_CAPABILITY_RXLDPC,
            hostap_config.HostapConfig.AC_CAPABILITY_MAX_A_MPDU_LEN_EXP6
    ]

    configs = [
            hostap_config.HostapConfig(
                    channel=channel,
                    mode=hostap_config.HostapConfig.MODE_11AX_MIXED,
                    n_capabilities=n_caps,
                    vht_channel_width=hostap_config.HostapConfig.
                    VHT_CHANNEL_WIDTH_80,
                    vht_center_channel=he_center_channel,
                    ac_capabilities=ac_caps,
                    he_channel_width=hostap_config.HostapConfig.
                    HE_CHANNEL_WIDTH_80,
                    he_center_channel=he_center_channel,
                    ax_capabilities=[])
            for channel, he_center_channel in [(44, 42), (157, 155)]
    ]
    use_iperf = True
    job.run_test('network_WiFi_BluetoothLoadPerf',
                 tag=NAME.split('.')[2],
                 host=host,
                 raw_cmdline_args=args,
                 args_dict=args_dict,
                 additional_params=(configs, use_iperf),
                 test_name=NAME.split('.')[1],
                 floss=True)


parallel_simple(run, machines)
