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

# This test verifies that the adapter should be able to power on and reconnect
# after it was powered off during suspend and resume
#
# Steps:
# 1. Pair a HID device
# 2. Power off the BT adapter
# 3. Suspend and resume the DUT
# 4. Power on the BT adapter; expect success
# 5. Expect that the device can initiate connection to the DUT
#
# Purpose: Verify the DUT can suspend and resume while the adapter is powered
# off

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

from autotest_lib.server import utils

NAME = 'bluetooth_AdapterSRHealth.sr_while_powered_off.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)
