# 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.gamepad_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 Bluetooth gamepad '
                     '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)
