# 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.

# This test verifies AVRCP media info sent by DUT can be received by peer.
# It verifies media information including: playback status, length, title,
# artist, and album.
# Steps:
# 1. Initialize the Bluetooth media player.
# 2. Update all media information twice to prevent previous leftover data affect
# the current iteration of test.
# 3. Compare the expected results against the information received on the peer
# device.
# 4. Return True if expected results equals the information received on the
# peer.
# 5. Cleanup for Bluetooth media player.

from autotest_lib.server import utils

NAME = 'bluetooth_AdapterAUHealth.au_avrcp_media_info_test.floss'
METADATA = {
    'contacts': ['chromeos-bt-team@google.com'],
    # ChromeOS > Platform > Connectivity > Bluetooth
    'bug_component': 'b:167317',
    'criteria': 'Verify AVRCP media info sent by DUT can be received by peer',
    'hw_agnostic': False,
    'requirements': ['bt-gen-0001-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_AdapterAUHealth', host=host, num_iterations=1,
                 tag='.'.join(NAME.split('.')[1:]),
                 args_dict=args_dict, test_name=NAME.split('.')[1], floss=True)

parallel_simple(run, machines)
