# Copyright 2014 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 = 'wiley, pstew, quiche'
NAME = 'network_WiFi_Perf.vht80'
ATTRIBUTES = 'suite:wifi_perf'
TIME = 'SHORT'
TEST_TYPE = 'Server'
DEPENDENCIES = 'wificell'

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


from autotest_lib.server.cros.network import hostap_config


def run(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)]]
    host = hosts.create_host(machine)
    job.run_test('network_WiFi_Perf', tag=NAME.split('.')[1],
                 host=host, raw_cmdline_args=args,
                 additional_params=configs)


parallel_simple(run, machines)
