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" 29a25fca2acb30aafab9cedc521888b794b703eff3tedwang#include "stack_config.h" 302c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker#include "tests/avrcp/avrcp_test_packets.h" 312c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker#include "tests/packet_test_helper.h" 322c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 332c822c94aa90b1014800633fe6f663d5598be196Ajay Panickernamespace bluetooth { 342c822c94aa90b1014800633fe6f663d5598be196Ajay Panickernamespace avrcp { 352c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 362c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker// TODO (apanicke): All the tests below are just basic positive unit tests. 372c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker// Add more tests to increase code coverage. 382c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 392c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing AvrcpResponse = std::unique_ptr<::bluetooth::PacketBuilder>; 402c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing TestAvrcpPacket = TestPacketType<Packet>; 412c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing TestBrowsePacket = TestPacketType<BrowsePacket>; 422c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 432c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing ::testing::_; 442c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing ::testing::MockFunction; 452c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing ::testing::Mock; 462c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing ::testing::NiceMock; 472c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerusing ::testing::Return; 482c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 49a25fca2acb30aafab9cedc521888b794b703eff3tedwangbool get_pts_avrcp_test(void) { return false; } 50a25fca2acb30aafab9cedc521888b794b703eff3tedwang 51a25fca2acb30aafab9cedc521888b794b703eff3tedwangconst stack_config_t interface = { 52a25fca2acb30aafab9cedc521888b794b703eff3tedwang nullptr, get_pts_avrcp_test, nullptr, nullptr, nullptr, nullptr, nullptr, 53a25fca2acb30aafab9cedc521888b794b703eff3tedwang nullptr}; 54a25fca2acb30aafab9cedc521888b794b703eff3tedwang 5528da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker// TODO (apanicke): All the tests below are just basic positive unit tests. 5628da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker// Add more tests to increase code coverage. 572c822c94aa90b1014800633fe6f663d5598be196Ajay Panickerclass AvrcpDeviceTest : public ::testing::Test { 582c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker public: 592c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker virtual void SetUp() override { 602c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // NOTE: We use a wrapper lambda for the MockFunction in order to 612c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // add a const qualifier to the response. Otherwise the MockFunction 622c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // type doesn't match the callback type and a compiler error occurs. 6328da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker base::Callback<void(uint8_t, bool, AvrcpResponse)> cb = base::Bind( 642c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker [](MockFunction<void(uint8_t, bool, const AvrcpResponse&)>* a, 6528da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker uint8_t b, bool c, AvrcpResponse d) { a->Call(b, c, d); }, 662c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker &response_cb); 672c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 682c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // TODO (apanicke): Test setting avrc13 to false once we have full 692c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // functionality. 707bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker test_device = new Device(RawAddress::kAny, true, cb, 0xFFFF, 0xFFFF); 712c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker } 722c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 732c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker virtual void TearDown() override { 742c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker delete test_device; 752c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Mock::VerifyAndClear(&response_cb); 762c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker } 772c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 782c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker void SendMessage(uint8_t label, std::shared_ptr<Packet> message) { 792c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->MessageReceived(label, message); 802c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker } 812c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 822c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker void SendBrowseMessage(uint8_t label, std::shared_ptr<BrowsePacket> message) { 832c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->BrowseMessageReceived(label, message); 842c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker } 852c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 862c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockFunction<void(uint8_t, bool, const AvrcpResponse&)> response_cb; 872c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Device* test_device; 882c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker}; 892c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 902c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, addressTest) { 9128da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker base::Callback<void(uint8_t, bool, AvrcpResponse)> cb = 9228da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker base::Bind([](MockFunction<void(uint8_t, bool, const AvrcpResponse&)>* a, 9328da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker uint8_t b, bool c, AvrcpResponse d) { a->Call(b, c, d); }, 9428da6c9fce2a70f3af28f363659fce39f32d7abcAjay Panicker &response_cb); 952c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 967bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Device device(RawAddress::kAny, true, cb, 0xFFFF, 0xFFFF); 972c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker ASSERT_EQ(device.GetAddress(), RawAddress::kAny); 982c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 992c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1002c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, trackChangedTest) { 1012c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 1022c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 1032c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1042c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 1052c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1062c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SongInfo info = {"test_id", 1072c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker {// The attribute map 1082c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TITLE, "Test Song"), 1092c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ARTIST_NAME, "Test Artist"), 1102c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ALBUM_NAME, "Test Album"), 1112c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TRACK_NUMBER, "1"), 1122c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"), 1132c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::GENRE, "Test Genre"), 1142c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::PLAYING_TIME, "1000")}}; 1152c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker std::vector<SongInfo> list = {info}; 1162c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1172c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetNowPlayingList(_)) 1182c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(2) 1192c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillRepeatedly(InvokeCb<0>("test_id", list)); 1202c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1212c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the interim response for track changed 1222c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto interim_response = 1232c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakeTrackChangedBuilder(true, 0x01); 1242c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 1252c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(interim_response)))) 1262c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 1272c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1282c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = 1292c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationRequestBuilder::MakeBuilder(Event::TRACK_CHANGED, 0); 1302c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto pkt = TestAvrcpPacket::Make(); 1312c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker request->Serialize(pkt); 1322c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, pkt); 1332c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1342c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the changed response for track changed 1352c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto changed_response = 1362c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakeTrackChangedBuilder(false, 0x01); 1372c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 1382c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(changed_response)))) 1392c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 1402c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1412c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->HandleTrackUpdate(); 1422c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 1432c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1442c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, playStatusTest) { 1452c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 1462c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 1472c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1482c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 1492c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1502c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker PlayStatus status1 = {0x1234, 0x5678, PlayState::PLAYING}; 1512c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker PlayStatus status2 = {0x1234, 0x5678, PlayState::STOPPED}; 1522c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1532c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetPlayStatus(_)) 1542c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(2) 1552c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<0>(status1)) 1562c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<0>(status2)); 1572c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1582c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Pretend the device is active 1592c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(a2dp_interface, active_peer()) 1602c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillRepeatedly(Return(test_device->GetAddress())); 1612c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1622c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the interim response for play status changed 1632c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto interim_response = 1642c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakePlaybackStatusBuilder( 1652c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker true, PlayState::PLAYING); 1662c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 1672c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(interim_response)))) 1682c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 1692c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1702c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = RegisterNotificationRequestBuilder::MakeBuilder( 1712c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Event::PLAYBACK_STATUS_CHANGED, 0); 1722c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto pkt = TestAvrcpPacket::Make(); 1732c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker request->Serialize(pkt); 1742c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, pkt); 1752c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1762c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the changed response for play status changed 1772c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto changed_response = 1782c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakePlaybackStatusBuilder( 1792c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker false, PlayState::STOPPED); 1802c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 1812c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(changed_response)))) 1822c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 1832c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->HandlePlayStatusUpdate(); 1842c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 1852c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1862c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, playPositionTest) { 1872c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 1882c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 1892c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1902c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 1912c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1922c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker PlayStatus status1 = {0x1234, 0x5678, PlayState::PLAYING}; 1932c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker PlayStatus status2 = {0x5678, 0x9ABC, PlayState::STOPPED}; 1942c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 1952c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetPlayStatus(_)) 1962c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(2) 1972c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<0>(status1)) 1982c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<0>(status2)); 1992c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2002c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Pretend the device is active 2012c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(a2dp_interface, active_peer()) 2022c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillRepeatedly(Return(test_device->GetAddress())); 2032c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2042c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the interim response for play status changed 2052c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto interim_response = 2062c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakePlaybackStatusBuilder( 2072c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker true, PlayState::PLAYING); 2082c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 2092c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(interim_response)))) 2102c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 2112c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2122c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = RegisterNotificationRequestBuilder::MakeBuilder( 2132c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Event::PLAYBACK_STATUS_CHANGED, 0); 2142c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto pkt = TestAvrcpPacket::Make(); 2152c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker request->Serialize(pkt); 2162c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, pkt); 2172c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2182c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the changed response for play status changed 2192c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto changed_response = 2202c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakePlaybackStatusBuilder( 2212c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker false, PlayState::STOPPED); 2222c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 2232c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(changed_response)))) 2242c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 2252c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->HandlePlayStatusUpdate(); 2262c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 2272c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2282c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, nowPlayingTest) { 2292c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 2302c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 2312c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2322c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 2332c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2342c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker SongInfo info = {"test_id", 2352c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker {// The attribute map 2362c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker AttributeEntry(Attribute::TITLE, "Test Song"), 2372c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker AttributeEntry(Attribute::ARTIST_NAME, "Test Artist"), 2382c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker AttributeEntry(Attribute::ALBUM_NAME, "Test Album"), 2392c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker AttributeEntry(Attribute::TRACK_NUMBER, "1"), 2402c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker AttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"), 2412c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker AttributeEntry(Attribute::GENRE, "Test Genre"), 2422c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker AttributeEntry(Attribute::PLAYING_TIME, "1000")}}; 2432c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker std::vector<SongInfo> list = {info}; 2442c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker EXPECT_CALL(interface, GetNowPlayingList(_)) 2452c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker .Times(2) 2462c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker .WillRepeatedly(InvokeCb<0>("test_id", list)); 2472c34dae9b89f02f5d179da574d0fc7180bc36dd9Ajay Panicker 2482c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the interim response for now playing list changed 2492c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto interim_response = 2502c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakeNowPlayingBuilder(true); 2512c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 2522c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(interim_response)))) 2532c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 2542c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2552c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = RegisterNotificationRequestBuilder::MakeBuilder( 2562c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Event::NOW_PLAYING_CONTENT_CHANGED, 0); 2572c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto pkt = TestAvrcpPacket::Make(); 2582c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker request->Serialize(pkt); 2592c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, pkt); 2602c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2612c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Test the changed response for now playing list changed 2622c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto changed_response = 2632c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationResponseBuilder::MakeNowPlayingBuilder(false); 2642c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 2652c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(changed_response)))) 2662c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 2672c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->HandleNowPlayingUpdate(); 2682c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 2692c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2702c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getPlayStatusTest) { 2712c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 2722c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 2732c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2742c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 2752c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2762c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker PlayStatus status = {0x1234, 0x5678, PlayState::PLAYING}; 2772c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2782c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetPlayStatus(_)) 2792c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1) 2802c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<0>(status)); 2812c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2822c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker // Pretend the device is active 2832c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(a2dp_interface, active_peer()) 2842c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillRepeatedly(Return(test_device->GetAddress())); 2852c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2862c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto expected_response = GetPlayStatusResponseBuilder::MakeBuilder( 2872c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 0x5678, 0x1234, PlayState::PLAYING); 2882c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 2892c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, false, matchPacket(std::move(expected_response)))) 2902c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 2912c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2922c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = TestAvrcpPacket::Make(get_play_status_request); 2932c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, request); 2942c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 2952c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 2962c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getElementAttributesTest) { 2972c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 2982c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 2992c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3002c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 3012c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3022c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SongInfo info = {"test_id", 3032c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker {// The attribute map 3042c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TITLE, "Test Song"), 3052c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ARTIST_NAME, "Test Artist"), 3062c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ALBUM_NAME, "Test Album"), 3072c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TRACK_NUMBER, "1"), 3082c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"), 3092c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::GENRE, "Test Genre"), 3102c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::PLAYING_TIME, "1000")}}; 3112c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3122c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetSongInfo(_)).WillRepeatedly(InvokeCb<0>(info)); 3132c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3147bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker auto compare_to_partial = 3157bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker GetElementAttributesResponseBuilder::MakeBuilder(0xFFFF); 3162c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker compare_to_partial->AddAttributeEntry(Attribute::TITLE, "Test Song"); 3172c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 3182c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(2, false, matchPacket(std::move(compare_to_partial)))) 3192c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 3202c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(2, TestAvrcpPacket::Make(get_element_attributes_request_partial)); 3212c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3227bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker auto compare_to_full = 3237bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker GetElementAttributesResponseBuilder::MakeBuilder(0xFFFF); 3247bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::TITLE, "Test Song"); 3257bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::ARTIST_NAME, "Test Artist"); 3267bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::ALBUM_NAME, "Test Album"); 3277bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::TRACK_NUMBER, "1"); 3287bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"); 3297bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::GENRE, "Test Genre"); 3307bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::PLAYING_TIME, "1000"); 3312c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 3322c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(3, false, matchPacket(std::move(compare_to_full)))) 3332c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 3342c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(3, TestAvrcpPacket::Make(get_element_attributes_request_full)); 3352c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 3362c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 3377bed53df63e72be19412e6519b2f23ed2565bdaeAjay PanickerTEST_F(AvrcpDeviceTest, getElementAttributesMtuTest) { 3387bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker auto truncated_packet = 3397bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker GetElementAttributesResponseBuilder::MakeBuilder(0xFFFF); 3407bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker truncated_packet->AddAttributeEntry(Attribute::TITLE, "1234"); 3417bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 3427bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker MockMediaInterface interface; 3437bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 3447bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 3457bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker base::Callback<void(uint8_t, bool, AvrcpResponse)> cb = 3467bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker base::Bind([](MockFunction<void(uint8_t, bool, const AvrcpResponse&)>* a, 3477bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker uint8_t b, bool c, AvrcpResponse d) { a->Call(b, c, d); }, 3487bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker &response_cb); 3497bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Device device(RawAddress::kAny, true, cb, truncated_packet->size(), 0xFFFF); 3507bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 3517bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker device.RegisterInterfaces(&interface, &a2dp_interface, nullptr); 3527bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 3537bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker SongInfo info = {"test_id", 3547bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker {AttributeEntry(Attribute::TITLE, "1234truncated")}}; 3557bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker EXPECT_CALL(interface, GetSongInfo(_)).WillRepeatedly(InvokeCb<0>(info)); 3567bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 3577bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker EXPECT_CALL(response_cb, 3587bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Call(1, false, matchPacket(std::move(truncated_packet)))) 3597bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker .Times(1); 3607bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 3617bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker device.MessageReceived( 3627bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 1, TestAvrcpPacket::Make(get_element_attributes_request_full)); 3637bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker} 3647bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 36510c628697efecba73211998334f1f9acb9b2c9b8Ajay PanickerTEST_F(AvrcpDeviceTest, getTotalNumberOfItemsMediaPlayersTest) { 36610c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker MockMediaInterface interface; 36710c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 36810c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 36910c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 37010c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 37110c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker std::vector<MediaPlayerInfo> player_list = { 37210c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker {0, "player1", true}, {1, "player2", true}, {2, "player3", true}, 37310c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker }; 37410c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 37510c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker EXPECT_CALL(interface, GetMediaPlayerList(_)) 37610c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker .Times(1) 37710c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker .WillOnce(InvokeCb<0>(0, player_list)); 37810c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 37910c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker auto expected_response = GetTotalNumberOfItemsResponseBuilder::MakeBuilder( 38010c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker Status::NO_ERROR, 0, player_list.size()); 38110c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker EXPECT_CALL(response_cb, 38210c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker Call(1, true, matchPacket(std::move(expected_response)))) 38310c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker .Times(1); 38410c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 38510c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker SendBrowseMessage(1, TestBrowsePacket::Make( 38610c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker get_total_number_of_items_request_media_players)); 38710c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker} 38810c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 38910c628697efecba73211998334f1f9acb9b2c9b8Ajay PanickerTEST_F(AvrcpDeviceTest, getTotalNumberOfItemsVFSTest) { 39010c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker MockMediaInterface interface; 39110c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 39210c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 39310c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 39410c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 39510c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker std::vector<ListItem> vfs_list = { 39610c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker {ListItem::FOLDER, {"id1", true, "folder1"}, SongInfo()}, 39710c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker {ListItem::FOLDER, {"id2", true, "folder2"}, SongInfo()}, 39810c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker }; 39910c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 40010c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker EXPECT_CALL(interface, GetFolderItems(_, "", _)) 40110c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker .Times(1) 40210c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker .WillOnce(InvokeCb<2>(vfs_list)); 40310c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 40410c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker auto expected_response = GetTotalNumberOfItemsResponseBuilder::MakeBuilder( 40510c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker Status::NO_ERROR, 0, vfs_list.size()); 40610c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker EXPECT_CALL(response_cb, 40710c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker Call(1, true, matchPacket(std::move(expected_response)))) 40810c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker .Times(1); 40910c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 41010c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker SendBrowseMessage( 41110c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 1, TestBrowsePacket::Make(get_total_number_of_items_request_vfs)); 41210c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker} 41310c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 41410c628697efecba73211998334f1f9acb9b2c9b8Ajay PanickerTEST_F(AvrcpDeviceTest, getTotalNumberOfItemsNowPlayingTest) { 41510c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker MockMediaInterface interface; 41610c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 41710c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 41810c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 41910c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 42010c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker std::vector<SongInfo> now_playing_list = { 42110c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker {"test_id1", {}}, {"test_id2", {}}, {"test_id3", {}}, 42210c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker {"test_id4", {}}, {"test_id5", {}}, 42310c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker }; 42410c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 42510c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker EXPECT_CALL(interface, GetNowPlayingList(_)) 42610c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker .WillRepeatedly(InvokeCb<0>("test_id1", now_playing_list)); 42710c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 42810c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker auto expected_response = GetTotalNumberOfItemsResponseBuilder::MakeBuilder( 42910c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker Status::NO_ERROR, 0, now_playing_list.size()); 43010c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker EXPECT_CALL(response_cb, 43110c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker Call(1, true, matchPacket(std::move(expected_response)))) 43210c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker .Times(1); 43310c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 43410c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker SendBrowseMessage( 43510c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 1, TestBrowsePacket::Make(get_total_number_of_items_request_now_playing)); 43610c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker} 43710c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker 4382c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getMediaPlayerListTest) { 4392c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 4402c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 4412c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4422c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 4432c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4442c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MediaPlayerInfo info = {0, "Test Player", true}; 4452c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker std::vector<MediaPlayerInfo> list = {info}; 4462c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4472c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetMediaPlayerList(_)) 4482c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1) 4492c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<0>(0, list)); 4502c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4512c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto expected_response = GetFolderItemsResponseBuilder::MakePlayerListBuilder( 4527bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status::NO_ERROR, 0x0000, 0xFFFF); 4532c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker expected_response->AddMediaPlayer(MediaPlayerItem(0, "Test Player", true)); 4542c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 4552c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, true, matchPacket(std::move(expected_response)))) 4562c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 4572c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4582c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = TestBrowsePacket::Make(get_folder_items_request); 4592c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendBrowseMessage(1, request); 4602c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 4612c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4622c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getNowPlayingListTest) { 4632c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 4642c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 4652c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4662c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 4672c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4682c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SongInfo info = {"test_id", 4692c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker {// The attribute map 4702c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TITLE, "Test Song"), 4712c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ARTIST_NAME, "Test Artist"), 4722c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ALBUM_NAME, "Test Album"), 4732c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TRACK_NUMBER, "1"), 4742c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"), 4752c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::GENRE, "Test Genre"), 4762c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::PLAYING_TIME, "1000")}}; 4772c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker std::vector<SongInfo> list = {info}; 4782c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4792c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetNowPlayingList(_)) 4802c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillRepeatedly(InvokeCb<0>("test_id", list)); 4812c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4822c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto expected_response = GetFolderItemsResponseBuilder::MakeNowPlayingBuilder( 4837bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status::NO_ERROR, 0x0000, 0xFFFF); 4842c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker expected_response->AddSong(MediaElementItem(1, "Test Song", info.attributes)); 4852c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 4862c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, true, matchPacket(std::move(expected_response)))) 4872c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 4882c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4892c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = TestBrowsePacket::Make(get_folder_items_request_now_playing); 4902c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendBrowseMessage(1, request); 4912c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 4922c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4932c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getVFSFolderTest) { 4942c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 4952c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 4962c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4972c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 4982c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 4992c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker FolderInfo info = {"test_id", true, "Test Folder"}; 5002c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker ListItem item = {ListItem::FOLDER, info, SongInfo()}; 5012c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker std::vector<ListItem> list = {item}; 5022c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 5032c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetFolderItems(_, "", _)) 5042c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1) 5052c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<2>(list)); 5062c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 5077bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker auto expected_response = GetFolderItemsResponseBuilder::MakeVFSBuilder( 5087bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status::NO_ERROR, 0x0000, 0xFFFF); 5092c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker expected_response->AddFolder(FolderItem(1, 0, true, "Test Folder")); 5102c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 5112c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, true, matchPacket(std::move(expected_response)))) 5122c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 5132c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 5142c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = TestBrowsePacket::Make(get_folder_items_request_vfs); 5152c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendBrowseMessage(1, request); 5162c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 5172c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 5187bed53df63e72be19412e6519b2f23ed2565bdaeAjay PanickerTEST_F(AvrcpDeviceTest, getFolderItemsMtuTest) { 5197bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker auto truncated_packet = GetFolderItemsResponseBuilder::MakeVFSBuilder( 5207bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status::NO_ERROR, 0x0000, 0xFFFF); 5217bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker truncated_packet->AddFolder(FolderItem(1, 0, true, "Test Folder0")); 5227bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker truncated_packet->AddFolder(FolderItem(2, 0, true, "Test Folder1")); 5237bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 5247bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker MockMediaInterface interface; 5257bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 5267bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker base::Callback<void(uint8_t, bool, AvrcpResponse)> cb = 5277bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker base::Bind([](MockFunction<void(uint8_t, bool, const AvrcpResponse&)>* a, 5287bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker uint8_t b, bool c, AvrcpResponse d) { a->Call(b, c, d); }, 5297bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker &response_cb); 5307bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Device device(RawAddress::kAny, true, cb, 0xFFFF, truncated_packet->size()); 5317bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker device.RegisterInterfaces(&interface, &a2dp_interface, nullptr); 5327bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 5337bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker FolderInfo info0 = {"test_id0", true, "Test Folder0"}; 5347bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker FolderInfo info1 = {"test_id1", true, "Test Folder1"}; 5357bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker FolderInfo info2 = {"test_id1", true, "Truncated folder"}; 5367bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker ListItem item0 = {ListItem::FOLDER, info0, SongInfo()}; 5377bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker ListItem item1 = {ListItem::FOLDER, info1, SongInfo()}; 5387bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker ListItem item2 = {ListItem::FOLDER, info1, SongInfo()}; 5397bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker std::vector<ListItem> list0 = {item0, item1, item2}; 5407bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker EXPECT_CALL(interface, GetFolderItems(_, "", _)) 5417bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker .WillRepeatedly(InvokeCb<2>(list0)); 5427bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 5437bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker EXPECT_CALL(response_cb, 5447bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Call(1, true, matchPacket(std::move(truncated_packet)))) 5457bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker .Times(1); 5467bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker device.BrowseMessageReceived( 5477bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 1, TestBrowsePacket::Make(get_folder_items_request_vfs)); 5487bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker} 5497bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 550bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay PanickerTEST_F(AvrcpDeviceTest, changePathTest) { 551bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker MockMediaInterface interface; 552bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 553bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 554bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 555bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 556bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker FolderInfo info0 = {"test_id0", true, "Test Folder0"}; 557bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker FolderInfo info1 = {"test_id1", true, "Test Folder1"}; 558bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ListItem item0 = {ListItem::FOLDER, info0, SongInfo()}; 559bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ListItem item1 = {ListItem::FOLDER, info1, SongInfo()}; 560bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker std::vector<ListItem> list0 = {item0, item1}; 561bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(interface, GetFolderItems(_, "", _)) 562bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .Times(1) 563bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .WillRepeatedly(InvokeCb<2>(list0)); 564bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 565bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker FolderInfo info2 = {"test_id2", true, "Test Folder2"}; 566bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker FolderInfo info3 = {"test_id3", true, "Test Folder3"}; 567bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker FolderInfo info4 = {"test_id4", true, "Test Folder4"}; 568bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ListItem item2 = {ListItem::FOLDER, info2, SongInfo()}; 569bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ListItem item3 = {ListItem::FOLDER, info3, SongInfo()}; 570bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ListItem item4 = {ListItem::FOLDER, info4, SongInfo()}; 571bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker std::vector<ListItem> list1 = {item2, item3, item4}; 572bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(interface, GetFolderItems(_, "test_id1", _)) 573bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .Times(3) 574bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .WillRepeatedly(InvokeCb<2>(list1)); 575bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 576bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker std::vector<ListItem> list2 = {}; 577bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(interface, GetFolderItems(_, "test_id3", _)) 578bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .Times(1) 579bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .WillOnce(InvokeCb<2>(list2)); 580bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 5818b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker // Populate the VFS ID map 5827bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker auto folder_items_response = GetFolderItemsResponseBuilder::MakeVFSBuilder( 5837bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status::NO_ERROR, 0x0000, 0xFFFF); 584bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker folder_items_response->AddFolder(FolderItem(1, 0, true, "Test Folder0")); 585bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker folder_items_response->AddFolder(FolderItem(2, 0, true, "Test Folder1")); 586bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(response_cb, 587bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker Call(1, true, matchPacket(std::move(folder_items_response)))) 588bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .Times(1); 5898b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker 5908b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker auto folder_request_builder = 5918b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker GetFolderItemsRequestBuilder::MakeBuilder(Scope::VFS, 0, 3, {}); 5928b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker auto request = TestBrowsePacket::Make(); 5938b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker folder_request_builder->Serialize(request); 594bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker SendBrowseMessage(1, request); 595bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 596bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker // Change path down into Test Folder1 597bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker auto change_path_response = 598bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ChangePathResponseBuilder::MakeBuilder(Status::NO_ERROR, list1.size()); 599bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(response_cb, 600bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker Call(2, true, matchPacket(std::move(change_path_response)))); 6018b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker auto path_request_builder = 6028b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker ChangePathRequestBuilder::MakeBuilder(0, Direction::DOWN, 2); 6038b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker request = TestBrowsePacket::Make(); 6048b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker path_request_builder->Serialize(request); 605bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker SendBrowseMessage(2, request); 606bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 6078b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker // Populate the new VFS ID 6087bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker folder_items_response = GetFolderItemsResponseBuilder::MakeVFSBuilder( 6097bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Status::NO_ERROR, 0x0000, 0xFFFF); 6108b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker folder_items_response->AddFolder(FolderItem(3, 0, true, "Test Folder2")); 6118b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker folder_items_response->AddFolder(FolderItem(4, 0, true, "Test Folder3")); 6128b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker folder_items_response->AddFolder(FolderItem(5, 0, true, "Test Folder4")); 613bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(response_cb, 614bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker Call(3, true, matchPacket(std::move(folder_items_response)))) 615bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker .Times(1); 6168b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker folder_request_builder = 6178b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker GetFolderItemsRequestBuilder::MakeBuilder(Scope::VFS, 0, 3, {}); 6188b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker request = TestBrowsePacket::Make(); 6198b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker folder_request_builder->Serialize(request); 620bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker SendBrowseMessage(3, request); 621bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 622bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker // Change path down into Test Folder3 623bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker change_path_response = 624bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ChangePathResponseBuilder::MakeBuilder(Status::NO_ERROR, list2.size()); 625bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(response_cb, 626bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker Call(4, true, matchPacket(std::move(change_path_response)))); 6278b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker path_request_builder = 6288b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker ChangePathRequestBuilder::MakeBuilder(0, Direction::DOWN, 4); 6298b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker request = TestBrowsePacket::Make(); 6308b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker path_request_builder->Serialize(request); 631bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker SendBrowseMessage(4, request); 632bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 633bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker // Change path up back into Test Folder1 634bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker change_path_response = 635bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker ChangePathResponseBuilder::MakeBuilder(Status::NO_ERROR, list1.size()); 636bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker EXPECT_CALL(response_cb, 637bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker Call(5, true, matchPacket(std::move(change_path_response)))); 6388b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker path_request_builder = 6398b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker ChangePathRequestBuilder::MakeBuilder(0, Direction::UP, 0); 6408b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker request = TestBrowsePacket::Make(); 6418b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker path_request_builder->Serialize(request); 642bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker SendBrowseMessage(5, request); 643bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker} 644bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker 6452c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getItemAttributesNowPlayingTest) { 6462c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 6472c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 6482c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 6492c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 6502c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 6512c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SongInfo info = {"test_id", 6522c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker {// The attribute map 6532c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TITLE, "Test Song"), 6542c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ARTIST_NAME, "Test Artist"), 6552c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::ALBUM_NAME, "Test Album"), 6562c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TRACK_NUMBER, "1"), 6572c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"), 6582c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::GENRE, "Test Genre"), 6592c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker AttributeEntry(Attribute::PLAYING_TIME, "1000")}}; 6602c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker std::vector<SongInfo> list = {info}; 6612c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 6622c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(interface, GetNowPlayingList(_)) 6632c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillRepeatedly(InvokeCb<0>("test_id", list)); 6642c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 6652c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto compare_to_full = 6667bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker GetItemAttributesResponseBuilder::MakeBuilder(Status::NO_ERROR, 0xFFFF); 6677bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::TITLE, "Test Song"); 6687bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::ARTIST_NAME, "Test Artist"); 6697bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::ALBUM_NAME, "Test Album"); 6707bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::TRACK_NUMBER, "1"); 6717bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"); 6727bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::GENRE, "Test Genre"); 6737bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker compare_to_full->AddAttributeEntry(Attribute::PLAYING_TIME, "1000"); 6742c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, 6752c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker Call(1, true, matchPacket(std::move(compare_to_full)))) 6762c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 6772c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 6782c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto request = 6792c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker TestBrowsePacket::Make(get_item_attributes_request_all_attributes); 6802c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendBrowseMessage(1, request); 6812c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 6822c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 6837bed53df63e72be19412e6519b2f23ed2565bdaeAjay PanickerTEST_F(AvrcpDeviceTest, geItemAttributesMtuTest) { 6847bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker auto truncated_packet = 6857bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker GetItemAttributesResponseBuilder::MakeBuilder(Status::NO_ERROR, 0xFFFF); 6867bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker truncated_packet->AddAttributeEntry(Attribute::TITLE, "1234"); 6877bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 6887bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker MockMediaInterface interface; 6897bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 6907bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker base::Callback<void(uint8_t, bool, AvrcpResponse)> cb = 6917bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker base::Bind([](MockFunction<void(uint8_t, bool, const AvrcpResponse&)>* a, 6927bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker uint8_t b, bool c, AvrcpResponse d) { a->Call(b, c, d); }, 6937bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker &response_cb); 6947bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Device device(RawAddress::kAny, true, cb, 0xFFFF, truncated_packet->size()); 6957bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker device.RegisterInterfaces(&interface, &a2dp_interface, nullptr); 6967bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 6977bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker SongInfo info = {"test_id", 6987bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker {AttributeEntry(Attribute::TITLE, "1234truncated")}}; 6997bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker std::vector<SongInfo> list = {info}; 7007bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker EXPECT_CALL(interface, GetNowPlayingList(_)) 7017bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker .WillRepeatedly(InvokeCb<0>("test_id", list)); 7027bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 7037bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker EXPECT_CALL(response_cb, 7047bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker Call(1, true, matchPacket(std::move(truncated_packet)))) 7057bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker .Times(1); 7067bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker device.BrowseMessageReceived( 7077bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 1, TestBrowsePacket::Make(get_item_attributes_request_all_attributes)); 7087bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker} 7097bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker 7100278ba88c94e08401349b058c0047de699c4fc6eAjay PanickerTEST_F(AvrcpDeviceTest, setAddressedPlayerTest) { 7110278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker MockMediaInterface interface; 7120278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 7130278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker 7140278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 7150278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker 716fe5d973670cc6f95d7431f5a0699a326032e8b06Hansong Zhang auto set_addr_player_rsp = RejectBuilder::MakeBuilder( 717fe5d973670cc6f95d7431f5a0699a326032e8b06Hansong Zhang CommandPdu::SET_ADDRESSED_PLAYER, Status::INVALID_PLAYER_ID); 7180278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker 7190278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker EXPECT_CALL(response_cb, 7200278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker Call(1, false, matchPacket(std::move(set_addr_player_rsp)))) 7210278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker .Times(1); 7220278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker 7230278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker auto request = TestAvrcpPacket::Make(set_addressed_player_request); 7240278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker SendMessage(1, request); 7250278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker} 7260278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker 7272c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, volumeChangedTest) { 7282c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockMediaInterface interface; 7292c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 7302c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker MockVolumeInterface vol_interface; 7312c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 7322c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, &vol_interface); 7332c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 7342d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker // Pretend the device is active 7352d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker EXPECT_CALL(a2dp_interface, active_peer()) 7362d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker .WillRepeatedly(Return(test_device->GetAddress())); 7372d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker 7382c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto reg_notif = 7392c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationRequestBuilder::MakeBuilder(Event::VOLUME_CHANGED, 0); 7402c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(reg_notif)))) 7412c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 7422c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker test_device->RegisterVolumeChanged(); 7432c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 7442c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(vol_interface, DeviceConnected(test_device->GetAddress(), _)) 7452c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1) 7462c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .WillOnce(InvokeCb<1>(0x30)); 7472c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto set_vol = SetAbsoluteVolumeRequestBuilder::MakeBuilder(0x30); 7482c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(set_vol)))) 7492c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 7502c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 7512c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto response = TestAvrcpPacket::Make(interim_volume_changed_notification); 7522c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, response); 7532c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 7542c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(vol_interface, SetVolume(0x47)).Times(1); 7552c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker auto reg_notif2 = 7562c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker RegisterNotificationRequestBuilder::MakeBuilder(Event::VOLUME_CHANGED, 0); 7572d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(reg_notif2)))) 7582d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker .Times(1); 7592d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker response = TestAvrcpPacket::Make(changed_volume_changed_notification); 7602d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker SendMessage(1, response); 7612d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker response = TestAvrcpPacket::Make(interim_volume_changed_notification); 7622d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker SendMessage(1, response); 7632d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker} 7642d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker 7652d9889ec07bcb067c04c743abfe6b5095104ed1aAjay PanickerTEST_F(AvrcpDeviceTest, volumeChangedNonActiveTest) { 7662d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker MockMediaInterface interface; 7672d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 7682d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker MockVolumeInterface vol_interface; 7692d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker 7702d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, &vol_interface); 7712d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker 77205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker // Pretend the device isn't active 7732d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker EXPECT_CALL(a2dp_interface, active_peer()) 7742d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker .WillRepeatedly(Return(RawAddress::kEmpty)); 7752d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker 7762d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker auto reg_notif = 7772d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker RegisterNotificationRequestBuilder::MakeBuilder(Event::VOLUME_CHANGED, 0); 7782d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(reg_notif)))) 7792d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker .Times(1); 7802d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker test_device->RegisterVolumeChanged(); 7812d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker 7822d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker EXPECT_CALL(vol_interface, DeviceConnected(test_device->GetAddress(), _)) 7832d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker .Times(1) 7842d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker .WillOnce(InvokeCb<1>(0x30)); 7852d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker auto set_vol = SetAbsoluteVolumeRequestBuilder::MakeBuilder(0x30); 7862d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(set_vol)))) 7872d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker .Times(1); 7882d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker 7892d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker auto response = TestAvrcpPacket::Make(interim_volume_changed_notification); 7902d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker SendMessage(1, response); 7912d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker 7922d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker // Ensure that SetVolume is never called 7932d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker EXPECT_CALL(vol_interface, SetVolume(0x47)).Times(0); 7942d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker 7952d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker auto reg_notif2 = 7962d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker RegisterNotificationRequestBuilder::MakeBuilder(Event::VOLUME_CHANGED, 0); 7972c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(reg_notif2)))) 7982c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker .Times(1); 7992c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker response = TestAvrcpPacket::Make(changed_volume_changed_notification); 8002c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, response); 8012c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker response = TestAvrcpPacket::Make(interim_volume_changed_notification); 8022c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker SendMessage(1, response); 8032c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} 8042c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker 80585f2a3e410af221ee8732c7a34413180d11513bcAjay PanickerTEST_F(AvrcpDeviceTest, volumeRejectedTest) { 80685f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker MockMediaInterface interface; 80785f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 80885f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker MockVolumeInterface vol_interface; 80985f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker 81085f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, &vol_interface); 81185f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker 81285f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker auto reg_notif = 81385f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker RegisterNotificationRequestBuilder::MakeBuilder(Event::VOLUME_CHANGED, 0); 81485f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(reg_notif)))) 81585f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker .Times(1); 81685f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker test_device->RegisterVolumeChanged(); 81785f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker 81885f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker auto response = TestAvrcpPacket::Make(rejected_volume_changed_notification); 81985f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker SendMessage(1, response); 82085f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker 82185f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker EXPECT_CALL(response_cb, Call(_, _, _)).Times(0); 82285f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker} 82385f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker 82405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay PanickerTEST_F(AvrcpDeviceTest, playPushedActiveDeviceTest) { 82505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker MockMediaInterface interface; 82605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 82705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker MockVolumeInterface vol_interface; 82805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 82905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, &vol_interface); 83005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 83105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker // Pretend the device is active 83205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(a2dp_interface, active_peer()) 83305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker .WillRepeatedly(Return(test_device->GetAddress())); 83405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 83505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker auto play_pushed = PassThroughPacketBuilder::MakeBuilder(false, true, 0x44); 83605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker auto play_pushed_response = 83705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker PassThroughPacketBuilder::MakeBuilder(true, true, 0x44); 83805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(response_cb, 83905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker Call(_, false, matchPacket(std::move(play_pushed_response)))) 84005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker .Times(1); 84105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 84205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker PlayStatus status = {0x1234, 0x5678, PlayState::PLAYING}; 84305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(interface, GetPlayStatus(_)) 84405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker .Times(1) 84505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker .WillOnce(InvokeCb<0>(status)); 84605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 84705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(interface, SendKeyEvent(0x44, KeyState::PUSHED)).Times(1); 84805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 84905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker auto play_pushed_pkt = TestAvrcpPacket::Make(); 85005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker play_pushed->Serialize(play_pushed_pkt); 85105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 85205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker SendMessage(1, play_pushed_pkt); 85305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker} 85405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 85505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay PanickerTEST_F(AvrcpDeviceTest, playPushedInactiveDeviceTest) { 85605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker MockMediaInterface interface; 85705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 85805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker MockVolumeInterface vol_interface; 85905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 86005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, &vol_interface); 86105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 86205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker // Pretend the device is not active 86305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(a2dp_interface, active_peer()) 86405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker .WillRepeatedly(Return(RawAddress::kEmpty)); 86505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 86605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker auto play_pushed = PassThroughPacketBuilder::MakeBuilder(false, true, 0x44); 86705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker auto play_pushed_response = 86805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker PassThroughPacketBuilder::MakeBuilder(true, true, 0x44); 86905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(response_cb, 87005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker Call(_, false, matchPacket(std::move(play_pushed_response)))) 87105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker .Times(1); 87205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 87305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker // Expect that the device will try to set itself as active 87405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(interface, SetActiveDevice(test_device->GetAddress())).Times(1); 87505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 87605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker // No play command should be sent since the music is already playing 87705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker PlayStatus status = {0x1234, 0x5678, PlayState::PLAYING}; 87805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(interface, GetPlayStatus(_)) 87905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker .Times(1) 88005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker .WillOnce(InvokeCb<0>(status)); 88105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(interface, SendKeyEvent(0x44, KeyState::PUSHED)).Times(0); 88205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 88305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker auto play_pushed_pkt = TestAvrcpPacket::Make(); 88405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker play_pushed->Serialize(play_pushed_pkt); 88505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 88605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker SendMessage(1, play_pushed_pkt); 88705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker} 88805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 88905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay PanickerTEST_F(AvrcpDeviceTest, mediaKeyActiveDeviceTest) { 89005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker MockMediaInterface interface; 89105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 89205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker MockVolumeInterface vol_interface; 89305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 89405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, &vol_interface); 89505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 89605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker // Pretend the device is active 89705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(a2dp_interface, active_peer()) 89805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker .WillRepeatedly(Return(test_device->GetAddress())); 89905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 90005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker auto play_released = 90105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker PassThroughPacketBuilder::MakeBuilder(false, false, 0x44); 90205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker auto play_released_response = 90305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker PassThroughPacketBuilder::MakeBuilder(true, false, 0x44); 90405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(response_cb, 90505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker Call(_, false, matchPacket(std::move(play_released_response)))) 90605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker .Times(1); 90705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 90805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(interface, GetPlayStatus(_)).Times(0); 90905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 91005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(interface, SendKeyEvent(0x44, KeyState::RELEASED)).Times(1); 91105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 91205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker auto play_released_pkt = TestAvrcpPacket::Make(); 91305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker play_released->Serialize(play_released_pkt); 91405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 91505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker SendMessage(1, play_released_pkt); 91605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker} 91705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 91805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay PanickerTEST_F(AvrcpDeviceTest, mediaKeyInactiveDeviceTest) { 91905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker MockMediaInterface interface; 92005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker NiceMock<MockA2dpInterface> a2dp_interface; 92105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker MockVolumeInterface vol_interface; 92205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 92305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker test_device->RegisterInterfaces(&interface, &a2dp_interface, &vol_interface); 92405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 92505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker // Pretend the device is not active 92605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(a2dp_interface, active_peer()) 92705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker .WillRepeatedly(Return(RawAddress::kEmpty)); 92805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 92905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker auto play_released = 93005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker PassThroughPacketBuilder::MakeBuilder(false, false, 0x44); 93105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker auto play_released_response = 93205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker PassThroughPacketBuilder::MakeBuilder(true, false, 0x44); 93305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(response_cb, 93405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker Call(_, false, matchPacket(std::move(play_released_response)))) 93505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker .Times(1); 93605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 93705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(interface, GetPlayStatus(_)).Times(0); 93805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 93905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker // Expect that the key event wont be sent to the media interface 94005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker EXPECT_CALL(interface, SendKeyEvent(0x44, KeyState::RELEASED)).Times(0); 94105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 94205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker auto play_released_pkt = TestAvrcpPacket::Make(); 94305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker play_released->Serialize(play_released_pkt); 94405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 94505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker SendMessage(1, play_released_pkt); 94605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker} 94705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker 9485e872794641b89b63176befdb04865d5acf14aa3tedwangTEST_F(AvrcpDeviceTest, getCapabilitiesTest) { 9495e872794641b89b63176befdb04865d5acf14aa3tedwang MockMediaInterface interface; 9505e872794641b89b63176befdb04865d5acf14aa3tedwang NiceMock<MockA2dpInterface> a2dp_interface; 9515e872794641b89b63176befdb04865d5acf14aa3tedwang 9525e872794641b89b63176befdb04865d5acf14aa3tedwang test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 9535e872794641b89b63176befdb04865d5acf14aa3tedwang 9545e872794641b89b63176befdb04865d5acf14aa3tedwang // GetCapabilities with CapabilityID COMPANY_ID 9555e872794641b89b63176befdb04865d5acf14aa3tedwang auto request_company_id_response = 9565e872794641b89b63176befdb04865d5acf14aa3tedwang GetCapabilitiesResponseBuilder::MakeCompanyIdBuilder(0x001958); 9575e872794641b89b63176befdb04865d5acf14aa3tedwang request_company_id_response->AddCompanyId(0x002345); 9585e872794641b89b63176befdb04865d5acf14aa3tedwang EXPECT_CALL( 9595e872794641b89b63176befdb04865d5acf14aa3tedwang response_cb, 9605e872794641b89b63176befdb04865d5acf14aa3tedwang Call(1, false, matchPacket(std::move(request_company_id_response)))) 9615e872794641b89b63176befdb04865d5acf14aa3tedwang .Times(1); 9625e872794641b89b63176befdb04865d5acf14aa3tedwang 9635e872794641b89b63176befdb04865d5acf14aa3tedwang auto request_company_id = 9645e872794641b89b63176befdb04865d5acf14aa3tedwang TestAvrcpPacket::Make(get_capabilities_request_company_id); 9655e872794641b89b63176befdb04865d5acf14aa3tedwang SendMessage(1, request_company_id); 9665e872794641b89b63176befdb04865d5acf14aa3tedwang 9675e872794641b89b63176befdb04865d5acf14aa3tedwang // GetCapabilities with CapabilityID EVENTS_SUPPORTED 9685e872794641b89b63176befdb04865d5acf14aa3tedwang auto request_events_supported_response = 9695e872794641b89b63176befdb04865d5acf14aa3tedwang GetCapabilitiesResponseBuilder::MakeEventsSupportedBuilder( 9705e872794641b89b63176befdb04865d5acf14aa3tedwang Event::PLAYBACK_STATUS_CHANGED); 9715e872794641b89b63176befdb04865d5acf14aa3tedwang request_events_supported_response->AddEvent(Event::TRACK_CHANGED); 9725e872794641b89b63176befdb04865d5acf14aa3tedwang request_events_supported_response->AddEvent(Event::PLAYBACK_POS_CHANGED); 9735e872794641b89b63176befdb04865d5acf14aa3tedwang 9745e872794641b89b63176befdb04865d5acf14aa3tedwang EXPECT_CALL( 9755e872794641b89b63176befdb04865d5acf14aa3tedwang response_cb, 9765e872794641b89b63176befdb04865d5acf14aa3tedwang Call(2, false, matchPacket(std::move(request_events_supported_response)))) 9775e872794641b89b63176befdb04865d5acf14aa3tedwang .Times(1); 9785e872794641b89b63176befdb04865d5acf14aa3tedwang 9795e872794641b89b63176befdb04865d5acf14aa3tedwang auto request_events_supported = 9805e872794641b89b63176befdb04865d5acf14aa3tedwang TestAvrcpPacket::Make(get_capabilities_request); 9815e872794641b89b63176befdb04865d5acf14aa3tedwang SendMessage(2, request_events_supported); 9825e872794641b89b63176befdb04865d5acf14aa3tedwang 9835e872794641b89b63176befdb04865d5acf14aa3tedwang // GetCapabilities with CapabilityID UNKNOWN 9845e872794641b89b63176befdb04865d5acf14aa3tedwang auto request_unknown_response = RejectBuilder::MakeBuilder( 9855e872794641b89b63176befdb04865d5acf14aa3tedwang CommandPdu::GET_CAPABILITIES, Status::INVALID_PARAMETER); 9865e872794641b89b63176befdb04865d5acf14aa3tedwang 9875e872794641b89b63176befdb04865d5acf14aa3tedwang EXPECT_CALL(response_cb, 9885e872794641b89b63176befdb04865d5acf14aa3tedwang Call(3, false, matchPacket(std::move(request_unknown_response)))) 9895e872794641b89b63176befdb04865d5acf14aa3tedwang .Times(1); 9905e872794641b89b63176befdb04865d5acf14aa3tedwang 9915e872794641b89b63176befdb04865d5acf14aa3tedwang auto request_unknown = 9925e872794641b89b63176befdb04865d5acf14aa3tedwang TestAvrcpPacket::Make(get_capabilities_request_unknown); 9935e872794641b89b63176befdb04865d5acf14aa3tedwang SendMessage(3, request_unknown); 9945e872794641b89b63176befdb04865d5acf14aa3tedwang} 9955e872794641b89b63176befdb04865d5acf14aa3tedwang 9967a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong ZhangTEST_F(AvrcpDeviceTest, getInvalidItemAttributesTest) { 9977a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang MockMediaInterface interface; 9987a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang NiceMock<MockA2dpInterface> a2dp_interface; 9997a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang 10007a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr); 10017a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang 10027a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang SongInfo info = {"test_id", 10037a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang {// The attribute map 10047a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang AttributeEntry(Attribute::TITLE, "Test Song"), 10057a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang AttributeEntry(Attribute::ARTIST_NAME, "Test Artist"), 10067a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang AttributeEntry(Attribute::ALBUM_NAME, "Test Album"), 10077a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang AttributeEntry(Attribute::TRACK_NUMBER, "1"), 10087a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang AttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"), 10097a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang AttributeEntry(Attribute::GENRE, "Test Genre"), 10107a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang AttributeEntry(Attribute::PLAYING_TIME, "1000")}}; 10117a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang std::vector<SongInfo> list = {info}; 10127a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang 10137a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang EXPECT_CALL(interface, GetNowPlayingList(_)) 10147a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang .WillRepeatedly(InvokeCb<0>("test_id", list)); 10157a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang 10167a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang auto compare_to_full = GetItemAttributesResponseBuilder::MakeBuilder( 10177a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang Status::UIDS_CHANGED, 0xFFFF); 10187a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang compare_to_full->AddAttributeEntry(Attribute::TITLE, "Test Song"); 10197a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang compare_to_full->AddAttributeEntry(Attribute::ARTIST_NAME, "Test Artist"); 10207a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang compare_to_full->AddAttributeEntry(Attribute::ALBUM_NAME, "Test Album"); 10217a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang compare_to_full->AddAttributeEntry(Attribute::TRACK_NUMBER, "1"); 10227a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang compare_to_full->AddAttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"); 10237a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang compare_to_full->AddAttributeEntry(Attribute::GENRE, "Test Genre"); 10247a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang compare_to_full->AddAttributeEntry(Attribute::PLAYING_TIME, "1000"); 10257a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang EXPECT_CALL(response_cb, 10267a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang Call(1, true, matchPacket(std::move(compare_to_full)))) 10277a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang .Times(1); 10287a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang 10297a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang auto request = TestBrowsePacket::Make( 10307a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang get_item_attributes_request_all_attributes_invalid); 10317a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang SendBrowseMessage(1, request); 10327a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang} 10337a866f54e0f9b2f687a4075a87258ce74c6a3d37Hansong Zhang 10342c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker} // namespace avrcp 10355e872794641b89b63176befdb04865d5acf14aa3tedwang} // namespace bluetooth 1036a25fca2acb30aafab9cedc521888b794b703eff3tedwang 1037a25fca2acb30aafab9cedc521888b794b703eff3tedwangconst stack_config_t* stack_config_get_interface(void) { 1038a25fca2acb30aafab9cedc521888b794b703eff3tedwang return &bluetooth::avrcp::interface; 1039a25fca2acb30aafab9cedc521888b794b703eff3tedwang} 1040