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

DOC = """
This test attempts to verify that we can connect to a router while using
TTLS authentication with several tunneled protocols.
"""

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


def run(machine):
    host = hosts.create_host(machine)
    # Negative tests check the parts of the state machine that handle failures.
    # We do these tests for only one inner authentication protocol because
    # we presume that supplicant reuses this code between inner authentication
    # types.
    configurations = tunneled_1x_tests.get_negative_8021x_test_cases(
            xmlrpc_security_types.Tunneled1xConfig.LAYER1_TYPE_TTLS,
            xmlrpc_security_types.Tunneled1xConfig.LAYER2_TYPE_MD5)
    inners = (xmlrpc_security_types.Tunneled1xConfig.LAYER2_TYPE_MSCHAPV2,
              xmlrpc_security_types.Tunneled1xConfig.LAYER2_TYPE_MD5,
              xmlrpc_security_types.Tunneled1xConfig.LAYER2_TYPE_TTLS_MSCHAPV2,
              xmlrpc_security_types.Tunneled1xConfig.LAYER2_TYPE_TTLS_MSCHAP,
              xmlrpc_security_types.Tunneled1xConfig.LAYER2_TYPE_TTLS_PAP)
    for inner in inners:
        configurations += tunneled_1x_tests.get_positive_8021x_test_cases(
                xmlrpc_security_types.Tunneled1xConfig.LAYER1_TYPE_TTLS,
                inner)
    job.run_test('network_WiFi_SimpleConnect',
                 tag=NAME.split('.')[1],
                 host=host,
                 raw_cmdline_args=args,
                 additional_params=configurations)


parallel_simple(run, machines)
