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