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

def run_chaos_debug(machine):
    host = hosts.create_host(machine)
    # List of specific APs to debug. Please verify the APs indeed support PSK.
    # Add your APs here.
    debug_aps = ['chromeos3-row7-rack1-host2',]
    # IP or DNS name of host to use as a packet capturing device.
    capturer_hostname = 'chromeos3-row7-rack1-host1.cros'
    ap_specs = [ap_spec.APSpec(security=ap_spec.SECURITY_TYPE_WPA2PSK,
                               hostnames=debug_aps,
                               band=ap_spec.BAND_2GHZ,
                               lab_ap=False)]
    for spec in ap_specs:
        runner = chaos_runner.ChaosRunner(
                'network_WiFi_ChaosConnectDisconnect', host, spec)
        runner.run(job, batch_size=2, tries=2,
                   capturer_hostname=capturer_hostname)


parallel_simple(run_chaos_debug, machines)
