1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project 3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License"); 5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License. 6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at 7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// http://www.apache.org/licenses/LICENSE-2.0 9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software 11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS, 12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and 14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License. 15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 161d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 17cddd2d09878704128d35ddfeec862109b7d7fdc9Alex Deymo#include "shill/net/ip_address.h" 18cddd2d09878704128d35ddfeec862109b7d7fdc9Alex Deymo 191d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart#include <gtest/gtest.h> 201d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 211d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart#include <arpa/inet.h> 221d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 238d6b59704591ba9fad57751858835dc332dbdd37Peter Qiu#include "shill/net/byte_string.h" 241d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 25188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewartusing std::string; 261d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartusing testing::Test; 271d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 281d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartnamespace shill { 291d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 301d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartnamespace { 311d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartconst char kV4String1[] = "192.168.10.1"; 321d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartconst unsigned char kV4Address1[] = { 192, 168, 10, 1 }; 331d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartconst char kV4String2[] = "192.168.10"; 341d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartconst unsigned char kV4Address2[] = { 192, 168, 10 }; 351d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartconst char kV6String1[] = "fe80::1aa9:5ff:7ebf:14c5"; 361d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartconst unsigned char kV6Address1[] = { 0xfe, 0x80, 0x00, 0x00, 371d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 0x00, 0x00, 0x00, 0x00, 381d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 0x1a, 0xa9, 0x05, 0xff, 391d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 0x7e, 0xbf, 0x14, 0xc5 }; 401d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartconst char kV6String2[] = "1980:0:1000:1b02:1aa9:5ff:7ebf"; 411d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartconst unsigned char kV6Address2[] = { 0x19, 0x80, 0x00, 0x00, 421d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 0x10, 0x00, 0x1b, 0x02, 431d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 0x1a, 0xa9, 0x05, 0xff, 441d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 0x7e, 0xbf }; 458a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko} // namespace 461d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 471d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewartclass IPAddressTest : public Test { 481d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart protected: 491d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart void TestAddress(IPAddress::Family family, 50e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const string& good_string, 51e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const ByteString& good_bytes, 52e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const string& bad_string, 53e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const ByteString& bad_bytes) { 541d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart IPAddress good_addr(family); 551d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 561d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_TRUE(good_addr.SetAddressFromString(good_string)); 571d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_EQ(IPAddress::GetAddressLength(family), good_addr.GetLength()); 581d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_EQ(family, good_addr.family()); 591d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_FALSE(good_addr.IsDefault()); 601d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_EQ(0, memcmp(good_addr.GetConstData(), good_bytes.GetConstData(), 611d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart good_bytes.GetLength())); 621d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_TRUE(good_addr.address().Equals(good_bytes)); 63188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewart string address_string; 642c15d2c7ae814d95673ea48ec8f4eb582ef3652emukesh agrawal EXPECT_TRUE(good_addr.IntoString(&address_string)); 65188a84a6f75dcadb972bc33bafa00c6ba7f3bbd6Paul Stewart EXPECT_EQ(good_string, address_string); 661d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 671d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart IPAddress good_addr_from_bytes(family, good_bytes); 681d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_TRUE(good_addr.Equals(good_addr_from_bytes)); 691d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 70a962d9d10b823805a6c57e545d31eb333ccf4482Samuel Tan IPAddress good_addr_from_string(good_string); 71a962d9d10b823805a6c57e545d31eb333ccf4482Samuel Tan EXPECT_EQ(family, good_addr_from_string.family()); 72a962d9d10b823805a6c57e545d31eb333ccf4482Samuel Tan 731d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart IPAddress bad_addr(family); 741d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_FALSE(bad_addr.SetAddressFromString(bad_string)); 751d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_FALSE(good_addr.Equals(bad_addr)); 761d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 771d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_FALSE(bad_addr.IsValid()); 781d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 791d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart IPAddress bad_addr_from_bytes(family, bad_bytes); 801d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_EQ(family, bad_addr_from_bytes.family()); 811d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_FALSE(bad_addr_from_bytes.IsValid()); 821d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 83a962d9d10b823805a6c57e545d31eb333ccf4482Samuel Tan IPAddress bad_addr_from_string(bad_string); 84a962d9d10b823805a6c57e545d31eb333ccf4482Samuel Tan EXPECT_EQ(IPAddress::kFamilyUnknown, bad_addr_from_string.family()); 85a962d9d10b823805a6c57e545d31eb333ccf4482Samuel Tan 861d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_FALSE(bad_addr.Equals(bad_addr_from_bytes)); 872c15d2c7ae814d95673ea48ec8f4eb582ef3652emukesh agrawal EXPECT_FALSE(bad_addr.IntoString(&address_string)); 88b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant 89b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant sockaddr_storage storage = {}; 90b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant auto addr = reinterpret_cast<sockaddr*>(&storage); 91b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant addr->sa_family = family; 92b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant ssize_t addr_size; 93b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant if (family == IPAddress::kFamilyIPv6) { 94b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant auto sin6 = reinterpret_cast<sockaddr_in6*>(addr); 95b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant inet_pton(AF_INET6, good_string.c_str(), &sin6->sin6_addr.s6_addr); 96b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant addr_size = sizeof(sockaddr_in6); 97b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant } else { 98b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant auto sin = reinterpret_cast<sockaddr_in*>(addr); 99b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant inet_pton(AF_INET, good_string.c_str(), &sin->sin_addr.s_addr); 100b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant addr_size = sizeof(sockaddr_in); 101b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant } 102b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant IPAddress from_short_sockaddr(addr, addr_size - 1); 103b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant EXPECT_FALSE(from_short_sockaddr.IsValid()); 104b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant IPAddress from_sockaddr(addr, addr_size); 105b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant EXPECT_TRUE(from_sockaddr.IsValid()); 106b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant EXPECT_EQ(family, from_sockaddr.family()); 107b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant EXPECT_TRUE(from_sockaddr.IntoString(&address_string)); 108b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant EXPECT_EQ(good_string, address_string); 109b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant 110b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant sockaddr_storage storage_empty = {}; 111b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant sockaddr_storage storage2 = {}; 112b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant auto addr2 = reinterpret_cast<sockaddr*>(&storage2); 113b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant EXPECT_FALSE(from_short_sockaddr.IntoSockAddr(addr2, addr_size)); 114b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant EXPECT_EQ(0, memcmp(&storage2, &storage_empty, sizeof(storage2))); 115b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant EXPECT_FALSE(from_sockaddr.IntoSockAddr(addr2, addr_size - 1)); 116b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant EXPECT_EQ(0, memcmp(&storage2, &storage_empty, sizeof(storage2))); 117b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant EXPECT_TRUE(from_sockaddr.IntoSockAddr(addr2, addr_size)); 118b3953b8fa428c46b48598396d2a8270a85934f72Christopher Grant EXPECT_EQ(0, memcmp(&storage2, &storage, sizeof(storage2))); 1191d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart } 1201d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart}; 1211d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 1221d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul StewartTEST_F(IPAddressTest, Statics) { 1237355ce1937c504d836a303ac809bd436272212b3Paul Stewart EXPECT_EQ(4, IPAddress::GetAddressLength(IPAddress::kFamilyIPv4)); 1247355ce1937c504d836a303ac809bd436272212b3Paul Stewart EXPECT_EQ(16, IPAddress::GetAddressLength(IPAddress::kFamilyIPv6)); 1251d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 12614c29ec4815e8ecda47b7ce5efdaa444580e20ceDarin Petkov EXPECT_EQ(0, IPAddress::GetPrefixLengthFromMask(IPAddress::kFamilyIPv4, 12714c29ec4815e8ecda47b7ce5efdaa444580e20ceDarin Petkov "0.0.0.0")); 12814c29ec4815e8ecda47b7ce5efdaa444580e20ceDarin Petkov EXPECT_EQ(20, IPAddress::GetPrefixLengthFromMask(IPAddress::kFamilyIPv4, 12914c29ec4815e8ecda47b7ce5efdaa444580e20ceDarin Petkov "255.255.240.0")); 13014c29ec4815e8ecda47b7ce5efdaa444580e20ceDarin Petkov EXPECT_EQ(32, IPAddress::GetPrefixLengthFromMask(IPAddress::kFamilyIPv4, 13114c29ec4815e8ecda47b7ce5efdaa444580e20ceDarin Petkov "255.255.255.255")); 13214c29ec4815e8ecda47b7ce5efdaa444580e20ceDarin Petkov EXPECT_EQ(32, IPAddress::GetPrefixLengthFromMask(IPAddress::kFamilyIPv4, 13314c29ec4815e8ecda47b7ce5efdaa444580e20ceDarin Petkov "")); 13414c29ec4815e8ecda47b7ce5efdaa444580e20ceDarin Petkov EXPECT_EQ(32, IPAddress::GetPrefixLengthFromMask(IPAddress::kFamilyIPv4, 13514c29ec4815e8ecda47b7ce5efdaa444580e20ceDarin Petkov "foo")); 13614c29ec4815e8ecda47b7ce5efdaa444580e20ceDarin Petkov 1377355ce1937c504d836a303ac809bd436272212b3Paul Stewart IPAddress addr4(IPAddress::kFamilyIPv4); 1381d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart addr4.SetAddressToDefault(); 1391d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 1401d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_EQ(4, addr4.GetLength()); 1417355ce1937c504d836a303ac809bd436272212b3Paul Stewart EXPECT_EQ(IPAddress::kFamilyIPv4, addr4.family()); 1421d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_TRUE(addr4.IsDefault()); 1431d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_TRUE(addr4.address().IsZero()); 1441d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_TRUE(addr4.address().Equals(ByteString(4))); 1451d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 1461d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 1477355ce1937c504d836a303ac809bd436272212b3Paul Stewart IPAddress addr6(IPAddress::kFamilyIPv6); 1481d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart addr6.SetAddressToDefault(); 1491d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 1501d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_EQ(16, addr6.GetLength()); 1517355ce1937c504d836a303ac809bd436272212b3Paul Stewart EXPECT_EQ(addr6.family(), IPAddress::kFamilyIPv6); 1521d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_TRUE(addr6.IsDefault()); 1531d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_TRUE(addr6.address().IsZero()); 1541d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_TRUE(addr6.address().Equals(ByteString(16))); 1551d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 1561d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart EXPECT_FALSE(addr4.Equals(addr6)); 1571d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart} 1581d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 1591d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul StewartTEST_F(IPAddressTest, IPv4) { 1607355ce1937c504d836a303ac809bd436272212b3Paul Stewart TestAddress(IPAddress::kFamilyIPv4, 1611d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart kV4String1, ByteString(kV4Address1, sizeof(kV4Address1)), 1621d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart kV4String2, ByteString(kV4Address2, sizeof(kV4Address2))); 1631d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart} 1641d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 1651d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 1661d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul StewartTEST_F(IPAddressTest, IPv6) { 1677355ce1937c504d836a303ac809bd436272212b3Paul Stewart TestAddress(IPAddress::kFamilyIPv6, 1681d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart kV6String1, ByteString(kV6Address1, sizeof(kV6Address1)), 1691d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart kV6String2, ByteString(kV6Address2, sizeof(kV6Address2))); 1701d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart} 1711d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart 172f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul StewartTEST_F(IPAddressTest, SetAddressAndPrefixFromString) { 173f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddress address(IPAddress::kFamilyIPv4); 174f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart const string kString1(kV4String1); 175f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart const string kString2(kV4String2); 176f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_FALSE(address.SetAddressAndPrefixFromString("")); 177f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString1)); 178f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString1 + "/")); 179f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString1 + "/10x")); 180f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString2 + "/10")); 181762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi EXPECT_TRUE(address.SetAddressAndPrefixFromString(kString1 + "/0")); 182762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi EXPECT_EQ(0, address.prefix()); 183762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi EXPECT_TRUE(address.SetAddressAndPrefixFromString(kString1 + "/32")); 184762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi EXPECT_EQ(32, address.prefix()); 185762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString1 + "/33")); 186762bfb8ab200a387fe732ec92423a5f0afe11bcfPrabhu Kaliamoorthi EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString1 + "/-1")); 187f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_TRUE(address.SetAddressAndPrefixFromString(kString1 + "/10")); 188f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_EQ(10, address.prefix()); 189f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart ByteString kAddress1(kV4Address1, sizeof(kV4Address1)); 190f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_TRUE(kAddress1.Equals(address.address())); 191f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart} 192f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 19355d9550e72197a203efbe06087edc2424676d886Paul StewartTEST_F(IPAddressTest, HasSameAddressAs) { 19455d9550e72197a203efbe06087edc2424676d886Paul Stewart const string kString1(kV4String1); 19555d9550e72197a203efbe06087edc2424676d886Paul Stewart IPAddress address0(IPAddress::kFamilyIPv4); 19655d9550e72197a203efbe06087edc2424676d886Paul Stewart EXPECT_TRUE(address0.SetAddressAndPrefixFromString(kString1 + "/0")); 19755d9550e72197a203efbe06087edc2424676d886Paul Stewart IPAddress address1(IPAddress::kFamilyIPv4); 19855d9550e72197a203efbe06087edc2424676d886Paul Stewart EXPECT_TRUE(address1.SetAddressAndPrefixFromString(kString1 + "/10")); 19955d9550e72197a203efbe06087edc2424676d886Paul Stewart IPAddress address2(IPAddress::kFamilyIPv4); 20055d9550e72197a203efbe06087edc2424676d886Paul Stewart EXPECT_TRUE(address2.SetAddressAndPrefixFromString(kString1 + "/0")); 20155d9550e72197a203efbe06087edc2424676d886Paul Stewart 20255d9550e72197a203efbe06087edc2424676d886Paul Stewart EXPECT_FALSE(address0.Equals(address1)); 20355d9550e72197a203efbe06087edc2424676d886Paul Stewart EXPECT_TRUE(address0.Equals(address2)); 20455d9550e72197a203efbe06087edc2424676d886Paul Stewart EXPECT_TRUE(address0.HasSameAddressAs(address1)); 20555d9550e72197a203efbe06087edc2424676d886Paul Stewart EXPECT_TRUE(address0.HasSameAddressAs(address2)); 20655d9550e72197a203efbe06087edc2424676d886Paul Stewart} 20755d9550e72197a203efbe06087edc2424676d886Paul Stewart 208f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewartstruct PrefixMapping { 209f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping() : family(IPAddress::kFamilyUnknown), prefix(0) {} 210f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::Family family_in, 211f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart size_t prefix_in, 212e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const string& expected_address_in) 213f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart : family(family_in), 214f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart prefix(prefix_in), 215f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart expected_address(expected_address_in) {} 216f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddress::Family family; 217f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart size_t prefix; 218f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart string expected_address; 219f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart}; 220f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 221f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewartclass IPAddressPrefixMappingTest 222f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart : public testing::TestWithParam<PrefixMapping> {}; 223f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 224f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul StewartTEST_P(IPAddressPrefixMappingTest, TestPrefixMapping) { 225f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddress address = IPAddress::GetAddressMaskFromPrefix(GetParam().family, 226f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart GetParam().prefix); 227f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddress expected_address(GetParam().family); 228f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_TRUE(expected_address.SetAddressFromString( 229f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart GetParam().expected_address)); 230f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_TRUE(expected_address.Equals(address)); 231f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart} 232f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 233f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul StewartINSTANTIATE_TEST_CASE_P( 234f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddressPrefixMappingTestRun, 235f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddressPrefixMappingTest, 236f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart ::testing::Values( 237f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv4, 0, "0.0.0.0"), 238f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv4, 1, "128.0.0.0"), 239f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv4, 4, "240.0.0.0"), 240f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv4, 7, "254.0.0.0"), 241f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv4, 10, "255.192.0.0"), 242f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv4, 13, "255.248.0.0"), 243f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv4, 16, "255.255.0.0"), 244f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv4, 19, "255.255.224.0"), 245f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv4, 22, "255.255.252.0"), 246f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv4, 25, "255.255.255.128"), 247f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv4, 28, "255.255.255.240"), 248f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv4, 31, "255.255.255.254"), 249f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv4, 32, "255.255.255.255"), 250f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv4, 33, "255.255.255.255"), 251f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv4, 34, "255.255.255.255"), 252f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv6, 0, "0::"), 253f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv6, 1, "8000::"), 254f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv6, 17, "ffff:8000::"), 255f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv6, 34, "ffff:ffff:c000::"), 256f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv6, 51, "ffff:ffff:ffff:e000::"), 257f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv6, 68, 258f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart "ffff:ffff:ffff:ffff:f000::"), 259f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv6, 85, 260f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart "ffff:ffff:ffff:ffff:ffff:f800::"), 261f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv6, 102, 262f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart "ffff:ffff:ffff:ffff:ffff:ffff:fc00::"), 263f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv6, 119, 264f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fe00"), 265f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv6, 128, 266f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), 267f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart PrefixMapping(IPAddress::kFamilyIPv6, 136, 268f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); 269f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 270fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewartstruct BitOperationMapping { 271fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart BitOperationMapping() : family(IPAddress::kFamilyUnknown) {} 272fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart BitOperationMapping(IPAddress::Family family_in, 273e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const string& address_a_in, 274e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const string& address_b_in, 275e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const string& expected_anded_in, 276e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const string& expected_orred_in) 277f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart : family(family_in), 278f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart address_a(address_a_in), 279f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart address_b(address_b_in), 280fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart expected_anded(expected_anded_in), 281fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart expected_orred(expected_orred_in) {} 282f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddress::Family family; 283f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart string address_a; 284f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart string address_b; 285fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart string expected_anded; 286fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart string expected_orred; 287f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart}; 288f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 289fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewartclass IPAddressBitOperationMappingTest 290fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart : public testing::TestWithParam<BitOperationMapping> {}; 291f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 292fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul StewartTEST_P(IPAddressBitOperationMappingTest, TestBitOperationMapping) { 293f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddress address_a(GetParam().family); 294f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_TRUE(address_a.SetAddressFromString(GetParam().address_a)); 295f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddress address_b(GetParam().family); 296f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_TRUE(address_b.SetAddressFromString(GetParam().address_b)); 297fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart IPAddress expected_anded(GetParam().family); 298fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart EXPECT_TRUE(expected_anded.SetAddressFromString( 299fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart GetParam().expected_anded)); 300fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart EXPECT_TRUE(expected_anded.Equals(address_a.MaskWith(address_b))); 301fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart IPAddress expected_orred(GetParam().family); 302fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart EXPECT_TRUE(expected_orred.SetAddressFromString( 303fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart GetParam().expected_orred)); 304fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart EXPECT_TRUE(expected_orred.Equals(address_a.MergeWith(address_b))); 305f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart} 306f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 307f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul StewartINSTANTIATE_TEST_CASE_P( 308fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart IPAddressBitOperationMappingTestRun, 309fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart IPAddressBitOperationMappingTest, 310f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart ::testing::Values( 311fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart BitOperationMapping(IPAddress::kFamilyIPv4, 312fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "255.255.255.255", "0.0.0.0", 313fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "0.0.0.0", "255.255.255.255"), 314fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart BitOperationMapping(IPAddress::kFamilyIPv4, 315fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "0.0.0.0", "255.255.255.255", 316fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "0.0.0.0", "255.255.255.255"), 317fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart BitOperationMapping(IPAddress::kFamilyIPv4, 318fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "170.170.170.170", "85.85.85.85", 319fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "0.0.0.0", "255.255.255.255"), 320fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart BitOperationMapping(IPAddress::kFamilyIPv4, 321fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "238.187.119.221", "119.221.238.187", 322fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "102.153.102.153", "255.255.255.255"), 323fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart BitOperationMapping(IPAddress::kFamilyIPv4, 324fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "17.68.136.34", "119.221.238.187", 325fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "17.68.136.34", "119.221.238.187"), 326fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart BitOperationMapping(IPAddress::kFamilyIPv4, 327fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "192.168.1.10", "255.255.255.0", 328fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "192.168.1.0", "255.255.255.10"))); 329f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 330f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewartstruct NetworkPartMapping { 331f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart NetworkPartMapping() : family(IPAddress::kFamilyUnknown) {} 332f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart NetworkPartMapping(IPAddress::Family family_in, 333e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const string& address_in, 334f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart size_t prefix_in, 335e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const string& expected_network_in, 336e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const string& expected_broadcast_in) 337f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart : family(family_in), 338f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart address(address_in), 339f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart prefix(prefix_in), 340fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart expected_network(expected_network_in), 341fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart expected_broadcast(expected_broadcast_in) {} 342f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddress::Family family; 343f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart string address; 344f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart size_t prefix; 345fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart string expected_network; 346fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart string expected_broadcast; 347f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart}; 348f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 349f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewartclass IPAddressNetworkPartMappingTest 350f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart : public testing::TestWithParam<NetworkPartMapping> {}; 351f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 352f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul StewartTEST_P(IPAddressNetworkPartMappingTest, TestNetworkPartMapping) { 353f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddress address(GetParam().family); 354f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_TRUE(address.SetAddressFromString(GetParam().address)); 355fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart IPAddress expected_network(GetParam().family); 356fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart EXPECT_TRUE(expected_network.SetAddressFromString( 357fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart GetParam().expected_network)); 358f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart address.set_prefix(GetParam().prefix); 359fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart EXPECT_TRUE(expected_network.Equals(address.GetNetworkPart())); 360fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart IPAddress expected_broadcast(GetParam().family); 361fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart EXPECT_TRUE(expected_broadcast.SetAddressFromString( 362fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart GetParam().expected_broadcast)); 363fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart EXPECT_TRUE(expected_broadcast.Equals(address.GetDefaultBroadcast())); 364f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart} 365f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 366f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul StewartINSTANTIATE_TEST_CASE_P( 367f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddressNetworkPartMappingTestRun, 368f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddressNetworkPartMappingTest, 369f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart ::testing::Values( 370f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart NetworkPartMapping(IPAddress::kFamilyIPv4, 371fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "255.255.255.255", 0, "0.0.0.0", "255.255.255.255"), 372fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart NetworkPartMapping(IPAddress::kFamilyIPv4, 373fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "255.255.255.255", 32, 374fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "255.255.255.255", "255.255.255.255"), 375fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart NetworkPartMapping(IPAddress::kFamilyIPv4, 376fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "255.255.255.255", 24, 377fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "255.255.255.0", "255.255.255.255"), 378fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart NetworkPartMapping(IPAddress::kFamilyIPv4, 379fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "255.255.255.255", 16, 380fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "255.255.0.0", "255.255.255.255"), 381fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart NetworkPartMapping(IPAddress::kFamilyIPv4, 382fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "0.0.0.0", 0, "0.0.0.0", "255.255.255.255"), 383fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart NetworkPartMapping(IPAddress::kFamilyIPv4, 384fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "0.0.0.0", 32, "0.0.0.0", "0.0.0.0"), 385fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart NetworkPartMapping(IPAddress::kFamilyIPv4, 386fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "0.0.0.0", 24, "0.0.0.0", "0.0.0.255"), 387f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart NetworkPartMapping(IPAddress::kFamilyIPv4, 388fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "0.0.0.0", 16, "0.0.0.0", "0.0.255.255"), 389f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart NetworkPartMapping(IPAddress::kFamilyIPv4, 390fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "192.168.1.1", 24, "192.168.1.0", "192.168.1.255"), 391f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart NetworkPartMapping(IPAddress::kFamilyIPv4, 392fe1c0e17fe470de449a1aadb6c202a41da146ef7Paul Stewart "10.1.0.1", 8, "10.0.0.0", "10.255.255.255"))); 393f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 394f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewartstruct MinPrefixLengthMapping { 395f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart MinPrefixLengthMapping() : family(IPAddress::kFamilyUnknown) {} 396f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart MinPrefixLengthMapping(IPAddress::Family family_in, 397e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const string& address_in, 398f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart size_t expected_min_prefix_in) 399f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart : family(family_in), 400f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart address(address_in), 401f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart expected_min_prefix(expected_min_prefix_in) {} 402f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddress::Family family; 403f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart string address; 404f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart size_t expected_min_prefix; 405f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart}; 406f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 407f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewartclass IPAddressMinPrefixLengthMappingTest 408f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart : public testing::TestWithParam<MinPrefixLengthMapping> {}; 409f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 410f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul StewartTEST_P(IPAddressMinPrefixLengthMappingTest, TestMinPrefixLengthMapping) { 411f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddress address(GetParam().family); 412f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_TRUE(address.SetAddressFromString(GetParam().address)); 413f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_EQ(GetParam().expected_min_prefix, address.GetMinPrefixLength()); 414f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart} 415f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 416f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul StewartINSTANTIATE_TEST_CASE_P( 417f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddressMinPrefixLengthMappingTestRun, 418f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddressMinPrefixLengthMappingTest, 419f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart ::testing::Values( 420f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart MinPrefixLengthMapping(IPAddress::kFamilyIPv6, "fe80::", 128), 421f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart MinPrefixLengthMapping(IPAddress::kFamilyIPv4, "255.255.255.255", 32), 422f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart MinPrefixLengthMapping(IPAddress::kFamilyIPv4, "224.0.0.0", 32), 423f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart MinPrefixLengthMapping(IPAddress::kFamilyIPv4, "192.168.0.0", 24), 424f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart MinPrefixLengthMapping(IPAddress::kFamilyIPv4, "172.16.0.0", 16), 425f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart MinPrefixLengthMapping(IPAddress::kFamilyIPv4, "10.10.10.10", 8))); 426f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 427f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewartstruct CanReachAddressMapping { 428f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart CanReachAddressMapping() : family(IPAddress::kFamilyUnknown) {} 429f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart CanReachAddressMapping(IPAddress::Family family_in, 430e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const string& address_a_in, 431e67a78539a05ea7fc68ed5ca18f6d1de333a3086Paul Stewart const string& address_b_in, 432f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart bool expected_result_in) 433f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart : family(family_in), 434f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart address_a(address_a_in), 435f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart address_b(address_b_in), 436f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart expected_result(expected_result_in) {} 437f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddress::Family family; 438f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart string address_a; 439f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart string address_b; 440f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart size_t expected_result; 441f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart}; 442f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 443f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewartclass IPAddressCanReachAddressMappingTest 444f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart : public testing::TestWithParam<CanReachAddressMapping> {}; 445f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 446f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul StewartTEST_P(IPAddressCanReachAddressMappingTest, TestCanReachAddressMapping) { 447f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddress address_a(GetParam().family); 448f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_TRUE(address_a.SetAddressAndPrefixFromString(GetParam().address_a)); 449f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddress address_b(GetParam().family); 450f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_TRUE(address_b.SetAddressAndPrefixFromString(GetParam().address_b)); 451f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart EXPECT_EQ(GetParam().expected_result, address_a.CanReachAddress(address_b)); 452f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart} 453f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 454f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul StewartINSTANTIATE_TEST_CASE_P( 455f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddressCanReachAddressMappingTestRun, 456f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart IPAddressCanReachAddressMappingTest, 457f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart ::testing::Values( 458f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart CanReachAddressMapping(IPAddress::kFamilyIPv6, 459f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart "fe80:1000::/16", "fe80:2000::/16", true), 460f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart CanReachAddressMapping(IPAddress::kFamilyIPv6, 461f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart "fe80:1000::/16", "fe80:2000::/32", true), 462f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart CanReachAddressMapping(IPAddress::kFamilyIPv6, 463f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart "fe80:1000::/32", "fe80:2000::/16", false), 464f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart CanReachAddressMapping(IPAddress::kFamilyIPv4, 465f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart "192.168.1.1/24", "192.168.1.2/24", true), 466f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart CanReachAddressMapping(IPAddress::kFamilyIPv4, 467f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart "192.168.1.1/24", "192.168.2.2/24", false), 468f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart CanReachAddressMapping(IPAddress::kFamilyIPv4, 469f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart "192.168.1.1/16", "192.168.2.2/24", true), 470f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart CanReachAddressMapping(IPAddress::kFamilyIPv4, 471f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart "192.168.1.1/24", "192.168.2.2/16", false))); 472f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart 4731d18e8cd593cc8dce91a6faabe2f0cae700b7e38Paul Stewart} // namespace shill 474