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