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