# Copyright 2021 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

AUTHOR = 'bfreed'
NAME = 'network_WiFi_BluetoothStreamPerf.11n'
ATTRIBUTES = 'suite:bluetooth_wifi_coex'
# This test is flaky but adding to  'suite:bluetooth_flaky' will use up
# a lot of lab capacity
TIME = 'MEDIUM'
TEST_TYPE = 'Server'
DEPENDENCIES = 'wificell, working_bluetooth_btpeer:1'

DOC = """
This test uses netperf to measure the maximal receiving and transmitting
throughput on a DUT with an open 802.11n network while operating bluetooth.
"""


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)]

    job.run_test('network_WiFi_BluetoothStreamPerf', tag=NAME.split('.')[1],
                 host=host, raw_cmdline_args=args, args_dict=args_dict,
                 additional_params=configs, test_name='coex_test')

parallel_simple(run, machines)
