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 #include <android-base/silent_death_test.h>
18 #include <gtest/gtest.h>
19
20 #include "avrcp_test_packets.h"
21 #include "get_folder_items.h"
22 #include "packet_test_helper.h"
23
24 namespace bluetooth {
25 namespace avrcp {
26
27 using TestGetFolderItemsReqPacket = TestPacketType<GetFolderItemsRequest>;
28
TEST(GetFolderItemsResponseBuilderTest,builderMediaPlayerSizeTest)29 TEST(GetFolderItemsResponseBuilderTest, builderMediaPlayerSizeTest) {
30 auto builder = GetFolderItemsResponseBuilder::MakePlayerListBuilder(
31 Status::NO_ERROR, 0x0000, 0xFFFF);
32 // If there are no items, then the only data in the packet is the status
33 ASSERT_EQ(builder->size(), get_folder_items_error_response.size());
34
35 auto player = MediaPlayerItem(0x0001, "com.google.android.music", true);
36 builder->AddMediaPlayer(player);
37 ASSERT_EQ(builder->size(), get_folder_items_media_player_response.size());
38 }
39
TEST(GetFolderItemsResponseBuilderTest,builderMediaPlayerAddTest)40 TEST(GetFolderItemsResponseBuilderTest, builderMediaPlayerAddTest) {
41 auto builder = GetFolderItemsResponseBuilder::MakePlayerListBuilder(
42 Status::NO_ERROR, 0x0000, 0xFFFF);
43 auto player = MediaPlayerItem(0x0001, "com.google.android.music", true);
44 builder->AddMediaPlayer(player);
45
46 auto test_packet = TestGetFolderItemsReqPacket::Make();
47 builder->Serialize(test_packet);
48 ASSERT_EQ(test_packet->GetData(), get_folder_items_media_player_response);
49 }
50
TEST(GetFolderItemsResponseBuilderTest,builderPlayerAddMtuTest)51 TEST(GetFolderItemsResponseBuilderTest, builderPlayerAddMtuTest) {
52 MediaPlayerItem player1(1, "Player 1 that fits", true);
53 MediaPlayerItem player2(2, "Player 2 that doesn't fit", true);
54 MediaPlayerItem player3(3, "Player 3 that fits", true);
55
56 // Browsing Header + Status field + UID Counter field + Number of Items field
57 auto packet_size = BrowsePacket::kMinSize() + 5;
58 packet_size += player1.size() + player3.size();
59
60 auto builder = GetFolderItemsResponseBuilder::MakePlayerListBuilder(
61 Status::NO_ERROR, 0x0000, packet_size);
62
63 ASSERT_TRUE(builder->AddMediaPlayer(player1));
64 ASSERT_FALSE(builder->AddMediaPlayer(player2));
65 ASSERT_TRUE(builder->AddMediaPlayer(player3));
66 }
67
TEST(GetFolderItemsResponseBuilderTest,builderFolderSizeTest)68 TEST(GetFolderItemsResponseBuilderTest, builderFolderSizeTest) {
69 auto builder = GetFolderItemsResponseBuilder::MakeVFSBuilder(Status::NO_ERROR,
70 0x0000, 0xFFFF);
71 ASSERT_EQ(builder->size(), get_folder_items_error_response.size());
72
73 auto folder = FolderItem(0x0000000000000001, 0x00, true, "Test Folder");
74 builder->AddFolder(folder);
75 ASSERT_EQ(builder->size(), get_folder_items_folder_response.size());
76 }
77
TEST(GetFolderItemsResponseBuilderTest,builderFolderAddTest)78 TEST(GetFolderItemsResponseBuilderTest, builderFolderAddTest) {
79 auto builder = GetFolderItemsResponseBuilder::MakeVFSBuilder(Status::NO_ERROR,
80 0x0000, 0xFFFF);
81 auto folder = FolderItem(0x0000000000000001, 0x00, true, "Test Folder");
82 builder->AddFolder(folder);
83
84 auto test_packet = TestGetFolderItemsReqPacket::Make();
85 builder->Serialize(test_packet);
86 ASSERT_EQ(test_packet->GetData(), get_folder_items_folder_response);
87 }
88
TEST(GetFolderItemsResponseBuilderTest,builderFolderAddMtuTest)89 TEST(GetFolderItemsResponseBuilderTest, builderFolderAddMtuTest) {
90 FolderItem folder1(0x01, 0x00, true, "Folder 1 that fits");
91 FolderItem folder2(0x02, 0x00, true, "Folder 2 that doesn't fit");
92 FolderItem folder3(0x03, 0x00, true, "Folder 3 that fits");
93
94 // Browsing Header + Status field + UID Counter field + Number of Items field
95 auto packet_size = BrowsePacket::kMinSize() + 5;
96 packet_size += folder1.size() + folder3.size();
97
98 auto builder = GetFolderItemsResponseBuilder::MakeVFSBuilder(
99 Status::NO_ERROR, 0x0000, packet_size);
100
101 ASSERT_TRUE(builder->AddFolder(folder1));
102 ASSERT_FALSE(builder->AddFolder(folder2));
103 ASSERT_TRUE(builder->AddFolder(folder3));
104 }
105
TEST(GetFolderItemsResponseBuilderTest,builderSongSizeTest)106 TEST(GetFolderItemsResponseBuilderTest, builderSongSizeTest) {
107 auto builder = GetFolderItemsResponseBuilder::MakeNowPlayingBuilder(
108 Status::NO_ERROR, 0x0000, 0xFFFF);
109 ASSERT_EQ(builder->size(), get_folder_items_error_response.size());
110
111 std::set<AttributeEntry> attributes;
112 attributes.insert(AttributeEntry(Attribute::TITLE, "Test Title"));
113 auto song = MediaElementItem(0x02, "Test Title", attributes);
114 builder->AddSong(song);
115 ASSERT_EQ(builder->size(), get_folder_items_song_response.size());
116 }
117
TEST(GetFolderItemsResponseBuilderTest,builderSongAddTest)118 TEST(GetFolderItemsResponseBuilderTest, builderSongAddTest) {
119 auto builder = GetFolderItemsResponseBuilder::MakeNowPlayingBuilder(
120 Status::NO_ERROR, 0x0000, 0xFFFF);
121 std::set<AttributeEntry> attributes;
122 attributes.insert(AttributeEntry(Attribute::TITLE, "Test Title"));
123 auto song = MediaElementItem(0x02, "Test Title", attributes);
124 builder->AddSong(song);
125
126 auto test_packet = TestGetFolderItemsReqPacket::Make();
127 builder->Serialize(test_packet);
128 ASSERT_EQ(test_packet->GetData(), get_folder_items_song_response);
129 }
130
TEST(GetFolderItemsResponseBuilderTest,builderSongAddMtuTest)131 TEST(GetFolderItemsResponseBuilderTest, builderSongAddMtuTest) {
132 MediaElementItem song1(0x01, "Song 1 that fits", std::set<AttributeEntry>());
133 MediaElementItem song2(0x02, "Song 2 that doesn't fit",
134 std::set<AttributeEntry>());
135 MediaElementItem song3(0x03, "Song 3 that fits", std::set<AttributeEntry>());
136
137 auto packet_size = BrowsePacket::kMinSize() + 5;
138 packet_size += song1.size() + song3.size();
139
140 auto builder = GetFolderItemsResponseBuilder::MakeNowPlayingBuilder(
141 Status::NO_ERROR, 0x0000, packet_size);
142
143 ASSERT_TRUE(builder->AddSong(song1));
144 ASSERT_FALSE(builder->AddSong(song2));
145 ASSERT_TRUE(builder->AddSong(song3));
146 }
147
TEST(GetFolderItemsResponseBuilderTest,builderNoItemsTest)148 TEST(GetFolderItemsResponseBuilderTest, builderNoItemsTest) {
149 auto builder = GetFolderItemsResponseBuilder::MakePlayerListBuilder(
150 Status::NO_ERROR, 0x0000, 0xFFFF);
151 auto test_packet = TestGetFolderItemsReqPacket::Make();
152 builder->Serialize(test_packet);
153 ASSERT_EQ(test_packet->GetData(), get_folder_items_error_response);
154
155 builder = GetFolderItemsResponseBuilder::MakeVFSBuilder(Status::NO_ERROR,
156 0x0000, 0xFFFF);
157 test_packet = TestGetFolderItemsReqPacket::Make();
158 builder->Serialize(test_packet);
159 ASSERT_EQ(test_packet->GetData(), get_folder_items_error_response);
160
161 builder = GetFolderItemsResponseBuilder::MakeNowPlayingBuilder(
162 Status::NO_ERROR, 0x0000, 0xFFFF);
163 test_packet = TestGetFolderItemsReqPacket::Make();
164 builder->Serialize(test_packet);
165 ASSERT_EQ(test_packet->GetData(), get_folder_items_error_response);
166 }
167
TEST(GetFolderItemsResponseBuilderTest,builderErrorStatusTest)168 TEST(GetFolderItemsResponseBuilderTest, builderErrorStatusTest) {
169 std::vector<uint8_t> get_folder_items_inv_scope = {0x71, 0x00, 0x01, 0x0a};
170
171 auto builder = GetFolderItemsResponseBuilder::MakePlayerListBuilder(
172 Status::INVALID_SCOPE, 0x0000, 0xFFFF);
173
174 // Check that the status remains INVALID_SCOPE even though there are zero
175 // items
176 auto test_packet = TestGetFolderItemsReqPacket::Make();
177 builder->Serialize(test_packet);
178 ASSERT_EQ(test_packet->GetData(), get_folder_items_inv_scope);
179
180 auto player = MediaPlayerItem(0x0001, "com.google.android.music", true);
181 builder->AddMediaPlayer(player);
182
183 // Check to make sure that even though we added an item, it doesn't get
184 // written to the packet
185 test_packet = TestGetFolderItemsReqPacket::Make();
186 builder->Serialize(test_packet);
187 ASSERT_EQ(test_packet->GetData(), get_folder_items_inv_scope);
188 }
189
TEST(GetFolderItemsResponseBuilderDeathTest,builderDeathTest)190 TEST(GetFolderItemsResponseBuilderDeathTest, builderDeathTest) {
191 auto player = MediaPlayerItem(0x0001, "com.google.android.music", true);
192 auto folder = FolderItem(0x01, 0x00, true, "test folder");
193 auto song = MediaElementItem(0x01, "test song", std::set<AttributeEntry>());
194
195 auto builder = GetFolderItemsResponseBuilder::MakePlayerListBuilder(
196 Status::NO_ERROR, 0x0000, 0xFFFF);
197 {
198 // this will silent SIGABRT sent in ASSERT_DEATH below
199 ScopedSilentDeath _silentDeath;
200
201 ASSERT_DEATH(builder->AddFolder(folder), "scope_ == Scope::VFS");
202 ASSERT_DEATH(builder->AddSong(song),
203 "scope_ == Scope::VFS \\|\\| scope_ == Scope::NOW_PLAYING");
204 }
205
206 builder = GetFolderItemsResponseBuilder::MakeVFSBuilder(Status::NO_ERROR,
207 0x0000, 0xFFFF);
208 {
209 // this will silent SIGABRT sent in ASSERT_DEATH below
210 ScopedSilentDeath _silentDeath;
211
212 ASSERT_DEATH(builder->AddMediaPlayer(player),
213 "scope_ == Scope::MEDIA_PLAYER_LIST");
214 }
215
216 builder = GetFolderItemsResponseBuilder::MakeNowPlayingBuilder(
217 Status::NO_ERROR, 0x0000, 0xFFFF);
218
219 // this will silent SIGABRT sent in ASSERT_DEATH below
220 ScopedSilentDeath _silentDeath;
221
222 ASSERT_DEATH(builder->AddMediaPlayer(player),
223 "scope_ == Scope::MEDIA_PLAYER_LIST");
224 ASSERT_DEATH(builder->AddFolder(folder), "scope_ == Scope::VFS");
225 }
226
TEST(GetFolderItemsRequestTest,getterTest)227 TEST(GetFolderItemsRequestTest, getterTest) {
228 auto test_packet =
229 TestGetFolderItemsReqPacket::Make(get_folder_items_request_vfs);
230
231 ASSERT_EQ(test_packet->GetScope(), Scope::VFS);
232 ASSERT_EQ(test_packet->GetStartItem(), 0x00000000u);
233 ASSERT_EQ(test_packet->GetEndItem(), 0x00000005u);
234 ASSERT_EQ(test_packet->GetNumAttributes(), 1);
235
236 std::vector<Attribute> attribute_list = {Attribute::TITLE};
237 ASSERT_EQ(test_packet->GetAttributesRequested(), attribute_list);
238 }
239
TEST(GetFolderItemsRequestBuilderTest,builderZeroAttrsTest)240 TEST(GetFolderItemsRequestBuilderTest, builderZeroAttrsTest) {
241 auto builder =
242 GetFolderItemsRequestBuilder::MakeBuilder(Scope::VFS, 0, 9, {});
243 ASSERT_EQ(builder->size(), get_folder_items_request_no_attrs.size());
244
245 auto test_packet = TestGetFolderItemsReqPacket::Make();
246 builder->Serialize(test_packet);
247 ASSERT_EQ(test_packet->GetData(), get_folder_items_request_no_attrs);
248 }
249
TEST(GetFolderItemsRequestBuilderTest,builderTest)250 TEST(GetFolderItemsRequestBuilderTest, builderTest) {
251 auto builder = GetFolderItemsRequestBuilder::MakeBuilder(Scope::VFS, 0, 9,
252 {Attribute::TITLE});
253 ASSERT_EQ(builder->size(), get_folder_items_request_title.size());
254
255 auto test_packet = TestGetFolderItemsReqPacket::Make();
256 builder->Serialize(test_packet);
257 ASSERT_EQ(test_packet->GetData(), get_folder_items_request_title);
258 }
259
260 } // namespace avrcp
261 } // namespace bluetooth