mirror of
https://gitlab.com/shadow_contributor/ntptun.git
synced 2026-10-03 03:46:50 +00:00
89 lines
3.1 KiB
C++
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()
|