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

# The test verifies that the power state is preserved after suspend and resume.
#
# Steps:
# 1. Power on the adapter.
# 2. Suspend and DUT and wait for resume.
# 3. Verify the power state.
# 4. Power off the adapter.
# 5. Suspend and DUT and wait for resume.
# 6. Verify the power state.
#
# Purpose: Verify the adapter power state is preserved after suspend and resume

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

from autotest_lib.server import utils

NAME = 'bluetooth_AdapterSAHealth.sa_adapter_suspend_resume_test.floss'
METADATA = {
    'contacts': ['chromeos-bt-team@google.com'],
    # ChromeOS > Platform > Connectivity > Bluetooth
    'bug_component': 'b:167317',
    'criteria': 'Pass all health test',
    'hw_agnostic': False,
    'requirements': ['bt-gen-0001-v01'],
}



ATTRIBUTES = 'suite:bluetooth_floss_sa'
TEST_TYPE = 'server'
DEPENDENCIES = 'bluetooth_state:NORMAL'


args_dict = utils.args_to_dict(args)

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

parallel_simple(run, machines)
