# 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'
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,
                 client_cert=site_eap_certs.client_cert_1_pkcs12)


parallel_simple(run, machines)
