# 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_checkWEP104'
TIME = 'SHORT'
TEST_TYPE = 'Server'
SUITE = 'wifi_matfunc, wifi_android_correctness, wifi_release'
DEPENDENCIES = 'wificell'

DOC = """
This test case verifies that the DUT can connect to an AP using WEP both open
and shared system authentication and 104-bit pre-shared keys.
"""


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 run(machine):
    # FYI: D-Bus requires string parameters must be valid UTF-8.
    wep_keys = ['0123456789abcdef0123456789',
                'mlk:ihgfedcba',
                # Mix ASCII characters with a 3-byte UTF-8 characters.
                'd\xe4\xb8\x80\xe4\xba\x8c\xe4\xb8\x89\xe5\x9b\x9b',
                # Mix different byte length UTF-8 characters.
                '\xe4\xb8\x80\xe4\xba\x8c\xe4\xb8\x89\xc2\xa2\xc2\xa3']
    auth_algs = (xmlrpc_security_types.WEPConfig.AUTH_ALGORITHM_OPEN,
                 xmlrpc_security_types.WEPConfig.AUTH_ALGORITHM_SHARED)
    configurations = []
    for auth_algorithm in auth_algs:
        for i in range(len(wep_keys)):
            wep_config = xmlrpc_security_types.WEPConfig(
                    wep_keys,
                    wep_default_key=i,
                    auth_algorithm=auth_algorithm)
            ap_config = hostap_config.HostapConfig(
                    frequency=2412,
                    mode=hostap_config.HostapConfig.MODE_11G,
                    security_config=wep_config)
            assoc_params = xmlrpc_datatypes.AssociationParameters(
                    security_config=wep_config)
            configurations.append((ap_config, 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)
