Add a test and fix the code

This commit is contained in:
Alexey Milovidov 2021-05-21 08:17:54 +03:00
parent b553c5a117
commit 87a7133659
2 changed files with 29 additions and 11 deletions

View File

@ -1,6 +1,7 @@
#include <Common/isLocalAddress.h>
#include <ifaddrs.h>
#include <array>
#include <cstring>
#include <optional>
#include <common/types.h>
@ -95,17 +96,13 @@ bool isLocalAddress(const Poco::Net::IPAddress & address)
{
if (address.family() == Poco::Net::AddressFamily::IPv4)
{
union
{
UInt32 word;
unsigned char digits[4];
} digits_union;
using Digits = std::array<UInt8, 4>;
Digits digits = unalignedLoad<Digits>(address.addr()); /// The address is located in memory in big endian form.
digits_union.word = ntohl(unalignedLoad<UInt32>(address.addr()));
if (digits_union.digits[0] == 127
&& digits_union.digits[1] <= 1
&& digits_union.digits[2] <= 1
&& digits_union.digits[3] <= 1)
if (digits[0] == 127
&& digits[1] <= 1
&& digits[2] <= 1
&& digits[3] <= 1)
{
return true;
}

View File

@ -11,9 +11,30 @@ TEST(LocalAddress, SmokeTest)
std::string address_str;
DB::readString(address_str, cmd->out);
cmd->wait();
std::cerr << "Got Address:" << address_str << std::endl;
std::cerr << "Got Address: " << address_str << std::endl;
Poco::Net::IPAddress address(address_str);
EXPECT_TRUE(DB::isLocalAddress(address));
}
TEST(LocalAddress, Localhost)
{
EXPECT_TRUE(DB::isLocalAddress(Poco::Net::IPAddress{"127.0.0.1"}));
EXPECT_TRUE(DB::isLocalAddress(Poco::Net::IPAddress{"127.0.1.1"}));
EXPECT_TRUE(DB::isLocalAddress(Poco::Net::IPAddress{"127.1.1.1"}));
EXPECT_TRUE(DB::isLocalAddress(Poco::Net::IPAddress{"127.1.0.1"}));
EXPECT_TRUE(DB::isLocalAddress(Poco::Net::IPAddress{"127.1.0.0"}));
EXPECT_TRUE(DB::isLocalAddress(Poco::Net::IPAddress{"::1"}));
/// Make sure we don't mess with the byte order.
EXPECT_FALSE(DB::isLocalAddress(Poco::Net::IPAddress{"1.0.0.127"}));
EXPECT_FALSE(DB::isLocalAddress(Poco::Net::IPAddress{"1.1.1.127"}));
EXPECT_FALSE(DB::isLocalAddress(Poco::Net::IPAddress{"0.0.0.0"}));
EXPECT_FALSE(DB::isLocalAddress(Poco::Net::IPAddress{"::"}));
EXPECT_FALSE(DB::isLocalAddress(Poco::Net::IPAddress{"::2"}));
/// The the comment in the implementation of isLocalAddress.
EXPECT_FALSE(DB::isLocalAddress(Poco::Net::IPAddress{"127.0.0.2"}));
}