# Copyright 2018 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 = 'kirtika'
NAME = 'network_WiFi_BgscanBackoff.5760_noise_check'
TIME = 'SHORT'
TEST_TYPE = 'Server'
ATTRIBUTES = ('suite:wifi_matfunc')
DEPENDENCIES = 'wificell'
MAX_RESULT_SIZE_KB = 512000

DOC = """
This test case verifies that bgscan aborts and/or backs off when
there is consistent outgoing traffic. This is a fork of the legacy test
that runs the test on channels 1 and 153 to serve two purposes:
(a) provide more 5 GHz coverage.
(b) help (a wee bit) to catch noise concerns around 5760 MHz as seen on
certain Intel SoCs.
This test can be compared with the '.wifi_bgscan_backoff' variant, to see
whether channel 153 behaves worse than other 5GHz channels.
"""

from autotest_lib.server.cros.network import hostap_config

def run(machine):
    host = hosts.create_host(machine)
    caps = [hostap_config.HostapConfig.N_CAPABILITY_HT40]
    mode = hostap_config.HostapConfig.MODE_11N_MIXED
    config_first_ap = (hostap_config.HostapConfig(channel=1,
            mode=mode, n_capabilities=caps))
    config_second_ap = (hostap_config.HostapConfig(channel=153,
            mode=mode, n_capabilities=caps))
    params = [config_first_ap, config_second_ap]
    job.run_test('network_WiFi_BgscanBackoff',
                 host=host,
                 raw_cmdline_args=args,
                 additional_params=params)

parallel_simple(run, machines)
