1 /*
2  * Copyright 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <gmock/gmock.h>
20 
21 #include <type_traits>
22 
23 #include "avrcp.h"
24 #include "avrcp_internal.h"
25 #include "avrcp_packet.h"
26 #include "stack/include/a2dp_api.h"
27 #include "stack/include/bt_hdr.h"
28 #include "tests/packet_test_helper.h"
29 #include "types/bluetooth/uuid.h"
30 #include "types/raw_address.h"
31 
32 namespace bluetooth {
33 namespace avrcp {
34 
35 using AvrcpResponse = std::unique_ptr<::bluetooth::PacketBuilder>;
36 using TestAvrcpPacket = TestPacketType<Packet>;
37 using TestBrowsePacket = TestPacketType<BrowsePacket>;
38 
39 class MockMediaInterface : public MediaInterface {
40 public:
41   MOCK_METHOD2(SendKeyEvent, void(uint8_t, KeyState));
42   MOCK_METHOD1(GetSongInfo, void(MediaInterface::SongInfoCallback));
43   MOCK_METHOD1(GetPlayStatus, void(MediaInterface::PlayStatusCallback));
44   MOCK_METHOD1(GetNowPlayingList, void(MediaInterface::NowPlayingCallback));
45   MOCK_METHOD1(GetMediaPlayerList, void(MediaInterface::MediaListCallback));
46   MOCK_METHOD1(GetAddressedPlayer, void(MediaInterface::GetAddressedPlayerCallback));
47   MOCK_METHOD3(GetFolderItems, void(uint16_t, std::string, MediaInterface::FolderItemsCallback));
48   MOCK_METHOD2(SetBrowsedPlayer, void(uint16_t, MediaInterface::SetBrowsedPlayerCallback));
49   MOCK_METHOD2(SetAddressedPlayer, void(uint16_t, MediaInterface::SetAddressedPlayerCallback));
50   MOCK_METHOD3(PlayItem, void(uint16_t, bool, std::string));
51   MOCK_METHOD1(SetActiveDevice, void(const RawAddress&));
52   MOCK_METHOD1(RegisterUpdateCallback, void(MediaCallbacks*));
53   MOCK_METHOD1(UnregisterUpdateCallback, void(MediaCallbacks*));
54 };
55 
56 class MockVolumeInterface : public VolumeInterface {
57 public:
58   MOCK_METHOD1(DeviceConnected, void(const RawAddress&));
59   MOCK_METHOD2(DeviceConnected, void(const RawAddress&, VolumeChangedCb));
60   MOCK_METHOD1(DeviceDisconnected, void(const RawAddress&));
61   MOCK_METHOD1(SetVolume, void(int8_t));
62 };
63 
64 class MockPlayerSettingsInterface : public PlayerSettingsInterface {
65 public:
66   MOCK_METHOD1(ListPlayerSettings, void(ListPlayerSettingsCallback));
67   MOCK_METHOD2(ListPlayerSettingValues, void(PlayerAttribute, ListPlayerSettingValuesCallback));
68   MOCK_METHOD2(GetCurrentPlayerSettingValue,
69                void(std::vector<PlayerAttribute>, GetCurrentPlayerSettingValueCallback));
70   MOCK_METHOD3(SetPlayerSettings, void(std::vector<PlayerAttribute>, std::vector<uint8_t>,
71                                        SetPlayerSettingValueCallback));
72 };
73 
74 class MockAvrcpInterface : public AvrcpInterface {
75 public:
76   MOCK_METHOD0(GetAvrcpVersion, uint16_t(void));
77   MOCK_METHOD8(AddRecord, uint16_t(uint16_t, const char*, const char*, uint16_t, uint32_t, bool,
78                                    uint16_t, uint16_t));
79   MOCK_METHOD1(RemoveRecord, uint16_t(uint32_t));
80   MOCK_METHOD4(FindService,
81                uint16_t(uint16_t, const RawAddress&, tAVRC_SDP_DB_PARAMS*, tAVRC_FIND_CBACK));
82   MOCK_METHOD3(Open, uint16_t(uint8_t*, tAVRC_CONN_CB*, const RawAddress&));
83   MOCK_METHOD2(OpenBrowse, uint16_t(uint8_t, tAVCT_ROLE));
84   MOCK_METHOD1(GetPeerMtu, uint16_t(uint8_t));
85   MOCK_METHOD1(GetBrowseMtu, uint16_t(uint8_t));
86   MOCK_METHOD1(Close, uint16_t(uint8_t));
87   MOCK_METHOD1(CloseBrowse, uint16_t(uint8_t));
88   MOCK_METHOD4(MsgReq, uint16_t(uint8_t, uint8_t, uint8_t, BT_HDR*));
89   MOCK_METHOD2(SaveControllerVersion, void(const RawAddress&, uint16_t));
90 };
91 
92 class MockA2dpInterface : public A2dpInterface {
93 public:
94   MOCK_METHOD1(event_open, void(const RawAddress&));
95   MOCK_METHOD1(event_close, void(const RawAddress&));
96   MOCK_METHOD0(active_peer, RawAddress());
97   MOCK_METHOD1(is_peer_in_silence_mode, bool(const RawAddress&));
98   MOCK_METHOD2(connect_audio_sink_delayed, void(uint8_t, const RawAddress&));
99   MOCK_METHOD2(find_audio_sink_service, uint16_t(const RawAddress&, tA2DP_FIND_CBACK));
100 };
101 
102 class MockSdpInterface : public SdpInterface {
103 public:
104   MOCK_METHOD6(InitDiscoveryDb, bool(tSDP_DISCOVERY_DB*, uint32_t, uint16_t, const bluetooth::Uuid*,
105                                      uint16_t, uint16_t*));
106   MOCK_METHOD3(ServiceSearchAttributeRequest,
107                bool(const RawAddress&, tSDP_DISCOVERY_DB*, tSDP_DISC_CMPL_CB*));
108   MOCK_METHOD3(FindServiceInDb, tSDP_DISC_REC*(tSDP_DISCOVERY_DB*, uint16_t, t_sdp_disc_rec*));
109   MOCK_METHOD2(FindAttributeInRec, tSDP_DISC_ATTR*(t_sdp_disc_rec*, uint16_t));
110   MOCK_METHOD3(FindProfileVersionInRec, bool(t_sdp_disc_rec*, uint16_t, uint16_t*));
111 };
112 
ACTION_TEMPLATE(InvokeCb,HAS_1_TEMPLATE_PARAMS (int,k),AND_1_VALUE_PARAMS (input))113 ACTION_TEMPLATE(InvokeCb, HAS_1_TEMPLATE_PARAMS(int, k), AND_1_VALUE_PARAMS(input)) {
114   ::testing::get<k>(args).Run(input);
115 }
116 
ACTION_TEMPLATE(InvokeCb,HAS_1_TEMPLATE_PARAMS (int,k),AND_2_VALUE_PARAMS (a,b))117 ACTION_TEMPLATE(InvokeCb, HAS_1_TEMPLATE_PARAMS(int, k), AND_2_VALUE_PARAMS(a, b)) {
118   ::testing::get<k>(args).Run(a, b);
119 }
120 
ACTION_TEMPLATE(InvokeCb,HAS_1_TEMPLATE_PARAMS (int,k),AND_3_VALUE_PARAMS (a,b,c))121 ACTION_TEMPLATE(InvokeCb, HAS_1_TEMPLATE_PARAMS(int, k), AND_3_VALUE_PARAMS(a, b, c)) {
122   ::testing::get<k>(args).Run(a, b, c);
123 }
124 
125 template <class PacketType>
126 class PacketMatcher : public ::testing::MatcherInterface<const AvrcpResponse&> {
127 public:
128   AvrcpResponse pkt_to_compare_to_;
129 
PacketMatcher(AvrcpResponse && pkt)130   PacketMatcher(AvrcpResponse&& pkt) { pkt_to_compare_to_ = std::move(pkt); }
131 
MatchAndExplain(const AvrcpResponse & r,::testing::MatchResultListener * listener)132   bool MatchAndExplain(const AvrcpResponse& r,
133                        ::testing::MatchResultListener* listener) const override {
134     auto packet1 = TestPacketType<PacketType>::Make();
135     r->Serialize(packet1);
136 
137     auto packet2 = TestPacketType<PacketType>::Make();
138     pkt_to_compare_to_->Serialize(packet2);
139 
140     if (packet1->GetData() != packet2->GetData()) {
141       *listener << "\nPacket to compare to: \n";
142       *listener << packet2->ToString();
143       *listener << "\nActual packet: \n";
144       *listener << packet1->ToString();
145     }
146 
147     return packet1->GetData() == packet2->GetData();
148   }
149 
DescribeTo(::std::ostream * os)150   void DescribeTo(::std::ostream* os) const override { *os << "Packets match"; }
151 };
152 
matchPacket(std::unique_ptr<PacketBuilder> && arg)153 inline ::testing::Matcher<const AvrcpResponse&> matchPacket(std::unique_ptr<PacketBuilder>&& arg) {
154   return MakeMatcher(new PacketMatcher<Packet>(std::move(arg)));
155 }
156 
matchPacket(std::unique_ptr<BrowsePacketBuilder> && arg)157 inline ::testing::Matcher<const AvrcpResponse&> matchPacket(
158         std::unique_ptr<BrowsePacketBuilder>&& arg) {
159   return MakeMatcher(new PacketMatcher<BrowsePacket>(std::move(arg)));
160 }
161 
162 }  // namespace avrcp
163 }  // namespace bluetooth
164