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