# Copyright (c) 2014 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 = 'asnagarajan, wiley, jabele'
NAME = 'network_WiFi_ChaosLongConnect.suspend'
TIME = 'LONG'
TEST_TYPE = 'server'

DOC = """
This script iterates through all of the access points in the AP compatibility
lab and has a chrome device connect to each in series. This test must be
performed in the AP compatibility lab. This test would hold the connection with
AP and performs performs a suspend resume cycle and check the liveliness of the
connection to the AP.
"""

from autotest_lib.server.cros.chaos_ap_configurators import ap_spec
from autotest_lib.server.cros.chaos_lib import chaos_runner
from autotest_lib.server.cros.chaos_lib import connection_worker

def run_chaos_wpa2psk(machine):
    host = hosts.create_host(machine)
    # Test with WPA2PSK on both 2.4 and 5 GHz bands
    ap_specs = [ap_spec.APSpec(security=ap_spec.SECURITY_TYPE_WPA2PSK,
                               band=ap_spec.BAND_2GHZ),
                ap_spec.APSpec(security=ap_spec.SECURITY_TYPE_WPA2PSK,
                               band=ap_spec.BAND_5GHZ),
                # Non-US models, which are all static
                ap_spec.APSpec(security=ap_spec.SECURITY_TYPE_WPA2PSK,
                               band=ap_spec.BAND_5GHZ,
                               channel=48,
                               configurator_type=ap_spec.CONFIGURATOR_STATIC)]
    conn_worker = connection_worker.ConnectionSuspend(suspend_sec=30)
    for spec in ap_specs:
        runner = chaos_runner.ChaosRunner(
                'network_WiFi_ChaosLongConnect', host, spec)
        runner.run(job, conn_worker=conn_worker)


parallel_simple(run_chaos_wpa2psk, machines)
