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