Files
MicrOBU/microbu-esp32c5/external/vanetza-idf/vanetza/geonet/tests/packet_buffer.cpp
T
Ashin Walpola 0e9525162d Keep the colleague's microbu-esp32c5 tree in this repository
obu-firmware builds against vanetza-idf from microbu-esp32c5/external, but
that tree was gitignored, so a clone of this repository could not build the
firmware it ships. It is now committed here as ordinary files in its own
folder, microbu-esp32c5/: the colleague's commit cf4b99f plus the V2X2MAP
bridge's signature verification (--trust) used on the bench. Nothing is
fetched from or pushed to the colleague's repository; this repository and
its remotes carry everything. The folder's own .gitignore keeps build output,
downloaded components and private key material out, as it did there; the
committed file set is identical to that repository's tracked files.

The ESP32-C5 is still flashed from obu-firmware/, which only takes
vanetza-idf from microbu-esp32c5/, so the two stay separate folders.
FLASHING.md says how to take a newer version of the colleague's tree (copy
it over the folder, rebuild, test, commit).
2026-09-23 17:46:40 +02:00

118 lines
3.2 KiB
C++

#include <gtest/gtest.h>
#include <vanetza/geonet/basic_header.hpp>
#include <vanetza/geonet/extended_pdu.hpp>
#include <vanetza/geonet/packet_buffer.hpp>
#include <vanetza/geonet/shb_header.hpp>
#include <chrono>
using std::chrono::seconds;
using std::chrono::milliseconds;
using namespace vanetza;
using namespace vanetza::geonet;
struct FakePacket
{
FakePacket(unsigned id) : id(id) {}
const unsigned id = 0;
std::size_t length = 0;
Clock::duration lifetime = Clock::duration::zero();
};
class FakeData : public packet_buffer::Data
{
public:
FakeData(unsigned id, std::list<FakePacket>& flushed) : m_flushed(flushed), m_packet(id) {}
FakePacket& packet() { return m_packet; }
std::size_t length() const override { return m_packet.length; }
Clock::duration reduce_lifetime(Clock::duration d) override { m_packet.lifetime -= d; return m_packet.lifetime; }
void flush() override { m_flushed.push_back(m_packet); }
private:
std::list<FakePacket>& m_flushed;
FakePacket m_packet;
};
class PacketBufferTest : public ::testing::Test
{
protected:
void SetUp() override
{
counter = 0;
now = Clock::time_point { std::chrono::minutes(1234) };
}
std::unique_ptr<FakeData> create_valid_length(std::size_t length)
{
std::unique_ptr<FakeData> data { new FakeData(++counter, flushed) };
data->packet().length = length;
return data;
}
std::unique_ptr<FakeData> create_valid_lifetime(Clock::duration d)
{
std::unique_ptr<FakeData> data { new FakeData(++counter, flushed) };
data->packet().length = 100;
data->packet().lifetime = d;
return data;
}
Clock::time_point now;
unsigned counter;
std::list<FakePacket> flushed;
};
TEST_F(PacketBufferTest, push)
{
PacketBuffer buffer(8192);
EXPECT_TRUE(buffer.push(create_valid_length(5000), now));
EXPECT_TRUE(buffer.push(create_valid_length(5000), now));
EXPECT_FALSE(buffer.push(create_valid_length(8200), now));
}
TEST_F(PacketBufferTest, flush_head_drop)
{
PacketBuffer buffer(8192);
buffer.push(create_valid_length(2000), now);
buffer.push(create_valid_length(3000), now);
buffer.push(create_valid_length(4000), now);
EXPECT_EQ(0, flushed.size());
buffer.flush(now);
ASSERT_EQ(2, flushed.size());
EXPECT_EQ(2, flushed.front().id);
EXPECT_EQ(3, flushed.back().id);
// buffer shall be empty now (flushed list remains empty)
flushed.clear();
buffer.flush(now);
EXPECT_EQ(0, flushed.size());
}
TEST_F(PacketBufferTest, flush_expired)
{
PacketBuffer buffer(8192);
buffer.push(create_valid_lifetime(milliseconds(3200)), now);
now += seconds(3);
buffer.push(create_valid_lifetime(milliseconds(10300)), now);
buffer.push(create_valid_lifetime(seconds(1)), now);
now += seconds(2);
buffer.flush(now);
ASSERT_EQ(1, flushed.size());
EXPECT_EQ(2, flushed.front().id);
}
TEST_F(PacketBufferTest, update_lifetime)
{
PacketBuffer buffer(8192);
buffer.push(create_valid_lifetime(milliseconds(2300)), now);
now += milliseconds(150);
buffer.flush(now);
ASSERT_EQ(1, flushed.size());
EXPECT_EQ(milliseconds(2150), flushed.front().lifetime);
}