# Copyright (c) 2013 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, wiley, jabele'
NAME = 'network_WiFi_ChaosConnectDisconnect.wpapsk'
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.
"""

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

def run_chaos_wpapsk(machine):
    host = hosts.create_host(machine)
    # Test with WPAPSK on both 2.4 and 5 GHz bands
    ap_specs = [ap_spec.APSpec(security=ap_spec.SECURITY_TYPE_WPAPSK,
                               band=ap_spec.BAND_2GHZ),
                ap_spec.APSpec(security=ap_spec.SECURITY_TYPE_WPAPSK,
                               band=ap_spec.BAND_5GHZ),
                # Non-US models, which are all static.
                ap_spec.APSpec(security=ap_spec.SECURITY_TYPE_WPAPSK,
                               band=ap_spec.BAND_5GHZ,
                               channel=48,
                               configurator_type=ap_spec.CONFIGURATOR_STATIC)]
    lab_status = []
    for spec in ap_specs:
        runner = chaos_runner.ChaosRunner(
                'network_WiFi_ChaosConnectDisconnect', host, spec, lab_status)
        runner.run(job)


parallel_simple(run_chaos_wpapsk, machines)
