# 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'
ATTRIBUTES = ('suite:wifi_correctness_cros_core, suite:wifi_matfunc,'
              'suite:wifi_matfunc_noservo,'
              'suite:wifi_matfunc_bcm4371, suite:wifi_release, subsystem:wifi,'
              'suite:android_wifi_connect')
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)
