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