# 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')
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)
