# 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.11g'
TIME = 'MEDIUM'
TEST_TYPE = 'Server'
DEPENDENCIES = 'servo, wificell'
ATTRIBUTES = 'suite:wifi_matfunc, suite:wifi_matfunc_bcm4371'

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.11g 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
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)

    g_mode = hostap_config.HostapConfig.MODE_11G
    configurations = [(hostap_config.HostapConfig(channel=1, mode=g_mode),
                       xmlrpc_datatypes.AssociationParameters()),
                      (hostap_config.HostapConfig(channel=6, mode=g_mode),
                       xmlrpc_datatypes.AssociationParameters()),
                      (hostap_config.HostapConfig(channel=11, mode=g_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)
