# 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_Perf.11a_wep'
SUITE = ('wifi_perf, wifi_perf_bcm4356, wifi_perf_marvell8897,'
         'wifi_perf_intel7265')
TIME = 'SHORT'
TEST_TYPE = 'Server'
DEPENDENCIES = 'wificell'

DOC = """
This test uses netperf to measure the maximal receiving and transmitting
throughput on a DUT with an 802.11a network with WEP encryption.
"""


from autotest_lib.client.common_lib.cros.network import xmlrpc_security_types
from autotest_lib.server.cros.network import hostap_config


def run(machine):
    host = hosts.create_host(machine)
    mode = hostap_config.HostapConfig.MODE_11A
    # 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']
    wep_config = xmlrpc_security_types.WEPConfig(
            wep_keys,
            wep_default_key=0,
            auth_algorithm=xmlrpc_security_types.WEPConfig.AUTH_ALGORITHM_OPEN)
    configs = [hostap_config.HostapConfig(channel=channel, mode=mode,
                                          security_config=wep_config)
               for channel in (44,)]
    job.run_test('network_WiFi_Perf', tag=NAME.split('.')[1],
                 host=host, raw_cmdline_args=args,
                 additional_params=configs)


parallel_simple(run, machines)
