# 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.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 BLE 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)
