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

DOC = """
This test verifies that we can connect to hidden WPA networks.  It checks
several common configurations of hidden networks such as pure WPA/WPA2 and
mixed WPA/WPA2 networks.
"""

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


def get_configurations():
    wpa_configs = [
            xmlrpc_security_types.WPAConfig(
                    psk='chromeos',
                    wpa_mode=xmlrpc_security_types.WPAConfig.MODE_PURE_WPA,
                    wpa_ciphers=[xmlrpc_security_types.WPAConfig.CIPHER_TKIP]),
            xmlrpc_security_types.WPAConfig(
                    psk='chromeos',
                    wpa_mode=xmlrpc_security_types.WPAConfig.MODE_PURE_WPA,
                    wpa_ciphers=[xmlrpc_security_types.WPAConfig.CIPHER_TKIP,
                                 xmlrpc_security_types.WPAConfig.CIPHER_CCMP]),
            xmlrpc_security_types.WPAConfig(
                    psk='chromeos',
                    wpa_mode=xmlrpc_security_types.WPAConfig.MODE_PURE_WPA2,
                    wpa2_ciphers=[xmlrpc_security_types.WPAConfig.CIPHER_CCMP]),
            xmlrpc_security_types.WPAConfig(
                    psk='chromeos',
                    wpa_mode=xmlrpc_security_types.WPAConfig.MODE_MIXED_WPA,
                    wpa_ciphers=[xmlrpc_security_types.WPAConfig.CIPHER_TKIP,
                                 xmlrpc_security_types.WPAConfig.CIPHER_CCMP],
                    wpa2_ciphers=[xmlrpc_security_types.WPAConfig.CIPHER_CCMP]),
    ]
    for wpa_config in wpa_configs:
        ap_config = hostap_config.HostapConfig(
                hide_ssid=True,
                frequency=2412,
                mode=hostap_config.HostapConfig.MODE_11G,
                security_config=wpa_config)
        assoc_params = xmlrpc_datatypes.AssociationParameters(
                is_hidden=True,
                security_config=wpa_config)
        configurations = [(ap_config, assoc_params)]
    return configurations


def run(machine):
    host = hosts.create_host(machine)
    job.run_test('network_WiFi_SimpleConnect',
                 tag=NAME.split('.')[1],
                 host=host,
                 raw_cmdline_args=args,
                 additional_params=get_configurations())


parallel_simple(run, machines)
