# 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_correctness_cros_core, 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)
