Mooncake/mooncake-transfer-engine/tests/common_test.cpp

285 lines
8.9 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <gtest/gtest.h>
#include <cstdint>
#include <optional>
#include <string>
#include "common.h"
namespace {
using namespace mooncake;
const uint16_t kDefaultPort = getDefaultHandshakePort();
//------------------------------------------------------------------------------
// parseFromString<T>
//------------------------------------------------------------------------------
TEST(ParseFromString, ValidUint16) {
auto result = parseFromString<uint16_t>("42");
ASSERT_TRUE(result.has_value());
EXPECT_EQ(*result, 42);
}
TEST(ParseFromString, InvalidAlpha) {
auto result = parseFromString<uint16_t>("forty-two");
EXPECT_FALSE(result.has_value());
}
TEST(ParseFromString, ValueOutOfRange) {
// 70000 exceeds std::numeric_limits<uint16_t>::max() (65535)
auto result = parseFromString<uint16_t>("70000");
EXPECT_FALSE(result.has_value());
}
//------------------------------------------------------------------------------
// getPortFromString
//------------------------------------------------------------------------------
TEST(GetPortFromString, ReturnsParsedPort) {
EXPECT_EQ(getPortFromString("8080", kDefaultPort), 8080);
}
TEST(GetPortFromString, FallsBackToDefaultOnInvalid) {
EXPECT_EQ(getPortFromString("not-a-number", kDefaultPort), kDefaultPort);
}
//------------------------------------------------------------------------------
// IPv6 helpers
//------------------------------------------------------------------------------
TEST(IsValidIpV6, RecognisesValidAddress) {
EXPECT_TRUE(isValidIpV6("2001:0db8:85a3:0000:0000:8a2e:0370:7334"));
}
TEST(IsValidIpV6, RejectsInvalidAddress) {
EXPECT_FALSE(isValidIpV6("not::an::ip"));
}
TEST(MaybeWrapIpV6, WrapsValidIp) {
const std::string addr = "2001:db8::1";
EXPECT_EQ(maybeWrapIpV6(addr), "[" + addr + "]");
}
TEST(MaybeWrapIpV6, LeavesInvalidUntouched) {
const std::string addr = "example.com";
EXPECT_EQ(maybeWrapIpV6(addr), addr);
}
//------------------------------------------------------------------------------
// parseHostNameWithPort
//------------------------------------------------------------------------------
TEST(ParseHostNameWithPort, BracketedIpv6WithPort) {
auto [host, port] = parseHostNameWithPort("[2001:db8::1]:1234");
EXPECT_EQ(host, "2001:db8::1");
EXPECT_EQ(port, 1234);
}
TEST(ParseHostNameWithPort, BracketedIpv6NoPort) {
auto [host, port] = parseHostNameWithPort("[2001:db8::1]");
EXPECT_EQ(host, "2001:db8::1");
EXPECT_EQ(port, kDefaultPort);
}
TEST(ParseHostNameWithPort, RawIpv6) {
auto [host, port] = parseHostNameWithPort("2001:db8::1");
EXPECT_EQ(host, "2001:db8::1");
EXPECT_EQ(port, kDefaultPort);
}
TEST(ParseHostNameWithPort, Ipv4WithPort) {
auto [host, port] = parseHostNameWithPort("8.8.8.8:4321");
EXPECT_EQ(host, "8.8.8.8");
EXPECT_EQ(port, 4321);
}
TEST(ParseHostNameWithPort, Ipv4WithoutPort) {
auto [host, port] = parseHostNameWithPort("8.8.8.8");
EXPECT_EQ(host, "8.8.8.8");
EXPECT_EQ(port, kDefaultPort);
}
TEST(ParseHostNameWithPort, HostWithPort) {
auto [host, port] = parseHostNameWithPort("example.com:4321");
EXPECT_EQ(host, "example.com");
EXPECT_EQ(port, 4321);
}
TEST(ParseHostNameWithPort, HostWithoutPort) {
auto [host, port] = parseHostNameWithPort("example.com");
EXPECT_EQ(host, "example.com");
EXPECT_EQ(port, kDefaultPort);
}
TEST(HostPortHelpers, DetectsExplicitPort) {
EXPECT_TRUE(hasExplicitPort("8.8.8.8:4321"));
EXPECT_TRUE(hasExplicitPort("example.com:4321"));
EXPECT_TRUE(hasExplicitPort("[2001:db8::1]:4321"));
EXPECT_FALSE(hasExplicitPort("2001:db8::1"));
EXPECT_FALSE(hasExplicitPort("[2001:db8::1]"));
}
TEST(HostPortHelpers, ExtractsHostWithoutPort) {
EXPECT_EQ(getHostNameWithoutPort("8.8.8.8:4321"), "8.8.8.8");
EXPECT_EQ(getHostNameWithoutPort("example.com:4321"), "example.com");
EXPECT_EQ(getHostNameWithoutPort("[2001:db8::1]:4321"), "2001:db8::1");
EXPECT_EQ(getHostNameWithoutPort("[2001:db8::1]"), "2001:db8::1");
EXPECT_EQ(getHostNameWithoutPort("2001:db8::1"), "2001:db8::1");
}
TEST(HostPortHelpers, BuildsBracketedIpv6Endpoint) {
EXPECT_EQ(buildHostNameWithPort("2001:db8::1", 4321), "[2001:db8::1]:4321");
EXPECT_EQ(buildHostNameWithPort("8.8.8.8", 4321), "8.8.8.8:4321");
}
//------------------------------------------------------------------------------
// parsePortAndDevice
//------------------------------------------------------------------------------
TEST(ParsePortAndDevice, PortOnly) {
int dev = -1;
EXPECT_EQ(parsePortAndDevice("8080", kDefaultPort, &dev), 8080);
EXPECT_EQ(dev, -1);
}
TEST(ParsePortAndDevice, PortAndDevice) {
int dev = -1;
EXPECT_EQ(parsePortAndDevice("9000:npu_2", kDefaultPort, &dev), 9000);
EXPECT_EQ(dev, 2);
}
TEST(ParsePortAndDevice, InvalidDeviceFormatKeepsDefault) {
int dev = -1;
EXPECT_EQ(parsePortAndDevice("9000:npu2", kDefaultPort, &dev), 9000);
EXPECT_EQ(dev, -1);
EXPECT_EQ(parsePortAndDevice("9000:_2", kDefaultPort, &dev), 9000);
EXPECT_EQ(dev, -1);
}
TEST(ParsePortAndDevice, InvalidDeviceIdSetsToZero) {
int dev = -1;
EXPECT_EQ(parsePortAndDevice("9000:npu_x", kDefaultPort, &dev), 9000);
EXPECT_EQ(dev, 0);
}
//------------------------------------------------------------------------------
// parseHostNameWithPortAscend
//------------------------------------------------------------------------------
TEST(ParseHostNameWithPortAscend, BracketedIpv6WithPort) {
int dev = -1;
auto [host, port] = parseHostNameWithPortAscend("[2001:db8::1]:1234", &dev);
EXPECT_EQ(host, "2001:db8::1");
EXPECT_EQ(port, 1234);
EXPECT_EQ(dev, -1);
}
TEST(ParseHostNameWithPortAscend, BracketedIpv6NoPort) {
int dev = -1;
auto [host, port] = parseHostNameWithPortAscend("[2001:db8::1]", &dev);
EXPECT_EQ(host, "2001:db8::1");
EXPECT_EQ(port, kDefaultPort);
EXPECT_EQ(dev, -1);
}
TEST(ParseHostNameWithPortAscend, RawIpv6) {
int dev = -1;
auto [host, port] = parseHostNameWithPortAscend("2001:db8::1", &dev);
EXPECT_EQ(host, "2001:db8::1");
EXPECT_EQ(port, kDefaultPort);
EXPECT_EQ(dev, -1);
}
TEST(ParseHostNameWithPortAscend, Ipv4WithPort) {
int dev = -1;
auto [host, port] = parseHostNameWithPortAscend("8.8.8.8:4321", &dev);
EXPECT_EQ(host, "8.8.8.8");
EXPECT_EQ(port, 4321);
EXPECT_EQ(dev, -1);
}
TEST(ParseHostNameWithPortAscend, Ipv4WithoutPort) {
int dev = -1;
auto [host, port] = parseHostNameWithPortAscend("8.8.8.8", &dev);
EXPECT_EQ(host, "8.8.8.8");
EXPECT_EQ(port, kDefaultPort);
EXPECT_EQ(dev, -1);
}
TEST(ParseHostNameWithPortAscend, HostWithPort) {
int dev = -1;
auto [host, port] = parseHostNameWithPortAscend("example.com:4321", &dev);
EXPECT_EQ(host, "example.com");
EXPECT_EQ(port, 4321);
EXPECT_EQ(dev, -1);
}
TEST(ParseHostNameWithPortAscend, HostWithoutPort) {
int dev = -1;
auto [host, port] = parseHostNameWithPortAscend("example.com", &dev);
EXPECT_EQ(host, "example.com");
EXPECT_EQ(port, kDefaultPort);
EXPECT_EQ(dev, -1);
}
TEST(ParseHostNameWithPortAscend, BracketedIpv6PortDevice) {
int dev = -1;
auto [host, port] =
parseHostNameWithPortAscend("[2001:db8::1]:8080:npu_3", &dev);
EXPECT_EQ(host, "2001:db8::1");
EXPECT_EQ(port, 8080);
EXPECT_EQ(dev, 3);
}
TEST(ParseHostNameWithPortAscend, Ipv4PortDevice) {
int dev = -1;
auto [host, port] = parseHostNameWithPortAscend("8.8.8.8:8080:npu_1", &dev);
EXPECT_EQ(host, "8.8.8.8");
EXPECT_EQ(port, 8080);
EXPECT_EQ(dev, 1);
}
TEST(ParseHostNameWithPortAscend, Ipv4PortInvalidDevice) {
int dev = -1;
auto [host, port] = parseHostNameWithPortAscend("8.8.8.8:8080:npu1", &dev);
EXPECT_EQ(host, "8.8.8.8");
EXPECT_EQ(port, 8080);
EXPECT_EQ(dev, -1);
}
TEST(ParseHostNameWithPortAscend, HostPortDevice) {
int dev = -1;
auto [host, port] =
parseHostNameWithPortAscend("example.com:8080:npu_1", &dev);
EXPECT_EQ(host, "example.com");
EXPECT_EQ(port, 8080);
EXPECT_EQ(dev, 1);
}
//------------------------------------------------------------------------------
// getHandshakeMaxLength
//------------------------------------------------------------------------------
// Note: Since getHandshakeMaxLength() uses static initialization that happens
// once per process, we only test that it returns a valid value (>= 1MB).
// Environment variable tests would require separate test processes.
TEST(GetHandshakeMaxLengthTest, ReturnsValidValue) {
size_t max_length = getHandshakeMaxLength();
// Should be at least the default/minimum (1MB) and at most the maximum
// (128MB)
EXPECT_GE(max_length, kDefaultHandshakeMaxLength);
EXPECT_LE(max_length, kMaxHandshakeMaxLength);
}
TEST(GetHandshakeMaxLengthTest, ReturnsSameValueOnMultipleCalls) {
// Static initialization ensures consistent value
size_t first_call = getHandshakeMaxLength();
size_t second_call = getHandshakeMaxLength();
EXPECT_EQ(first_call, second_call);
}
} // namespace