Skip to content

Commit d623e40

Browse files
authored
BTP engine unit test (project-chip#32897)
* Port BTP engine test from OpenWeave project * Copyrights from origin project
1 parent f92178b commit d623e40

File tree

2 files changed

+182
-0
lines changed

2 files changed

+182
-0
lines changed

src/ble/tests/BUILD.gn

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ chip_test_suite("tests") {
2323
test_sources = [
2424
"TestBleErrorStr.cpp",
2525
"TestBleUUID.cpp",
26+
"TestBtpEngine.cpp",
2627
]
2728

2829
cflags = [ "-Wconversion" ]

src/ble/tests/TestBtpEngine.cpp

+181
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
/*
2+
*
3+
* Copyright (c) 2024 Project CHIP Authors
4+
* Copyright (c) 2018 Google LLC.
5+
* Copyright (c) 2018 Nest Labs, Inc.
6+
*
7+
* Licensed under the Apache License, Version 2.0 (the "License");
8+
* you may not use this file except in compliance with the License.
9+
* You may obtain a copy of the License at
10+
*
11+
* http://www.apache.org/licenses/LICENSE-2.0
12+
*
13+
* Unless required by applicable law or agreed to in writing, software
14+
* distributed under the License is distributed on an "AS IS" BASIS,
15+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
* See the License for the specific language governing permissions and
17+
* limitations under the License.
18+
*/
19+
20+
#include <cstdint>
21+
#include <numeric>
22+
23+
#include <ble/BleLayer.h>
24+
#include <ble/BtpEngine.h>
25+
#include <lib/support/CHIPMem.h>
26+
#include <lib/support/logging/CHIPLogging.h>
27+
28+
#include <gtest/gtest.h>
29+
30+
using namespace chip;
31+
using namespace chip::Ble;
32+
33+
namespace {
34+
35+
class TestBtpEngine : public ::testing::Test
36+
{
37+
public:
38+
static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); }
39+
static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); }
40+
41+
void SetUp()
42+
{
43+
ASSERT_EQ(mBtpEngine.Init(nullptr, false), CHIP_NO_ERROR);
44+
ChipLogDetail(Test, "### Initial BTP Engine State:");
45+
mBtpEngine.LogState();
46+
}
47+
48+
void TearDown()
49+
{
50+
ChipLogDetail(Test, "### Final BTP Engine State:");
51+
mBtpEngine.LogState();
52+
}
53+
54+
Ble::BtpEngine mBtpEngine;
55+
};
56+
57+
TEST_F(TestBtpEngine, HandleCharacteristicReceivedOnePacket)
58+
{
59+
constexpr uint8_t packetData0[] = {
60+
to_underlying(BtpEngine::HeaderFlags::kStartMessage) | to_underlying(BtpEngine::HeaderFlags::kEndMessage),
61+
0x01,
62+
0x01,
63+
0x00,
64+
0xff, // payload
65+
};
66+
67+
auto packet0 = System::PacketBufferHandle::NewWithData(packetData0, sizeof(packetData0));
68+
EXPECT_EQ(packet0->DataLength(), 5);
69+
70+
SequenceNumber_t receivedAck;
71+
bool didReceiveAck;
72+
EXPECT_EQ(mBtpEngine.HandleCharacteristicReceived(std::move(packet0), receivedAck, didReceiveAck), CHIP_NO_ERROR);
73+
EXPECT_EQ(mBtpEngine.RxState(), BtpEngine::kState_Complete);
74+
}
75+
76+
TEST_F(TestBtpEngine, HandleCharacteristicReceivedTwoPacket)
77+
{
78+
constexpr uint8_t packetData0[] = { to_underlying(BtpEngine::HeaderFlags::kStartMessage), 0x01, 0x02, 0x00, 0xfe };
79+
constexpr uint8_t packetData1[] = { to_underlying(BtpEngine::HeaderFlags::kEndMessage), 0x02, 0xff };
80+
81+
auto packet0 = System::PacketBufferHandle::NewWithData(packetData0, sizeof(packetData0));
82+
EXPECT_EQ(packet0->DataLength(), 5);
83+
84+
SequenceNumber_t receivedAck;
85+
bool didReceiveAck;
86+
EXPECT_EQ(mBtpEngine.HandleCharacteristicReceived(std::move(packet0), receivedAck, didReceiveAck), CHIP_NO_ERROR);
87+
EXPECT_EQ(mBtpEngine.RxState(), BtpEngine::kState_InProgress);
88+
89+
auto packet1 = System::PacketBufferHandle::NewWithData(packetData1, sizeof(packetData1));
90+
EXPECT_EQ(packet1->DataLength(), 3);
91+
92+
EXPECT_EQ(mBtpEngine.HandleCharacteristicReceived(std::move(packet1), receivedAck, didReceiveAck), CHIP_NO_ERROR);
93+
EXPECT_EQ(mBtpEngine.RxState(), BtpEngine::kState_Complete);
94+
}
95+
96+
TEST_F(TestBtpEngine, HandleCharacteristicReceivedThreePacket)
97+
{
98+
constexpr uint8_t packetData0[] = { to_underlying(BtpEngine::HeaderFlags::kStartMessage), 0x01, 0x03, 0x00, 0xfd };
99+
constexpr uint8_t packetData1[] = { to_underlying(BtpEngine::HeaderFlags::kContinueMessage), 0x02, 0xfe };
100+
constexpr uint8_t packetData2[] = { to_underlying(BtpEngine::HeaderFlags::kEndMessage), 0x03, 0xff };
101+
102+
auto packet0 = System::PacketBufferHandle::NewWithData(packetData0, sizeof(packetData0));
103+
EXPECT_EQ(packet0->DataLength(), 5);
104+
105+
SequenceNumber_t receivedAck;
106+
bool didReceiveAck;
107+
EXPECT_EQ(mBtpEngine.HandleCharacteristicReceived(std::move(packet0), receivedAck, didReceiveAck), CHIP_NO_ERROR);
108+
EXPECT_EQ(mBtpEngine.RxState(), BtpEngine::kState_InProgress);
109+
110+
auto packet1 = System::PacketBufferHandle::NewWithData(packetData1, sizeof(packetData1));
111+
EXPECT_EQ(packet1->DataLength(), 3);
112+
113+
EXPECT_EQ(mBtpEngine.HandleCharacteristicReceived(std::move(packet1), receivedAck, didReceiveAck), CHIP_NO_ERROR);
114+
EXPECT_EQ(mBtpEngine.RxState(), BtpEngine::kState_InProgress);
115+
116+
auto packet2 = System::PacketBufferHandle::NewWithData(packetData2, sizeof(packetData2));
117+
EXPECT_EQ(packet2->DataLength(), 3);
118+
119+
EXPECT_EQ(mBtpEngine.HandleCharacteristicReceived(std::move(packet2), receivedAck, didReceiveAck), CHIP_NO_ERROR);
120+
EXPECT_EQ(mBtpEngine.RxState(), BtpEngine::kState_Complete);
121+
}
122+
123+
TEST_F(TestBtpEngine, HandleCharacteristicSendOnePacket)
124+
{
125+
auto packet0 = System::PacketBufferHandle::New(10);
126+
packet0->SetDataLength(1);
127+
128+
auto data0 = packet0->Start();
129+
ASSERT_NE(data0, nullptr);
130+
std::iota(data0, data0 + 1, 0);
131+
132+
EXPECT_TRUE(mBtpEngine.HandleCharacteristicSend(packet0.Retain(), false));
133+
EXPECT_EQ(mBtpEngine.TxState(), BtpEngine::kState_Complete);
134+
EXPECT_EQ(packet0->DataLength(), 5);
135+
}
136+
137+
TEST_F(TestBtpEngine, HandleCharacteristicSendTwoPacket)
138+
{
139+
auto packet0 = System::PacketBufferHandle::New(30);
140+
packet0->SetDataLength(30);
141+
142+
auto data0 = packet0->Start();
143+
ASSERT_NE(data0, nullptr);
144+
std::iota(data0, data0 + 30, 0);
145+
146+
EXPECT_TRUE(mBtpEngine.HandleCharacteristicSend(packet0.Retain(), false));
147+
EXPECT_EQ(mBtpEngine.TxState(), BtpEngine::kState_InProgress);
148+
EXPECT_EQ(packet0->DataLength(), 20);
149+
150+
EXPECT_TRUE(mBtpEngine.HandleCharacteristicSend(nullptr, false));
151+
EXPECT_EQ(mBtpEngine.TxState(), BtpEngine::kState_Complete);
152+
EXPECT_EQ(packet0->DataLength(), 16);
153+
}
154+
155+
// Send 40-byte payload.
156+
// Packet0: 4 byte header + 16 byte payload
157+
// Packet1: 2 byte header + 18 byte payload
158+
// Packet2: 2 byte header + 6 byte payload
159+
TEST_F(TestBtpEngine, HandleCharacteristicSendThreePacket)
160+
{
161+
auto packet0 = System::PacketBufferHandle::New(40);
162+
packet0->SetDataLength(40);
163+
164+
auto data0 = packet0->Start();
165+
ASSERT_NE(data0, nullptr);
166+
std::iota(data0, data0 + 40, 0);
167+
168+
EXPECT_TRUE(mBtpEngine.HandleCharacteristicSend(packet0.Retain(), false));
169+
EXPECT_EQ(mBtpEngine.TxState(), BtpEngine::kState_InProgress);
170+
EXPECT_EQ(packet0->DataLength(), 20);
171+
172+
EXPECT_TRUE(mBtpEngine.HandleCharacteristicSend(nullptr, false));
173+
EXPECT_EQ(mBtpEngine.TxState(), BtpEngine::kState_InProgress);
174+
EXPECT_EQ(packet0->DataLength(), 20);
175+
176+
EXPECT_TRUE(mBtpEngine.HandleCharacteristicSend(nullptr, false));
177+
EXPECT_EQ(mBtpEngine.TxState(), BtpEngine::kState_Complete);
178+
EXPECT_EQ(packet0->DataLength(), 8);
179+
}
180+
181+
} // namespace

0 commit comments

Comments
 (0)