# Copyright 2022 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_PerfNoisyEnv.vht40_gaussian_ch149'
METADATA = {
    'contacts': ['chromeos-wifi-champs@google.com'],
    # ChromeOS > Platform > Connectivity > WiFi
    'bug_component': 'b:893827',
    # Network: Open VHT40 802.11ac, Channel 149.
    'criteria': 'Measure the maximal receiving and transmitting throughput and point of disconnection on a DUT while broadcasting gaussian noise at multiple gain values',
    'hw_agnostic': False,
}
ATTRIBUTES = ''
MAX_RESULT_SIZE_KB = 512000
TEST_TYPE = 'Server'
DEPENDENCIES = 'wificell, peripheral_wifi_state:WORKING'

from autotest_lib.server.cros.network import hostap_config


def run(machine):
    host = hosts.create_host(machine)
    noise_file = 'gaussian_noise_sample_rate_8M_amplitude_1_signed_8bit.iq'
    frequency = 5745000000
    start_gain=35
    gain_increment=1
    noise_parameters = (noise_file, frequency, start_gain, gain_increment)
    ap_config = hostap_config.HostapConfig(
                        channel=149,
                        mode=hostap_config.HostapConfig.MODE_11AC_PURE,
                        n_capabilities=[hostap_config.HostapConfig.N_CAPABILITY_HT40],
                        ac_capabilities=[hostap_config.HostapConfig.AC_CAPABILITY_MAX_A_MPDU_LEN_EXP7],
                        vht_channel_width=hostap_config.HostapConfig.VHT_CHANNEL_WIDTH_40)
    use_iperf = True
    job.run_test('network_WiFi_PerfNoisyEnv', tag=NAME.split('.')[1],
                 host=host, raw_cmdline_args=args,
                 additional_params=(noise_parameters, ap_config, use_iperf))

parallel_simple(run, machines)
