# 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_checkHidden'
TIME = 'SHORT'
TEST_TYPE = 'Server'
ATTRIBUTES = ('suite:wifi_matfunc, suite:wifi_release')
DEPENDENCIES = 'wificell'

DOC = """
This test attempts to verify that we can connect to a hidden network on both
2.4 and 5 Ghz channels.
"""

import copy

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


def run(machine):
    g = hostap_config.HostapConfig.MODE_11G
    n = hostap_config.HostapConfig.MODE_11N_PURE
    assoc_params = xmlrpc_datatypes.AssociationParameters()
    assoc_params.is_hidden = True
    configurations = [
            (hostap_config.HostapConfig(channel=6, mode=g, hide_ssid=True),
             copy.copy(assoc_params)),
            (hostap_config.HostapConfig(channel=36, mode=n, hide_ssid=True),
             copy.copy(assoc_params)),
            (hostap_config.HostapConfig(channel=48, mode=n, hide_ssid=True),
             copy.copy(assoc_params))]

    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)
