Unit tests and fixes for SockAddr::fromString()

pull/1257/head
Stephen Shelton 4 years ago
parent 0b54087689
commit e944bcb28a
No known key found for this signature in database
GPG Key ID: EE4BADACCE8B631C

@ -38,7 +38,8 @@ namespace llarp
SockAddr::SockAddr(std::string_view addr)
{
throw std::runtime_error("FIXME");
init();
fromString(addr);
}
SockAddr::SockAddr(const SockAddr&)
@ -97,8 +98,11 @@ namespace llarp
auto byteStr = ipSplits[i];
auto result = std::from_chars(byteStr.data(), byteStr.data() + byteStr.size(), ipBytes[i]);
if (result.ec == std::errc::invalid_argument)
if (result.ec != std::errc())
throw std::runtime_error(stringify(str, " contains invalid number"));
if (result.ptr != (byteStr.data() + byteStr.size()))
throw std::runtime_error(stringify(str, " contains non-numeric values"));
}
// attempt port before setting IPv4 bytes
@ -108,9 +112,12 @@ namespace llarp
auto portStr = splits[1];
auto result = std::from_chars(portStr.data(), portStr.data() + portStr.size(), port);
if (result.ec == std::errc::invalid_argument)
if (result.ec != std::errc())
throw std::runtime_error(stringify(str, " contains invalid port"));
if (result.ptr != (portStr.data() + portStr.size()))
throw std::runtime_error(stringify(str, " contains junk after port"));
setPort(port);
}
@ -130,7 +137,7 @@ namespace llarp
uint8_t* ip6 = m_addr.sin6_addr.s6_addr;
// ensure SIIT
if (not ip6[10] == 0xff or not ip6[11])
if (ip6[10] != 0xff or ip6[11] != 0xff)
throw std::runtime_error("Only SIIT address supported");
constexpr auto MaxIPv4PlusPortStringSize = 22;
@ -147,7 +154,7 @@ namespace llarp
str.append(std::to_string(ip6[15]));
str.append(1, ':');
str.append(std::to_string(m_addr.sin6_port));
str.append(std::to_string(getPort()));
return str;
}

@ -38,4 +38,44 @@ TEST_CASE("SockAddr fromString", "[SockAddr]")
llarp::SockAddr addr;
CHECK_NOTHROW(addr.fromString("1.2.3.4"));
CHECK(addr.toString() == "1.2.3.4:0");
CHECK(llarp::SockAddr("1.3.5.7").toString() == "1.3.5.7:0");
CHECK(llarp::SockAddr("0.0.0.0").toString() == "0.0.0.0:0");
CHECK(llarp::SockAddr("0.0.0.0:0").toString() == "0.0.0.0:0");
CHECK(llarp::SockAddr("255.255.255.255").toString() == "255.255.255.255:0");
CHECK(llarp::SockAddr("255.255.255.255:255").toString() == "255.255.255.255:255");
CHECK(llarp::SockAddr("255.255.255.255:65535").toString() == "255.255.255.255:65535");
CHECK_THROWS_WITH(llarp::SockAddr("abcd"), "abcd is not a valid IPv4 address");
CHECK_THROWS_WITH(llarp::SockAddr("0.0.0.0:foo"), "0.0.0.0:foo contains invalid port");
CHECK_THROWS_WITH(llarp::SockAddr("256.257.258.259"), "256.257.258.259 contains invalid number");
CHECK_THROWS_WITH(llarp::SockAddr("-1.-2.-3.-4"), "-1.-2.-3.-4 contains invalid number");
CHECK_THROWS_WITH(llarp::SockAddr("1.2.3"), "1.2.3 is not a valid IPv4 address");
CHECK_THROWS_WITH(llarp::SockAddr("1.2.3."), "1.2.3. is not a valid IPv4 address");
CHECK_THROWS_WITH(llarp::SockAddr(".1.2.3"), ".1.2.3 is not a valid IPv4 address");
CHECK_THROWS_WITH(llarp::SockAddr("1.2.3.4.5"), "1.2.3.4.5 is not a valid IPv4 address");
CHECK_THROWS_WITH(llarp::SockAddr("1.2.3. "), "1.2.3. contains invalid number");
CHECK_THROWS_WITH(llarp::SockAddr("1a.2b.3c.4z"), "1a.2b.3c.4z contains non-numeric values");
// TODO: there's no reason this couldn't be supported
CHECK_THROWS_WITH(
llarp::SockAddr("0xFF.0xFF.0xFF.0xFF"), "0xFF.0xFF.0xFF.0xFF contains non-numeric values");
CHECK_THROWS_WITH(llarp::SockAddr(""), "cannot construct IPv4 from empty string");
CHECK_THROWS_WITH(llarp::SockAddr(" "), " is not a valid IPv4 address");
CHECK_THROWS_WITH(llarp::SockAddr("1.2.3.4:65536"), "1.2.3.4:65536 contains invalid port");
CHECK_THROWS_WITH(llarp::SockAddr("1.2.3.4:1a"), "1.2.3.4:1a contains junk after port");
}

Loading…
Cancel
Save