# 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.Hidden'
TIME = 'MEDIUM'
MAX_RESULT_SIZE_KB = 512000
TEST_TYPE = 'Server'
DEPENDENCIES = 'wificell'
ATTRIBUTES = ('suite:wifi_matfunc')

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

import copy

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

def run(machine):
    host = hosts.create_host(machine)
    g = hostap_config.HostapConfig.MODE_11G
    n = hostap_config.HostapConfig.MODE_11N_PURE
    assoc_params = xmlrpc_datatypes.AssociationParameters()
    assoc_params.is_hidden = True
    configurations = [
            (hostap_config.HostapConfig(channel=6, mode=g, hide_ssid=True),
             copy.copy(assoc_params)),
            (hostap_config.HostapConfig(channel=36, mode=n, hide_ssid=True),
             copy.copy(assoc_params)),
            (hostap_config.HostapConfig(channel=48, mode=n, hide_ssid=True),
             copy.copy(assoc_params))]

    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)
