# Copyright 2015 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 = 'samueltan, ejcaruso'
NAME = 'network_WiFi_ReconnectInDarkResume.DisconnectBeforeSuspendDiffAP'
TIME = 'SHORT'
TEST_TYPE = 'Server'
DEPENDENCIES = 'servo, wificell, lucidsleep'
ATTRIBUTES = 'suite:wifi_correctness_cros_core, suite:wifi_lucidsleep'

DOC = """
This test verifies that the DUT that suspends disconnected successfully
reconnects to a preferred network that appears while it is suspended. In this
test, the preferred network that appears during suspend is different from the
one that the DUT was last connected to before suspend.

The test is conducted as follows:

1) AP ("AP 1") is brought up, and DUT connects to it
2) AP 1 is brought down, disconnecting the DUT from it
3) Another AP ("AP 2") is brought up, and DUT connects to it
4) AP 2 is brought down, disconnecting the DUT from it
5) DUT suspends while disconnected
6) AP 1 is brought up again
7) The DUT is woken from suspend
8) Verify that the DUT is connected to AP 1 upon resuming from suspend

We verify the connectivity status of the DUT on resume by parsing shill logs,
since the delays involved in waking a DUT from suspend using autotest framework
make real-time checks inaccurate.
"""

from autotest_lib.client.common_lib.cros.network import xmlrpc_datatypes
from autotest_lib.client.common_lib.cros.network import xmlrpc_security_types
from autotest_lib.server.cros.network import hostap_config
from autotest_lib.server import utils

args_dict = utils.args_to_dict(args)
servo_args = hosts.CrosHost.get_servo_arguments(args_dict)

def run(machine):
    host = hosts.create_host(machine, servo_args=servo_args)
    job.run_test('network_WiFi_ReconnectInDarkResume',
                 host=host,
                 tag=NAME.split('.')[1],
                 disconnect_before_suspend=True,
                 reconnect_to_same_ap=False,
                 num_iterations=1,
                 raw_cmdline_args=args)


parallel_simple(run, machines)
