1 /*
2  * Copyright 2019 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 "packet/packet_builder.h"
18 
19 #include <gtest/gtest.h>
20 
21 #include <forward_list>
22 #include <memory>
23 
24 using bluetooth::packet::BasePacketBuilder;
25 using bluetooth::packet::BitInserter;
26 using bluetooth::packet::PacketBuilder;
27 using std::vector;
28 
29 namespace {
30 vector<uint8_t> count_all = {
31         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
32         0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
33         0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
34 };
35 
36 vector<uint8_t> count_1 = {
37         0x00,
38         0x01,
39         0x02,
40 };
41 
42 vector<uint8_t> count_2 = {
43         0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
44 };
45 
46 vector<uint8_t> count_3 = {
47         0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
48         0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
49 };
50 }  // namespace
51 
52 namespace bluetooth {
53 namespace packet {
54 
55 template <bool little_endian>
56 class EndianBuilder : public PacketBuilder<little_endian> {
57 public:
EndianBuilder(uint8_t byte,uint16_t two_bytes,uint32_t four_bytes,uint64_t eight_bytes)58   EndianBuilder(uint8_t byte, uint16_t two_bytes, uint32_t four_bytes, uint64_t eight_bytes)
59       : byte_(byte), two_bytes_(two_bytes), four_bytes_(four_bytes), eight_bytes_(eight_bytes) {}
60   ~EndianBuilder() = default;
61 
size() const62   virtual size_t size() const override {
63     return sizeof(signature_) + sizeof(byte_) + sizeof(two_bytes_) + sizeof(four_bytes_) +
64            sizeof(eight_bytes_);
65   }
66 
FinalPacket()67   virtual const std::unique_ptr<std::vector<uint8_t>> FinalPacket() {
68     std::unique_ptr<std::vector<uint8_t>> packet = std::make_unique<std::vector<uint8_t>>();
69     packet->reserve(size());
70     BitInserter it(*packet);
71     Serialize(it);
72     return packet;
73   }
74 
Serialize(BitInserter & it) const75   virtual void Serialize(BitInserter& it) const override {
76     PacketBuilder<little_endian>::insert(signature_, it);
77     PacketBuilder<little_endian>::insert(byte_, it);
78     PacketBuilder<little_endian>::insert(two_bytes_, it);
79     PacketBuilder<little_endian>::insert(four_bytes_, it);
80     PacketBuilder<little_endian>::insert(eight_bytes_, it);
81   }
82 
83 private:
84   uint32_t signature_{(little_endian ? 0x03020100 : 0x00010203)};
85   uint8_t byte_;
86   uint16_t two_bytes_;
87   uint32_t four_bytes_;
88   uint64_t eight_bytes_;
89 };
90 
91 class PacketBuilderEndianTest : public ::testing::Test {
92 public:
93   PacketBuilderEndianTest() = default;
94   ~PacketBuilderEndianTest() = default;
95 };
96 
TEST(PacketBuilderEndianTest,insertTest)97 TEST(PacketBuilderEndianTest, insertTest) {
98   EndianBuilder<true> little(0x04, 0x0605, 0x0a090807, 0x1211100f0e0d0c0b);
99   EndianBuilder<false> big(0x04, 0x0506, 0x0708090a, 0x0b0c0d0e0f101112);
100   ASSERT_EQ(*big.FinalPacket(), *little.FinalPacket());
101 }
102 
103 template <typename T>
104 class VectorBuilder : public PacketBuilder<true> {
105 public:
VectorBuilder(const std::vector<uint64_t> vect)106   VectorBuilder(const std::vector<uint64_t> vect) {
107     for (uint64_t element : vect) {
108       vect_.push_back(static_cast<T>(element));
109     }
110   }
111   ~VectorBuilder() = default;
112 
size() const113   virtual size_t size() const override { return vect_.size() * sizeof(T); }
114 
FinalPacket()115   virtual const std::unique_ptr<std::vector<uint8_t>> FinalPacket() {
116     std::unique_ptr<std::vector<uint8_t>> packet = std::make_unique<std::vector<uint8_t>>();
117     packet->reserve(size());
118     BitInserter it(*packet);
119     Serialize(it);
120     return packet;
121   }
122 
Serialize(BitInserter & it) const123   virtual void Serialize(BitInserter& it) const override {
124     PacketBuilder<true>::insert_vector(vect_, it);
125   }
126 
127 private:
128   std::vector<T> vect_;
129 };
130 
131 template <typename T>
132 class InsertElementsBuilder : public PacketBuilder<true> {
133 public:
InsertElementsBuilder(const std::vector<uint64_t> vect)134   InsertElementsBuilder(const std::vector<uint64_t> vect) {
135     for (uint64_t element : vect) {
136       vect_.push_back(static_cast<T>(element));
137     }
138   }
139   virtual ~InsertElementsBuilder() = default;
140 
size() const141   virtual size_t size() const override { return vect_.size() * sizeof(T); }
142 
FinalPacket()143   virtual const std::unique_ptr<std::vector<uint8_t>> FinalPacket() {
144     std::unique_ptr<std::vector<uint8_t>> packet = std::make_unique<std::vector<uint8_t>>();
145     packet->reserve(size());
146     BitInserter it(*packet);
147     Serialize(it);
148     return packet;
149   }
150 
Serialize(BitInserter & it) const151   virtual void Serialize(BitInserter& it) const override {
152     for (T elem : vect_) {
153       PacketBuilder<true>::insert(elem, it);
154     }
155   }
156 
157 private:
158   std::vector<T> vect_;
159 };
160 
161 std::vector<uint64_t> vector_data{
162         0x7060504030201000, 0x7161514131211101, 0x7262524232221202,
163         0x7363534333231303, 0x7464544434241404, 0x7565554535251505,
164         0x7666564636261606, 0x7767574737271707, 0x7868584838281808,
165 };
166 
167 template <typename T>
168 class VectorBuilderTest : public ::testing::Test {
169 public:
170   VectorBuilderTest() = default;
171   ~VectorBuilderTest() = default;
172 
SetUp()173   void SetUp() {
174     packet_1_ = std::shared_ptr<VectorBuilder<T>>(new VectorBuilder<T>(vector_data));
175     packet_2_ =
176             std::shared_ptr<InsertElementsBuilder<T>>(new InsertElementsBuilder<T>(vector_data));
177   }
178 
TearDown()179   void TearDown() {
180     packet_1_.reset();
181     packet_2_.reset();
182   }
183 
184   std::shared_ptr<VectorBuilder<T>> packet_1_;
185   std::shared_ptr<InsertElementsBuilder<T>> packet_2_;
186 };
187 
188 using VectorBaseTypes =
189         ::testing::Types<uint8_t, uint16_t, uint32_t, uint64_t, int8_t, int16_t, int32_t, int64_t>;
190 TYPED_TEST_CASE(VectorBuilderTest, VectorBaseTypes);
191 
TYPED_TEST(VectorBuilderTest,insertVectorTest)192 TYPED_TEST(VectorBuilderTest, insertVectorTest) {
193   ASSERT_EQ(*(this->packet_1_->FinalPacket()), *(this->packet_2_->FinalPacket()));
194 }
195 
196 class NestedBuilder : public PacketBuilder<true> {
197 public:
198   ~NestedBuilder() = default;
199 
size() const200   virtual size_t size() const override {
201     size_t payload_size = (payload_ ? payload_->size() : 0);
202     return 1 + payload_size;
203   }
204 
Create(uint8_t level)205   static std::unique_ptr<NestedBuilder> Create(uint8_t level) {
206     return std::unique_ptr<NestedBuilder>(new NestedBuilder(level));
207   }
208 
CreateNested(std::unique_ptr<BasePacketBuilder> payload,uint8_t level)209   static std::unique_ptr<NestedBuilder> CreateNested(std::unique_ptr<BasePacketBuilder> payload,
210                                                      uint8_t level) {
211     return std::unique_ptr<NestedBuilder>(new NestedBuilder(std::move(payload), level));
212   }
213 
FinalPacket()214   virtual const std::unique_ptr<std::vector<uint8_t>> FinalPacket() {
215     std::unique_ptr<std::vector<uint8_t>> packet = std::make_unique<std::vector<uint8_t>>();
216     packet->reserve(size());
217     BitInserter it(*packet);
218     Serialize(it);
219     return packet;
220   }
221 
Serialize(BitInserter & it) const222   virtual void Serialize(BitInserter& it) const override {
223     PacketBuilder<true>::insert(level_, it);
224     if (payload_) {
225       payload_->Serialize(it);
226     }
227   }
228 
229 private:
230   std::unique_ptr<BasePacketBuilder> payload_;
231   uint8_t level_;
232 
NestedBuilder(std::unique_ptr<BasePacketBuilder> inner,uint8_t level)233   NestedBuilder(std::unique_ptr<BasePacketBuilder> inner, uint8_t level)
234       : payload_(std::move(inner)), level_(level) {}
NestedBuilder(uint8_t level)235   NestedBuilder(uint8_t level) : level_(level) {}
236 };
237 
238 class BuilderBuilderTest : public ::testing::Test {};
239 
TEST(BuilderBuilderTest,nestingTest)240 TEST(BuilderBuilderTest, nestingTest) {
241   std::unique_ptr<BasePacketBuilder> innermost = NestedBuilder::Create(0);
242   std::unique_ptr<BasePacketBuilder> number_1 =
243           NestedBuilder::CreateNested(std::move(innermost), 1);
244   std::unique_ptr<BasePacketBuilder> number_2 = NestedBuilder::CreateNested(std::move(number_1), 2);
245   std::unique_ptr<BasePacketBuilder> number_3 = NestedBuilder::CreateNested(std::move(number_2), 3);
246   std::unique_ptr<BasePacketBuilder> number_4 = NestedBuilder::CreateNested(std::move(number_3), 4);
247   std::unique_ptr<NestedBuilder> number_5 = NestedBuilder::CreateNested(std::move(number_4), 5);
248 
249   std::vector<uint8_t> count_down{5, 4, 3, 2, 1, 0};
250   ASSERT_EQ(*number_5->FinalPacket(), count_down);
251 }
252 }  // namespace packet
253 }  // namespace bluetooth
254