avrcp_device_test.cc revision 2c34dae9b89f02f5d179da574d0fc7180bc36dd9
12c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker/* 22c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker * Copyright 2018 The Android Open Source Project 32c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker * 42c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker * Licensed under the Apache License, Version 2.0 (the "License"); 52c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker * you may not use this file except in compliance with the License. 62c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker * You may obtain a copy of the License at 72c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker * 82c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker * http://www.apache.org/licenses/LICENSE-2.0 92c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker * 102c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker * Unless required by applicable law or agreed to in writing, software 112c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker * distributed under the License is distributed on an "AS IS" BASIS, 122c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker * See the License for the specific language governing permissions and 142c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker * limitations under the License. 152c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker */ 162c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 172c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker#include <algorithm> 182c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker#include <iostream> 192c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 202c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker#include <base/bind.h> 212c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker#include <base/logging.h> 222c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker#include <base/threading/thread.h> 232c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker#include <gmock/gmock.h> 242c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker#include <gtest/gtest.h> 252c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 262c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker#include "avrcp_packet.h" 2728da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker#include "avrcp_test_helper.h" 282c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker#include "device.h" 292c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker#include "tests/avrcp/avrcp_test_packets.h" 302c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker#include "tests/packet_test_helper.h" 312c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 322c822c94aa90b1014800633fe6f663d5598be196Ajay Panickernamespace bluetooth { 332c822c94aa90b1014800633fe6f663d5598be196Ajay Panickernamespace avrcp { 342c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 352c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker// TODO (apanicke): All the tests below are just basic positive unit tests. 362c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker// Add more tests to increase code coverage. 372c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 382c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing AvrcpResponse = std::unique_ptr<::bluetooth::PacketBuilder>; 392c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing TestAvrcpPacket = TestPacketType<Packet>; 402c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing TestBrowsePacket = TestPacketType<BrowsePacket>; 412c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 422c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing ::testing::_; 432c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing ::testing::MockFunction; 442c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing ::testing::Mock; 452c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing ::testing::NiceMock; 462c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing ::testing::Return; 472c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4828da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker// TODO (apanicke): All the tests below are just basic positive unit tests. 4928da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker// Add more tests to increase code coverage. 502c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerclass AvrcpDeviceTest : public ::testing::Test { 512c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker public: 522c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker virtual void SetUp() override { 532c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // NOTE: We use a wrapper lambda for the MockFunction in order to 542c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // add a const qualifier to the response. Otherwise the MockFunction 552c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // type doesn't match the callback type and a compiler error occurs. 5628da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker base::Callback<void(uint8_t, bool, AvrcpResponse)> cb = base::Bind( 572c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker [](MockFunction<void(uint8_t, bool, const AvrcpResponse&)>* a, 5828da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker uint8_t b, bool c, AvrcpResponse d) { a->Call(b, c, d); }, 592c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker &response_cb); 602c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 612c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // TODO (apanicke): Test setting avrc13 to false once we have full 622c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // functionality. 637bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker test_device = new Device(RawAddress::kAny, true, cb, 0xFFFF, 0xFFFF); 642c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker } 652c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 662c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker virtual void TearDown() override { 672c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker delete test_device; 682c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Mock::VerifyAndClear(&response_cb); 692c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker } 702c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 712c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker void SendMessage(uint8_t label, std::shared_ptr<Packet> message) { 722c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->MessageReceived(label, message); 732c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker } 742c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 752c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker void SendBrowseMessage(uint8_t label, std::shared_ptr<BrowsePacket> message) { 762c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->BrowseMessageReceived(label, message); 772c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker } 782c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 792c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockFunction<void(uint8_t, bool, const AvrcpResponse&)> response_cb; 802c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Device* test_device; 812c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker}; 822c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 832c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, addressTest) { 8428da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker base::Callback<void(uint8_t, bool, AvrcpResponse)> cb = 8528da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker base::Bind([](MockFunction<void(uint8_t, bool, const AvrcpResponse&)>* a, 8628da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker uint8_t b, bool c, AvrcpResponse d) { a->Call(b, c, d); }, 8728da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker &response_cb); 882c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 897bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Device device(RawAddress::kAny, true, cb, 0xFFFF, 0xFFFF); 902c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker ASSERT_EQ(device.GetAddress(), RawAddress::kAny); 912c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 922c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 932c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, trackChangedTest) { 942c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 952c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 962c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 972c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 982c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 992c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SongInfo info = {"test_id", 1002c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker {// The attribute map 1012c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TITLE, "Test Song"), 1022c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ARTIST_NAME, "Test Artist"), 1032c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ALBUM_NAME, "Test Album"), 1042c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TRACK_NUMBER, "1"), 1052c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"), 1062c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::GENRE, "Test Genre"), 1072c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::PLAYING_TIME, "1000")}}; 1082c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker std::vector<SongInfo> list = {info}; 1092c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1102c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetNowPlayingList(_)) 1112c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(2) 1122c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillRepeatedly(InvokeCb<0>("test_id", list)); 1132c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1142c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the interim response for track changed 1152c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto interim_response = 1162c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakeTrackChangedBuilder(true, 0x01); 1172c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 1182c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(interim_response)))) 1192c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 1202c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1212c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = 1222c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationRequestBuilder::MakeBuilder(Event::TRACK_CHANGED, 0); 1232c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto pkt = TestAvrcpPacket::Make(); 1242c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker request->Serialize(pkt); 1252c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, pkt); 1262c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1272c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the changed response for track changed 1282c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto changed_response = 1292c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakeTrackChangedBuilder(false, 0x01); 1302c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 1312c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(changed_response)))) 1322c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 1332c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1342c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->HandleTrackUpdate(); 1352c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 1362c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1372c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, playStatusTest) { 1382c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 1392c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 1402c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1412c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 1422c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1432c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker PlayStatus status1 = {0x1234, 0x5678, PlayState::PLAYING}; 1442c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker PlayStatus status2 = {0x1234, 0x5678, PlayState::STOPPED}; 1452c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1462c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetPlayStatus(_)) 1472c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(2) 1482c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<0>(status1)) 1492c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<0>(status2)); 1502c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1512c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Pretend the device is active 1522c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(a2dp_interface, active_peer()) 1532c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillRepeatedly(Return(test_device->GetAddress())); 1542c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1552c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the interim response for play status changed 1562c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto interim_response = 1572c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakePlaybackStatusBuilder( 1582c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker true, PlayState::PLAYING); 1592c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 1602c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(interim_response)))) 1612c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 1622c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1632c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = RegisterNotificationRequestBuilder::MakeBuilder( 1642c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Event::PLAYBACK_STATUS_CHANGED, 0); 1652c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto pkt = TestAvrcpPacket::Make(); 1662c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker request->Serialize(pkt); 1672c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, pkt); 1682c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1692c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the changed response for play status changed 1702c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto changed_response = 1712c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakePlaybackStatusBuilder( 1722c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker false, PlayState::STOPPED); 1732c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 1742c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(changed_response)))) 1752c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 1762c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->HandlePlayStatusUpdate(); 1772c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 1782c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1792c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, playPositionTest) { 1802c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 1812c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 1822c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1832c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 1842c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1852c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker PlayStatus status1 = {0x1234, 0x5678, PlayState::PLAYING}; 1862c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker PlayStatus status2 = {0x5678, 0x9ABC, PlayState::STOPPED}; 1872c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1882c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetPlayStatus(_)) 1892c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(2) 1902c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<0>(status1)) 1912c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<0>(status2)); 1922c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1932c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Pretend the device is active 1942c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(a2dp_interface, active_peer()) 1952c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillRepeatedly(Return(test_device->GetAddress())); 1962c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1972c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the interim response for play status changed 1982c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto interim_response = 1992c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakePlaybackStatusBuilder( 2002c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker true, PlayState::PLAYING); 2012c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 2022c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(interim_response)))) 2032c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 2042c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2052c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = RegisterNotificationRequestBuilder::MakeBuilder( 2062c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Event::PLAYBACK_STATUS_CHANGED, 0); 2072c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto pkt = TestAvrcpPacket::Make(); 2082c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker request->Serialize(pkt); 2092c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, pkt); 2102c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2112c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the changed response for play status changed 2122c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto changed_response = 2132c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakePlaybackStatusBuilder( 2142c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker false, PlayState::STOPPED); 2152c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 2162c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(changed_response)))) 2172c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 2182c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->HandlePlayStatusUpdate(); 2192c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 2202c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2212c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, nowPlayingTest) { 2222c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 2232c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 2242c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2252c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 2262c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2272c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker SongInfo info = {"test_id", 2282c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker {// The attribute map 2292c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker AttributeEntry(Attribute::TITLE, "Test Song"), 2302c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker AttributeEntry(Attribute::ARTIST_NAME, "Test Artist"), 2312c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker AttributeEntry(Attribute::ALBUM_NAME, "Test Album"), 2322c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker AttributeEntry(Attribute::TRACK_NUMBER, "1"), 2332c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker AttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"), 2342c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker AttributeEntry(Attribute::GENRE, "Test Genre"), 2352c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker AttributeEntry(Attribute::PLAYING_TIME, "1000")}}; 2362c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker std::vector<SongInfo> list = {info}; 2372c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker EXPECT_CALL(interface, GetNowPlayingList(_)) 2382c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker .Times(2) 2392c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker .WillRepeatedly(InvokeCb<0>("test_id", list)); 2402c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker 2412c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the interim response for now playing list changed 2422c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto interim_response = 2432c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakeNowPlayingBuilder(true); 2442c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 2452c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(interim_response)))) 2462c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 2472c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2482c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = RegisterNotificationRequestBuilder::MakeBuilder( 2492c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Event::NOW_PLAYING_CONTENT_CHANGED, 0); 2502c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto pkt = TestAvrcpPacket::Make(); 2512c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker request->Serialize(pkt); 2522c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, pkt); 2532c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2542c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the changed response for now playing list changed 2552c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto changed_response = 2562c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakeNowPlayingBuilder(false); 2572c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 2582c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(changed_response)))) 2592c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 2602c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->HandleNowPlayingUpdate(); 2612c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 2622c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2632c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getPlayStatusTest) { 2642c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 2652c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 2662c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2672c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 2682c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2692c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker PlayStatus status = {0x1234, 0x5678, PlayState::PLAYING}; 2702c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2712c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetPlayStatus(_)) 2722c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1) 2732c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<0>(status)); 2742c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2752c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Pretend the device is active 2762c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(a2dp_interface, active_peer()) 2772c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillRepeatedly(Return(test_device->GetAddress())); 2782c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2792c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto expected_response = GetPlayStatusResponseBuilder::MakeBuilder( 2802c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 0x5678, 0x1234, PlayState::PLAYING); 2812c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 2822c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(expected_response)))) 2832c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 2842c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2852c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = TestAvrcpPacket::Make(get_play_status_request); 2862c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, request); 2872c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 2882c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2892c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getElementAttributesTest) { 2902c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 2912c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 2922c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2932c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 2942c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2952c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SongInfo info = {"test_id", 2962c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker {// The attribute map 2972c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TITLE, "Test Song"), 2982c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ARTIST_NAME, "Test Artist"), 2992c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ALBUM_NAME, "Test Album"), 3002c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TRACK_NUMBER, "1"), 3012c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"), 3022c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::GENRE, "Test Genre"), 3032c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::PLAYING_TIME, "1000")}}; 3042c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3052c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetSongInfo(_)).WillRepeatedly(InvokeCb<0>(info)); 3062c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3077bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker auto compare_to_partial = 3087bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker GetElementAttributesResponseBuilder::MakeBuilder(0xFFFF); 3092c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker compare_to_partial->AddAttributeEntry(Attribute::TITLE, "Test Song"); 3102c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 3112c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(2, false, matchPacket(std::move(compare_to_partial)))) 3122c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 3132c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(2, TestAvrcpPacket::Make(get_element_attributes_request_partial)); 3142c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3157bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker auto compare_to_full = 3167bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker GetElementAttributesResponseBuilder::MakeBuilder(0xFFFF); 3177bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::TITLE, "Test Song"); 3187bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::ARTIST_NAME, "Test Artist"); 3197bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::ALBUM_NAME, "Test Album"); 3207bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::TRACK_NUMBER, "1"); 3217bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"); 3227bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::GENRE, "Test Genre"); 3237bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::PLAYING_TIME, "1000"); 3242c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 3252c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(3, false, matchPacket(std::move(compare_to_full)))) 3262c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 3272c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(3, TestAvrcpPacket::Make(get_element_attributes_request_full)); 3282c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 3292c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3307bed53df63e72be19412e6519b2f23ed2565bdaeAjay PanickerTEST_F(AvrcpDeviceTest, getElementAttributesMtuTest) { 3317bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker auto truncated_packet = 3327bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker GetElementAttributesResponseBuilder::MakeBuilder(0xFFFF); 3337bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker truncated_packet->AddAttributeEntry(Attribute::TITLE, "1234"); 3347bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 3357bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker MockMediaInterface interface; 3367bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 3377bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 3387bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker base::Callback<void(uint8_t, bool, AvrcpResponse)> cb = 3397bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker base::Bind([](MockFunction<void(uint8_t, bool, const AvrcpResponse&)>* a, 3407bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker uint8_t b, bool c, AvrcpResponse d) { a->Call(b, c, d); }, 3417bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker &response_cb); 3427bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Device device(RawAddress::kAny, true, cb, truncated_packet->size(), 0xFFFF); 3437bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 3447bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker device.RegisterInterfaces(&interface, &a2dp_interface, nullptr); 3457bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 3467bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker SongInfo info = {"test_id", 3477bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker {AttributeEntry(Attribute::TITLE, "1234truncated")}}; 3487bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker EXPECT_CALL(interface, GetSongInfo(_)).WillRepeatedly(InvokeCb<0>(info)); 3497bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 3507bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker EXPECT_CALL(response_cb, 3517bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Call(1, false, matchPacket(std::move(truncated_packet)))) 3527bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker .Times(1); 3537bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 3547bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker device.MessageReceived( 3557bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 1, TestAvrcpPacket::Make(get_element_attributes_request_full)); 3567bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker} 3577bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 3582c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getMediaPlayerListTest) { 3592c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 3602c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 3612c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3622c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 3632c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3642c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MediaPlayerInfo info = {0, "Test Player", true}; 3652c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker std::vector<MediaPlayerInfo> list = {info}; 3662c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3672c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetMediaPlayerList(_)) 3682c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1) 3692c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<0>(0, list)); 3702c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3712c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto expected_response = GetFolderItemsResponseBuilder::MakePlayerListBuilder( 3727bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status::NO_ERROR, 0x0000, 0xFFFF); 3732c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker expected_response->AddMediaPlayer(MediaPlayerItem(0, "Test Player", true)); 3742c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 3752c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, true, matchPacket(std::move(expected_response)))) 3762c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 3772c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3782c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = TestBrowsePacket::Make(get_folder_items_request); 3792c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendBrowseMessage(1, request); 3802c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 3812c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3822c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getNowPlayingListTest) { 3832c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 3842c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 3852c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3862c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 3872c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3882c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SongInfo info = {"test_id", 3892c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker {// The attribute map 3902c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TITLE, "Test Song"), 3912c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ARTIST_NAME, "Test Artist"), 3922c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ALBUM_NAME, "Test Album"), 3932c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TRACK_NUMBER, "1"), 3942c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"), 3952c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::GENRE, "Test Genre"), 3962c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::PLAYING_TIME, "1000")}}; 3972c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker std::vector<SongInfo> list = {info}; 3982c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3992c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetNowPlayingList(_)) 4002c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillRepeatedly(InvokeCb<0>("test_id", list)); 4012c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4022c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto expected_response = GetFolderItemsResponseBuilder::MakeNowPlayingBuilder( 4037bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status::NO_ERROR, 0x0000, 0xFFFF); 4042c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker expected_response->AddSong(MediaElementItem(1, "Test Song", info.attributes)); 4052c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 4062c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, true, matchPacket(std::move(expected_response)))) 4072c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 4082c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4092c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = TestBrowsePacket::Make(get_folder_items_request_now_playing); 4102c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendBrowseMessage(1, request); 4112c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 4122c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4132c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getVFSFolderTest) { 4142c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 4152c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 4162c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4172c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 4182c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4192c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker FolderInfo info = {"test_id", true, "Test Folder"}; 4202c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker ListItem item = {ListItem::FOLDER, info, SongInfo()}; 4212c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker std::vector<ListItem> list = {item}; 4222c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4232c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetFolderItems(_, "", _)) 4242c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1) 4252c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<2>(list)); 4262c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4277bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker auto expected_response = GetFolderItemsResponseBuilder::MakeVFSBuilder( 4287bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status::NO_ERROR, 0x0000, 0xFFFF); 4292c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker expected_response->AddFolder(FolderItem(1, 0, true, "Test Folder")); 4302c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 4312c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, true, matchPacket(std::move(expected_response)))) 4322c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 4332c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4342c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = TestBrowsePacket::Make(get_folder_items_request_vfs); 4352c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendBrowseMessage(1, request); 4362c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 4372c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4387bed53df63e72be19412e6519b2f23ed2565bdaeAjay PanickerTEST_F(AvrcpDeviceTest, getFolderItemsMtuTest) { 4397bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker auto truncated_packet = GetFolderItemsResponseBuilder::MakeVFSBuilder( 4407bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status::NO_ERROR, 0x0000, 0xFFFF); 4417bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker truncated_packet->AddFolder(FolderItem(1, 0, true, "Test Folder0")); 4427bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker truncated_packet->AddFolder(FolderItem(2, 0, true, "Test Folder1")); 4437bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 4447bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker MockMediaInterface interface; 4457bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 4467bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker base::Callback<void(uint8_t, bool, AvrcpResponse)> cb = 4477bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker base::Bind([](MockFunction<void(uint8_t, bool, const AvrcpResponse&)>* a, 4487bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker uint8_t b, bool c, AvrcpResponse d) { a->Call(b, c, d); }, 4497bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker &response_cb); 4507bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Device device(RawAddress::kAny, true, cb, 0xFFFF, truncated_packet->size()); 4517bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker device.RegisterInterfaces(&interface, &a2dp_interface, nullptr); 4527bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 4537bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker FolderInfo info0 = {"test_id0", true, "Test Folder0"}; 4547bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker FolderInfo info1 = {"test_id1", true, "Test Folder1"}; 4557bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker FolderInfo info2 = {"test_id1", true, "Truncated folder"}; 4567bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker ListItem item0 = {ListItem::FOLDER, info0, SongInfo()}; 4577bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker ListItem item1 = {ListItem::FOLDER, info1, SongInfo()}; 4587bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker ListItem item2 = {ListItem::FOLDER, info1, SongInfo()}; 4597bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker std::vector<ListItem> list0 = {item0, item1, item2}; 4607bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker EXPECT_CALL(interface, GetFolderItems(_, "", _)) 4617bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker .WillRepeatedly(InvokeCb<2>(list0)); 4627bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 4637bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker EXPECT_CALL(response_cb, 4647bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Call(1, true, matchPacket(std::move(truncated_packet)))) 4657bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker .Times(1); 4667bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker device.BrowseMessageReceived( 4677bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 1, TestBrowsePacket::Make(get_folder_items_request_vfs)); 4687bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker} 4697bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 470bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay PanickerTEST_F(AvrcpDeviceTest, changePathTest) { 471bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker MockMediaInterface interface; 472bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 473bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 474bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 475bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 476bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker FolderInfo info0 = {"test_id0", true, "Test Folder0"}; 477bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker FolderInfo info1 = {"test_id1", true, "Test Folder1"}; 478bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ListItem item0 = {ListItem::FOLDER, info0, SongInfo()}; 479bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ListItem item1 = {ListItem::FOLDER, info1, SongInfo()}; 480bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker std::vector<ListItem> list0 = {item0, item1}; 481bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(interface, GetFolderItems(_, "", _)) 482bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .Times(1) 483bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .WillRepeatedly(InvokeCb<2>(list0)); 484bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 485bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker FolderInfo info2 = {"test_id2", true, "Test Folder2"}; 486bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker FolderInfo info3 = {"test_id3", true, "Test Folder3"}; 487bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker FolderInfo info4 = {"test_id4", true, "Test Folder4"}; 488bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ListItem item2 = {ListItem::FOLDER, info2, SongInfo()}; 489bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ListItem item3 = {ListItem::FOLDER, info3, SongInfo()}; 490bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ListItem item4 = {ListItem::FOLDER, info4, SongInfo()}; 491bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker std::vector<ListItem> list1 = {item2, item3, item4}; 492bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(interface, GetFolderItems(_, "test_id1", _)) 493bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .Times(3) 494bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .WillRepeatedly(InvokeCb<2>(list1)); 495bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 496bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker std::vector<ListItem> list2 = {}; 497bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(interface, GetFolderItems(_, "test_id3", _)) 498bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .Times(1) 499bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .WillOnce(InvokeCb<2>(list2)); 500bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 501bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker // Populate the VFS ID map since we don't persist UIDs 5027bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker auto folder_items_response = GetFolderItemsResponseBuilder::MakeVFSBuilder( 5037bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status::NO_ERROR, 0x0000, 0xFFFF); 504bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker folder_items_response->AddFolder(FolderItem(1, 0, true, "Test Folder0")); 505bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker folder_items_response->AddFolder(FolderItem(2, 0, true, "Test Folder1")); 506bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(response_cb, 507bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker Call(1, true, matchPacket(std::move(folder_items_response)))) 508bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .Times(1); 509bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker auto request = TestBrowsePacket::Make(get_folder_items_request_vfs); 510bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker SendBrowseMessage(1, request); 511bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 512bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker // Change path down into Test Folder1 513bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker auto change_path_response = 514bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ChangePathResponseBuilder::MakeBuilder(Status::NO_ERROR, list1.size()); 515bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(response_cb, 516bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker Call(2, true, matchPacket(std::move(change_path_response)))); 517bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker request = TestBrowsePacket::Make(change_path_request); 518bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker SendBrowseMessage(2, request); 519bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 520bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker // Populate the VFS ID map since we don't persist UIDs 5217bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker folder_items_response = GetFolderItemsResponseBuilder::MakeVFSBuilder( 5227bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status::NO_ERROR, 0x0000, 0xFFFF); 523bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker folder_items_response->AddFolder(FolderItem(1, 0, true, "Test Folder2")); 524bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker folder_items_response->AddFolder(FolderItem(2, 0, true, "Test Folder3")); 525bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker folder_items_response->AddFolder(FolderItem(3, 0, true, "Test Folder4")); 526bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(response_cb, 527bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker Call(3, true, matchPacket(std::move(folder_items_response)))) 528bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .Times(1); 529bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker request = TestBrowsePacket::Make(get_folder_items_request_vfs); 530bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker SendBrowseMessage(3, request); 531bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 532bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker // Change path down into Test Folder3 533bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker change_path_response = 534bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ChangePathResponseBuilder::MakeBuilder(Status::NO_ERROR, list2.size()); 535bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(response_cb, 536bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker Call(4, true, matchPacket(std::move(change_path_response)))); 537bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker request = TestBrowsePacket::Make(change_path_request); 538bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker SendBrowseMessage(4, request); 539bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 540bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker // Change path up back into Test Folder1 541bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker change_path_response = 542bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ChangePathResponseBuilder::MakeBuilder(Status::NO_ERROR, list1.size()); 543bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(response_cb, 544bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker Call(5, true, matchPacket(std::move(change_path_response)))); 545bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker request = TestBrowsePacket::Make(change_path_up_request); 546bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker SendBrowseMessage(5, request); 547bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker} 548bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 5492c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getItemAttributesNowPlayingTest) { 5502c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 5512c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 5522c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 5532c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 5542c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 5552c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SongInfo info = {"test_id", 5562c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker {// The attribute map 5572c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TITLE, "Test Song"), 5582c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ARTIST_NAME, "Test Artist"), 5592c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ALBUM_NAME, "Test Album"), 5602c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TRACK_NUMBER, "1"), 5612c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"), 5622c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::GENRE, "Test Genre"), 5632c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::PLAYING_TIME, "1000")}}; 5642c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker std::vector<SongInfo> list = {info}; 5652c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 5662c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetNowPlayingList(_)) 5672c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillRepeatedly(InvokeCb<0>("test_id", list)); 5682c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 5692c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto compare_to_full = 5707bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker GetItemAttributesResponseBuilder::MakeBuilder(Status::NO_ERROR, 0xFFFF); 5717bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::TITLE, "Test Song"); 5727bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::ARTIST_NAME, "Test Artist"); 5737bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::ALBUM_NAME, "Test Album"); 5747bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::TRACK_NUMBER, "1"); 5757bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"); 5767bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::GENRE, "Test Genre"); 5777bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::PLAYING_TIME, "1000"); 5782c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 5792c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, true, matchPacket(std::move(compare_to_full)))) 5802c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 5812c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 5822c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = 5832c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker TestBrowsePacket::Make(get_item_attributes_request_all_attributes); 5842c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendBrowseMessage(1, request); 5852c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 5862c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 5877bed53df63e72be19412e6519b2f23ed2565bdaeAjay PanickerTEST_F(AvrcpDeviceTest, geItemAttributesMtuTest) { 5887bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker auto truncated_packet = 5897bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker GetItemAttributesResponseBuilder::MakeBuilder(Status::NO_ERROR, 0xFFFF); 5907bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker truncated_packet->AddAttributeEntry(Attribute::TITLE, "1234"); 5917bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 5927bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker MockMediaInterface interface; 5937bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 5947bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker base::Callback<void(uint8_t, bool, AvrcpResponse)> cb = 5957bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker base::Bind([](MockFunction<void(uint8_t, bool, const AvrcpResponse&)>* a, 5967bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker uint8_t b, bool c, AvrcpResponse d) { a->Call(b, c, d); }, 5977bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker &response_cb); 5987bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Device device(RawAddress::kAny, true, cb, 0xFFFF, truncated_packet->size()); 5997bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker device.RegisterInterfaces(&interface, &a2dp_interface, nullptr); 6007bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 6017bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker SongInfo info = {"test_id", 6027bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker {AttributeEntry(Attribute::TITLE, "1234truncated")}}; 6037bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker std::vector<SongInfo> list = {info}; 6047bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker EXPECT_CALL(interface, GetNowPlayingList(_)) 6057bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker .WillRepeatedly(InvokeCb<0>("test_id", list)); 6067bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 6077bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker EXPECT_CALL(response_cb, 6087bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Call(1, true, matchPacket(std::move(truncated_packet)))) 6097bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker .Times(1); 6107bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker device.BrowseMessageReceived( 6117bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 1, TestBrowsePacket::Make(get_item_attributes_request_all_attributes)); 6127bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker} 6137bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 6140278ba88c94e08401349b058c0047de699c4fc6eAjay PanickerTEST_F(AvrcpDeviceTest, setAddressedPlayerTest) { 6150278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker MockMediaInterface interface; 6160278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 6170278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker 6180278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 6190278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker 6200278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker auto set_addr_player_rsp = 6210278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker SetAddressedPlayerResponseBuilder::MakeBuilder(Status::NO_ERROR); 6220278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker 6230278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker EXPECT_CALL(response_cb, 6240278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker Call(1, false, matchPacket(std::move(set_addr_player_rsp)))) 6250278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker .Times(1); 6260278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker 6270278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker auto request = TestAvrcpPacket::Make(set_addressed_player_request); 6280278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker SendMessage(1, request); 6290278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker} 6300278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker 6312c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, volumeChangedTest) { 6322c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 6332c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 6342c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockVolumeInterface vol_interface; 6352c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 6362c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, &vol_interface); 6372c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 6382c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto reg_notif = 6392c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationRequestBuilder::MakeBuilder(Event::VOLUME_CHANGED, 0); 6402c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(reg_notif)))) 6412c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 6422c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterVolumeChanged(); 6432c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 6442c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(vol_interface, DeviceConnected(test_device->GetAddress(), _)) 6452c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1) 6462c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<1>(0x30)); 6472c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto set_vol = SetAbsoluteVolumeRequestBuilder::MakeBuilder(0x30); 6482c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(set_vol)))) 6492c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 6502c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 6512c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto response = TestAvrcpPacket::Make(interim_volume_changed_notification); 6522c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, response); 6532c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 6542c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(vol_interface, SetVolume(0x47)).Times(1); 6552c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto reg_notif2 = 6562c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationRequestBuilder::MakeBuilder(Event::VOLUME_CHANGED, 0); 6572c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(reg_notif2)))) 6582c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 6592c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker response = TestAvrcpPacket::Make(changed_volume_changed_notification); 6602c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, response); 6612c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker response = TestAvrcpPacket::Make(interim_volume_changed_notification); 6622c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, response); 6632c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 6642c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 6652c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} // namespace avrcp 6662c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} // namespace bluetooth