1 // Copyright 2021 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14
15 #include "pw_bluetooth_hci/packet.h"
16
17 #include "gtest/gtest.h"
18 #include "pw_bytes/array.h"
19 #include "pw_bytes/byte_builder.h"
20 #include "pw_status/status.h"
21
22 namespace pw::bluetooth_hci {
23 namespace {
24
25 class PacketTest : public ::testing::Test {
26 protected:
27 constexpr static size_t kMaxHeaderSizeBytes = std::max({
28 CommandPacket::kHeaderSizeBytes,
29 AsyncDataPacket::kHeaderSizeBytes,
30 SyncDataPacket::kHeaderSizeBytes,
31 EventPacket::kHeaderSizeBytes,
32 });
33 // Arbitrarily add at most 2 bytes worth of payload (data or parameters).
34 constexpr static size_t kArbitraryMaxPayloadSizeBytes = 2;
35 constexpr static size_t kMaxPacketSizeBytes =
36 kMaxHeaderSizeBytes + kArbitraryMaxPayloadSizeBytes;
37 std::array<std::byte, kMaxPacketSizeBytes> packet_buffer_;
38 };
39
TEST_F(PacketTest,CommandPacketHeaderUndersizedEncode)40 TEST_F(PacketTest, CommandPacketHeaderUndersizedEncode) {
41 const CommandPacket packet(0u, ConstByteSpan());
42 EXPECT_EQ(0u, packet.parameters().size_bytes());
43 const Result<ConstByteSpan> encode_result = packet.Encode(
44 {packet_buffer_.data(), CommandPacket::kHeaderSizeBytes - 1});
45 EXPECT_EQ(Status::ResourceExhausted(), encode_result.status());
46 }
47
TEST_F(PacketTest,CommandPacketHeaderUndersizedDecode)48 TEST_F(PacketTest, CommandPacketHeaderUndersizedDecode) {
49 EXPECT_FALSE(CommandPacket::Decode(
50 {packet_buffer_.data(), CommandPacket::kHeaderSizeBytes - 1})
51 .has_value());
52 }
53
TEST_F(PacketTest,CommandPacketHeaderOnlyEncodeAndDecode)54 TEST_F(PacketTest, CommandPacketHeaderOnlyEncodeAndDecode) {
55 constexpr uint16_t kOpcodeCommandField = 0b00'0000'0000;
56 constexpr uint8_t kOpcodeGroupField = 0b11'1111;
57
58 constexpr uint16_t kOpcode = (kOpcodeGroupField << 10) | kOpcodeCommandField;
59
60 const CommandPacket packet(kOpcode, ConstByteSpan());
61 EXPECT_EQ(packet.type(), Packet::Type::kCommandPacket);
62 EXPECT_EQ(packet.size_bytes(), CommandPacket::kHeaderSizeBytes);
63 EXPECT_EQ(packet.opcode(), kOpcode);
64 EXPECT_EQ(packet.opcode_command_field(), kOpcodeCommandField);
65 EXPECT_EQ(packet.opcode_group_field(), kOpcodeGroupField);
66 EXPECT_EQ(packet.parameters().size_bytes(), 0u);
67
68 const Result<ConstByteSpan> encode_result = packet.Encode(packet_buffer_);
69 ASSERT_EQ(OkStatus(), encode_result.status());
70
71 constexpr std::array<const std::byte, CommandPacket::kHeaderSizeBytes>
72 kExpectedEncodedPacket = bytes::MakeArray<const std::byte>(
73 0b0000'0000, 0b1111'1100, 0b0000'0000);
74 const ConstByteSpan& encoded_packet = encode_result.value();
75 EXPECT_TRUE(std::equal(kExpectedEncodedPacket.begin(),
76 kExpectedEncodedPacket.end(),
77 encoded_packet.begin(),
78 encoded_packet.end()));
79
80 // First, decode it from a perfectly sized span which we just encoded.
81 std::optional<CommandPacket> possible_packet =
82 CommandPacket::Decode(encoded_packet);
83 ASSERT_TRUE(possible_packet.has_value());
84 CommandPacket& decoded_packet = possible_packet.value();
85 EXPECT_EQ(decoded_packet.type(), Packet::Type::kCommandPacket);
86 EXPECT_EQ(decoded_packet.size_bytes(), CommandPacket::kHeaderSizeBytes);
87 EXPECT_EQ(decoded_packet.opcode(), kOpcode);
88 EXPECT_EQ(decoded_packet.opcode_command_field(), kOpcodeCommandField);
89 EXPECT_EQ(decoded_packet.opcode_group_field(), kOpcodeGroupField);
90 EXPECT_EQ(decoded_packet.parameters().size_bytes(), 0u);
91
92 // Second, decode it from an oversized buffer.
93 possible_packet = CommandPacket::Decode({packet_buffer_});
94 ASSERT_TRUE(possible_packet.has_value());
95 decoded_packet = possible_packet.value();
96 EXPECT_EQ(decoded_packet.type(), Packet::Type::kCommandPacket);
97 EXPECT_EQ(decoded_packet.size_bytes(), CommandPacket::kHeaderSizeBytes);
98 EXPECT_EQ(decoded_packet.opcode(), kOpcode);
99 EXPECT_EQ(decoded_packet.opcode_command_field(), kOpcodeCommandField);
100 EXPECT_EQ(decoded_packet.opcode_group_field(), kOpcodeGroupField);
101 EXPECT_EQ(decoded_packet.parameters().size_bytes(), 0u);
102 }
103
TEST_F(PacketTest,CommandPacketWithParametersEncodeAndDecode)104 TEST_F(PacketTest, CommandPacketWithParametersEncodeAndDecode) {
105 constexpr uint16_t kOpcodeCommandField = 0b10'1010'1010;
106 constexpr uint8_t kOpcodeGroupField = 0b10'1010;
107
108 constexpr uint16_t kOpcode = (kOpcodeGroupField << 10) | kOpcodeCommandField;
109
110 constexpr std::array<const std::byte, kArbitraryMaxPayloadSizeBytes>
111 kParameters = bytes::MakeArray<const std::byte>(1, 2);
112 const CommandPacket packet(kOpcode, kParameters);
113 EXPECT_EQ(packet.type(), Packet::Type::kCommandPacket);
114 EXPECT_EQ(packet.size_bytes(),
115 CommandPacket::kHeaderSizeBytes + kArbitraryMaxPayloadSizeBytes);
116 EXPECT_EQ(packet.opcode(), kOpcode);
117 EXPECT_EQ(packet.opcode_command_field(), kOpcodeCommandField);
118 EXPECT_EQ(packet.opcode_group_field(), kOpcodeGroupField);
119 EXPECT_EQ(packet.parameters().size_bytes(), kArbitraryMaxPayloadSizeBytes);
120
121 const Result<ConstByteSpan> encode_result = packet.Encode(packet_buffer_);
122 ASSERT_EQ(OkStatus(), encode_result.status());
123
124 constexpr std::array<const std::byte,
125 CommandPacket::kHeaderSizeBytes +
126 kArbitraryMaxPayloadSizeBytes>
127 kExpectedEncodedPacket = bytes::MakeArray<const std::byte>(
128 0b1010'1010, 0b1010'1010, 0b0000'0010, 1, 2);
129 const ConstByteSpan& encoded_packet = encode_result.value();
130 EXPECT_TRUE(std::equal(kExpectedEncodedPacket.begin(),
131 kExpectedEncodedPacket.end(),
132 encoded_packet.begin(),
133 encoded_packet.end()));
134
135 // First, decode it from a perfectly sized span which we just encoded.
136 std::optional<CommandPacket> possible_packet =
137 CommandPacket::Decode(encoded_packet);
138 ASSERT_TRUE(possible_packet.has_value());
139 CommandPacket& decoded_packet = possible_packet.value();
140 EXPECT_EQ(decoded_packet.type(), Packet::Type::kCommandPacket);
141 EXPECT_EQ(decoded_packet.size_bytes(),
142 CommandPacket::kHeaderSizeBytes + kArbitraryMaxPayloadSizeBytes);
143 EXPECT_EQ(decoded_packet.opcode(), kOpcode);
144 EXPECT_EQ(decoded_packet.opcode_command_field(), kOpcodeCommandField);
145 EXPECT_EQ(decoded_packet.opcode_group_field(), kOpcodeGroupField);
146 EXPECT_EQ(decoded_packet.parameters().size_bytes(),
147 kArbitraryMaxPayloadSizeBytes);
148
149 // Second, decode it from an oversized buffer.
150 possible_packet = CommandPacket::Decode({packet_buffer_});
151 ASSERT_TRUE(possible_packet.has_value());
152 decoded_packet = possible_packet.value();
153 EXPECT_EQ(decoded_packet.type(), Packet::Type::kCommandPacket);
154 EXPECT_EQ(decoded_packet.size_bytes(),
155 CommandPacket::kHeaderSizeBytes + kArbitraryMaxPayloadSizeBytes);
156 EXPECT_EQ(decoded_packet.opcode(), kOpcode);
157 EXPECT_EQ(decoded_packet.opcode_command_field(), kOpcodeCommandField);
158 EXPECT_EQ(decoded_packet.opcode_group_field(), kOpcodeGroupField);
159 EXPECT_EQ(decoded_packet.parameters().size_bytes(),
160 kArbitraryMaxPayloadSizeBytes);
161 }
162
TEST_F(PacketTest,AsyncDataPacketHeaderUndersizedEncode)163 TEST_F(PacketTest, AsyncDataPacketHeaderUndersizedEncode) {
164 const AsyncDataPacket packet(0u, ConstByteSpan());
165 EXPECT_EQ(0u, packet.data().size_bytes());
166 const Result<ConstByteSpan> encode_result = packet.Encode(
167 {packet_buffer_.data(), AsyncDataPacket::kHeaderSizeBytes - 1});
168 EXPECT_EQ(Status::ResourceExhausted(), encode_result.status());
169 }
170
TEST_F(PacketTest,AsyncDataPacketHeaderUndersizedDecode)171 TEST_F(PacketTest, AsyncDataPacketHeaderUndersizedDecode) {
172 EXPECT_FALSE(AsyncDataPacket::Decode({packet_buffer_.data(),
173 AsyncDataPacket::kHeaderSizeBytes - 1})
174 .has_value());
175 }
176
TEST_F(PacketTest,AsyncDataPacketHeaderOnlyEncodeAndDecode)177 TEST_F(PacketTest, AsyncDataPacketHeaderOnlyEncodeAndDecode) {
178 constexpr uint16_t kHandle = 0b00'0000'0000;
179 constexpr uint8_t kPbFlag = 0b01;
180 constexpr uint8_t kBcFlag = 0b10;
181
182 constexpr uint16_t kHandleAndFragmentationBits =
183 kHandle | (kPbFlag << 12) | (kBcFlag << 14);
184
185 const AsyncDataPacket packet(kHandleAndFragmentationBits, ConstByteSpan());
186 EXPECT_EQ(packet.type(), Packet::Type::kAsyncDataPacket);
187 EXPECT_EQ(packet.size_bytes(), AsyncDataPacket::kHeaderSizeBytes);
188 EXPECT_EQ(packet.handle_and_fragmentation_bits(),
189 kHandleAndFragmentationBits);
190 EXPECT_EQ(packet.handle(), kHandle);
191 EXPECT_EQ(packet.pb_flag(), kPbFlag);
192 EXPECT_EQ(packet.bc_flag(), kBcFlag);
193 EXPECT_EQ(packet.data().size_bytes(), 0u);
194
195 const Result<ConstByteSpan> encode_result = packet.Encode(packet_buffer_);
196 ASSERT_EQ(OkStatus(), encode_result.status());
197
198 constexpr std::array<const std::byte, AsyncDataPacket::kHeaderSizeBytes>
199 kExpectedEncodedPacket = bytes::MakeArray<const std::byte>(
200 0b0000'0000, 0b1001'0000, 0b0000'0000, 0b0000'0000);
201 const ConstByteSpan& encoded_packet = encode_result.value();
202 EXPECT_TRUE(std::equal(kExpectedEncodedPacket.begin(),
203 kExpectedEncodedPacket.end(),
204 encoded_packet.begin(),
205 encoded_packet.end()));
206
207 // First, decode it from a perfectly sized span which we just encoded.
208 std::optional<AsyncDataPacket> possible_packet =
209 AsyncDataPacket::Decode(encoded_packet);
210 ASSERT_TRUE(possible_packet.has_value());
211 AsyncDataPacket& decoded_packet = possible_packet.value();
212 EXPECT_EQ(decoded_packet.type(), Packet::Type::kAsyncDataPacket);
213 EXPECT_EQ(decoded_packet.size_bytes(), AsyncDataPacket::kHeaderSizeBytes);
214 EXPECT_EQ(decoded_packet.handle_and_fragmentation_bits(),
215 kHandleAndFragmentationBits);
216 EXPECT_EQ(decoded_packet.handle(), kHandle);
217 EXPECT_EQ(decoded_packet.pb_flag(), kPbFlag);
218 EXPECT_EQ(decoded_packet.bc_flag(), kBcFlag);
219 EXPECT_EQ(decoded_packet.data().size_bytes(), 0u);
220
221 // Second, decode it from an oversized buffer.
222 possible_packet = AsyncDataPacket::Decode({packet_buffer_});
223 ASSERT_TRUE(possible_packet.has_value());
224 decoded_packet = possible_packet.value();
225 EXPECT_EQ(decoded_packet.type(), Packet::Type::kAsyncDataPacket);
226 EXPECT_EQ(decoded_packet.size_bytes(), AsyncDataPacket::kHeaderSizeBytes);
227 EXPECT_EQ(decoded_packet.handle_and_fragmentation_bits(),
228 kHandleAndFragmentationBits);
229 EXPECT_EQ(decoded_packet.handle(), kHandle);
230 EXPECT_EQ(decoded_packet.pb_flag(), kPbFlag);
231 EXPECT_EQ(decoded_packet.bc_flag(), kBcFlag);
232 EXPECT_EQ(decoded_packet.data().size_bytes(), 0u);
233 }
234
TEST_F(PacketTest,AsyncDataPacketWithDataEncodeAndDecode)235 TEST_F(PacketTest, AsyncDataPacketWithDataEncodeAndDecode) {
236 constexpr uint16_t kHandle = 0b00'0000'0000;
237 constexpr uint8_t kPbFlag = 0b01;
238 constexpr uint8_t kBcFlag = 0b10;
239
240 constexpr uint16_t kHandleAndFragmentationBits =
241 kHandle | (kPbFlag << 12) | (kBcFlag << 14);
242
243 constexpr std::array<const std::byte, kArbitraryMaxPayloadSizeBytes> kData =
244 bytes::MakeArray<const std::byte>(1, 2);
245 const AsyncDataPacket packet(kHandleAndFragmentationBits, kData);
246 EXPECT_EQ(packet.type(), Packet::Type::kAsyncDataPacket);
247 EXPECT_EQ(packet.size_bytes(),
248 AsyncDataPacket::kHeaderSizeBytes + kArbitraryMaxPayloadSizeBytes);
249 EXPECT_EQ(packet.handle_and_fragmentation_bits(),
250 kHandleAndFragmentationBits);
251 EXPECT_EQ(packet.handle(), kHandle);
252 EXPECT_EQ(packet.pb_flag(), kPbFlag);
253 EXPECT_EQ(packet.bc_flag(), kBcFlag);
254 EXPECT_EQ(packet.data().size_bytes(), kArbitraryMaxPayloadSizeBytes);
255
256 const Result<ConstByteSpan> encode_result = packet.Encode(packet_buffer_);
257 ASSERT_EQ(OkStatus(), encode_result.status());
258
259 constexpr std::array<const std::byte,
260 AsyncDataPacket::kHeaderSizeBytes +
261 kArbitraryMaxPayloadSizeBytes>
262 kExpectedEncodedPacket = bytes::MakeArray<const std::byte>(
263 0b0000'0000, 0b1001'0000, 0b0000'0010, 0b0000'0000, 1, 2);
264 const ConstByteSpan& encoded_packet = encode_result.value();
265 EXPECT_TRUE(std::equal(kExpectedEncodedPacket.begin(),
266 kExpectedEncodedPacket.end(),
267 encoded_packet.begin(),
268 encoded_packet.end()));
269
270 // First, decode it from a perfectly sized span which we just encoded.
271 std::optional<AsyncDataPacket> possible_packet =
272 AsyncDataPacket::Decode(encoded_packet);
273 ASSERT_TRUE(possible_packet.has_value());
274 AsyncDataPacket& decoded_packet = possible_packet.value();
275 EXPECT_EQ(decoded_packet.type(), Packet::Type::kAsyncDataPacket);
276 EXPECT_EQ(decoded_packet.size_bytes(),
277 AsyncDataPacket::kHeaderSizeBytes + kArbitraryMaxPayloadSizeBytes);
278 EXPECT_EQ(decoded_packet.handle_and_fragmentation_bits(),
279 kHandleAndFragmentationBits);
280 EXPECT_EQ(decoded_packet.handle(), kHandle);
281 EXPECT_EQ(decoded_packet.pb_flag(), kPbFlag);
282 EXPECT_EQ(decoded_packet.bc_flag(), kBcFlag);
283 EXPECT_EQ(decoded_packet.data().size_bytes(), kArbitraryMaxPayloadSizeBytes);
284
285 // Second, decode it from an oversized buffer.
286 possible_packet = AsyncDataPacket::Decode({packet_buffer_});
287 ASSERT_TRUE(possible_packet.has_value());
288 decoded_packet = possible_packet.value();
289 EXPECT_EQ(decoded_packet.type(), Packet::Type::kAsyncDataPacket);
290 EXPECT_EQ(decoded_packet.size_bytes(),
291 AsyncDataPacket::kHeaderSizeBytes + kArbitraryMaxPayloadSizeBytes);
292 EXPECT_EQ(decoded_packet.handle_and_fragmentation_bits(),
293 kHandleAndFragmentationBits);
294 EXPECT_EQ(decoded_packet.handle(), kHandle);
295 EXPECT_EQ(decoded_packet.pb_flag(), kPbFlag);
296 EXPECT_EQ(decoded_packet.bc_flag(), kBcFlag);
297 EXPECT_EQ(decoded_packet.data().size_bytes(), kArbitraryMaxPayloadSizeBytes);
298 }
299
TEST_F(PacketTest,SyncDataPacketHeaderUndersizedEncode)300 TEST_F(PacketTest, SyncDataPacketHeaderUndersizedEncode) {
301 const SyncDataPacket packet(0u, ConstByteSpan());
302 EXPECT_EQ(0u, packet.data().size_bytes());
303 const Result<ConstByteSpan> encode_result = packet.Encode(
304 {packet_buffer_.data(), SyncDataPacket::kHeaderSizeBytes - 1});
305 EXPECT_EQ(Status::ResourceExhausted(), encode_result.status());
306 }
307
TEST_F(PacketTest,SyncDataPacketHeaderUndersizedDecode)308 TEST_F(PacketTest, SyncDataPacketHeaderUndersizedDecode) {
309 EXPECT_FALSE(SyncDataPacket::Decode({packet_buffer_.data(),
310 SyncDataPacket::kHeaderSizeBytes - 1})
311 .has_value());
312 }
313
TEST_F(PacketTest,SyncDataPacketHeaderOnlyEncodeAndDecode)314 TEST_F(PacketTest, SyncDataPacketHeaderOnlyEncodeAndDecode) {
315 constexpr uint16_t kHandle = 0b00'0000'0000;
316 constexpr uint8_t kPacketStatusFlag = 0b11;
317 constexpr uint8_t kReservedBits = 0;
318
319 constexpr uint16_t kHandleAndStatusBits =
320 kHandle | (kPacketStatusFlag << 12) | (kReservedBits << 14);
321
322 const SyncDataPacket packet(kHandleAndStatusBits, ConstByteSpan());
323 EXPECT_EQ(packet.type(), Packet::Type::kSyncDataPacket);
324 EXPECT_EQ(packet.size_bytes(), SyncDataPacket::kHeaderSizeBytes);
325 EXPECT_EQ(packet.handle_and_status_bits(), kHandleAndStatusBits);
326 EXPECT_EQ(packet.handle(), kHandle);
327 EXPECT_EQ(packet.packet_status_flag(), kPacketStatusFlag);
328 EXPECT_EQ(packet.data().size_bytes(), 0u);
329
330 const Result<ConstByteSpan> encode_result = packet.Encode(packet_buffer_);
331 ASSERT_EQ(OkStatus(), encode_result.status());
332
333 constexpr std::array<const std::byte, SyncDataPacket::kHeaderSizeBytes>
334 kExpectedEncodedPacket = bytes::MakeArray<const std::byte>(
335 0b0000'0000, 0b0011'0000, 0b0000'0000);
336 const ConstByteSpan& encoded_packet = encode_result.value();
337 EXPECT_TRUE(std::equal(kExpectedEncodedPacket.begin(),
338 kExpectedEncodedPacket.end(),
339 encoded_packet.begin(),
340 encoded_packet.end()));
341
342 // First, decode it from a perfectly sized span which we just encoded.
343 std::optional<SyncDataPacket> possible_packet =
344 SyncDataPacket::Decode(encoded_packet);
345 ASSERT_TRUE(possible_packet.has_value());
346 SyncDataPacket& decoded_packet = possible_packet.value();
347 EXPECT_EQ(decoded_packet.type(), Packet::Type::kSyncDataPacket);
348 EXPECT_EQ(decoded_packet.size_bytes(), SyncDataPacket::kHeaderSizeBytes);
349 EXPECT_EQ(packet.handle_and_status_bits(), kHandleAndStatusBits);
350 EXPECT_EQ(decoded_packet.packet_status_flag(), kPacketStatusFlag);
351 EXPECT_EQ(decoded_packet.handle(), kHandle);
352 EXPECT_EQ(decoded_packet.data().size_bytes(), 0u);
353
354 // Second, decode it from an oversized buffer.
355 possible_packet = SyncDataPacket::Decode({packet_buffer_});
356 ASSERT_TRUE(possible_packet.has_value());
357 decoded_packet = possible_packet.value();
358 EXPECT_EQ(decoded_packet.type(), Packet::Type::kSyncDataPacket);
359 EXPECT_EQ(decoded_packet.size_bytes(), SyncDataPacket::kHeaderSizeBytes);
360 EXPECT_EQ(packet.handle_and_status_bits(), kHandleAndStatusBits);
361 EXPECT_EQ(decoded_packet.handle(), kHandle);
362 EXPECT_EQ(decoded_packet.packet_status_flag(), kPacketStatusFlag);
363 EXPECT_EQ(decoded_packet.data().size_bytes(), 0u);
364 }
365
TEST_F(PacketTest,SyncDataPacketWithDataEncodeAndDecode)366 TEST_F(PacketTest, SyncDataPacketWithDataEncodeAndDecode) {
367 constexpr uint16_t kHandle = 0b00'0000'0000;
368 constexpr uint8_t kPacketStatusFlag = 0b11;
369 constexpr uint8_t kReservedBits = 0;
370
371 constexpr uint16_t kHandleAndStatusBits =
372 kHandle | (kPacketStatusFlag << 12) | (kReservedBits << 14);
373
374 constexpr std::array<const std::byte, kArbitraryMaxPayloadSizeBytes> kData =
375 bytes::MakeArray<const std::byte>(1, 2);
376 const SyncDataPacket packet(kHandleAndStatusBits, kData);
377 EXPECT_EQ(packet.type(), Packet::Type::kSyncDataPacket);
378 EXPECT_EQ(packet.size_bytes(),
379 SyncDataPacket::kHeaderSizeBytes + kArbitraryMaxPayloadSizeBytes);
380 EXPECT_EQ(packet.handle_and_status_bits(), kHandleAndStatusBits);
381 EXPECT_EQ(packet.handle(), kHandle);
382 EXPECT_EQ(packet.packet_status_flag(), kPacketStatusFlag);
383 EXPECT_EQ(packet.data().size_bytes(), kArbitraryMaxPayloadSizeBytes);
384
385 const Result<ConstByteSpan> encode_result = packet.Encode(packet_buffer_);
386 ASSERT_EQ(OkStatus(), encode_result.status());
387
388 constexpr std::array<const std::byte,
389 SyncDataPacket::kHeaderSizeBytes +
390 kArbitraryMaxPayloadSizeBytes>
391 kExpectedEncodedPacket = bytes::MakeArray<const std::byte>(
392 0b0000'0000, 0b0011'0000, 0b0000'0010, 1, 2);
393 const ConstByteSpan& encoded_packet = encode_result.value();
394 EXPECT_TRUE(std::equal(kExpectedEncodedPacket.begin(),
395 kExpectedEncodedPacket.end(),
396 encoded_packet.begin(),
397 encoded_packet.end()));
398
399 // First, decode it from a perfectly sized span which we just encoded.
400 std::optional<SyncDataPacket> possible_packet =
401 SyncDataPacket::Decode(encoded_packet);
402 ASSERT_TRUE(possible_packet.has_value());
403 SyncDataPacket& decoded_packet = possible_packet.value();
404 EXPECT_EQ(decoded_packet.type(), Packet::Type::kSyncDataPacket);
405 EXPECT_EQ(decoded_packet.size_bytes(),
406 SyncDataPacket::kHeaderSizeBytes + kArbitraryMaxPayloadSizeBytes);
407 EXPECT_EQ(packet.handle_and_status_bits(), kHandleAndStatusBits);
408 EXPECT_EQ(packet.handle(), kHandle);
409 EXPECT_EQ(packet.packet_status_flag(), kPacketStatusFlag);
410 EXPECT_EQ(decoded_packet.data().size_bytes(), kArbitraryMaxPayloadSizeBytes);
411
412 // Second, decode it from an oversized buffer.
413 possible_packet = SyncDataPacket::Decode({packet_buffer_});
414 ASSERT_TRUE(possible_packet.has_value());
415 decoded_packet = possible_packet.value();
416 EXPECT_EQ(decoded_packet.type(), Packet::Type::kSyncDataPacket);
417 EXPECT_EQ(decoded_packet.size_bytes(),
418 SyncDataPacket::kHeaderSizeBytes + kArbitraryMaxPayloadSizeBytes);
419 EXPECT_EQ(packet.handle_and_status_bits(), kHandleAndStatusBits);
420 EXPECT_EQ(packet.handle(), kHandle);
421 EXPECT_EQ(packet.packet_status_flag(), kPacketStatusFlag);
422 EXPECT_EQ(decoded_packet.data().size_bytes(), kArbitraryMaxPayloadSizeBytes);
423 }
424
TEST_F(PacketTest,EventPacketHeaderUndersizedEncode)425 TEST_F(PacketTest, EventPacketHeaderUndersizedEncode) {
426 const EventPacket packet(0u, ConstByteSpan());
427 EXPECT_EQ(0u, packet.parameters().size_bytes());
428 const Result<ConstByteSpan> encode_result =
429 packet.Encode({packet_buffer_.data(), EventPacket::kHeaderSizeBytes - 1});
430 EXPECT_EQ(Status::ResourceExhausted(), encode_result.status());
431 }
432
TEST_F(PacketTest,EventPacketHeaderUndersizedDecode)433 TEST_F(PacketTest, EventPacketHeaderUndersizedDecode) {
434 EXPECT_FALSE(EventPacket::Decode(
435 {packet_buffer_.data(), EventPacket::kHeaderSizeBytes - 1})
436 .has_value());
437 }
438
TEST_F(PacketTest,EventPacketHeaderOnlyEncodeAndDecode)439 TEST_F(PacketTest, EventPacketHeaderOnlyEncodeAndDecode) {
440 constexpr uint8_t kEventCode = 0b1111'1111;
441
442 const EventPacket packet(kEventCode, ConstByteSpan());
443 EXPECT_EQ(packet.type(), Packet::Type::kEventPacket);
444 EXPECT_EQ(packet.size_bytes(), EventPacket::kHeaderSizeBytes);
445 EXPECT_EQ(packet.event_code(), kEventCode);
446 EXPECT_EQ(packet.parameters().size_bytes(), 0u);
447
448 const Result<ConstByteSpan> encode_result = packet.Encode(packet_buffer_);
449 ASSERT_EQ(OkStatus(), encode_result.status());
450
451 constexpr std::array<const std::byte, EventPacket::kHeaderSizeBytes>
452 kExpectedEncodedPacket =
453 bytes::MakeArray<const std::byte>(0b1111'11111, 0b0000'0000);
454 const ConstByteSpan& encoded_packet = encode_result.value();
455 EXPECT_TRUE(std::equal(kExpectedEncodedPacket.begin(),
456 kExpectedEncodedPacket.end(),
457 encoded_packet.begin(),
458 encoded_packet.end()));
459
460 // First, decode it from a perfectly sized span which we just encoded.
461 std::optional<EventPacket> possible_packet =
462 EventPacket::Decode(encoded_packet);
463 ASSERT_TRUE(possible_packet.has_value());
464 EventPacket& decoded_packet = possible_packet.value();
465 EXPECT_EQ(decoded_packet.type(), Packet::Type::kEventPacket);
466 EXPECT_EQ(decoded_packet.size_bytes(), EventPacket::kHeaderSizeBytes);
467 EXPECT_EQ(decoded_packet.event_code(), kEventCode);
468 EXPECT_EQ(decoded_packet.parameters().size_bytes(), 0u);
469
470 // Second, decode it from an oversized buffer.
471 possible_packet = EventPacket::Decode({packet_buffer_});
472 ASSERT_TRUE(possible_packet.has_value());
473 decoded_packet = possible_packet.value();
474 EXPECT_EQ(decoded_packet.type(), Packet::Type::kEventPacket);
475 EXPECT_EQ(decoded_packet.size_bytes(), EventPacket::kHeaderSizeBytes);
476 EXPECT_EQ(decoded_packet.event_code(), kEventCode);
477 EXPECT_EQ(decoded_packet.parameters().size_bytes(), 0u);
478 }
479
TEST_F(PacketTest,EventPacketWithParametersEncodeAndDecode)480 TEST_F(PacketTest, EventPacketWithParametersEncodeAndDecode) {
481 constexpr uint8_t kEventCode = 0b1111'0000;
482
483 constexpr std::array<const std::byte, kArbitraryMaxPayloadSizeBytes>
484 kParameters = bytes::MakeArray<const std::byte>(1, 2);
485 const EventPacket packet(kEventCode, kParameters);
486 EXPECT_EQ(packet.type(), Packet::Type::kEventPacket);
487 EXPECT_EQ(packet.size_bytes(),
488 EventPacket::kHeaderSizeBytes + kArbitraryMaxPayloadSizeBytes);
489 EXPECT_EQ(packet.event_code(), kEventCode);
490 EXPECT_EQ(packet.parameters().size_bytes(), kArbitraryMaxPayloadSizeBytes);
491
492 const Result<ConstByteSpan> encode_result = packet.Encode(packet_buffer_);
493 ASSERT_EQ(OkStatus(), encode_result.status());
494
495 constexpr std::array<const std::byte,
496 EventPacket::kHeaderSizeBytes +
497 kArbitraryMaxPayloadSizeBytes>
498 kExpectedEncodedPacket =
499 bytes::MakeArray<const std::byte>(0b1111'0000, 0b0000'0010, 1, 2);
500 const ConstByteSpan& encoded_packet = encode_result.value();
501 EXPECT_TRUE(std::equal(kExpectedEncodedPacket.begin(),
502 kExpectedEncodedPacket.end(),
503 encoded_packet.begin(),
504 encoded_packet.end()));
505
506 // First, decode it from a perfectly sized span which we just encoded.
507 std::optional<EventPacket> possible_packet =
508 EventPacket::Decode(encoded_packet);
509 ASSERT_TRUE(possible_packet.has_value());
510 EventPacket& decoded_packet = possible_packet.value();
511 EXPECT_EQ(decoded_packet.type(), Packet::Type::kEventPacket);
512 EXPECT_EQ(decoded_packet.size_bytes(),
513 EventPacket::kHeaderSizeBytes + kArbitraryMaxPayloadSizeBytes);
514 EXPECT_EQ(decoded_packet.event_code(), kEventCode);
515 EXPECT_EQ(decoded_packet.parameters().size_bytes(),
516 kArbitraryMaxPayloadSizeBytes);
517
518 // Second, decode it from an oversized buffer.
519 possible_packet = EventPacket::Decode({packet_buffer_});
520 ASSERT_TRUE(possible_packet.has_value());
521 decoded_packet = possible_packet.value();
522 EXPECT_EQ(decoded_packet.type(), Packet::Type::kEventPacket);
523 EXPECT_EQ(decoded_packet.size_bytes(),
524 EventPacket::kHeaderSizeBytes + kArbitraryMaxPayloadSizeBytes);
525 EXPECT_EQ(decoded_packet.event_code(), kEventCode);
526 EXPECT_EQ(decoded_packet.parameters().size_bytes(),
527 kArbitraryMaxPayloadSizeBytes);
528 }
529
530 } // namespace
531 } // namespace pw::bluetooth_hci
532