# 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 DUT's suspend/resume
# should work well with BQR (Bluetooth Quality Report).
#
# Steps:
# 1. Enable BQR
# 2. Connect to the audio device with A2DP profile
# 3. Check the bqr logs before suspend/resume
# 4. Starting to suspend/resume
# 5. Open a 2nd btmon log for BQR log checking
# 6. After suspend/resume DUT should be able to connect to devices
# 7. Expect the A2DP devices are connected after suspend/resume
# 8. Check that BQR doesn't break the suspend/resume and vice versa
#
# Purpose: Verify suspend/resume works well with BQR

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

from autotest_lib.server import utils

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


ATTRIBUTES = 'suite:bluetooth_flaky'
TEST_TYPE = 'server'
DEPENDENCIES = 'bluetooth_state:NORMAL, working_bluetooth_btpeer:2'


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:]))

parallel_simple(run, machines)
