# 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.ap_configurators import ap_spec
from autotest_lib.server.cros.chaos_lib import chaos_runner
from autotest_lib.server.cros.network 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)
