mirror of
https://github.com/logos-co/logos-liblogos.git
synced 2026-08-27 12:51:10 +00:00
70 lines
2.4 KiB
C++
70 lines
2.4 KiB
C++
#include <gtest/gtest.h>
|
|||
|
|
|
||
|
|
#include "logos_core/protocol_gate.h"
|
||
|
|
#include "logos_protocol.h"
|
||
|
|
|
||
|
|
// Gate tests (land with the gate, per the versioning design):
|
||
|
|
// (a) a module stamped with a different MAJOR is refused,
|
||
|
|
// (b) an unstamped (legacy) module is allowed permissively,
|
||
|
|
// (c) equal major / different minor loads silently.
|
||
|
|
// The stamp values are exercised against both a fixed major and the real
|
||
|
|
// LOGOS_PROTOCOL_VERSION_MAJOR the host links.
|
||
|
|
|
||
|
|
using LogosCore::evaluateProtocolGate;
|
||
|
|
using LogosCore::protocolVersionMajor;
|
||
|
|
using LogosCore::ProtocolGateDecision;
|
||
|
|
|
||
|
|
TEST(ProtocolGate, RefusesDifferentMajor)
|
||
|
|
{
|
||
|
|
const auto r = evaluateProtocolGate("2.0.0", 1);
|
||
|
|
EXPECT_EQ(r.decision, ProtocolGateDecision::Refuse);
|
||
|
|
EXPECT_EQ(r.moduleMajor, 2);
|
||
|
|
|
||
|
|
// Against the real host major: a deliberately bumped stamp is refused.
|
||
|
|
const int hostMajor = LOGOS_PROTOCOL_VERSION_MAJOR;
|
||
|
|
const std::string bumped = std::to_string(hostMajor + 1) + ".0.0";
|
||
|
|
EXPECT_EQ(evaluateProtocolGate(bumped, hostMajor).decision,
|
||
|
|
ProtocolGateDecision::Refuse);
|
||
|
|
}
|
||
|
|
|
||
|
|
TEST(ProtocolGate, MissingStampLoadsPermissively)
|
||
|
|
{
|
||
|
|
const auto r = evaluateProtocolGate("", LOGOS_PROTOCOL_VERSION_MAJOR);
|
||
|
|
EXPECT_EQ(r.decision, ProtocolGateDecision::AllowLegacy);
|
||
|
|
EXPECT_EQ(r.moduleMajor, -1);
|
||
|
|
}
|
||
|
|
|
||
|
|
TEST(ProtocolGate, UnparseableStampLoadsPermissively)
|
||
|
|
{
|
||
|
|
EXPECT_EQ(evaluateProtocolGate("garbage", 1).decision,
|
||
|
|
ProtocolGateDecision::AllowLegacy);
|
||
|
|
EXPECT_EQ(evaluateProtocolGate("-1.0.0", 1).decision,
|
||
|
|
ProtocolGateDecision::AllowLegacy);
|
||
|
|
}
|
||
|
|
|
||
|
|
TEST(ProtocolGate, EqualMajorDifferentMinorAllowsSilently)
|
||
|
|
{
|
||
|
|
const int hostMajor = LOGOS_PROTOCOL_VERSION_MAJOR;
|
||
|
|
const std::string newerMinor =
|
||
|
|
std::to_string(hostMajor) + ".99.7";
|
||
|
|
const auto r = evaluateProtocolGate(newerMinor, hostMajor);
|
||
|
|
EXPECT_EQ(r.decision, ProtocolGateDecision::Allow);
|
||
|
|
EXPECT_EQ(r.moduleMajor, hostMajor);
|
||
|
|
}
|
||
|
|
|
||
|
|
TEST(ProtocolGate, HostOwnVersionAllows)
|
||
|
|
{
|
||
|
|
EXPECT_EQ(evaluateProtocolGate(LOGOS_PROTOCOL_VERSION_STRING,
|
||
|
|
LOGOS_PROTOCOL_VERSION_MAJOR).decision,
|
||
|
|
ProtocolGateDecision::Allow);
|
||
|
|
}
|
||
|
|
|
||
|
|
TEST(ProtocolGate, MajorParser)
|
||
|
|
{
|
||
|
|
EXPECT_EQ(protocolVersionMajor("0.1.0"), 0);
|
||
|
|
EXPECT_EQ(protocolVersionMajor("12.3.4"), 12);
|
||
|
|
EXPECT_EQ(protocolVersionMajor("1"), 1);
|
||
|
|
EXPECT_EQ(protocolVersionMajor(""), -1);
|
||
|
|
EXPECT_EQ(protocolVersionMajor("x.y.z"), -1);
|
||
|
|
}
|