• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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