# Copyright 2021 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_BluetoothStreamPerf.11n'
METADATA = {
    'requirements': ['wifi-coex-0001-v01'],
    'contacts': ['chromeos-wifi-champs@google.com'],
    # ChromeOS > Platform > Connectivity > WiFi
    'bug_component': 'b:893827',
    # netperf is used for measuring the throughput.
    # Network: Open 802.11n, Channels 1 and 157.
    'criteria': 'Measure the maximal receiving and transmitting throughput on a DUT while operating bluetooth',
    'hw_agnostic': False,
}
ATTRIBUTES = 'suite:bluetooth_wifi_coex'
# This test is flaky but adding to  'suite:bluetooth_flaky' will use up
# a lot of lab capacity
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)

    all_caps = ([hostap_config.HostapConfig.N_CAPABILITY_HT20],
                [hostap_config.HostapConfig.N_CAPABILITY_HT40])
    mode = hostap_config.HostapConfig.MODE_11N_PURE
    configs = [hostap_config.HostapConfig(n_capabilities=caps,
                                          channel=channel, mode=mode)
               for caps in all_caps
               for channel in (1, 157)]
    use_iperf=True
    job.run_test('network_WiFi_BluetoothStreamPerf', tag=NAME.split('.')[1],
                 host=host, raw_cmdline_args=args, args_dict=args_dict,
                 additional_params=(configs, use_iperf), test_name='coex_test')

parallel_simple(run, machines)
