xref: /aosp_15_r20/external/pigweed/pw_bluetooth_sapphire/host/l2cap/frame_headers_test.cc (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1 // Copyright 2023 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_sapphire/internal/host/l2cap/frame_headers.h"
16 
17 #include "pw_bluetooth_sapphire/internal/host/common/byte_buffer.h"
18 #include "pw_unit_test/framework.h"
19 
20 namespace bt::l2cap::internal {
21 namespace {
22 
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesInformationFrame)23 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesInformationFrame) {
24   // See Core Spec, v5, Vol 3, Part A, Table 3.2.
25   EXPECT_TRUE(StaticByteBuffer(0b0000'0000, 0)
26                   .To<EnhancedControlField>()
27                   .designates_information_frame());
28 }
29 
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesNonInformationFrame)30 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesNonInformationFrame) {
31   // See Core Spec, v5, Vol 3, Part A, Table 3.2.
32   EXPECT_FALSE(StaticByteBuffer(0b0000'0001, 0)
33                    .To<EnhancedControlField>()
34                    .designates_information_frame());
35 }
36 
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesSupervisoryFrame)37 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesSupervisoryFrame) {
38   // See Core Spec, v5, Vol 3, Part A, Table 3.2.
39   EXPECT_TRUE(StaticByteBuffer(0b00000001, 0)
40                   .To<EnhancedControlField>()
41                   .designates_supervisory_frame());
42 }
43 
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesNonSupervisoryFrame)44 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesNonSupervisoryFrame) {
45   // See Core Spec, v5, Vol 3, Part A, Table 3.2.
46   EXPECT_FALSE(StaticByteBuffer(0b00000000, 1)
47                    .To<EnhancedControlField>()
48                    .designates_supervisory_frame());
49 }
50 
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesStartOfSegmentedSdu)51 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesStartOfSegmentedSdu) {
52   // See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
53   EXPECT_TRUE(StaticByteBuffer(0, 0b01000000)
54                   .To<EnhancedControlField>()
55                   .designates_start_of_segmented_sdu());
56 }
57 
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesNonStartOfSegmentedSdu)58 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesNonStartOfSegmentedSdu) {
59   // See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
60   EXPECT_FALSE(StaticByteBuffer(0, 0b00000000)
61                    .To<EnhancedControlField>()
62                    .designates_start_of_segmented_sdu());
63   EXPECT_FALSE(StaticByteBuffer(0, 0b10000000)
64                    .To<EnhancedControlField>()
65                    .designates_start_of_segmented_sdu());
66   EXPECT_FALSE(StaticByteBuffer(0, 0b11000000)
67                    .To<EnhancedControlField>()
68                    .designates_start_of_segmented_sdu());
69   EXPECT_FALSE(StaticByteBuffer(1, 0b01000000)
70                    .To<EnhancedControlField>()
71                    .designates_start_of_segmented_sdu());
72 }
73 
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesPartOfSegmentedSdu)74 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesPartOfSegmentedSdu) {
75   // See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
76   EXPECT_TRUE(StaticByteBuffer(0, 0b01000000)
77                   .To<EnhancedControlField>()
78                   .designates_part_of_segmented_sdu());
79   EXPECT_TRUE(StaticByteBuffer(0, 0b10000000)
80                   .To<EnhancedControlField>()
81                   .designates_part_of_segmented_sdu());
82   EXPECT_TRUE(StaticByteBuffer(0, 0b11000000)
83                   .To<EnhancedControlField>()
84                   .designates_part_of_segmented_sdu());
85 }
86 
TEST(FrameHeadersEnhancedControlFieldTest,IdentifiesNotPartOfSegmentedSdu)87 TEST(FrameHeadersEnhancedControlFieldTest, IdentifiesNotPartOfSegmentedSdu) {
88   // See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
89   EXPECT_FALSE(StaticByteBuffer(0, 0b00000000)
90                    .To<EnhancedControlField>()
91                    .designates_part_of_segmented_sdu());
92   EXPECT_FALSE(StaticByteBuffer(1, 0b01000000)
93                    .To<EnhancedControlField>()
94                    .designates_part_of_segmented_sdu());
95   EXPECT_FALSE(StaticByteBuffer(1, 0b10000000)
96                    .To<EnhancedControlField>()
97                    .designates_part_of_segmented_sdu());
98   EXPECT_FALSE(StaticByteBuffer(1, 0b11000000)
99                    .To<EnhancedControlField>()
100                    .designates_part_of_segmented_sdu());
101 }
102 
TEST(FrameHeadersEnhancedControlFieldTest,ReadsRequestSequenceNumber)103 TEST(FrameHeadersEnhancedControlFieldTest, ReadsRequestSequenceNumber) {
104   // See Core Spec, v5, Vol 3, Part A, Table 3.2, and Core Spec v5, Vol 3, Part
105   // A, Sec 8.3.
106   for (uint8_t seq_num = 0; seq_num < 64; ++seq_num) {
107     EXPECT_EQ(seq_num,
108               StaticByteBuffer(0, seq_num)
109                   .To<EnhancedControlField>()
110                   .receive_seq_num());
111   }
112 }
113 
TEST(FrameHeadersEnhancedControlFieldTest,IsConstructedProperly)114 TEST(FrameHeadersEnhancedControlFieldTest, IsConstructedProperly) {
115   EnhancedControlField ecf;
116   EXPECT_EQ(StaticByteBuffer(0, 0), BufferView(&ecf, sizeof(ecf)));
117 }
118 
TEST(FrameHeadersEnhancedControlFieldTest,SetSupervisoryFrameSetsBitCorrectly)119 TEST(FrameHeadersEnhancedControlFieldTest,
120      SetSupervisoryFrameSetsBitCorrectly) {
121   EnhancedControlField ecf;
122   ecf.set_supervisory_frame();
123   // See Core Spec, v5, Vol 3, Part A, Table 3.2.
124   EXPECT_EQ(StaticByteBuffer(0b1, 0), BufferView(&ecf, sizeof(ecf)));
125 }
126 
TEST(FrameHeadersEnhancedControlFieldTest,SetRequestSeqNumSetsBitsCorrectly)127 TEST(FrameHeadersEnhancedControlFieldTest, SetRequestSeqNumSetsBitsCorrectly) {
128   for (uint8_t seq_num = 0; seq_num < 64; ++seq_num) {
129     EnhancedControlField ecf;
130     ecf.set_receive_seq_num(seq_num);
131     // See Core Spec, v5, Vol 3, Part A, Table 3.2.
132     EXPECT_EQ(StaticByteBuffer(0, seq_num), BufferView(&ecf, sizeof(ecf)));
133   }
134 }
135 
TEST(FrameHeadersEnhancedControlFieldTest,SetSegmentationStatusWorksCorrectlyOnFreshFrame)136 TEST(FrameHeadersEnhancedControlFieldTest,
137      SetSegmentationStatusWorksCorrectlyOnFreshFrame) {
138   // See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
139 
140   {
141     EnhancedControlField ecf;
142     ecf.set_segmentation_status(SegmentationStatus::Unsegmented);
143     EXPECT_EQ(StaticByteBuffer(0, 0), BufferView(&ecf, sizeof(ecf)));
144   }
145 
146   {
147     EnhancedControlField ecf;
148     ecf.set_segmentation_status(SegmentationStatus::FirstSegment);
149     EXPECT_EQ(StaticByteBuffer(0, 0b0100'0000), BufferView(&ecf, sizeof(ecf)));
150   }
151 
152   {
153     EnhancedControlField ecf;
154     ecf.set_segmentation_status(SegmentationStatus::LastSegment);
155     EXPECT_EQ(StaticByteBuffer(0, 0b1000'0000), BufferView(&ecf, sizeof(ecf)));
156   }
157 
158   {
159     EnhancedControlField ecf;
160     ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
161     EXPECT_EQ(StaticByteBuffer(0, 0b1100'0000), BufferView(&ecf, sizeof(ecf)));
162   }
163 }
164 
TEST(FrameHeadersEnhancedControlFieldTest,SetSegmentationStatusWorksCorrectlyOnRecycledFrame)165 TEST(FrameHeadersEnhancedControlFieldTest,
166      SetSegmentationStatusWorksCorrectlyOnRecycledFrame) {
167   // See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
168 
169   {
170     EnhancedControlField ecf;
171     ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
172     ecf.set_segmentation_status(SegmentationStatus::Unsegmented);
173     EXPECT_EQ(StaticByteBuffer(0, 0), BufferView(&ecf, sizeof(ecf)));
174   }
175 
176   {
177     EnhancedControlField ecf;
178     ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
179     ecf.set_segmentation_status(SegmentationStatus::FirstSegment);
180     EXPECT_EQ(StaticByteBuffer(0, 0b0100'0000), BufferView(&ecf, sizeof(ecf)));
181   }
182 
183   {
184     EnhancedControlField ecf;
185     ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
186     ecf.set_segmentation_status(SegmentationStatus::LastSegment);
187     EXPECT_EQ(StaticByteBuffer(0, 0b1000'0000), BufferView(&ecf, sizeof(ecf)));
188   }
189 
190   {
191     EnhancedControlField ecf;
192     ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
193     ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
194     EXPECT_EQ(StaticByteBuffer(0, 0b1100'0000), BufferView(&ecf, sizeof(ecf)));
195   }
196 }
197 
TEST(FrameHeadersEnhancedControlFieldTest,SetSegmentationStatusPreservesRequestSeqNum)198 TEST(FrameHeadersEnhancedControlFieldTest,
199      SetSegmentationStatusPreservesRequestSeqNum) {
200   EnhancedControlField ecf;
201   ecf.set_receive_seq_num(EnhancedControlField::kMaxSeqNum);
202   ecf.set_segmentation_status(SegmentationStatus::Unsegmented);
203   EXPECT_EQ(EnhancedControlField::kMaxSeqNum, ecf.receive_seq_num());
204 }
205 
TEST(FrameHeadersSimpleInformationFrameHeaderTest,ReadsTxSequenceNumber)206 TEST(FrameHeadersSimpleInformationFrameHeaderTest, ReadsTxSequenceNumber) {
207   // See Core Spec, v5, Vol 3, Part A, Table 3.2, and Core Spec v5, Vol 3, Part
208   // A, Sec 8.3.
209   for (uint8_t seq_num = 0; seq_num < 64; ++seq_num) {
210     EXPECT_EQ(seq_num,
211               StaticByteBuffer(seq_num << 1, 0)
212                   .To<SimpleInformationFrameHeader>()
213                   .tx_seq());
214   }
215 }
216 
TEST(FrameHeadersSimpleInformationFrameHeaderTest,IsConstructedProperly)217 TEST(FrameHeadersSimpleInformationFrameHeaderTest, IsConstructedProperly) {
218   constexpr uint8_t kTxSeq = 63;
219   SimpleInformationFrameHeader frame(kTxSeq);
220   // See Core Spec, v5, Vol 3, Part A, Table 3.2.
221   EXPECT_EQ(StaticByteBuffer(0b111'1110, 0), BufferView(&frame, sizeof(frame)));
222 }
223 
TEST(FrameHeadersSimpleInformationFrameHeaderTest,SetSegmentationStatusPreservesTxSeq)224 TEST(FrameHeadersSimpleInformationFrameHeaderTest,
225      SetSegmentationStatusPreservesTxSeq) {
226   constexpr uint8_t kTxSeq = 63;
227   SimpleInformationFrameHeader frame(kTxSeq);
228   frame.set_segmentation_status(SegmentationStatus::Unsegmented);
229   EXPECT_EQ(kTxSeq, frame.tx_seq());
230 }
231 
TEST(FrameHeadersSimpleStartOfSduFrameHeaderTest,IsConstructedProperly)232 TEST(FrameHeadersSimpleStartOfSduFrameHeaderTest, IsConstructedProperly) {
233   constexpr uint8_t kTxSeq = 63;
234   SimpleStartOfSduFrameHeader frame(kTxSeq);
235   // See Core Spec, v5, Vol 3, Part A, Table 3.2, and Figure 3.3.
236   EXPECT_EQ(StaticByteBuffer(0b111'1110, 0b0100'0000, 0, 0),
237             BufferView(&frame, sizeof(frame)));
238 }
239 
TEST(FrameHeadersSimpleSupervisoryFrameTest,IsConstructedProperly)240 TEST(FrameHeadersSimpleSupervisoryFrameTest, IsConstructedProperly) {
241   // See Core Spec, v5, Vol 3, Part A, Table 3.2.
242 
243   {
244     SimpleSupervisoryFrame frame(SupervisoryFunction::ReceiverReady);
245     EXPECT_EQ(StaticByteBuffer(0b0001, 0), BufferView(&frame, sizeof(frame)));
246   }
247 
248   {
249     SimpleSupervisoryFrame frame(SupervisoryFunction::Reject);
250     EXPECT_EQ(StaticByteBuffer(0b0101, 0), BufferView(&frame, sizeof(frame)));
251   }
252 
253   {
254     SimpleSupervisoryFrame frame(SupervisoryFunction::ReceiverNotReady);
255     EXPECT_EQ(StaticByteBuffer(0b1001, 0), BufferView(&frame, sizeof(frame)));
256   }
257 
258   {
259     SimpleSupervisoryFrame frame(SupervisoryFunction::SelectiveReject);
260     EXPECT_EQ(StaticByteBuffer(0b1101, 0), BufferView(&frame, sizeof(frame)));
261   }
262 }
263 
TEST(FrameHeadersSimpleSupervisoryFrameTest,IdentifiesPollRequest)264 TEST(FrameHeadersSimpleSupervisoryFrameTest, IdentifiesPollRequest) {
265   // See Core Spec, v5, Vol 3, Part A, Table 3.2.
266   EXPECT_FALSE(StaticByteBuffer(0b0'0001, 0)
267                    .To<SimpleSupervisoryFrame>()
268                    .is_poll_request());
269   EXPECT_TRUE(StaticByteBuffer(0b1'0001, 0)
270                   .To<SimpleSupervisoryFrame>()
271                   .is_poll_request());
272 }
273 
TEST(FrameHeadersSimpleSupervisoryFrameTest,IdentifiesPollResponse)274 TEST(FrameHeadersSimpleSupervisoryFrameTest, IdentifiesPollResponse) {
275   // See Core Spec, v5, Vol 3, Part A, Table 3.2.
276   EXPECT_FALSE(StaticByteBuffer(0b0000'0001, 0)
277                    .To<SimpleSupervisoryFrame>()
278                    .is_poll_response());
279   EXPECT_TRUE(StaticByteBuffer(0b1000'0001, 0)
280                   .To<SimpleSupervisoryFrame>()
281                   .is_poll_response());
282 }
283 
TEST(FrameHeadersSimpleSupervisoryFrameTest,FunctionReadsSupervisoryFunction)284 TEST(FrameHeadersSimpleSupervisoryFrameTest, FunctionReadsSupervisoryFunction) {
285   // See Core Spec, v5, Vol 3, Part A, Table 3.2 and Table 3.5.
286   EXPECT_EQ(
287       SupervisoryFunction::ReceiverReady,
288       StaticByteBuffer(0b0001, 0).To<SimpleSupervisoryFrame>().function());
289   EXPECT_EQ(
290       SupervisoryFunction::Reject,
291       StaticByteBuffer(0b0101, 0).To<SimpleSupervisoryFrame>().function());
292   EXPECT_EQ(
293       SupervisoryFunction::ReceiverNotReady,
294       StaticByteBuffer(0b1001, 0).To<SimpleSupervisoryFrame>().function());
295   EXPECT_EQ(
296       SupervisoryFunction::SelectiveReject,
297       StaticByteBuffer(0b1101, 0).To<SimpleSupervisoryFrame>().function());
298 }
299 
TEST(FrameHeadersSimpleSupervisoryFrameTest,SetIsPollRequestSetsCorrectBit)300 TEST(FrameHeadersSimpleSupervisoryFrameTest, SetIsPollRequestSetsCorrectBit) {
301   SimpleSupervisoryFrame sframe(SupervisoryFunction::ReceiverReady);
302   sframe.set_is_poll_request();
303   // See Core Spec, v5, Vol 3, Part A, Table 3.2.
304   EXPECT_EQ(StaticByteBuffer(0b1'0001, 0), BufferView(&sframe, sizeof(sframe)));
305 }
306 
TEST(FrameHeadersSimpleSupervisoryFrameTest,SetIsPollResponseSetsCorrectBit)307 TEST(FrameHeadersSimpleSupervisoryFrameTest, SetIsPollResponseSetsCorrectBit) {
308   SimpleSupervisoryFrame sframe(SupervisoryFunction::ReceiverReady);
309   sframe.set_is_poll_response();
310   // See Core Spec, v5, Vol 3, Part A, Table 3.2.
311   EXPECT_EQ(StaticByteBuffer(0b1000'0001, 0),
312             BufferView(&sframe, sizeof(sframe)));
313 }
314 
TEST(FrameHeadersSimpleReceiverReadyFrameTest,IsConstructedProperly)315 TEST(FrameHeadersSimpleReceiverReadyFrameTest, IsConstructedProperly) {
316   SimpleReceiverReadyFrame frame;
317   // See Core Spec, v5, Vol 3, Part A, Table 3.2 and Table 3.5.
318   EXPECT_EQ(StaticByteBuffer(0b0001, 0), BufferView(&frame, sizeof(frame)));
319 }
320 
321 }  // namespace
322 }  // namespace bt::l2cap::internal
323