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).
118 lines
3.2 KiB
C++
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);
|
|
}
|