# 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)]
    for spec in ap_specs:
        runner = chaos_runner.ChaosRunner(
                'network_WiFi_ChaosConnectDisconnect', host, spec)
        runner.run(job)


parallel_simple(run_chaos_wpapsk, machines)
