# 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_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)
