blob: 84d5880ee3911e3fdd03791b8f950cc2805220dd [file] [log] [blame]
// Copyright 2023 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
#include "pw_bluetooth_sapphire/internal/host/l2cap/fcs.h"
#include "pw_unit_test/framework.h"
namespace bt::l2cap {
namespace {
constexpr const char kTestData[] = "🍜🥯🍕🥖🍞🍩"; // Carb-heavy dataset
const BufferView kTestBuffer = BufferView(kTestData, sizeof(kTestData) - 1);
TEST(FcsTest, EmptyBufferProducesInitialValue) {
EXPECT_EQ(0, ComputeFcs(BufferView()).fcs);
EXPECT_EQ(5, ComputeFcs(BufferView(), FrameCheckSequence{5}).fcs);
}
TEST(FcsTest, FcsOfSimpleValues) {
// By inspection, the FCS has value zero if all inputs are 0.
EXPECT_EQ(0, ComputeFcs(StaticByteBuffer(0).view()).fcs);
// If only the "last" bit (i.e. MSb of the message) is set, then the FCS
// should equal the generator polynomial because there's exactly one round of
// feedback.
EXPECT_EQ(0b1010'0000'0000'0001,
ComputeFcs(StaticByteBuffer(0b1000'0000).view()).fcs);
}
TEST(FcsTest, Example1) {
// Core Spec v5.0, Vol 3, Part A, Section 3.3.5, Example 1.
const StaticByteBuffer kExample1Data(0x0E,
0x00,
0x40,
0x00,
0x02,
0x00,
0x00,
0x01,
0x02,
0x03,
0x04,
0x05,
0x06,
0x07,
0x08,
0x09);
EXPECT_EQ(0x6138, ComputeFcs(kExample1Data.view()).fcs);
}
TEST(FcsTest, Example2) {
// Core Spec v5.0, Vol 3, Part A, Section 3.3.5, Example 2.
const StaticByteBuffer kExample2Data(0x04, 0x00, 0x40, 0x00, 0x01, 0x01);
EXPECT_EQ(0x14D4, ComputeFcs(kExample2Data.view()).fcs);
}
TEST(FcsTest, FcsOfSlicesSameAsFcsOfWhole) {
const FrameCheckSequence whole_fcs = ComputeFcs(kTestBuffer);
const auto slice0 = kTestBuffer.view(0, 4);
const auto slice1 = kTestBuffer.view(slice0.size());
const FrameCheckSequence sliced_fcs = ComputeFcs(slice1, ComputeFcs(slice0));
EXPECT_EQ(whole_fcs.fcs, sliced_fcs.fcs);
}
} // namespace
} // namespace bt::l2cap