# 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.md_ble_hid_and_audio_loads.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 concurrent BLE mouse'
                     ', BLE keyboard and Audio loads.'),
        'hw_agnostic': False,
}
ATTRIBUTES = 'suite:bluetooth_wifi_coex'
TEST_TYPE = 'Server'
DEPENDENCIES = ('wificell, working_bluetooth_btpeer:3, '
                '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)
