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

DOC = """
This test case verifies that the DUT can connect to a hidden SSID
using all variants of 40/104 bit open/shared WEP encryption.
"""


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():
    wep40_keys = ['0123456789', '89abcdef01', '9876543210', 'fedcba9876']
    wep104_keys = ['0123456789abcdef0123456789', '89abcdef0123456789abcdef01',
                   'fedcba9876543210fedcba9876', '109fedcba987654321fedcba98']
    auth_algs = (xmlrpc_security_types.WEPConfig.AUTH_ALGORITHM_OPEN,
                 xmlrpc_security_types.WEPConfig.AUTH_ALGORITHM_SHARED)
    configurations = []
    for wep_keys in (wep40_keys, wep104_keys):
        for auth_alg in auth_algs:
            wep_config = xmlrpc_security_types.WEPConfig(
                    wep_keys=wep_keys,
                    auth_algorithm=auth_alg)
            ap_config = hostap_config.HostapConfig(
                    hide_ssid=True,
                    frequency=2412,
                    mode=hostap_config.HostapConfig.MODE_11G,
                    security_config=wep_config)
            assoc_params = xmlrpc_datatypes.AssociationParameters(
                    is_hidden=True,
                    security_config=wep_config)
            configurations.append((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)
