# 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.11ac'
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'
PY_VERSION = 3

DOC = """
This test uses netperf to measure the maximal receiving and transmitting
throughput on a DUT with an open 802.11ac 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)

    n_caps = [hostap_config.HostapConfig.N_CAPABILITY_HT40_PLUS]
    ac_caps = [hostap_config.HostapConfig.AC_CAPABILITY_SHORT_GI_80]
    ac_mode = hostap_config.HostapConfig.MODE_11AC_MIXED
    channel_width_80_mhz = hostap_config.HostapConfig.VHT_CHANNEL_WIDTH_80
    configs = [hostap_config.HostapConfig(
                    channel=channel,
                    mode=ac_mode,
                    n_capabilities=n_caps,
                    vht_channel_width=channel_width_80_mhz,
                    vht_center_channel=vht_center_channel,
                    ac_capabilities=ac_caps)
               for channel, vht_center_channel in [(44, 42), (157, 155)]]

    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)
