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_item_attributes.h"
21 #include "packet_test_helper.h"
22
23 namespace bluetooth {
24 namespace avrcp {
25
26 using TestGetItemAttrsReqPacket = TestPacketType<GetItemAttributesRequest>;
27
TEST(GetItemAttributesResponseBuilderTest,builderSizeTest)28 TEST(GetItemAttributesResponseBuilderTest, builderSizeTest) {
29 auto builder = GetItemAttributesResponseBuilder::MakeBuilder(Status::NO_ERROR, 0xFFFF);
30 ASSERT_EQ(builder->size(), 5u);
31
32 builder->AddAttributeEntry(Attribute::TITLE, "Test Song");
33 ASSERT_EQ(builder->size(), 22u);
34
35 builder->AddAttributeEntry(Attribute::ARTIST_NAME, "Test Artist");
36 ASSERT_EQ(builder->size(), 41u);
37
38 builder->AddAttributeEntry(Attribute::ALBUM_NAME, "Test Album");
39 ASSERT_EQ(builder->size(), get_item_attributes_song_response.size());
40 }
41
TEST(GetItemAttributesResponseBuilderTest,builderTest)42 TEST(GetItemAttributesResponseBuilderTest, builderTest) {
43 auto builder = GetItemAttributesResponseBuilder::MakeBuilder(Status::NO_ERROR, 0xFFFF);
44 builder->AddAttributeEntry(Attribute::TITLE, "Test Song");
45 builder->AddAttributeEntry(Attribute::ARTIST_NAME, "Test Artist");
46 builder->AddAttributeEntry(Attribute::ALBUM_NAME, "Test Album");
47
48 auto test_packet = TestGetItemAttrsReqPacket::Make();
49 builder->Serialize(test_packet);
50 ASSERT_EQ(test_packet->GetData(), get_item_attributes_song_response);
51 }
52
TEST(GetItemAttributesResponseBuilderTest,truncateBuilderTest)53 TEST(GetItemAttributesResponseBuilderTest, truncateBuilderTest) {
54 auto attribute = AttributeEntry(Attribute::TITLE, "1234");
55 size_t truncated_size = BrowsePacket::kMinSize();
56 truncated_size += 2; // Status field + Number of attributes field
57 truncated_size += attribute.size(); // Attribute size
58
59 auto truncated_builder =
60 GetItemAttributesResponseBuilder::MakeBuilder(Status::NO_ERROR, truncated_size);
61 ASSERT_TRUE(truncated_builder->AddAttributeEntry(Attribute::TITLE, "1234truncated"));
62 ASSERT_EQ(truncated_builder->size(), truncated_size);
63
64 ASSERT_FALSE(truncated_builder->AddAttributeEntry(Attribute::ARTIST_NAME, "Can not add"));
65
66 auto truncated_packet = TestGetItemAttrsReqPacket::Make();
67 truncated_builder->Serialize(truncated_packet);
68
69 auto builder = GetItemAttributesResponseBuilder::MakeBuilder(Status::NO_ERROR, 0xFFFF);
70 builder->AddAttributeEntry(attribute);
71 auto test_packet = TestGetItemAttrsReqPacket::Make();
72 builder->Serialize(test_packet);
73
74 ASSERT_EQ(truncated_packet->GetData(), test_packet->GetData());
75 }
76
TEST(GetItemAttributesResponseBuilderTest,errorStatusTest)77 TEST(GetItemAttributesResponseBuilderTest, errorStatusTest) {
78 std::vector<uint8_t> does_not_exist_status = {0x73, 0x00, 0x01, 0x09};
79 auto builder = GetItemAttributesResponseBuilder::MakeBuilder(Status::DOES_NOT_EXIST, 0xFFFF);
80 ASSERT_EQ(builder->size(), does_not_exist_status.size());
81
82 auto test_packet = TestGetItemAttrsReqPacket::Make();
83 builder->Serialize(test_packet);
84 ASSERT_EQ(test_packet->GetData(), does_not_exist_status);
85 }
86
TEST(GetItemAttributesRequestTest,getterTest)87 TEST(GetItemAttributesRequestTest, getterTest) {
88 auto test_packet = TestGetItemAttrsReqPacket::Make(get_item_attributes_request_all_attributes);
89
90 ASSERT_EQ(test_packet->GetScope(), Scope::NOW_PLAYING);
91 ASSERT_EQ(test_packet->GetUidCounter(), 0x0000u);
92 ASSERT_EQ(test_packet->GetUid(), 0x0000000000000001u);
93 ASSERT_EQ(test_packet->GetNumAttributes(), 7);
94 std::vector<Attribute> attrs_requested = {Attribute::TITLE,
95 Attribute::ARTIST_NAME,
96 Attribute::ALBUM_NAME,
97 Attribute::TRACK_NUMBER,
98 Attribute::TOTAL_NUMBER_OF_TRACKS,
99 Attribute::GENRE,
100 Attribute::PLAYING_TIME};
101 ASSERT_EQ(test_packet->GetAttributesRequested(), attrs_requested);
102 }
103
TEST(GetItemAttributesRequestTest,validTest)104 TEST(GetItemAttributesRequestTest, validTest) {
105 auto test_packet = TestGetItemAttrsReqPacket::Make(get_item_attributes_request_all_attributes);
106 ASSERT_TRUE(test_packet->IsValid());
107 }
108
TEST(GetItemAttributesRequestTest,invalidTest)109 TEST(GetItemAttributesRequestTest, invalidTest) {
110 auto packet_copy = get_item_attributes_request_all_attributes;
111 packet_copy.push_back(0x00);
112 auto test_packet = TestGetItemAttrsReqPacket::Make(packet_copy);
113 ASSERT_FALSE(test_packet->IsValid());
114
115 std::vector<uint8_t> short_packet = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
116 test_packet = TestGetItemAttrsReqPacket::Make(short_packet);
117 ASSERT_FALSE(test_packet->IsValid());
118 }
119
TEST(GetItemAttributesRequestTest,builderMtuTest)120 TEST(GetItemAttributesRequestTest, builderMtuTest) {
121 std::vector<AttributeEntry> test_data = {
122 {Attribute::TITLE, "Test Song 1"}, {Attribute::ARTIST_NAME, "Test Artist"},
123 {Attribute::ALBUM_NAME, "Test Album"}, {Attribute::TRACK_NUMBER, "1"},
124 {Attribute::TOTAL_NUMBER_OF_TRACKS, "2"}, {Attribute::GENRE, "Test Genre"},
125 {Attribute::PLAYING_TIME, "10 200"}, {Attribute::TITLE, "Test Song 2"},
126 {Attribute::ARTIST_NAME, "Test Artist"}, {Attribute::ALBUM_NAME, "Test Album"},
127 {Attribute::TRACK_NUMBER, "2"}, {Attribute::TOTAL_NUMBER_OF_TRACKS, "2"},
128 {Attribute::GENRE, "Test Genre"}, {Attribute::PLAYING_TIME, "1500"},
129 };
130
131 using Builder = GetItemAttributesResponseBuilder;
132 using Helper = FragmentationBuilderHelper<Builder>;
133 size_t mtu = size_t(-1);
134 Helper helper(mtu, [](size_t mtu) { return Builder::MakeBuilder(Status::NO_ERROR, mtu); });
135
136 EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu, false, false));
137
138 mtu = test_data[0].size() + Builder::kHeaderSize();
139 EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu));
140
141 mtu = test_data[0].size() + test_data[1].size() + Builder::kHeaderSize();
142 EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu));
143
144 mtu = test_data[0].size() + (Builder::kHeaderSize() * 2) + 1;
145 EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu, true, false));
146
147 mtu = Builder::kHeaderSize() + AttributeEntry::kHeaderSize() + 1;
148 EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu));
149
150 mtu = Builder::kHeaderSize() + AttributeEntry::kHeaderSize();
151 EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu, false, false));
152 }
153
154 } // namespace avrcp
155 } // namespace bluetooth
156