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