# 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 = 'debayanb'
NAME = 'network_WiFi_SuspendStress.integration'
TIME = 'MEDIUM'
TEST_TYPE = 'Server'
DEPENDENCIES = 'servo, wificell'
ATTRIBUTES = 'suite:wifi_endtoend'

DOC = """
This test uses servo to simulate lid close and open events and checks that the
wifi adapter is brought back up along with client side test :dekstopSimpleUi to
run and connects to a 802.11g & 802.11a network on channels 1,6,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
    a_mode = hostap_config.HostapConfig.MODE_11A
    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=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,
                 integration=True)


parallel_simple(run, machines)
