# Copyright (c) 2015 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.24HT40'
TIME = 'MEDIUM'
TEST_TYPE = 'Server'
DEPENDENCIES = 'servo, wificell'
SUITE = ('wifi_matfunc, wifi_matfunc_bcm4356, wifi_matfunc_marvell8897,'
         'wifi_matfunc_intel7265')
DOC = """
This test uses servo to simulate lid close and open events and checks that the
wifi adapter is brought back up and connects to a 802.11n network on 2.4 GHz.
"""

from autotest_lib.client.common_lib.cros.network import xmlrpc_datatypes
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):
    host = hosts.create_host(machine, servo_args=servo_args)
    caps = [hostap_config.HostapConfig.N_CAPABILITY_GREENFIELD,
            hostap_config.HostapConfig.N_CAPABILITY_HT40]
    n = hostap_config.HostapConfig.MODE_11N_PURE
    configurations = [(hostap_config.HostapConfig(frequency=2437, mode=n,
                                                  n_capabilities=caps),
                       xmlrpc_datatypes.AssociationParameters())]
    job.run_test('network_WiFi_SuspendStress',
                 host=host,
                 tag=NAME.split('.')[1],
                 suspends=5,
                 raw_cmdline_args=args,
                 additional_params=configurations)

parallel_simple(run, machines)
