• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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