# Copyright 2020 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Verify the DUT's discoverable behavior during suspend and after resume
# with and without setting a discovery filter.
#
# Test Discovery without setting discovery filter:
# 1. Get current time to use it in the resume as start time
# 2. Start discovering
# 3. Suspend the DUT.
# 4. Resume the DUT.
# 5. Expect discovering to restore after suspend/resume
#
# Test discovery with discovery filter set:
# 1. Get current time to use it in the resume as start time
# 2. Set discovery filter (Transport:Auto)
# 3. Start discovering
# 4. Suspend the DUT
# 5. Resume the DUT
# 6. Expect discovering to restore after suspend/resume
#
# Purpose: Verify discovering is restored after suspend/resume with and without
# setting discovery filter

# Deprecated variables:
#     TIME = 'SHORT'
#     TEST_CATEGORY = 'Functional'

from autotest_lib.server import utils

NAME = 'bluetooth_AdapterSRHealth.sr_while_discovering.floss'
METADATA = {
    'contacts': ['chromeos-bt-team@google.com'],
    # ChromeOS > Platform > Connectivity > Bluetooth
    'bug_component': 'b:167317',
    'criteria': 'Pass test',
    'hw_agnostic': False,
    'requirements': ['bt-phy-0010-v01']
}


ATTRIBUTES = 'suite:bluetooth_floss'
TEST_TYPE = 'server'
DEPENDENCIES = 'bluetooth_state:NORMAL, working_bluetooth_btpeer:1'


args_dict = utils.args_to_dict(args)

def run(machine):
    host = hosts.create_host(machine)
    job.run_test('bluetooth_AdapterSRHealth', host=host, num_iterations=1,
                 args_dict=args_dict, test_name=NAME.split('.')[1], tag='.'.join(NAME.split('.')[1:]), floss=True)

parallel_simple(run, machines)
