ntptun/tests/test_ntp.cpp
2026-07-14 20:46:28 +02:00

89 lines
3.1 KiB
C++

#include "ntptun/Ntp.hpp"
#include "ntptun/Bytes.hpp"
#include "TestUtil.hpp"
#include <array>
using namespace ntptun;
void run_tests() {
// --- Header serialize / parse round trip --------------------------------
{
NtpHeader h;
h.set_li_vn_mode(0, 4, kNtpModeClient);
h.stratum = 3;
h.poll = 6;
h.precision = -20;
h.root_delay = 0x00010002u;
h.root_dispersion = 0x00030004u;
h.reference_id = 0x7f000001u;
h.reference_ts = 0x1111111122222222ULL;
h.origin_ts = 0x3333333344444444ULL;
h.receive_ts = 0x5555555566666666ULL;
h.transmit_ts = 0x7777777788888888ULL;
std::array<Byte, kNtpHeaderSize> raw{};
serialize_ntp_header(h, raw.data());
const auto parsed = parse_ntp_header(ByteSpan(raw.data(), raw.size()));
CHECK(parsed.has_value());
CHECK_EQ(parsed->version(), static_cast<std::uint8_t>(4));
CHECK_EQ(parsed->mode(), kNtpModeClient);
CHECK_EQ(parsed->stratum, static_cast<std::uint8_t>(3));
CHECK_EQ(parsed->precision, static_cast<std::int8_t>(-20));
CHECK_EQ(parsed->reference_id, 0x7f000001u);
CHECK_EQ(parsed->origin_ts, 0x3333333344444444ULL);
CHECK_EQ(parsed->transmit_ts, 0x7777777788888888ULL);
}
// --- Too-short buffers are rejected -------------------------------------
{
std::array<Byte, 10> tiny{};
CHECK(!parse_ntp_header(ByteSpan(tiny.data(), tiny.size())).has_value());
}
// --- build_packet_with_extension + parse_ntp_extensions -----------------
{
NtpHeader h;
h.set_li_vn_mode(0, 4, kNtpModeServer);
h.transmit_ts = 0xABCDEF0123456789ULL;
const ByteVector value = {0xDE, 0xAD, 0xBE, 0xEF, 0x00, 0x11, 0x22, 0x33};
const std::uint16_t ext_type = 0x0F4E;
const ByteVector packet = build_packet_with_extension(h, ext_type, value);
// 48 header + 4 TL header + 8 value.
CHECK_EQ(packet.size(), static_cast<std::size_t>(48 + 4 + 8));
std::vector<NtpExtension> exts;
CHECK(parse_ntp_extensions(ByteSpan(packet), exts));
CHECK_EQ(exts.size(), static_cast<std::size_t>(1));
CHECK_EQ(exts[0].type, ext_type);
CHECK_EQ(exts[0].value.size(), value.size());
bool same = true;
for (std::size_t i = 0; i < value.size(); ++i) {
if (exts[0].value[i] != value[i]) same = false;
}
CHECK(same);
}
// --- A bare 48-byte packet has zero extensions --------------------------
{
NtpHeader h;
h.set_li_vn_mode(0, 4, kNtpModeClient);
std::array<Byte, kNtpHeaderSize> raw{};
serialize_ntp_header(h, raw.data());
std::vector<NtpExtension> exts;
CHECK(parse_ntp_extensions(ByteSpan(raw.data(), raw.size()), exts));
CHECK(exts.empty());
}
// --- A misaligned trailing region is not a clean TLV sequence -----------
{
std::array<Byte, kNtpHeaderSize + 3> raw{};
std::vector<NtpExtension> exts;
CHECK(!parse_ntp_extensions(ByteSpan(raw.data(), raw.size()), exts));
}
}
TEST_MAIN()