blob: 8cb9631da9d94e4ff48fd15609065f24736a4bcd [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "frame_headers.h"
#include <iostream>
#include "gtest/gtest.h"
#include "src/connectivity/bluetooth/core/bt-host/common/byte_buffer.h"
namespace bt {
namespace l2cap {
namespace internal {
namespace {
TEST(L2CAP_FrameHeaders_EnhancedControlFieldTest, IdentifiesInformationFrame) {
// See Core Spec, v5, Vol 3, Part A, Table 3.2.
EXPECT_TRUE(CreateStaticByteBuffer(0b0000'0000, 0)
.As<EnhancedControlField>()
.designates_information_frame());
}
TEST(L2CAP_FrameHeaders_EnhancedControlFieldTest,
IdentifiesNonInformationFrame) {
// See Core Spec, v5, Vol 3, Part A, Table 3.2.
EXPECT_FALSE(CreateStaticByteBuffer(0b0000'0001, 0)
.As<EnhancedControlField>()
.designates_information_frame());
}
TEST(L2CAP_FrameHeaders_EnhancedControlFieldTest, IdentifiesSupervisoryFrame) {
// See Core Spec, v5, Vol 3, Part A, Table 3.2.
EXPECT_TRUE(CreateStaticByteBuffer(0b00000001, 0)
.As<EnhancedControlField>()
.designates_supervisory_frame());
}
TEST(L2CAP_FrameHeaders_EnhancedControlFieldTest,
IdentifiesNonSupervisoryFrame) {
// See Core Spec, v5, Vol 3, Part A, Table 3.2.
EXPECT_FALSE(CreateStaticByteBuffer(0b00000000, 1)
.As<EnhancedControlField>()
.designates_supervisory_frame());
}
TEST(L2CAP_FrameHeaders_EnhancedControlFieldTest,
IdentifiesStartOfSegmentedSdu) {
// See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
EXPECT_TRUE(CreateStaticByteBuffer(0, 0b01000000)
.As<EnhancedControlField>()
.designates_start_of_segmented_sdu());
}
TEST(L2CAP_FrameHeaders_EnhancedControlFieldTest,
IdentifiesNonStartOfSegmentedSdu) {
// See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
EXPECT_FALSE(CreateStaticByteBuffer(0, 0b00000000)
.As<EnhancedControlField>()
.designates_start_of_segmented_sdu());
EXPECT_FALSE(CreateStaticByteBuffer(0, 0b10000000)
.As<EnhancedControlField>()
.designates_start_of_segmented_sdu());
EXPECT_FALSE(CreateStaticByteBuffer(0, 0b11000000)
.As<EnhancedControlField>()
.designates_start_of_segmented_sdu());
EXPECT_FALSE(CreateStaticByteBuffer(1, 0b01000000)
.As<EnhancedControlField>()
.designates_start_of_segmented_sdu());
}
TEST(L2CAP_FrameHeaders_EnhancedControlFieldTest,
IdentifiesPartOfSegmentedSdu) {
// See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
EXPECT_TRUE(CreateStaticByteBuffer(0, 0b01000000)
.As<EnhancedControlField>()
.designates_part_of_segmented_sdu());
EXPECT_TRUE(CreateStaticByteBuffer(0, 0b10000000)
.As<EnhancedControlField>()
.designates_part_of_segmented_sdu());
EXPECT_TRUE(CreateStaticByteBuffer(0, 0b11000000)
.As<EnhancedControlField>()
.designates_part_of_segmented_sdu());
}
TEST(L2CAP_FrameHeaders_EnhancedControlFieldTest,
IdentifiesNotPartOfSegmentedSdu) {
// See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
EXPECT_FALSE(CreateStaticByteBuffer(0, 0b00000000)
.As<EnhancedControlField>()
.designates_part_of_segmented_sdu());
EXPECT_FALSE(CreateStaticByteBuffer(1, 0b01000000)
.As<EnhancedControlField>()
.designates_part_of_segmented_sdu());
EXPECT_FALSE(CreateStaticByteBuffer(1, 0b10000000)
.As<EnhancedControlField>()
.designates_part_of_segmented_sdu());
EXPECT_FALSE(CreateStaticByteBuffer(1, 0b11000000)
.As<EnhancedControlField>()
.designates_part_of_segmented_sdu());
}
TEST(L2CAP_FrameHeaders_EnhancedControlFieldTest, ReadsRequestSequenceNumber) {
// See Core Spec, v5, Vol 3, Part A, Table 3.2, and Core Spec v5, Vol 3, Part
// A, Sec 8.3.
for (uint8_t seq_num = 0; seq_num < 64; ++seq_num) {
EXPECT_EQ(seq_num, CreateStaticByteBuffer(0, seq_num)
.As<EnhancedControlField>()
.request_seq_num());
}
}
TEST(L2CAP_FrameHeaders_EnhancedControlFieldTest, IsConstructedProperly) {
EnhancedControlField ecf;
EXPECT_EQ(CreateStaticByteBuffer(0, 0), BufferView(&ecf, sizeof(ecf)));
}
TEST(L2CAP_FrameHeaders_EnhancedControlFieldTest,
SetSupervisoryFrameSetsBitCorrectly) {
EnhancedControlField ecf;
ecf.set_supervisory_frame();
// See Core Spec, v5, Vol 3, Part A, Table 3.2.
EXPECT_EQ(CreateStaticByteBuffer(0b1, 0), BufferView(&ecf, sizeof(ecf)));
}
TEST(L2CAP_FrameHeaders_EnhancedControlFieldTest,
SetRequestSeqNumSetsBitsCorrectly) {
for (uint8_t seq_num = 0; seq_num < 64; ++seq_num) {
EnhancedControlField ecf;
ecf.set_request_seq_num(seq_num);
// See Core Spec, v5, Vol 3, Part A, Table 3.2.
EXPECT_EQ(CreateStaticByteBuffer(0, seq_num),
BufferView(&ecf, sizeof(ecf)));
}
}
TEST(L2CAP_FrameHeaders_EnhancedControlFieldTest,
SetSegmentationStatusWorksCorrectlyOnFreshFrame) {
// See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
{
EnhancedControlField ecf;
ecf.set_segmentation_status(SegmentationStatus::Unsegmented);
EXPECT_EQ(CreateStaticByteBuffer(0, 0), BufferView(&ecf, sizeof(ecf)));
}
{
EnhancedControlField ecf;
ecf.set_segmentation_status(SegmentationStatus::FirstSegment);
EXPECT_EQ(CreateStaticByteBuffer(0, 0b0100'0000),
BufferView(&ecf, sizeof(ecf)));
}
{
EnhancedControlField ecf;
ecf.set_segmentation_status(SegmentationStatus::LastSegment);
EXPECT_EQ(CreateStaticByteBuffer(0, 0b1000'0000),
BufferView(&ecf, sizeof(ecf)));
}
{
EnhancedControlField ecf;
ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
EXPECT_EQ(CreateStaticByteBuffer(0, 0b1100'0000),
BufferView(&ecf, sizeof(ecf)));
}
}
TEST(L2CAP_FrameHeaders_EnhancedControlFieldTest,
SetSegmentationStatusWorksCorrectlyOnRecycledFrame) {
// See Core Spec, v5, Vol 3, Part A, Tables 3.2 and 3.4.
{
EnhancedControlField ecf;
ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
ecf.set_segmentation_status(SegmentationStatus::Unsegmented);
EXPECT_EQ(CreateStaticByteBuffer(0, 0), BufferView(&ecf, sizeof(ecf)));
}
{
EnhancedControlField ecf;
ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
ecf.set_segmentation_status(SegmentationStatus::FirstSegment);
EXPECT_EQ(CreateStaticByteBuffer(0, 0b0100'0000),
BufferView(&ecf, sizeof(ecf)));
}
{
EnhancedControlField ecf;
ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
ecf.set_segmentation_status(SegmentationStatus::LastSegment);
EXPECT_EQ(CreateStaticByteBuffer(0, 0b1000'0000),
BufferView(&ecf, sizeof(ecf)));
}
{
EnhancedControlField ecf;
ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
ecf.set_segmentation_status(SegmentationStatus::MiddleSegment);
EXPECT_EQ(CreateStaticByteBuffer(0, 0b1100'0000),
BufferView(&ecf, sizeof(ecf)));
}
}
TEST(L2CAP_FrameHeaders_EnhancedControlFieldTest,
SetSegmentationStatusPreservesRequestSeqNum) {
EnhancedControlField ecf;
ecf.set_request_seq_num(EnhancedControlField::kMaxSeqNum);
ecf.set_segmentation_status(SegmentationStatus::Unsegmented);
EXPECT_EQ(EnhancedControlField::kMaxSeqNum, ecf.request_seq_num());
}
TEST(L2CAP_FrameHeaders_SimpleInformationFrameHeaderTest,
ReadsTxSequenceNumber) {
// See Core Spec, v5, Vol 3, Part A, Table 3.2, and Core Spec v5, Vol 3, Part
// A, Sec 8.3.
for (uint8_t seq_num = 0; seq_num < 64; ++seq_num) {
EXPECT_EQ(seq_num, CreateStaticByteBuffer(seq_num << 1, 0)
.As<SimpleInformationFrameHeader>()
.tx_seq());
}
}
TEST(L2CAP_FrameHeaders_SimpleInformationFrameHeaderTest,
IsConstructedProperly) {
constexpr uint8_t kTxSeq = 63;
SimpleInformationFrameHeader frame(kTxSeq);
// See Core Spec, v5, Vol 3, Part A, Table 3.2.
EXPECT_EQ(CreateStaticByteBuffer(0b111'1110, 0),
BufferView(&frame, sizeof(frame)));
}
TEST(L2CAP_FrameHeaders_SimpleInformationFrameHeaderTest,
SetSegmentationStatusPreservesTxSeq) {
constexpr uint8_t kTxSeq = 63;
SimpleInformationFrameHeader frame(kTxSeq);
frame.set_segmentation_status(SegmentationStatus::Unsegmented);
EXPECT_EQ(kTxSeq, frame.tx_seq());
}
TEST(L2CAP_FrameHeaders_SimpleStartOfSduFrameHeaderTest,
IsConstructedProperly) {
constexpr uint8_t kTxSeq = 63;
SimpleStartOfSduFrameHeader frame(kTxSeq);
// See Core Spec, v5, Vol 3, Part A, Table 3.2, and Figure 3.3.
EXPECT_EQ(CreateStaticByteBuffer(0b111'1110, 0b0100'0000, 0, 0),
BufferView(&frame, sizeof(frame)));
}
TEST(L2CAP_FrameHeaders_SimpleSupervisoryFrameTest, IsConstructedProperly) {
// See Core Spec, v5, Vol 3, Part A, Table 3.2.
{
SimpleSupervisoryFrame frame(SupervisoryFunction::ReceiverReady);
EXPECT_EQ(CreateStaticByteBuffer(0b0001, 0),
BufferView(&frame, sizeof(frame)));
}
{
SimpleSupervisoryFrame frame(SupervisoryFunction::Reject);
EXPECT_EQ(CreateStaticByteBuffer(0b0101, 0),
BufferView(&frame, sizeof(frame)));
}
{
SimpleSupervisoryFrame frame(SupervisoryFunction::ReceiverNotReady);
EXPECT_EQ(CreateStaticByteBuffer(0b1001, 0),
BufferView(&frame, sizeof(frame)));
}
{
SimpleSupervisoryFrame frame(SupervisoryFunction::SelectiveReject);
EXPECT_EQ(CreateStaticByteBuffer(0b1101, 0),
BufferView(&frame, sizeof(frame)));
}
}
TEST(L2CAP_FrameHeaders_SimpleSupervisoryFrameTest, IdentifiesPollRequest) {
// See Core Spec, v5, Vol 3, Part A, Table 3.2.
EXPECT_FALSE(CreateStaticByteBuffer(0b0'0001, 0)
.As<SimpleSupervisoryFrame>()
.is_poll_request());
EXPECT_TRUE(CreateStaticByteBuffer(0b1'0001, 0)
.As<SimpleSupervisoryFrame>()
.is_poll_request());
}
TEST(L2CAP_FrameHeaders_SimpleSupervisoryFrameTest, IdentifiesPollResponse) {
// See Core Spec, v5, Vol 3, Part A, Table 3.2.
EXPECT_FALSE(CreateStaticByteBuffer(0b0000'0001, 0)
.As<SimpleSupervisoryFrame>()
.is_poll_response());
EXPECT_TRUE(CreateStaticByteBuffer(0b1000'0001, 0)
.As<SimpleSupervisoryFrame>()
.is_poll_response());
}
TEST(L2CAP_FrameHeaders_SimpleSupervisoryFrameTest,
FunctionReadsSupervisoryFunction) {
// See Core Spec, v5, Vol 3, Part A, Table 3.2 and Table 3.5.
EXPECT_EQ(SupervisoryFunction::ReceiverReady,
CreateStaticByteBuffer(0b0001, 0)
.As<SimpleSupervisoryFrame>()
.function());
EXPECT_EQ(SupervisoryFunction::Reject, CreateStaticByteBuffer(0b0101, 0)
.As<SimpleSupervisoryFrame>()
.function());
EXPECT_EQ(SupervisoryFunction::ReceiverNotReady,
CreateStaticByteBuffer(0b1001, 0)
.As<SimpleSupervisoryFrame>()
.function());
EXPECT_EQ(SupervisoryFunction::SelectiveReject,
CreateStaticByteBuffer(0b1101, 0)
.As<SimpleSupervisoryFrame>()
.function());
}
TEST(L2CAP_FrameHeaders_SimpleSupervisoryFrameTest,
SetIsPollRequestSetsCorrectBit) {
SimpleSupervisoryFrame sframe(SupervisoryFunction::ReceiverReady);
sframe.set_is_poll_request();
// See Core Spec, v5, Vol 3, Part A, Table 3.2.
EXPECT_EQ(CreateStaticByteBuffer(0b1'0001, 0),
BufferView(&sframe, sizeof(sframe)));
}
TEST(L2CAP_FrameHeaders_SimpleSupervisoryFrameTest,
SetIsPollResponseSetsCorrectBit) {
SimpleSupervisoryFrame sframe(SupervisoryFunction::ReceiverReady);
sframe.set_is_poll_response();
// See Core Spec, v5, Vol 3, Part A, Table 3.2.
EXPECT_EQ(CreateStaticByteBuffer(0b1000'0001, 0),
BufferView(&sframe, sizeof(sframe)));
}
TEST(L2CAP_FrameHeaders_SimpleReceiverReadyFrameTest, IsConstructedProperly) {
SimpleReceiverReadyFrame frame;
// See Core Spec, v5, Vol 3, Part A, Table 3.2 and Table 3.5.
EXPECT_EQ(CreateStaticByteBuffer(0b0001, 0),
BufferView(&frame, sizeof(frame)));
}
} // namespace
} // namespace internal
} // namespace l2cap
} // namespace bt