avrcp_device_test.cc revision 05c13ff0be3e638bbbd54786f60f3a3b17d1e1c0
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
35810c628697efecba73211998334f1f9acb9b2c9b8Ajay PanickerTEST_F(AvrcpDeviceTest, getTotalNumberOfItemsMediaPlayersTest) {
35910c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  MockMediaInterface interface;
36010c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
36110c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
36210c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr);
36310c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
36410c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  std::vector<MediaPlayerInfo> player_list = {
36510c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      {0, "player1", true}, {1, "player2", true}, {2, "player3", true},
36610c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  };
36710c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
36810c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  EXPECT_CALL(interface, GetMediaPlayerList(_))
36910c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      .Times(1)
37010c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      .WillOnce(InvokeCb<0>(0, player_list));
37110c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
37210c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  auto expected_response = GetTotalNumberOfItemsResponseBuilder::MakeBuilder(
37310c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      Status::NO_ERROR, 0, player_list.size());
37410c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  EXPECT_CALL(response_cb,
37510c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker              Call(1, true, matchPacket(std::move(expected_response))))
37610c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      .Times(1);
37710c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
37810c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  SendBrowseMessage(1, TestBrowsePacket::Make(
37910c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker                           get_total_number_of_items_request_media_players));
38010c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker}
38110c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
38210c628697efecba73211998334f1f9acb9b2c9b8Ajay PanickerTEST_F(AvrcpDeviceTest, getTotalNumberOfItemsVFSTest) {
38310c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  MockMediaInterface interface;
38410c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
38510c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
38610c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr);
38710c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
38810c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  std::vector<ListItem> vfs_list = {
38910c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      {ListItem::FOLDER, {"id1", true, "folder1"}, SongInfo()},
39010c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      {ListItem::FOLDER, {"id2", true, "folder2"}, SongInfo()},
39110c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  };
39210c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
39310c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  EXPECT_CALL(interface, GetFolderItems(_, "", _))
39410c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      .Times(1)
39510c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      .WillOnce(InvokeCb<2>(vfs_list));
39610c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
39710c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  auto expected_response = GetTotalNumberOfItemsResponseBuilder::MakeBuilder(
39810c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      Status::NO_ERROR, 0, vfs_list.size());
39910c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  EXPECT_CALL(response_cb,
40010c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker              Call(1, true, matchPacket(std::move(expected_response))))
40110c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      .Times(1);
40210c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
40310c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  SendBrowseMessage(
40410c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      1, TestBrowsePacket::Make(get_total_number_of_items_request_vfs));
40510c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker}
40610c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
40710c628697efecba73211998334f1f9acb9b2c9b8Ajay PanickerTEST_F(AvrcpDeviceTest, getTotalNumberOfItemsNowPlayingTest) {
40810c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  MockMediaInterface interface;
40910c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
41010c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
41110c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr);
41210c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
41310c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  std::vector<SongInfo> now_playing_list = {
41410c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      {"test_id1", {}}, {"test_id2", {}}, {"test_id3", {}},
41510c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      {"test_id4", {}}, {"test_id5", {}},
41610c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  };
41710c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
41810c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  EXPECT_CALL(interface, GetNowPlayingList(_))
41910c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      .WillRepeatedly(InvokeCb<0>("test_id1", now_playing_list));
42010c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
42110c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  auto expected_response = GetTotalNumberOfItemsResponseBuilder::MakeBuilder(
42210c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      Status::NO_ERROR, 0, now_playing_list.size());
42310c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  EXPECT_CALL(response_cb,
42410c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker              Call(1, true, matchPacket(std::move(expected_response))))
42510c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      .Times(1);
42610c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
42710c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker  SendBrowseMessage(
42810c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker      1, TestBrowsePacket::Make(get_total_number_of_items_request_now_playing));
42910c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker}
43010c628697efecba73211998334f1f9acb9b2c9b8Ajay Panicker
4312c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getMediaPlayerListTest) {
4322c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  MockMediaInterface interface;
4332c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
4342c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
4352c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr);
4362c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
4372c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  MediaPlayerInfo info = {0, "Test Player", true};
4382c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  std::vector<MediaPlayerInfo> list = {info};
4392c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
4402c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  EXPECT_CALL(interface, GetMediaPlayerList(_))
4412c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      .Times(1)
4422c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      .WillOnce(InvokeCb<0>(0, list));
4432c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
4442c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  auto expected_response = GetFolderItemsResponseBuilder::MakePlayerListBuilder(
4457bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      Status::NO_ERROR, 0x0000, 0xFFFF);
4462c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  expected_response->AddMediaPlayer(MediaPlayerItem(0, "Test Player", true));
4472c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  EXPECT_CALL(response_cb,
4482c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker              Call(1, true, matchPacket(std::move(expected_response))))
4492c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      .Times(1);
4502c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
4512c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  auto request = TestBrowsePacket::Make(get_folder_items_request);
4522c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  SendBrowseMessage(1, request);
4532c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker}
4542c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
4552c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getNowPlayingListTest) {
4562c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  MockMediaInterface interface;
4572c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
4582c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
4592c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr);
4602c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
4612c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  SongInfo info = {"test_id",
4622c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                   {// The attribute map
4632c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                    AttributeEntry(Attribute::TITLE, "Test Song"),
4642c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                    AttributeEntry(Attribute::ARTIST_NAME, "Test Artist"),
4652c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                    AttributeEntry(Attribute::ALBUM_NAME, "Test Album"),
4662c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                    AttributeEntry(Attribute::TRACK_NUMBER, "1"),
4672c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                    AttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"),
4682c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                    AttributeEntry(Attribute::GENRE, "Test Genre"),
4692c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                    AttributeEntry(Attribute::PLAYING_TIME, "1000")}};
4702c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  std::vector<SongInfo> list = {info};
4712c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
4722c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  EXPECT_CALL(interface, GetNowPlayingList(_))
4732c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      .WillRepeatedly(InvokeCb<0>("test_id", list));
4742c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
4752c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  auto expected_response = GetFolderItemsResponseBuilder::MakeNowPlayingBuilder(
4767bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      Status::NO_ERROR, 0x0000, 0xFFFF);
4772c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  expected_response->AddSong(MediaElementItem(1, "Test Song", info.attributes));
4782c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  EXPECT_CALL(response_cb,
4792c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker              Call(1, true, matchPacket(std::move(expected_response))))
4802c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      .Times(1);
4812c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
4822c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  auto request = TestBrowsePacket::Make(get_folder_items_request_now_playing);
4832c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  SendBrowseMessage(1, request);
4842c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker}
4852c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
4862c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getVFSFolderTest) {
4872c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  MockMediaInterface interface;
4882c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
4892c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
4902c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr);
4912c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
4922c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  FolderInfo info = {"test_id", true, "Test Folder"};
4932c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  ListItem item = {ListItem::FOLDER, info, SongInfo()};
4942c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  std::vector<ListItem> list = {item};
4952c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
4962c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  EXPECT_CALL(interface, GetFolderItems(_, "", _))
4972c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      .Times(1)
4982c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      .WillOnce(InvokeCb<2>(list));
4992c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
5007bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  auto expected_response = GetFolderItemsResponseBuilder::MakeVFSBuilder(
5017bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      Status::NO_ERROR, 0x0000, 0xFFFF);
5022c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  expected_response->AddFolder(FolderItem(1, 0, true, "Test Folder"));
5032c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  EXPECT_CALL(response_cb,
5042c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker              Call(1, true, matchPacket(std::move(expected_response))))
5052c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      .Times(1);
5062c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
5072c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  auto request = TestBrowsePacket::Make(get_folder_items_request_vfs);
5082c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  SendBrowseMessage(1, request);
5092c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker}
5102c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
5117bed53df63e72be19412e6519b2f23ed2565bdaeAjay PanickerTEST_F(AvrcpDeviceTest, getFolderItemsMtuTest) {
5127bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  auto truncated_packet = GetFolderItemsResponseBuilder::MakeVFSBuilder(
5137bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      Status::NO_ERROR, 0x0000, 0xFFFF);
5147bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  truncated_packet->AddFolder(FolderItem(1, 0, true, "Test Folder0"));
5157bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  truncated_packet->AddFolder(FolderItem(2, 0, true, "Test Folder1"));
5167bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker
5177bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  MockMediaInterface interface;
5187bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
5197bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  base::Callback<void(uint8_t, bool, AvrcpResponse)> cb =
5207bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      base::Bind([](MockFunction<void(uint8_t, bool, const AvrcpResponse&)>* a,
5217bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker                    uint8_t b, bool c, AvrcpResponse d) { a->Call(b, c, d); },
5227bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker                 &response_cb);
5237bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  Device device(RawAddress::kAny, true, cb, 0xFFFF, truncated_packet->size());
5247bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  device.RegisterInterfaces(&interface, &a2dp_interface, nullptr);
5257bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker
5267bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  FolderInfo info0 = {"test_id0", true, "Test Folder0"};
5277bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  FolderInfo info1 = {"test_id1", true, "Test Folder1"};
5287bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  FolderInfo info2 = {"test_id1", true, "Truncated folder"};
5297bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  ListItem item0 = {ListItem::FOLDER, info0, SongInfo()};
5307bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  ListItem item1 = {ListItem::FOLDER, info1, SongInfo()};
5317bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  ListItem item2 = {ListItem::FOLDER, info1, SongInfo()};
5327bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  std::vector<ListItem> list0 = {item0, item1, item2};
5337bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  EXPECT_CALL(interface, GetFolderItems(_, "", _))
5347bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      .WillRepeatedly(InvokeCb<2>(list0));
5357bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker
5367bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  EXPECT_CALL(response_cb,
5377bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker              Call(1, true, matchPacket(std::move(truncated_packet))))
5387bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      .Times(1);
5397bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  device.BrowseMessageReceived(
5407bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      1, TestBrowsePacket::Make(get_folder_items_request_vfs));
5417bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker}
5427bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker
543bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay PanickerTEST_F(AvrcpDeviceTest, changePathTest) {
544bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  MockMediaInterface interface;
545bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
546bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker
547bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr);
548bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker
549bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  FolderInfo info0 = {"test_id0", true, "Test Folder0"};
550bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  FolderInfo info1 = {"test_id1", true, "Test Folder1"};
551bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  ListItem item0 = {ListItem::FOLDER, info0, SongInfo()};
552bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  ListItem item1 = {ListItem::FOLDER, info1, SongInfo()};
553bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  std::vector<ListItem> list0 = {item0, item1};
554bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  EXPECT_CALL(interface, GetFolderItems(_, "", _))
555bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker      .Times(1)
556bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker      .WillRepeatedly(InvokeCb<2>(list0));
557bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker
558bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  FolderInfo info2 = {"test_id2", true, "Test Folder2"};
559bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  FolderInfo info3 = {"test_id3", true, "Test Folder3"};
560bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  FolderInfo info4 = {"test_id4", true, "Test Folder4"};
561bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  ListItem item2 = {ListItem::FOLDER, info2, SongInfo()};
562bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  ListItem item3 = {ListItem::FOLDER, info3, SongInfo()};
563bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  ListItem item4 = {ListItem::FOLDER, info4, SongInfo()};
564bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  std::vector<ListItem> list1 = {item2, item3, item4};
565bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  EXPECT_CALL(interface, GetFolderItems(_, "test_id1", _))
566bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker      .Times(3)
567bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker      .WillRepeatedly(InvokeCb<2>(list1));
568bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker
569bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  std::vector<ListItem> list2 = {};
570bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  EXPECT_CALL(interface, GetFolderItems(_, "test_id3", _))
571bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker      .Times(1)
572bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker      .WillOnce(InvokeCb<2>(list2));
573bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker
5748b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  // Populate the VFS ID map
5757bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  auto folder_items_response = GetFolderItemsResponseBuilder::MakeVFSBuilder(
5767bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      Status::NO_ERROR, 0x0000, 0xFFFF);
577bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  folder_items_response->AddFolder(FolderItem(1, 0, true, "Test Folder0"));
578bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  folder_items_response->AddFolder(FolderItem(2, 0, true, "Test Folder1"));
579bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  EXPECT_CALL(response_cb,
580bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker              Call(1, true, matchPacket(std::move(folder_items_response))))
581bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker      .Times(1);
5828b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker
5838b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  auto folder_request_builder =
5848b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker      GetFolderItemsRequestBuilder::MakeBuilder(Scope::VFS, 0, 3, {});
5858b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  auto request = TestBrowsePacket::Make();
5868b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  folder_request_builder->Serialize(request);
587bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  SendBrowseMessage(1, request);
588bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker
589bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  // Change path down into Test Folder1
590bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  auto change_path_response =
591bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker      ChangePathResponseBuilder::MakeBuilder(Status::NO_ERROR, list1.size());
592bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  EXPECT_CALL(response_cb,
593bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker              Call(2, true, matchPacket(std::move(change_path_response))));
5948b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  auto path_request_builder =
5958b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker      ChangePathRequestBuilder::MakeBuilder(0, Direction::DOWN, 2);
5968b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  request = TestBrowsePacket::Make();
5978b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  path_request_builder->Serialize(request);
598bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  SendBrowseMessage(2, request);
599bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker
6008b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  // Populate the new VFS ID
6017bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  folder_items_response = GetFolderItemsResponseBuilder::MakeVFSBuilder(
6027bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      Status::NO_ERROR, 0x0000, 0xFFFF);
6038b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  folder_items_response->AddFolder(FolderItem(3, 0, true, "Test Folder2"));
6048b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  folder_items_response->AddFolder(FolderItem(4, 0, true, "Test Folder3"));
6058b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  folder_items_response->AddFolder(FolderItem(5, 0, true, "Test Folder4"));
606bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  EXPECT_CALL(response_cb,
607bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker              Call(3, true, matchPacket(std::move(folder_items_response))))
608bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker      .Times(1);
6098b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  folder_request_builder =
6108b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker      GetFolderItemsRequestBuilder::MakeBuilder(Scope::VFS, 0, 3, {});
6118b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  request = TestBrowsePacket::Make();
6128b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  folder_request_builder->Serialize(request);
613bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  SendBrowseMessage(3, request);
614bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker
615bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  // Change path down into Test Folder3
616bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  change_path_response =
617bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker      ChangePathResponseBuilder::MakeBuilder(Status::NO_ERROR, list2.size());
618bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  EXPECT_CALL(response_cb,
619bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker              Call(4, true, matchPacket(std::move(change_path_response))));
6208b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  path_request_builder =
6218b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker      ChangePathRequestBuilder::MakeBuilder(0, Direction::DOWN, 4);
6228b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  request = TestBrowsePacket::Make();
6238b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  path_request_builder->Serialize(request);
624bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  SendBrowseMessage(4, request);
625bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker
626bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  // Change path up back into Test Folder1
627bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  change_path_response =
628bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker      ChangePathResponseBuilder::MakeBuilder(Status::NO_ERROR, list1.size());
629bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  EXPECT_CALL(response_cb,
630bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker              Call(5, true, matchPacket(std::move(change_path_response))));
6318b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  path_request_builder =
6328b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker      ChangePathRequestBuilder::MakeBuilder(0, Direction::UP, 0);
6338b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  request = TestBrowsePacket::Make();
6348b6e6b8b9f8190cfbcdabb53ced727f81523d2b4Ajay Panicker  path_request_builder->Serialize(request);
635bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker  SendBrowseMessage(5, request);
636bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker}
637bfd23f5b102278fcb0104811e7d77c8d6e3c8487Ajay Panicker
6382c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, getItemAttributesNowPlayingTest) {
6392c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  MockMediaInterface interface;
6402c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
6412c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
6422c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr);
6432c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
6442c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  SongInfo info = {"test_id",
6452c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                   {// The attribute map
6462c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                    AttributeEntry(Attribute::TITLE, "Test Song"),
6472c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                    AttributeEntry(Attribute::ARTIST_NAME, "Test Artist"),
6482c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                    AttributeEntry(Attribute::ALBUM_NAME, "Test Album"),
6492c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                    AttributeEntry(Attribute::TRACK_NUMBER, "1"),
6502c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                    AttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2"),
6512c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                    AttributeEntry(Attribute::GENRE, "Test Genre"),
6522c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker                    AttributeEntry(Attribute::PLAYING_TIME, "1000")}};
6532c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  std::vector<SongInfo> list = {info};
6542c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
6552c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  EXPECT_CALL(interface, GetNowPlayingList(_))
6562c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      .WillRepeatedly(InvokeCb<0>("test_id", list));
6572c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
6582c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  auto compare_to_full =
6597bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      GetItemAttributesResponseBuilder::MakeBuilder(Status::NO_ERROR, 0xFFFF);
6607bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  compare_to_full->AddAttributeEntry(Attribute::TITLE, "Test Song");
6617bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  compare_to_full->AddAttributeEntry(Attribute::ARTIST_NAME, "Test Artist");
6627bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  compare_to_full->AddAttributeEntry(Attribute::ALBUM_NAME, "Test Album");
6637bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  compare_to_full->AddAttributeEntry(Attribute::TRACK_NUMBER, "1");
6647bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  compare_to_full->AddAttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2");
6657bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  compare_to_full->AddAttributeEntry(Attribute::GENRE, "Test Genre");
6667bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  compare_to_full->AddAttributeEntry(Attribute::PLAYING_TIME, "1000");
6672c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  EXPECT_CALL(response_cb,
6682c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker              Call(1, true, matchPacket(std::move(compare_to_full))))
6692c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      .Times(1);
6702c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
6712c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  auto request =
6722c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      TestBrowsePacket::Make(get_item_attributes_request_all_attributes);
6732c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  SendBrowseMessage(1, request);
6742c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker}
6752c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
6767bed53df63e72be19412e6519b2f23ed2565bdaeAjay PanickerTEST_F(AvrcpDeviceTest, geItemAttributesMtuTest) {
6777bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  auto truncated_packet =
6787bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      GetItemAttributesResponseBuilder::MakeBuilder(Status::NO_ERROR, 0xFFFF);
6797bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  truncated_packet->AddAttributeEntry(Attribute::TITLE, "1234");
6807bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker
6817bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  MockMediaInterface interface;
6827bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
6837bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  base::Callback<void(uint8_t, bool, AvrcpResponse)> cb =
6847bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      base::Bind([](MockFunction<void(uint8_t, bool, const AvrcpResponse&)>* a,
6857bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker                    uint8_t b, bool c, AvrcpResponse d) { a->Call(b, c, d); },
6867bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker                 &response_cb);
6877bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  Device device(RawAddress::kAny, true, cb, 0xFFFF, truncated_packet->size());
6887bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  device.RegisterInterfaces(&interface, &a2dp_interface, nullptr);
6897bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker
6907bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  SongInfo info = {"test_id",
6917bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker                   {AttributeEntry(Attribute::TITLE, "1234truncated")}};
6927bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  std::vector<SongInfo> list = {info};
6937bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  EXPECT_CALL(interface, GetNowPlayingList(_))
6947bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      .WillRepeatedly(InvokeCb<0>("test_id", list));
6957bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker
6967bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  EXPECT_CALL(response_cb,
6977bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker              Call(1, true, matchPacket(std::move(truncated_packet))))
6987bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      .Times(1);
6997bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker  device.BrowseMessageReceived(
7007bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker      1, TestBrowsePacket::Make(get_item_attributes_request_all_attributes));
7017bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker}
7027bed53df63e72be19412e6519b2f23ed2565bdaeAjay Panicker
7030278ba88c94e08401349b058c0047de699c4fc6eAjay PanickerTEST_F(AvrcpDeviceTest, setAddressedPlayerTest) {
7040278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker  MockMediaInterface interface;
7050278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
7060278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker
7070278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, nullptr);
7080278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker
7090278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker  auto set_addr_player_rsp =
7100278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker      SetAddressedPlayerResponseBuilder::MakeBuilder(Status::NO_ERROR);
7110278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker
7120278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker  EXPECT_CALL(response_cb,
7130278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker              Call(1, false, matchPacket(std::move(set_addr_player_rsp))))
7140278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker      .Times(1);
7150278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker
7160278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker  auto request = TestAvrcpPacket::Make(set_addressed_player_request);
7170278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker  SendMessage(1, request);
7180278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker}
7190278ba88c94e08401349b058c0047de699c4fc6eAjay Panicker
7202c822c94aa90b1014800633fe6f663d5598be196Ajay PanickerTEST_F(AvrcpDeviceTest, volumeChangedTest) {
7212c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  MockMediaInterface interface;
7222c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
7232c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  MockVolumeInterface vol_interface;
7242c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
7252c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, &vol_interface);
7262c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
7272d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  // Pretend the device is active
7282d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  EXPECT_CALL(a2dp_interface, active_peer())
7292d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker      .WillRepeatedly(Return(test_device->GetAddress()));
7302d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker
7312c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  auto reg_notif =
7322c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      RegisterNotificationRequestBuilder::MakeBuilder(Event::VOLUME_CHANGED, 0);
7332c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(reg_notif))))
7342c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      .Times(1);
7352c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  test_device->RegisterVolumeChanged();
7362c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
7372c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  EXPECT_CALL(vol_interface, DeviceConnected(test_device->GetAddress(), _))
7382c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      .Times(1)
7392c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      .WillOnce(InvokeCb<1>(0x30));
7402c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  auto set_vol = SetAbsoluteVolumeRequestBuilder::MakeBuilder(0x30);
7412c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(set_vol))))
7422c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      .Times(1);
7432c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
7442c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  auto response = TestAvrcpPacket::Make(interim_volume_changed_notification);
7452c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  SendMessage(1, response);
7462c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
7472c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  EXPECT_CALL(vol_interface, SetVolume(0x47)).Times(1);
7482c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  auto reg_notif2 =
7492c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      RegisterNotificationRequestBuilder::MakeBuilder(Event::VOLUME_CHANGED, 0);
7502d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(reg_notif2))))
7512d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker      .Times(1);
7522d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  response = TestAvrcpPacket::Make(changed_volume_changed_notification);
7532d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  SendMessage(1, response);
7542d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  response = TestAvrcpPacket::Make(interim_volume_changed_notification);
7552d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  SendMessage(1, response);
7562d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker}
7572d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker
7582d9889ec07bcb067c04c743abfe6b5095104ed1aAjay PanickerTEST_F(AvrcpDeviceTest, volumeChangedNonActiveTest) {
7592d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  MockMediaInterface interface;
7602d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
7612d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  MockVolumeInterface vol_interface;
7622d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker
7632d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, &vol_interface);
7642d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker
76505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  // Pretend the device isn't active
7662d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  EXPECT_CALL(a2dp_interface, active_peer())
7672d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker      .WillRepeatedly(Return(RawAddress::kEmpty));
7682d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker
7692d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  auto reg_notif =
7702d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker      RegisterNotificationRequestBuilder::MakeBuilder(Event::VOLUME_CHANGED, 0);
7712d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(reg_notif))))
7722d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker      .Times(1);
7732d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  test_device->RegisterVolumeChanged();
7742d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker
7752d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  EXPECT_CALL(vol_interface, DeviceConnected(test_device->GetAddress(), _))
7762d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker      .Times(1)
7772d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker      .WillOnce(InvokeCb<1>(0x30));
7782d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  auto set_vol = SetAbsoluteVolumeRequestBuilder::MakeBuilder(0x30);
7792d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(set_vol))))
7802d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker      .Times(1);
7812d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker
7822d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  auto response = TestAvrcpPacket::Make(interim_volume_changed_notification);
7832d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  SendMessage(1, response);
7842d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker
7852d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  // Ensure that SetVolume is never called
7862d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  EXPECT_CALL(vol_interface, SetVolume(0x47)).Times(0);
7872d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker
7882d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker  auto reg_notif2 =
7892d9889ec07bcb067c04c743abfe6b5095104ed1aAjay Panicker      RegisterNotificationRequestBuilder::MakeBuilder(Event::VOLUME_CHANGED, 0);
7902c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(reg_notif2))))
7912c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker      .Times(1);
7922c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  response = TestAvrcpPacket::Make(changed_volume_changed_notification);
7932c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  SendMessage(1, response);
7942c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  response = TestAvrcpPacket::Make(interim_volume_changed_notification);
7952c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker  SendMessage(1, response);
7962c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker}
7972c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker
79885f2a3e410af221ee8732c7a34413180d11513bcAjay PanickerTEST_F(AvrcpDeviceTest, volumeRejectedTest) {
79985f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker  MockMediaInterface interface;
80085f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
80185f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker  MockVolumeInterface vol_interface;
80285f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker
80385f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, &vol_interface);
80485f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker
80585f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker  auto reg_notif =
80685f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker      RegisterNotificationRequestBuilder::MakeBuilder(Event::VOLUME_CHANGED, 0);
80785f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker  EXPECT_CALL(response_cb, Call(_, false, matchPacket(std::move(reg_notif))))
80885f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker      .Times(1);
80985f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker  test_device->RegisterVolumeChanged();
81085f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker
81185f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker  auto response = TestAvrcpPacket::Make(rejected_volume_changed_notification);
81285f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker  SendMessage(1, response);
81385f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker
81485f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker  EXPECT_CALL(response_cb, Call(_, _, _)).Times(0);
81585f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker}
81685f2a3e410af221ee8732c7a34413180d11513bcAjay Panicker
81705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay PanickerTEST_F(AvrcpDeviceTest, playPushedActiveDeviceTest) {
81805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  MockMediaInterface interface;
81905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
82005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  MockVolumeInterface vol_interface;
82105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
82205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, &vol_interface);
82305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
82405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  // Pretend the device is active
82505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(a2dp_interface, active_peer())
82605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      .WillRepeatedly(Return(test_device->GetAddress()));
82705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
82805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  auto play_pushed = PassThroughPacketBuilder::MakeBuilder(false, true, 0x44);
82905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  auto play_pushed_response =
83005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      PassThroughPacketBuilder::MakeBuilder(true, true, 0x44);
83105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(response_cb,
83205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker              Call(_, false, matchPacket(std::move(play_pushed_response))))
83305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      .Times(1);
83405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
83505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  PlayStatus status = {0x1234, 0x5678, PlayState::PLAYING};
83605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(interface, GetPlayStatus(_))
83705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      .Times(1)
83805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      .WillOnce(InvokeCb<0>(status));
83905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
84005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(interface, SendKeyEvent(0x44, KeyState::PUSHED)).Times(1);
84105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
84205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  auto play_pushed_pkt = TestAvrcpPacket::Make();
84305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  play_pushed->Serialize(play_pushed_pkt);
84405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
84505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  SendMessage(1, play_pushed_pkt);
84605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker}
84705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
84805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay PanickerTEST_F(AvrcpDeviceTest, playPushedInactiveDeviceTest) {
84905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  MockMediaInterface interface;
85005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
85105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  MockVolumeInterface vol_interface;
85205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
85305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, &vol_interface);
85405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
85505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  // Pretend the device is not active
85605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(a2dp_interface, active_peer())
85705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      .WillRepeatedly(Return(RawAddress::kEmpty));
85805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
85905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  auto play_pushed = PassThroughPacketBuilder::MakeBuilder(false, true, 0x44);
86005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  auto play_pushed_response =
86105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      PassThroughPacketBuilder::MakeBuilder(true, true, 0x44);
86205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(response_cb,
86305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker              Call(_, false, matchPacket(std::move(play_pushed_response))))
86405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      .Times(1);
86505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
86605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  // Expect that the device will try to set itself as active
86705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(interface, SetActiveDevice(test_device->GetAddress())).Times(1);
86805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
86905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  // No play command should be sent since the music is already playing
87005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  PlayStatus status = {0x1234, 0x5678, PlayState::PLAYING};
87105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(interface, GetPlayStatus(_))
87205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      .Times(1)
87305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      .WillOnce(InvokeCb<0>(status));
87405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(interface, SendKeyEvent(0x44, KeyState::PUSHED)).Times(0);
87505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
87605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  auto play_pushed_pkt = TestAvrcpPacket::Make();
87705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  play_pushed->Serialize(play_pushed_pkt);
87805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
87905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  SendMessage(1, play_pushed_pkt);
88005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker}
88105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
88205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay PanickerTEST_F(AvrcpDeviceTest, mediaKeyActiveDeviceTest) {
88305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  MockMediaInterface interface;
88405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
88505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  MockVolumeInterface vol_interface;
88605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
88705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, &vol_interface);
88805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
88905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  // Pretend the device is active
89005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(a2dp_interface, active_peer())
89105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      .WillRepeatedly(Return(test_device->GetAddress()));
89205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
89305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  auto play_released =
89405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      PassThroughPacketBuilder::MakeBuilder(false, false, 0x44);
89505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  auto play_released_response =
89605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      PassThroughPacketBuilder::MakeBuilder(true, false, 0x44);
89705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(response_cb,
89805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker              Call(_, false, matchPacket(std::move(play_released_response))))
89905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      .Times(1);
90005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
90105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(interface, GetPlayStatus(_)).Times(0);
90205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
90305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(interface, SendKeyEvent(0x44, KeyState::RELEASED)).Times(1);
90405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
90505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  auto play_released_pkt = TestAvrcpPacket::Make();
90605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  play_released->Serialize(play_released_pkt);
90705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
90805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  SendMessage(1, play_released_pkt);
90905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker}
91005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
91105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay PanickerTEST_F(AvrcpDeviceTest, mediaKeyInactiveDeviceTest) {
91205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  MockMediaInterface interface;
91305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  NiceMock<MockA2dpInterface> a2dp_interface;
91405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  MockVolumeInterface vol_interface;
91505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
91605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  test_device->RegisterInterfaces(&interface, &a2dp_interface, &vol_interface);
91705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
91805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  // Pretend the device is not active
91905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(a2dp_interface, active_peer())
92005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      .WillRepeatedly(Return(RawAddress::kEmpty));
92105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
92205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  auto play_released =
92305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      PassThroughPacketBuilder::MakeBuilder(false, false, 0x44);
92405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  auto play_released_response =
92505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      PassThroughPacketBuilder::MakeBuilder(true, false, 0x44);
92605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(response_cb,
92705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker              Call(_, false, matchPacket(std::move(play_released_response))))
92805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker      .Times(1);
92905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
93005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(interface, GetPlayStatus(_)).Times(0);
93105c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
93205c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  // Expect that the key event wont be sent to the media interface
93305c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  EXPECT_CALL(interface, SendKeyEvent(0x44, KeyState::RELEASED)).Times(0);
93405c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
93505c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  auto play_released_pkt = TestAvrcpPacket::Make();
93605c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  play_released->Serialize(play_released_pkt);
93705c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
93805c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker  SendMessage(1, play_released_pkt);
93905c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker}
94005c13ff0be3e638bbbd54786f60f3a3b17d1e1c0Ajay Panicker
9412c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker}  // namespace avrcp
9422c822c94aa90b1014800633fe6f663d5598be196Ajay Panicker}  // namespace bluetooth