/* * Copyright 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <gtest/gtest.h> #include "avrcp_test_packets.h" #include "get_folder_items.h" #include "packet_test_helper.h" namespace bluetooth { namespace avrcp { using TestGetFolderItemsReqPacket = TestPacketType<GetFolderItemsRequest>; TEST(GetFolderItemsResponseBuilderTest, builderMediaPlayerSizeTest) { auto builder = GetFolderItemsResponseBuilder::MakePlayerListBuilder( Status::NO_ERROR, 0x0000, 0xFFFF); // If there are no items, then the only data in the packet is the status ASSERT_EQ(builder->size(), get_folder_items_error_response.size()); auto player = MediaPlayerItem(0x0001, "com.google.android.music", true); builder->AddMediaPlayer(player); ASSERT_EQ(builder->size(), get_folder_items_media_player_response.size()); } TEST(GetFolderItemsResponseBuilderTest, builderMediaPlayerAddTest) { auto builder = GetFolderItemsResponseBuilder::MakePlayerListBuilder( Status::NO_ERROR, 0x0000, 0xFFFF); auto player = MediaPlayerItem(0x0001, "com.google.android.music", true); builder->AddMediaPlayer(player); auto test_packet = TestGetFolderItemsReqPacket::Make(); builder->Serialize(test_packet); ASSERT_EQ(test_packet->GetData(), get_folder_items_media_player_response); } TEST(GetFolderItemsResponseBuilderTest, builderPlayerAddMtuTest) { MediaPlayerItem player1(1, "Player 1 that fits", true); MediaPlayerItem player2(2, "Player 2 that doesn't fit", true); MediaPlayerItem player3(3, "Player 3 that fits", true); // Browsing Header + Status field + UID Counter field + Number of Items field auto packet_size = BrowsePacket::kMinSize() + 5; packet_size += player1.size() + player3.size(); auto builder = GetFolderItemsResponseBuilder::MakePlayerListBuilder( Status::NO_ERROR, 0x0000, packet_size); ASSERT_TRUE(builder->AddMediaPlayer(player1)); ASSERT_FALSE(builder->AddMediaPlayer(player2)); ASSERT_TRUE(builder->AddMediaPlayer(player3)); } TEST(GetFolderItemsResponseBuilderTest, builderFolderSizeTest) { auto builder = GetFolderItemsResponseBuilder::MakeVFSBuilder(Status::NO_ERROR, 0x0000, 0xFFFF); ASSERT_EQ(builder->size(), get_folder_items_error_response.size()); auto folder = FolderItem(0x0000000000000001, 0x00, true, "Test Folder"); builder->AddFolder(folder); ASSERT_EQ(builder->size(), get_folder_items_folder_response.size()); } TEST(GetFolderItemsResponseBuilderTest, builderFolderAddTest) { auto builder = GetFolderItemsResponseBuilder::MakeVFSBuilder(Status::NO_ERROR, 0x0000, 0xFFFF); auto folder = FolderItem(0x0000000000000001, 0x00, true, "Test Folder"); builder->AddFolder(folder); auto test_packet = TestGetFolderItemsReqPacket::Make(); builder->Serialize(test_packet); ASSERT_EQ(test_packet->GetData(), get_folder_items_folder_response); } TEST(GetFolderItemsResponseBuilderTest, builderFolderAddMtuTest) { FolderItem folder1(0x01, 0x00, true, "Folder 1 that fits"); FolderItem folder2(0x02, 0x00, true, "Folder 2 that doesn't fit"); FolderItem folder3(0x03, 0x00, true, "Folder 3 that fits"); // Browsing Header + Status field + UID Counter field + Number of Items field auto packet_size = BrowsePacket::kMinSize() + 5; packet_size += folder1.size() + folder3.size(); auto builder = GetFolderItemsResponseBuilder::MakeVFSBuilder( Status::NO_ERROR, 0x0000, packet_size); ASSERT_TRUE(builder->AddFolder(folder1)); ASSERT_FALSE(builder->AddFolder(folder2)); ASSERT_TRUE(builder->AddFolder(folder3)); } TEST(GetFolderItemsResponseBuilderTest, builderSongSizeTest) { auto builder = GetFolderItemsResponseBuilder::MakeNowPlayingBuilder( Status::NO_ERROR, 0x0000, 0xFFFF); ASSERT_EQ(builder->size(), get_folder_items_error_response.size()); std::set<AttributeEntry> attributes; attributes.insert(AttributeEntry(Attribute::TITLE, "Test Title")); auto song = MediaElementItem(0x02, "Test Title", attributes); builder->AddSong(song); ASSERT_EQ(builder->size(), get_folder_items_song_response.size()); } TEST(GetFolderItemsResponseBuilderTest, builderSongAddTest) { auto builder = GetFolderItemsResponseBuilder::MakeNowPlayingBuilder( Status::NO_ERROR, 0x0000, 0xFFFF); std::set<AttributeEntry> attributes; attributes.insert(AttributeEntry(Attribute::TITLE, "Test Title")); auto song = MediaElementItem(0x02, "Test Title", attributes); builder->AddSong(song); auto test_packet = TestGetFolderItemsReqPacket::Make(); builder->Serialize(test_packet); ASSERT_EQ(test_packet->GetData(), get_folder_items_song_response); } TEST(GetFolderItemsResponseBuilderTest, builderSongAddMtuTest) { MediaElementItem song1(0x01, "Song 1 that fits", std::set<AttributeEntry>()); MediaElementItem song2(0x02, "Song 2 that doesn't fit", std::set<AttributeEntry>()); MediaElementItem song3(0x03, "Song 3 that fits", std::set<AttributeEntry>()); auto packet_size = BrowsePacket::kMinSize() + 5; packet_size += song1.size() + song3.size(); auto builder = GetFolderItemsResponseBuilder::MakeNowPlayingBuilder( Status::NO_ERROR, 0x0000, packet_size); ASSERT_TRUE(builder->AddSong(song1)); ASSERT_FALSE(builder->AddSong(song2)); ASSERT_TRUE(builder->AddSong(song3)); } TEST(GetFolderItemsResponseBuilderTest, builderNoItemsTest) { auto builder = GetFolderItemsResponseBuilder::MakePlayerListBuilder( Status::NO_ERROR, 0x0000, 0xFFFF); auto test_packet = TestGetFolderItemsReqPacket::Make(); builder->Serialize(test_packet); ASSERT_EQ(test_packet->GetData(), get_folder_items_error_response); builder = GetFolderItemsResponseBuilder::MakeVFSBuilder(Status::NO_ERROR, 0x0000, 0xFFFF); test_packet = TestGetFolderItemsReqPacket::Make(); builder->Serialize(test_packet); ASSERT_EQ(test_packet->GetData(), get_folder_items_error_response); builder = GetFolderItemsResponseBuilder::MakeNowPlayingBuilder( Status::NO_ERROR, 0x0000, 0xFFFF); test_packet = TestGetFolderItemsReqPacket::Make(); builder->Serialize(test_packet); ASSERT_EQ(test_packet->GetData(), get_folder_items_error_response); } TEST(GetFolderItemsResponseBuilderTest, builderErrorStatusTest) { std::vector<uint8_t> get_folder_items_inv_scope = {0x71, 0x00, 0x01, 0x0a}; auto builder = GetFolderItemsResponseBuilder::MakePlayerListBuilder( Status::INVALID_SCOPE, 0x0000, 0xFFFF); // Check that the status remains INVALID_SCOPE even though there are zero // items auto test_packet = TestGetFolderItemsReqPacket::Make(); builder->Serialize(test_packet); ASSERT_EQ(test_packet->GetData(), get_folder_items_inv_scope); auto player = MediaPlayerItem(0x0001, "com.google.android.music", true); builder->AddMediaPlayer(player); // Check to make sure that even though we added an item, it doesn't get // written to the packet test_packet = TestGetFolderItemsReqPacket::Make(); builder->Serialize(test_packet); ASSERT_EQ(test_packet->GetData(), get_folder_items_inv_scope); } TEST(GetFolderItemsResponseBuilderTest, builderDeathTest) { auto player = MediaPlayerItem(0x0001, "com.google.android.music", true); auto folder = FolderItem(0x01, 0x00, true, "test folder"); auto song = MediaElementItem(0x01, "test song", std::set<AttributeEntry>()); auto builder = GetFolderItemsResponseBuilder::MakePlayerListBuilder( Status::NO_ERROR, 0x0000, 0xFFFF); ASSERT_DEATH(builder->AddFolder(folder), "scope_ == Scope::VFS"); ASSERT_DEATH(builder->AddSong(song), "scope_ == Scope::VFS \\|\\| scope_ == Scope::NOW_PLAYING"); builder = GetFolderItemsResponseBuilder::MakeVFSBuilder(Status::NO_ERROR, 0x0000, 0xFFFF); ASSERT_DEATH(builder->AddMediaPlayer(player), "scope_ == Scope::MEDIA_PLAYER_LIST"); builder = GetFolderItemsResponseBuilder::MakeNowPlayingBuilder( Status::NO_ERROR, 0x0000, 0xFFFF); ASSERT_DEATH(builder->AddMediaPlayer(player), "scope_ == Scope::MEDIA_PLAYER_LIST"); ASSERT_DEATH(builder->AddFolder(folder), "scope_ == Scope::VFS"); } TEST(GetFolderItemsRequestTest, getterTest) { auto test_packet = TestGetFolderItemsReqPacket::Make(get_folder_items_request_vfs); ASSERT_EQ(test_packet->GetScope(), Scope::VFS); ASSERT_EQ(test_packet->GetStartItem(), 0x00000000u); ASSERT_EQ(test_packet->GetEndItem(), 0x00000005u); ASSERT_EQ(test_packet->GetNumAttributes(), 1); std::vector<Attribute> attribute_list = {Attribute::TITLE}; ASSERT_EQ(test_packet->GetAttributesRequested(), attribute_list); } TEST(GetFolderItemsRequestBuilderTest, builderZeroAttrsTest) { auto builder = GetFolderItemsRequestBuilder::MakeBuilder(Scope::VFS, 0, 9, {}); ASSERT_EQ(builder->size(), get_folder_items_request_no_attrs.size()); auto test_packet = TestGetFolderItemsReqPacket::Make(); builder->Serialize(test_packet); ASSERT_EQ(test_packet->GetData(), get_folder_items_request_no_attrs); } TEST(GetFolderItemsRequestBuilderTest, builderTest) { auto builder = GetFolderItemsRequestBuilder::MakeBuilder(Scope::VFS, 0, 9, {Attribute::TITLE}); ASSERT_EQ(builder->size(), get_folder_items_request_title.size()); auto test_packet = TestGetFolderItemsReqPacket::Make(); builder->Serialize(test_packet); ASSERT_EQ(test_packet->GetData(), get_folder_items_request_title); } } // namespace avrcp } // namespace bluetooth