# 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.Stress'
TIME = 'MEDIUM'
TEST_TYPE = 'Server'
DEPENDENCIES = 'servo, wificell, lucidsleep'
ATTRIBUTES = 'suite:wifi_correctness_cros_core, suite:wifi_lucidsleep'

DOC = """
This test verifies that the DUT successfully reconnects to a network in dark
resume after getting disconnected from that same network while suspended.
This test simulates the cases where multiple disconnect and SSID appearance
events take place over a single period of suspension. 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) DUT suspends while connected to AP 2
5) AP 2 is brought down, disconnecting the DUT from it while suspended
6) AP 2 is brought up again
7) Repeat steps 5-6 another 4 times (for 5 total iterations)
8) The DUT is woken from suspend
9) Verify that the DUT is connected to AP 2 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.

Note: this test suspends the DUT for long periods of time, which may lead to
flakiness if the ssh connection from the autotest host to the DUT has a
ServerAliveInterval setting that is too low (i.e. less than the total suspend
time). This test was verified stable with the ServerAliveInterval set to 900.
"""

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=False,
                 reconnect_to_same_ap=True,
                 num_iterations=5,
                 raw_cmdline_args=args)

parallel_simple(run, machines)
