# 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.

from autotest_lib.server import utils

AUTHOR = 'samueltan, ejcaruso'
NAME = 'network_WiFi_DarkResumeActiveScans'
TIME = 'MEDIUM'
TEST_TYPE = 'Server'
DEPENDENCIES = 'wificell, servo, lucidsleep'
ATTRIBUTES = 'suite:wifi_lucidsleep'

DOC = """
When wake on WiFi is supported and enabled, our system could wake up from
suspend in dark resume for several reasons. Due to privacy concerns, we do not
want active scans to be launched on certain types of dark resume wakes where the
user does not expect information that can uniquely identify their system
(e.g. MAC addresses) to be broadcasted.

We permit active scans to be launched when the system wakes up due to a SSID
match or disconnect, since we might try to connect or reconnect to known
networks during these periods, and the connection/authentication process
inevitably broadcasts MAC addresses.

However, when the system wakes up due to a RTC timer (e.g. the periodic scan
timer or DHCP lease renewal timer) or a packet pattern match, we expect the
system to carry out its tasks and re-suspend without active scanning and
broadcasting MAC addresses.

This test attempts to verify that no active scans are started in dark resumes
that are triggered by RTC timers or packet pattern matches. Verify this by
triggering these wake events and analyzing packet captures to ensure that the
DUT does not launch any probe requests during these dark resumes.
"""

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_DarkResumeActiveScans',
                 host=host,
                 raw_cmdline_args=args)

parallel_simple(run, machines)
