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,truncateBuilderTest)106 TEST(GetElementAttributesResponseBuilderTest, truncateBuilderTest) {
107   auto attribute = AttributeEntry(Attribute::TITLE, "1234");
108   size_t truncated_size = VendorPacket::kMinSize();
109   truncated_size += 1;                 // Number of attributes
110   truncated_size += attribute.size();  // Attribute size
111 
112   auto truncated_builder =
113       GetElementAttributesResponseBuilder::MakeBuilder(truncated_size);
114   ASSERT_TRUE(
115       truncated_builder->AddAttributeEntry(Attribute::TITLE, "1234truncated"));
116   ASSERT_EQ(truncated_builder->size(), truncated_size);
117 
118   ASSERT_FALSE(truncated_builder->AddAttributeEntry(Attribute::ARTIST_NAME,
119                                                     "Can not add"));
120 
121   auto truncated_packet = TestGetElemAttrReqPacket::Make();
122   truncated_builder->Serialize(truncated_packet);
123 
124   auto builder = GetElementAttributesResponseBuilder::MakeBuilder(0xFFFF);
125   builder->AddAttributeEntry(attribute);
126   auto test_packet = TestGetElemAttrReqPacket::Make();
127   builder->Serialize(test_packet);
128 
129   ASSERT_EQ(truncated_packet->GetData(), test_packet->GetData());
130 }
131 
132 }  // namespace avrcp
133 }  // namespace bluetooth