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

DOC = """
This tests verifies that we can connect to an AP advertising support for both
WPA and WPA2 with TKIP/AES supported for WPA and AES supported for WPA2.
"""

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):
    wpa_config = xmlrpc_security_types.WPAConfig(
            psk='chromeos',
            wpa_mode=xmlrpc_security_types.WPAConfig.MODE_MIXED_WPA,
            wpa_ciphers=[xmlrpc_security_types.WPAConfig.CIPHER_CCMP,
                         xmlrpc_security_types.WPAConfig.CIPHER_TKIP],
            wpa2_ciphers=[xmlrpc_security_types.WPAConfig.CIPHER_CCMP])
    ap_config = hostap_config.HostapConfig(
            frequency=2412,
            mode=hostap_config.HostapConfig.MODE_11G,
            security_config=wpa_config)
    assoc_params = xmlrpc_datatypes.AssociationParameters()
    assoc_params.security_config = wpa_config
    configurations = [(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)
