mirror of
https://github.com/mikecarper/MeshCore.git
synced 2026-09-07 18:23:53 +00:00
Improve companion BLE delivery and idempotent remote CLI retries, make FPF7 persistence atomic with FPF6 migration, verify staged OTA data on resume, and clarify filter policy wildcard and BlackHole semantics.
124 lines
3.3 KiB
C++
124 lines
3.3 KiB
C++
#include <gtest/gtest.h>
|
|
|
|
#include <helpers/CompanionFrameQueue.h>
|
|
|
|
namespace {
|
|
|
|
struct TestFrame {
|
|
size_t len;
|
|
uint8_t buf[8];
|
|
};
|
|
|
|
static bool enqueue(TestFrame queue[], size_t& count, size_t capacity,
|
|
uint8_t code) {
|
|
return mesh::enqueueCompanionFrame(queue, count, capacity, &code, 1);
|
|
}
|
|
|
|
TEST(CompanionFrameQueue, PushTrafficLeavesOneResponseSlot) {
|
|
TestFrame queue[4] = {};
|
|
size_t count = 0;
|
|
|
|
EXPECT_TRUE(enqueue(queue, count, 4, 0x88));
|
|
EXPECT_TRUE(enqueue(queue, count, 4, 0x84));
|
|
EXPECT_TRUE(enqueue(queue, count, 4, 0x81));
|
|
EXPECT_FALSE(enqueue(queue, count, 4, 0x8A));
|
|
ASSERT_EQ(3U, count);
|
|
|
|
EXPECT_TRUE(enqueue(queue, count, 4, 0x00));
|
|
ASSERT_EQ(4U, count);
|
|
EXPECT_EQ(0x00, queue[0].buf[0]);
|
|
}
|
|
|
|
TEST(CompanionFrameQueue, RequiredPushEvictsBestEffortTraffic) {
|
|
TestFrame queue[4] = {
|
|
{1, {0x06}}, {1, {0x82}}, {1, {0x88}}, {1, {0x84}}};
|
|
size_t count = 4;
|
|
|
|
ASSERT_TRUE(enqueue(queue, count, 4, 0x8B));
|
|
ASSERT_EQ(4U, count);
|
|
EXPECT_EQ(0x06, queue[0].buf[0]);
|
|
EXPECT_EQ(0x82, queue[1].buf[0]);
|
|
EXPECT_EQ(0x8B, queue[2].buf[0]);
|
|
EXPECT_EQ(0x88, queue[3].buf[0]);
|
|
}
|
|
|
|
TEST(CompanionFrameQueue, RequiredPushesRemainFifoAheadOfLogs) {
|
|
TestFrame queue[6] = {};
|
|
size_t count = 0;
|
|
|
|
ASSERT_TRUE(enqueue(queue, count, 6, 0x88));
|
|
ASSERT_TRUE(enqueue(queue, count, 6, 0x82));
|
|
ASSERT_TRUE(enqueue(queue, count, 6, 0x84));
|
|
ASSERT_TRUE(enqueue(queue, count, 6, 0x85));
|
|
|
|
ASSERT_EQ(4U, count);
|
|
EXPECT_EQ(0x82, queue[0].buf[0]);
|
|
EXPECT_EQ(0x85, queue[1].buf[0]);
|
|
EXPECT_EQ(0x88, queue[2].buf[0]);
|
|
EXPECT_EQ(0x84, queue[3].buf[0]);
|
|
}
|
|
|
|
TEST(CompanionFrameQueue, MessageWaitingCoalesces) {
|
|
TestFrame queue[4] = {};
|
|
size_t count = 0;
|
|
|
|
ASSERT_TRUE(enqueue(queue, count, 4, 0x83));
|
|
ASSERT_TRUE(enqueue(queue, count, 4, 0x83));
|
|
EXPECT_EQ(1U, count);
|
|
}
|
|
|
|
TEST(CompanionFrameQueue, UnknownPushDefaultsToRequired) {
|
|
uint8_t unknown = 0xF1;
|
|
EXPECT_TRUE(mesh::companionFrameRequiresDelivery(&unknown, 1));
|
|
uint8_t packet_log = 0x88;
|
|
EXPECT_FALSE(mesh::companionFrameRequiresDelivery(&packet_log, 1));
|
|
}
|
|
|
|
TEST(CompanionFrameQueue, ResponsesRunBeforeQueuedPushesAndRemainFifo) {
|
|
TestFrame queue[5] = {};
|
|
size_t count = 0;
|
|
|
|
ASSERT_TRUE(enqueue(queue, count, 5, 0x88));
|
|
ASSERT_TRUE(enqueue(queue, count, 5, 0x06));
|
|
ASSERT_TRUE(enqueue(queue, count, 5, 0x84));
|
|
ASSERT_TRUE(enqueue(queue, count, 5, 0x00));
|
|
|
|
ASSERT_EQ(4U, count);
|
|
EXPECT_EQ(0x06, queue[0].buf[0]);
|
|
EXPECT_EQ(0x00, queue[1].buf[0]);
|
|
EXPECT_EQ(0x88, queue[2].buf[0]);
|
|
EXPECT_EQ(0x84, queue[3].buf[0]);
|
|
}
|
|
|
|
TEST(CompanionFrameQueue, ResponseEvictsNewestPushFromAnAlreadyFullQueue) {
|
|
TestFrame queue[4] = {
|
|
{1, {0x06}}, {1, {0x88}}, {1, {0x00}}, {1, {0x84}}};
|
|
size_t count = 4;
|
|
|
|
ASSERT_TRUE(enqueue(queue, count, 4, 0x01));
|
|
ASSERT_EQ(4U, count);
|
|
EXPECT_EQ(0x06, queue[0].buf[0]);
|
|
EXPECT_EQ(0x00, queue[1].buf[0]);
|
|
EXPECT_EQ(0x01, queue[2].buf[0]);
|
|
EXPECT_EQ(0x88, queue[3].buf[0]);
|
|
}
|
|
|
|
TEST(CompanionFrameQueue, ResponseDoesNotEvictAnotherResponse) {
|
|
TestFrame queue[3] = {
|
|
{1, {0x00}}, {1, {0x01}}, {1, {0x06}}};
|
|
size_t count = 3;
|
|
|
|
EXPECT_FALSE(enqueue(queue, count, 3, 0x02));
|
|
EXPECT_EQ(3U, count);
|
|
EXPECT_EQ(0x00, queue[0].buf[0]);
|
|
EXPECT_EQ(0x01, queue[1].buf[0]);
|
|
EXPECT_EQ(0x06, queue[2].buf[0]);
|
|
}
|
|
|
|
} // namespace
|
|
|
|
int main(int argc, char** argv) {
|
|
::testing::InitGoogleTest(&argc, argv);
|
|
return RUN_ALL_TESTS();
|
|
}
|