#!/usr/bin/env python3 # # Copyright (C) 2019 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy of # the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. """Perform base Avrcp command from headset to dut""" import time import os import queue from acts import asserts from acts_contrib.test_utils.abstract_devices.bluetooth_handsfree_abstract_device import BluetoothHandsfreeAbstractDeviceFactory as Factory from acts_contrib.test_utils.bt.simulated_carkit_device import SimulatedCarkitDevice from acts_contrib.test_utils.bt.bt_test_utils import connect_phone_to_headset from acts_contrib.test_utils.bt.BluetoothBaseTest import BluetoothBaseTest from acts_contrib.test_utils.car.car_media_utils import EVENT_PLAY_RECEIVED from acts_contrib.test_utils.car.car_media_utils import EVENT_PAUSE_RECEIVED from acts_contrib.test_utils.car.car_media_utils import EVENT_SKIP_NEXT_RECEIVED from acts_contrib.test_utils.car.car_media_utils import EVENT_SKIP_PREV_RECEIVED from acts_contrib.test_utils.car.car_media_utils import CMD_MEDIA_PLAY from acts_contrib.test_utils.car.car_media_utils import CMD_MEDIA_PAUSE ADB_FILE_EXISTS = 'test -e %s && echo True' DEFAULT_TIMEOUT = 5 EVENT_TIMEOUT = 1 class AvrcpBaseTest(BluetoothBaseTest): def __init__(self, configs): super(AvrcpBaseTest, self).__init__(configs) self.dut = self.android_devices[0] serial = self.user_params['simulated_carkit_device'] controller = SimulatedCarkitDevice(serial) self.controller = Factory().generate(controller) self.phone_music_files = [] self.host_music_files = [] for music_file in self.user_params['music_file_names']: self.phone_music_files.append(os.path.join( self.user_params['phone_music_file_dir'], music_file)) self.host_music_files.append(os.path.join( self.user_params['host_music_file_dir'], music_file)) self.ensure_phone_has_music_file() def setup_class(self): super().setup_class() self.controller.power_on() time.sleep(DEFAULT_TIMEOUT) def teardown_class(self): super().teardown_class() self.dut.droid.mediaPlayStop() self.controller.destroy() def setup_test(self): self.dut.droid.bluetoothMediaPhoneSL4AMBSStart() time.sleep(DEFAULT_TIMEOUT) self.dut.droid.bluetoothStartPairingHelper(True) if not connect_phone_to_headset(self.dut, self.controller, 600): asserts.fail('Not able to connect to hands-free device') #make sure SL4AMBS is active MediaSession self.dut.droid.bluetoothMediaHandleMediaCommandOnPhone(CMD_MEDIA_PLAY) time.sleep(0.5) self.dut.droid.bluetoothMediaHandleMediaCommandOnPhone(CMD_MEDIA_PAUSE) def teardown_test(self): self.dut.droid.bluetoothMediaPhoneSL4AMBSStop() def ensure_phone_has_music_file(self): """Make sure music file (based on config values) is on the phone.""" for host_file, phone_file in zip(self.host_music_files, self.phone_music_files): if self.dut.adb.shell(ADB_FILE_EXISTS % phone_file): self.log.info( 'Music file {} already on phone. Skipping file transfer.' .format(host_file)) else: self.dut.adb.push(host_file, phone_file) has_file = self.dut.adb.shell( ADB_FILE_EXISTS % phone_file) if not has_file: self.log.error( 'Audio file {} not pushed to phone.'.format(host_file)) self.log.info('Music file successfully pushed to phone.') def play_from_controller(self): self.dut.ed.clear_all_events() self.controller.play() try: self.dut.ed.pop_event(EVENT_PLAY_RECEIVED, EVENT_TIMEOUT) except queue.Empty as e: asserts.fail('{} Event Not received'.format(EVENT_PLAY_RECEIVED)) self.log.info('Event Received : {}'.format(EVENT_PLAY_RECEIVED)) def pause_from_controller(self): self.dut.ed.clear_all_events() self.controller.pause() try: self.dut.ed.pop_event(EVENT_PAUSE_RECEIVED, EVENT_TIMEOUT) except queue.Empty as e: asserts.fail('{} Event Not received'.format(EVENT_PAUSE_RECEIVED)) self.log.info('Event Received : {}'.format(EVENT_PAUSE_RECEIVED)) def skip_next_from_controller(self): self.dut.ed.clear_all_events() self.controller.next_track() try: self.dut.ed.pop_event(EVENT_SKIP_NEXT_RECEIVED, EVENT_TIMEOUT) except queue.Empty as e: asserts.fail('{} Event Not ' 'received'.format(EVENT_SKIP_NEXT_RECEIVED)) self.log.info('Event Received : {}'.format(EVENT_SKIP_NEXT_RECEIVED)) def skip_prev_from_controller(self): self.dut.ed.clear_all_events() self.controller.previous_track() try: self.dut.ed.pop_event(EVENT_SKIP_PREV_RECEIVED, EVENT_TIMEOUT) except queue.Empty as e: asserts.fail('{} Event Not ' 'received'.format(EVENT_SKIP_PREV_RECEIVED)) self.log.info('Event Received : {}'.format(EVENT_SKIP_PREV_RECEIVED))