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 "get_element_attributes_packet.h"
18 
19 #include <gtest/gtest.h>
20 
21 #include "avrcp_test_packets.h"
22 #include "packet_test_helper.h"
23 
24 namespace bluetooth {
25 namespace avrcp {
26 
27 using TestGetElemAttrReqPacket = TestPacketType<GetElementAttributesRequest>;
28 
TEST(GetElementAttributesRequestPacketTest,getterTest)29 TEST(GetElementAttributesRequestPacketTest, getterTest) {
30   // Only Title is requested
31   auto test_packet = TestGetElemAttrReqPacket::Make(get_element_attributes_request_partial);
32 
33   ASSERT_EQ(test_packet->GetIdentifier(), 0u);
34 
35   auto attribute_list = test_packet->GetAttributesRequested();
36   ASSERT_EQ(attribute_list.size(), 1u);
37   ASSERT_EQ(attribute_list[0], Attribute::TITLE);
38 
39   // Title, Artist, Album, Media Numer, Playing Time, Total Number of Media,
40   // and Genre requested
41   test_packet = TestGetElemAttrReqPacket::Make(get_element_attributes_request_full);
42 
43   ASSERT_EQ(test_packet->GetIdentifier(), 0u);
44 
45   attribute_list = test_packet->GetAttributesRequested();
46   ASSERT_EQ(attribute_list.size(), 7u);
47   ASSERT_EQ(attribute_list[0], Attribute::TITLE);
48   ASSERT_EQ(attribute_list[1], Attribute::ARTIST_NAME);
49   ASSERT_EQ(attribute_list[2], Attribute::ALBUM_NAME);
50   ASSERT_EQ(attribute_list[3], Attribute::TRACK_NUMBER);
51   ASSERT_EQ(attribute_list[4], Attribute::PLAYING_TIME);
52   ASSERT_EQ(attribute_list[5], Attribute::TOTAL_NUMBER_OF_TRACKS);
53   ASSERT_EQ(attribute_list[6], Attribute::GENRE);
54 }
55 
TEST(GetElementAttributesRequestPacketTest,validTest)56 TEST(GetElementAttributesRequestPacketTest, validTest) {
57   auto test_packet = TestGetElemAttrReqPacket::Make(get_element_attributes_request_partial);
58   ASSERT_TRUE(test_packet->IsValid());
59 
60   test_packet = TestGetElemAttrReqPacket::Make(get_element_attributes_request_full);
61   ASSERT_TRUE(test_packet->IsValid());
62 }
63 
TEST(GetElementAttributesRequestPacketTest,invalidTest)64 TEST(GetElementAttributesRequestPacketTest, invalidTest) {
65   std::vector<uint8_t> packet_copy = get_element_attributes_request_partial;
66   packet_copy.push_back(0x00);
67   auto test_packet = TestGetElemAttrReqPacket::Make(packet_copy);
68   ASSERT_FALSE(test_packet->IsValid());
69 
70   std::vector<uint8_t> short_packet = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
71   test_packet = TestGetElemAttrReqPacket::Make(short_packet);
72   ASSERT_FALSE(test_packet->IsValid());
73 }
74 
TEST(GetElementAttributesResponseBuilderTest,builderLengthTest)75 TEST(GetElementAttributesResponseBuilderTest, builderLengthTest) {
76   // Attributes have a size of 8 + string length
77   auto builder = GetElementAttributesResponseBuilder::MakeBuilder(0xFFFF);
78   ASSERT_EQ(builder->size(), 11u);
79   builder->AddAttributeEntry(Attribute::TITLE, "test");
80   ASSERT_EQ(builder->size(), 23u);
81   builder->AddAttributeEntry(Attribute::ARTIST_NAME, "test");
82   ASSERT_EQ(builder->size(), 35u);
83 }
84 
TEST(GetElementAttributesResponseBuilderTest,builderTest)85 TEST(GetElementAttributesResponseBuilderTest, builderTest) {
86   auto builder = GetElementAttributesResponseBuilder::MakeBuilder(0xFFFF);
87   builder->AddAttributeEntry(Attribute::TITLE, "Test Song");
88   builder->AddAttributeEntry(Attribute::ARTIST_NAME, "Test Artist");
89   builder->AddAttributeEntry(Attribute::ALBUM_NAME, "Test Album");
90   builder->AddAttributeEntry(Attribute::TRACK_NUMBER, "1");
91   builder->AddAttributeEntry(Attribute::TOTAL_NUMBER_OF_TRACKS, "2");
92   builder->AddAttributeEntry(Attribute::GENRE, "Test Genre");
93   builder->AddAttributeEntry(Attribute::PLAYING_TIME, "1000");
94 
95   ASSERT_EQ(builder->size(), get_elements_attributes_response_full.size());
96 
97   auto test_packet = TestGetElemAttrReqPacket::Make();
98   builder->Serialize(test_packet);
99   ASSERT_EQ(test_packet->GetData(), get_elements_attributes_response_full);
100 }
101 
TEST(GetElementAttributesResponseBuilderTest,builderMtuTest)102 TEST(GetElementAttributesResponseBuilderTest, builderMtuTest) {
103   std::vector<AttributeEntry> test_data = {
104           {Attribute::TITLE, "Test Song 1"},        {Attribute::ARTIST_NAME, "Test Artist"},
105           {Attribute::ALBUM_NAME, "Test Album"},    {Attribute::TRACK_NUMBER, "1"},
106           {Attribute::TOTAL_NUMBER_OF_TRACKS, "2"}, {Attribute::GENRE, "Test Genre"},
107           {Attribute::PLAYING_TIME, "10 200"},      {Attribute::TITLE, "Test Song 2"},
108           {Attribute::ARTIST_NAME, "Test Artist"},  {Attribute::ALBUM_NAME, "Test Album"},
109           {Attribute::TRACK_NUMBER, "2"},           {Attribute::TOTAL_NUMBER_OF_TRACKS, "2"},
110           {Attribute::GENRE, "Test Genre"},         {Attribute::PLAYING_TIME, "1500"},
111   };
112 
113   using Builder = GetElementAttributesResponseBuilder;
114   using Helper = FragmentationBuilderHelper<Builder>;
115   size_t mtu = size_t(-1);
116   Helper helper(mtu, [](size_t mtu) { return Builder::MakeBuilder(mtu); });
117 
118   EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu, false, false));
119 
120   mtu = test_data[0].size() + Builder::kHeaderSize();
121   EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu));
122 
123   mtu = test_data[0].size() + test_data[1].size() + Builder::kHeaderSize();
124   EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu));
125 
126   mtu = test_data[0].size() + (Builder::kHeaderSize() * 2) + 1;
127   EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu, true, false));
128 
129   mtu = Builder::kHeaderSize() + AttributeEntry::kHeaderSize() + 1;
130   EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu));
131 
132   mtu = Builder::kHeaderSize() + AttributeEntry::kHeaderSize();
133   EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu, false, false));
134 }
135 
TEST(GetElementAttributesResponseBuilderTest,truncateBuilderTest)136 TEST(GetElementAttributesResponseBuilderTest, truncateBuilderTest) {
137   auto attribute = AttributeEntry(Attribute::TITLE, "1234");
138   size_t truncated_size = VendorPacket::kMinSize();
139   truncated_size += 1;                 // Number of attributes
140   truncated_size += attribute.size();  // Attribute size
141 
142   auto truncated_builder = GetElementAttributesResponseBuilder::MakeBuilder(truncated_size);
143   ASSERT_TRUE(truncated_builder->AddAttributeEntry(Attribute::TITLE, "1234truncated"));
144   ASSERT_EQ(truncated_builder->size(), truncated_size);
145 
146   ASSERT_FALSE(truncated_builder->AddAttributeEntry(Attribute::ARTIST_NAME, "Can not add"));
147 
148   auto truncated_packet = TestGetElemAttrReqPacket::Make();
149   truncated_builder->Serialize(truncated_packet);
150 
151   auto builder = GetElementAttributesResponseBuilder::MakeBuilder(0xFFFF);
152   builder->AddAttributeEntry(attribute);
153   auto test_packet = TestGetElemAttrReqPacket::Make();
154   builder->Serialize(test_packet);
155 
156   ASSERT_EQ(truncated_packet->GetData(), test_packet->GetData());
157 }
158 
159 }  // namespace avrcp
160 }  // namespace bluetooth
161