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