# 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'
SUITE = 'wifi_flaky, wifi_android_correctness, 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)
