# Copyright (c) 2013 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_SimpleConnect.wifi_check11g'
TIME = 'SHORT'
TEST_TYPE = 'Server'
ATTRIBUTES = ('suite:wifi_correctness_cros_core, suite:wifi_matfunc, suite:wifi_matfunc_bcm4371,'
              'suite:wifi_release, subsystem:wifi, suite:wificell-pre-cq,'
              'suite:android_wifi_connect')
DEPENDENCIES = 'wificell'

DOC = """
This test attempts to verify that we can connect to a router over 802.11g
on channels 1, 6, and 11 (2.4 Ghz band) and correctly send IP traffic.
"""


from autotest_lib.client.common_lib.cros.network import xmlrpc_datatypes
from autotest_lib.server.cros.network import hostap_config


def run(machine):
    g_mode = hostap_config.HostapConfig.MODE_11G
    configurations = [(hostap_config.HostapConfig(channel=1, mode=g_mode),
                       xmlrpc_datatypes.AssociationParameters()),
                      (hostap_config.HostapConfig(channel=6, mode=g_mode),
                       xmlrpc_datatypes.AssociationParameters()),
                      (hostap_config.HostapConfig(channel=11, mode=g_mode),
                       xmlrpc_datatypes.AssociationParameters())]
    host = hosts.create_host(machine)
    job.run_test('network_WiFi_SimpleConnect',
                 tag=NAME.split('.')[1],
                 host=host,
                 raw_cmdline_args=args,
                 additional_params=configurations)


parallel_simple(run, machines)
