# Copyright 2016 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 = 'krisr, tienchang, bmahadev'
NAME = 'network_WiFi_SuspendStress.stress_WPA2'
TIME = 'LONG'
TEST_TYPE = 'Server'
DEPENDENCIES = 'wificell'
ATTRIBUTES = 'suite:wifi_stress, suite:wifi_matfunc_noservo'

DOC = """
This test uses powerd_dbus to suspend and resume and checks that the
wifi adapter is brought back up and connects to a WPA2 network.
"""

from autotest_lib.client.common_lib.cros.network import xmlrpc_datatypes
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
from autotest_lib.server import utils

args_dict = utils.args_to_dict(args)
servo_args = hosts.CrosHost.get_servo_arguments(args_dict)

def run(machine):
    try:
        host = hosts.create_host(machine, servo_args=servo_args)
    except IOError:
        # We probably failed to connect to the servo. That's probably
        # because the cell doesn't have a servo.
        #
        # Ideally, we'd raise TestNAError here, and be done. But the
        # test isn't actually running yet. So we instantiate a host
        # without servo, and let the network_WiFi_SuspendStress
        # instance report the TestNAError.
        host = hosts.create_host(machine)

    wpa_config = xmlrpc_security_types.WPAConfig(
            psk='chromeos',
            wpa_mode=xmlrpc_security_types.WPAConfig.MODE_PURE_WPA2,
            wpa2_ciphers=[xmlrpc_security_types.WPAConfig.CIPHER_CCMP])
    ap_config = hostap_config.HostapConfig(
            frequency=2412,
            mode=hostap_config.HostapConfig.MODE_11N_PURE,
            security_config=wpa_config)
    assoc_params = xmlrpc_datatypes.AssociationParameters()
    assoc_params.security_config = wpa_config
    configurations = [(ap_config, assoc_params)]
    job.run_test('network_WiFi_SuspendStress',
                 host=host,
                 tag=NAME.split('.')[1],
                 suspends=690,
                 raw_cmdline_args=args,
                 additional_params=configurations)

parallel_simple(run, machines)
