# 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.mouse_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 mouse '
                     '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, '
                'Ubiquiti_UniFi_6_Plus]')

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)
