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