# Copyright 2018 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 = 'timkovich'
TIME = 'SHORT'
NAME = 'policy_WiFiTypesServer.wpa_eap_tls'
TEST_TYPE = 'Server'
# TODO(timkovich): Disabled for now: crbug.com/883522
# ATTRIBUTES = 'suite:ent-wificell'
DEPENDENCIES = 'wificell'

DOC = """
'policy_WiFiTypesServer.wpa_eap_tls' test configures an EAP-TLS network and
runs the client side 'policy_WiFiTypes' test that configures the user network
policy and attempts to connect to the AP.

"""

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

def run(machine):
    eap_config = xmlrpc_security_types.WPAEAPConfig(
            server_ca_cert=site_eap_certs.ca_cert_1,
            server_cert=site_eap_certs.server_cert_1,
            server_key=site_eap_certs.server_private_key_1,
            client_ca_cert=site_eap_certs.ca_cert_1,
            client_cert=site_eap_certs.client_cert_1,
            client_key=site_eap_certs.client_private_key_1)
    ap_config = hostap_config.HostapConfig(
            frequency=2412,
            mode=hostap_config.HostapConfig.MODE_11G,
            security_config=eap_config)

    host = hosts.create_host(machine)
    job.run_test('policy_WiFiTypesServer',
                 raw_cmdline_args=args,
                 host=host,
                 ap_config=ap_config,
                 security='WPA-EAP',
                 eap='EAP-TLS',
                 identity='chromeos',
                 ca_cert=site_eap_certs.ca_cert_1)


parallel_simple(run, machines)
