# Copyright 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.

from autotest_lib.server import utils

AUTHOR = 'krisr, tienchang, bmahadev'
NAME = 'network_WiFi_SuspendStress.11a'
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.11a network on channels
48, 64.
"""

from autotest_lib.client.common_lib.cros.network import xmlrpc_datatypes
from autotest_lib.server.cros.network import hostap_config

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)
    a_mode = hostap_config.HostapConfig.MODE_11A
    configurations = [(hostap_config.HostapConfig(channel=48, mode=a_mode),
                       xmlrpc_datatypes.AssociationParameters()),
                      (hostap_config.HostapConfig(channel=64, mode=a_mode),
                       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)
