# 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.keyboard_load.11g'
METADATA = {
        'contacts': ['chromeos-wifi-champs@google.com'],
        # ChromeOS > Platform > Connectivity > WiFi
        'bug_component': 'b:893827',
        # Network: Open 802.11g, Channel 6 and 9.
        'criteria': ('Ensure compliance with criteria for receiving and '
                     'transmitting specified throughput, latency, and drop '
                     'rate on a DUT during operation with a Bluetooth keyboard'
                     ' load.'),
        'hw_agnostic': False,
}
ATTRIBUTES = 'suite:bluetooth_wifi_coex'
TEST_TYPE = 'Server'
DEPENDENCIES = ('wificell, working_bluetooth_btpeer:1, '
                'peripheral_wifi_state:WORKING')

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)

    mode = hostap_config.HostapConfig.MODE_11G
    configs = [
            hostap_config.HostapConfig(channel=channel, mode=mode)
            for channel in (6, 9)
    ]
    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)
