Home | History | Annotate | Download | only in net
      1 //
      2 // Copyright (C) 2012 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 #include "shill/net/ip_address.h"
     18 
     19 #include <gtest/gtest.h>
     20 
     21 #include <arpa/inet.h>
     22 
     23 #include "shill/net/byte_string.h"
     24 
     25 using std::string;
     26 using testing::Test;
     27 
     28 namespace shill {
     29 
     30 namespace {
     31 const char kV4String1[] = "192.168.10.1";
     32 const unsigned char kV4Address1[] = { 192, 168, 10, 1 };
     33 const char kV4String2[] = "192.168.10";
     34 const unsigned char kV4Address2[] = { 192, 168, 10 };
     35 const char kV6String1[] = "fe80::1aa9:5ff:7ebf:14c5";
     36 const unsigned char kV6Address1[] = { 0xfe, 0x80, 0x00, 0x00,
     37                                       0x00, 0x00, 0x00, 0x00,
     38                                       0x1a, 0xa9, 0x05, 0xff,
     39                                       0x7e, 0xbf, 0x14, 0xc5 };
     40 const char kV6String2[] = "1980:0:1000:1b02:1aa9:5ff:7ebf";
     41 const unsigned char kV6Address2[] = { 0x19, 0x80, 0x00, 0x00,
     42                                       0x10, 0x00, 0x1b, 0x02,
     43                                       0x1a, 0xa9, 0x05, 0xff,
     44                                       0x7e, 0xbf };
     45 }  // namespace
     46 
     47 class IPAddressTest : public Test {
     48  protected:
     49   void TestAddress(IPAddress::Family family,
     50                    const string& good_string,
     51                    const ByteString& good_bytes,
     52                    const string& bad_string,
     53                    const ByteString& bad_bytes) {
     54     IPAddress good_addr(family);
     55 
     56     EXPECT_TRUE(good_addr.SetAddressFromString(good_string));
     57     EXPECT_EQ(IPAddress::GetAddressLength(family), good_addr.GetLength());
     58     EXPECT_EQ(family, good_addr.family());
     59     EXPECT_FALSE(good_addr.IsDefault());
     60     EXPECT_EQ(0, memcmp(good_addr.GetConstData(), good_bytes.GetConstData(),
     61                         good_bytes.GetLength()));
     62     EXPECT_TRUE(good_addr.address().Equals(good_bytes));
     63     string address_string;
     64     EXPECT_TRUE(good_addr.IntoString(&address_string));
     65     EXPECT_EQ(good_string, address_string);
     66 
     67     IPAddress good_addr_from_bytes(family, good_bytes);
     68     EXPECT_TRUE(good_addr.Equals(good_addr_from_bytes));
     69 
     70     IPAddress good_addr_from_string(good_string);
     71     EXPECT_EQ(family, good_addr_from_string.family());
     72 
     73     IPAddress bad_addr(family);
     74     EXPECT_FALSE(bad_addr.SetAddressFromString(bad_string));
     75     EXPECT_FALSE(good_addr.Equals(bad_addr));
     76 
     77     EXPECT_FALSE(bad_addr.IsValid());
     78 
     79     IPAddress bad_addr_from_bytes(family, bad_bytes);
     80     EXPECT_EQ(family, bad_addr_from_bytes.family());
     81     EXPECT_FALSE(bad_addr_from_bytes.IsValid());
     82 
     83     IPAddress bad_addr_from_string(bad_string);
     84     EXPECT_EQ(IPAddress::kFamilyUnknown, bad_addr_from_string.family());
     85 
     86     EXPECT_FALSE(bad_addr.Equals(bad_addr_from_bytes));
     87     EXPECT_FALSE(bad_addr.IntoString(&address_string));
     88 
     89     sockaddr_storage storage = {};
     90     auto addr = reinterpret_cast<sockaddr*>(&storage);
     91     addr->sa_family = family;
     92     ssize_t addr_size;
     93     if (family == IPAddress::kFamilyIPv6) {
     94       auto sin6 = reinterpret_cast<sockaddr_in6*>(addr);
     95       inet_pton(AF_INET6, good_string.c_str(), &sin6->sin6_addr.s6_addr);
     96       addr_size = sizeof(sockaddr_in6);
     97     } else {
     98       auto sin = reinterpret_cast<sockaddr_in*>(addr);
     99       inet_pton(AF_INET, good_string.c_str(), &sin->sin_addr.s_addr);
    100       addr_size = sizeof(sockaddr_in);
    101     }
    102     IPAddress from_short_sockaddr(addr, addr_size - 1);
    103     EXPECT_FALSE(from_short_sockaddr.IsValid());
    104     IPAddress from_sockaddr(addr, addr_size);
    105     EXPECT_TRUE(from_sockaddr.IsValid());
    106     EXPECT_EQ(family, from_sockaddr.family());
    107     EXPECT_TRUE(from_sockaddr.IntoString(&address_string));
    108     EXPECT_EQ(good_string, address_string);
    109 
    110     sockaddr_storage storage_empty = {};
    111     sockaddr_storage storage2 = {};
    112     auto addr2 = reinterpret_cast<sockaddr*>(&storage2);
    113     EXPECT_FALSE(from_short_sockaddr.IntoSockAddr(addr2, addr_size));
    114     EXPECT_EQ(0, memcmp(&storage2, &storage_empty, sizeof(storage2)));
    115     EXPECT_FALSE(from_sockaddr.IntoSockAddr(addr2, addr_size - 1));
    116     EXPECT_EQ(0, memcmp(&storage2, &storage_empty, sizeof(storage2)));
    117     EXPECT_TRUE(from_sockaddr.IntoSockAddr(addr2, addr_size));
    118     EXPECT_EQ(0, memcmp(&storage2, &storage, sizeof(storage2)));
    119   }
    120 };
    121 
    122 TEST_F(IPAddressTest, Statics) {
    123   EXPECT_EQ(4, IPAddress::GetAddressLength(IPAddress::kFamilyIPv4));
    124   EXPECT_EQ(16, IPAddress::GetAddressLength(IPAddress::kFamilyIPv6));
    125 
    126   EXPECT_EQ(0, IPAddress::GetPrefixLengthFromMask(IPAddress::kFamilyIPv4,
    127                                                   "0.0.0.0"));
    128   EXPECT_EQ(20, IPAddress::GetPrefixLengthFromMask(IPAddress::kFamilyIPv4,
    129                                                    "255.255.240.0"));
    130   EXPECT_EQ(32, IPAddress::GetPrefixLengthFromMask(IPAddress::kFamilyIPv4,
    131                                                    "255.255.255.255"));
    132   EXPECT_EQ(32, IPAddress::GetPrefixLengthFromMask(IPAddress::kFamilyIPv4,
    133                                                    ""));
    134   EXPECT_EQ(32, IPAddress::GetPrefixLengthFromMask(IPAddress::kFamilyIPv4,
    135                                                    "foo"));
    136 
    137   IPAddress addr4(IPAddress::kFamilyIPv4);
    138   addr4.SetAddressToDefault();
    139 
    140   EXPECT_EQ(4, addr4.GetLength());
    141   EXPECT_EQ(IPAddress::kFamilyIPv4, addr4.family());
    142   EXPECT_TRUE(addr4.IsDefault());
    143   EXPECT_TRUE(addr4.address().IsZero());
    144   EXPECT_TRUE(addr4.address().Equals(ByteString(4)));
    145 
    146 
    147   IPAddress addr6(IPAddress::kFamilyIPv6);
    148   addr6.SetAddressToDefault();
    149 
    150   EXPECT_EQ(16, addr6.GetLength());
    151   EXPECT_EQ(addr6.family(), IPAddress::kFamilyIPv6);
    152   EXPECT_TRUE(addr6.IsDefault());
    153   EXPECT_TRUE(addr6.address().IsZero());
    154   EXPECT_TRUE(addr6.address().Equals(ByteString(16)));
    155 
    156   EXPECT_FALSE(addr4.Equals(addr6));
    157 }
    158 
    159 TEST_F(IPAddressTest, IPv4) {
    160   TestAddress(IPAddress::kFamilyIPv4,
    161               kV4String1, ByteString(kV4Address1, sizeof(kV4Address1)),
    162               kV4String2, ByteString(kV4Address2, sizeof(kV4Address2)));
    163 }
    164 
    165 
    166 TEST_F(IPAddressTest, IPv6) {
    167   TestAddress(IPAddress::kFamilyIPv6,
    168               kV6String1, ByteString(kV6Address1, sizeof(kV6Address1)),
    169               kV6String2, ByteString(kV6Address2, sizeof(kV6Address2)));
    170 }
    171 
    172 TEST_F(IPAddressTest, SetAddressAndPrefixFromString) {
    173   IPAddress address(IPAddress::kFamilyIPv4);
    174   const string kString1(kV4String1);
    175   const string kString2(kV4String2);
    176   EXPECT_FALSE(address.SetAddressAndPrefixFromString(""));
    177   EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString1));
    178   EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString1 + "/"));
    179   EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString1 + "/10x"));
    180   EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString2 + "/10"));
    181   EXPECT_TRUE(address.SetAddressAndPrefixFromString(kString1 + "/0"));
    182   EXPECT_EQ(0, address.prefix());
    183   EXPECT_TRUE(address.SetAddressAndPrefixFromString(kString1 + "/32"));
    184   EXPECT_EQ(32, address.prefix());
    185   EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString1 + "/33"));
    186   EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString1 + "/-1"));
    187   EXPECT_TRUE(address.SetAddressAndPrefixFromString(kString1 + "/10"));
    188   EXPECT_EQ(10, address.prefix());
    189   ByteString kAddress1(kV4Address1, sizeof(kV4Address1));
    190   EXPECT_TRUE(kAddress1.Equals(address.address()));
    191 }
    192 
    193 TEST_F(IPAddressTest, HasSameAddressAs) {
    194   const string kString1(kV4String1);
    195   IPAddress address0(IPAddress::kFamilyIPv4);
    196   EXPECT_TRUE(address0.SetAddressAndPrefixFromString(kString1 + "/0"));
    197   IPAddress address1(IPAddress::kFamilyIPv4);
    198   EXPECT_TRUE(address1.SetAddressAndPrefixFromString(kString1 + "/10"));
    199   IPAddress address2(IPAddress::kFamilyIPv4);
    200   EXPECT_TRUE(address2.SetAddressAndPrefixFromString(kString1 + "/0"));
    201 
    202   EXPECT_FALSE(address0.Equals(address1));
    203   EXPECT_TRUE(address0.Equals(address2));
    204   EXPECT_TRUE(address0.HasSameAddressAs(address1));
    205   EXPECT_TRUE(address0.HasSameAddressAs(address2));
    206 }
    207 
    208 struct PrefixMapping {
    209   PrefixMapping() : family(IPAddress::kFamilyUnknown), prefix(0) {}
    210   PrefixMapping(IPAddress::Family family_in,
    211                 size_t prefix_in,
    212                 const string& expected_address_in)
    213       : family(family_in),
    214         prefix(prefix_in),
    215         expected_address(expected_address_in) {}
    216   IPAddress::Family family;
    217   size_t prefix;
    218   string expected_address;
    219 };
    220 
    221 class IPAddressPrefixMappingTest
    222     : public testing::TestWithParam<PrefixMapping> {};
    223 
    224 TEST_P(IPAddressPrefixMappingTest, TestPrefixMapping) {
    225   IPAddress address = IPAddress::GetAddressMaskFromPrefix(GetParam().family,
    226                                                           GetParam().prefix);
    227   IPAddress expected_address(GetParam().family);
    228   EXPECT_TRUE(expected_address.SetAddressFromString(
    229       GetParam().expected_address));
    230   EXPECT_TRUE(expected_address.Equals(address));
    231 }
    232 
    233 INSTANTIATE_TEST_CASE_P(
    234     IPAddressPrefixMappingTestRun,
    235     IPAddressPrefixMappingTest,
    236     ::testing::Values(
    237         PrefixMapping(IPAddress::kFamilyIPv4, 0, "0.0.0.0"),
    238         PrefixMapping(IPAddress::kFamilyIPv4, 1, "128.0.0.0"),
    239         PrefixMapping(IPAddress::kFamilyIPv4, 4, "240.0.0.0"),
    240         PrefixMapping(IPAddress::kFamilyIPv4, 7, "254.0.0.0"),
    241         PrefixMapping(IPAddress::kFamilyIPv4, 10, "255.192.0.0"),
    242         PrefixMapping(IPAddress::kFamilyIPv4, 13, "255.248.0.0"),
    243         PrefixMapping(IPAddress::kFamilyIPv4, 16, "255.255.0.0"),
    244         PrefixMapping(IPAddress::kFamilyIPv4, 19, "255.255.224.0"),
    245         PrefixMapping(IPAddress::kFamilyIPv4, 22, "255.255.252.0"),
    246         PrefixMapping(IPAddress::kFamilyIPv4, 25, "255.255.255.128"),
    247         PrefixMapping(IPAddress::kFamilyIPv4, 28, "255.255.255.240"),
    248         PrefixMapping(IPAddress::kFamilyIPv4, 31, "255.255.255.254"),
    249         PrefixMapping(IPAddress::kFamilyIPv4, 32, "255.255.255.255"),
    250         PrefixMapping(IPAddress::kFamilyIPv4, 33, "255.255.255.255"),
    251         PrefixMapping(IPAddress::kFamilyIPv4, 34, "255.255.255.255"),
    252         PrefixMapping(IPAddress::kFamilyIPv6, 0, "0::"),
    253         PrefixMapping(IPAddress::kFamilyIPv6, 1, "8000::"),
    254         PrefixMapping(IPAddress::kFamilyIPv6, 17, "ffff:8000::"),
    255         PrefixMapping(IPAddress::kFamilyIPv6, 34, "ffff:ffff:c000::"),
    256         PrefixMapping(IPAddress::kFamilyIPv6, 51, "ffff:ffff:ffff:e000::"),
    257         PrefixMapping(IPAddress::kFamilyIPv6, 68,
    258                       "ffff:ffff:ffff:ffff:f000::"),
    259         PrefixMapping(IPAddress::kFamilyIPv6, 85,
    260                       "ffff:ffff:ffff:ffff:ffff:f800::"),
    261         PrefixMapping(IPAddress::kFamilyIPv6, 102,
    262                       "ffff:ffff:ffff:ffff:ffff:ffff:fc00::"),
    263         PrefixMapping(IPAddress::kFamilyIPv6, 119,
    264                       "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fe00"),
    265         PrefixMapping(IPAddress::kFamilyIPv6, 128,
    266                       "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"),
    267         PrefixMapping(IPAddress::kFamilyIPv6, 136,
    268                       "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")));
    269 
    270 struct BitOperationMapping {
    271   BitOperationMapping() : family(IPAddress::kFamilyUnknown) {}
    272   BitOperationMapping(IPAddress::Family family_in,
    273               const string& address_a_in,
    274               const string& address_b_in,
    275               const string& expected_anded_in,
    276               const string& expected_orred_in)
    277       : family(family_in),
    278         address_a(address_a_in),
    279         address_b(address_b_in),
    280         expected_anded(expected_anded_in),
    281         expected_orred(expected_orred_in) {}
    282   IPAddress::Family family;
    283   string address_a;
    284   string address_b;
    285   string expected_anded;
    286   string expected_orred;
    287 };
    288 
    289 class IPAddressBitOperationMappingTest
    290     : public testing::TestWithParam<BitOperationMapping> {};
    291 
    292 TEST_P(IPAddressBitOperationMappingTest, TestBitOperationMapping) {
    293   IPAddress address_a(GetParam().family);
    294   EXPECT_TRUE(address_a.SetAddressFromString(GetParam().address_a));
    295   IPAddress address_b(GetParam().family);
    296   EXPECT_TRUE(address_b.SetAddressFromString(GetParam().address_b));
    297   IPAddress expected_anded(GetParam().family);
    298   EXPECT_TRUE(expected_anded.SetAddressFromString(
    299       GetParam().expected_anded));
    300   EXPECT_TRUE(expected_anded.Equals(address_a.MaskWith(address_b)));
    301   IPAddress expected_orred(GetParam().family);
    302   EXPECT_TRUE(expected_orred.SetAddressFromString(
    303       GetParam().expected_orred));
    304   EXPECT_TRUE(expected_orred.Equals(address_a.MergeWith(address_b)));
    305 }
    306 
    307 INSTANTIATE_TEST_CASE_P(
    308     IPAddressBitOperationMappingTestRun,
    309     IPAddressBitOperationMappingTest,
    310     ::testing::Values(
    311         BitOperationMapping(IPAddress::kFamilyIPv4,
    312                             "255.255.255.255", "0.0.0.0",
    313                             "0.0.0.0", "255.255.255.255"),
    314         BitOperationMapping(IPAddress::kFamilyIPv4,
    315                             "0.0.0.0", "255.255.255.255",
    316                             "0.0.0.0", "255.255.255.255"),
    317         BitOperationMapping(IPAddress::kFamilyIPv4,
    318                             "170.170.170.170", "85.85.85.85",
    319                             "0.0.0.0", "255.255.255.255"),
    320         BitOperationMapping(IPAddress::kFamilyIPv4,
    321                             "238.187.119.221", "119.221.238.187",
    322                             "102.153.102.153", "255.255.255.255"),
    323         BitOperationMapping(IPAddress::kFamilyIPv4,
    324                             "17.68.136.34", "119.221.238.187",
    325                             "17.68.136.34", "119.221.238.187"),
    326         BitOperationMapping(IPAddress::kFamilyIPv4,
    327                             "192.168.1.10", "255.255.255.0",
    328                             "192.168.1.0", "255.255.255.10")));
    329 
    330 struct NetworkPartMapping {
    331   NetworkPartMapping() : family(IPAddress::kFamilyUnknown) {}
    332   NetworkPartMapping(IPAddress::Family family_in,
    333                      const string& address_in,
    334                      size_t prefix_in,
    335                      const string& expected_network_in,
    336                      const string& expected_broadcast_in)
    337       : family(family_in),
    338         address(address_in),
    339         prefix(prefix_in),
    340         expected_network(expected_network_in),
    341         expected_broadcast(expected_broadcast_in) {}
    342   IPAddress::Family family;
    343   string address;
    344   size_t prefix;
    345   string expected_network;
    346   string expected_broadcast;
    347 };
    348 
    349 class IPAddressNetworkPartMappingTest
    350     : public testing::TestWithParam<NetworkPartMapping> {};
    351 
    352 TEST_P(IPAddressNetworkPartMappingTest, TestNetworkPartMapping) {
    353   IPAddress address(GetParam().family);
    354   EXPECT_TRUE(address.SetAddressFromString(GetParam().address));
    355   IPAddress expected_network(GetParam().family);
    356   EXPECT_TRUE(expected_network.SetAddressFromString(
    357       GetParam().expected_network));
    358   address.set_prefix(GetParam().prefix);
    359   EXPECT_TRUE(expected_network.Equals(address.GetNetworkPart()));
    360   IPAddress expected_broadcast(GetParam().family);
    361   EXPECT_TRUE(expected_broadcast.SetAddressFromString(
    362       GetParam().expected_broadcast));
    363   EXPECT_TRUE(expected_broadcast.Equals(address.GetDefaultBroadcast()));
    364 }
    365 
    366 INSTANTIATE_TEST_CASE_P(
    367     IPAddressNetworkPartMappingTestRun,
    368     IPAddressNetworkPartMappingTest,
    369     ::testing::Values(
    370         NetworkPartMapping(IPAddress::kFamilyIPv4,
    371                            "255.255.255.255", 0, "0.0.0.0", "255.255.255.255"),
    372         NetworkPartMapping(IPAddress::kFamilyIPv4,
    373                            "255.255.255.255", 32,
    374                            "255.255.255.255", "255.255.255.255"),
    375         NetworkPartMapping(IPAddress::kFamilyIPv4,
    376                            "255.255.255.255", 24,
    377                            "255.255.255.0", "255.255.255.255"),
    378         NetworkPartMapping(IPAddress::kFamilyIPv4,
    379                            "255.255.255.255", 16,
    380                            "255.255.0.0", "255.255.255.255"),
    381         NetworkPartMapping(IPAddress::kFamilyIPv4,
    382                            "0.0.0.0", 0, "0.0.0.0", "255.255.255.255"),
    383         NetworkPartMapping(IPAddress::kFamilyIPv4,
    384                            "0.0.0.0", 32, "0.0.0.0", "0.0.0.0"),
    385         NetworkPartMapping(IPAddress::kFamilyIPv4,
    386                            "0.0.0.0", 24, "0.0.0.0", "0.0.0.255"),
    387         NetworkPartMapping(IPAddress::kFamilyIPv4,
    388                            "0.0.0.0", 16, "0.0.0.0", "0.0.255.255"),
    389         NetworkPartMapping(IPAddress::kFamilyIPv4,
    390                            "192.168.1.1", 24, "192.168.1.0", "192.168.1.255"),
    391         NetworkPartMapping(IPAddress::kFamilyIPv4,
    392                            "10.1.0.1", 8, "10.0.0.0", "10.255.255.255")));
    393 
    394 struct MinPrefixLengthMapping {
    395   MinPrefixLengthMapping() : family(IPAddress::kFamilyUnknown) {}
    396   MinPrefixLengthMapping(IPAddress::Family family_in,
    397                          const string& address_in,
    398                          size_t expected_min_prefix_in)
    399       : family(family_in),
    400         address(address_in),
    401         expected_min_prefix(expected_min_prefix_in) {}
    402   IPAddress::Family family;
    403   string address;
    404   size_t expected_min_prefix;
    405 };
    406 
    407 class IPAddressMinPrefixLengthMappingTest
    408     : public testing::TestWithParam<MinPrefixLengthMapping> {};
    409 
    410 TEST_P(IPAddressMinPrefixLengthMappingTest, TestMinPrefixLengthMapping) {
    411   IPAddress address(GetParam().family);
    412   EXPECT_TRUE(address.SetAddressFromString(GetParam().address));
    413   EXPECT_EQ(GetParam().expected_min_prefix, address.GetMinPrefixLength());
    414 }
    415 
    416 INSTANTIATE_TEST_CASE_P(
    417     IPAddressMinPrefixLengthMappingTestRun,
    418     IPAddressMinPrefixLengthMappingTest,
    419     ::testing::Values(
    420         MinPrefixLengthMapping(IPAddress::kFamilyIPv6, "fe80::", 128),
    421         MinPrefixLengthMapping(IPAddress::kFamilyIPv4, "255.255.255.255", 32),
    422         MinPrefixLengthMapping(IPAddress::kFamilyIPv4, "224.0.0.0", 32),
    423         MinPrefixLengthMapping(IPAddress::kFamilyIPv4, "192.168.0.0", 24),
    424         MinPrefixLengthMapping(IPAddress::kFamilyIPv4, "172.16.0.0", 16),
    425         MinPrefixLengthMapping(IPAddress::kFamilyIPv4, "10.10.10.10", 8)));
    426 
    427 struct CanReachAddressMapping {
    428   CanReachAddressMapping() : family(IPAddress::kFamilyUnknown) {}
    429   CanReachAddressMapping(IPAddress::Family family_in,
    430                          const string& address_a_in,
    431                          const string& address_b_in,
    432                          bool expected_result_in)
    433       : family(family_in),
    434         address_a(address_a_in),
    435         address_b(address_b_in),
    436         expected_result(expected_result_in) {}
    437   IPAddress::Family family;
    438   string address_a;
    439   string address_b;
    440   size_t expected_result;
    441 };
    442 
    443 class IPAddressCanReachAddressMappingTest
    444     : public testing::TestWithParam<CanReachAddressMapping> {};
    445 
    446 TEST_P(IPAddressCanReachAddressMappingTest, TestCanReachAddressMapping) {
    447   IPAddress address_a(GetParam().family);
    448   EXPECT_TRUE(address_a.SetAddressAndPrefixFromString(GetParam().address_a));
    449   IPAddress address_b(GetParam().family);
    450   EXPECT_TRUE(address_b.SetAddressAndPrefixFromString(GetParam().address_b));
    451   EXPECT_EQ(GetParam().expected_result, address_a.CanReachAddress(address_b));
    452 }
    453 
    454 INSTANTIATE_TEST_CASE_P(
    455     IPAddressCanReachAddressMappingTestRun,
    456     IPAddressCanReachAddressMappingTest,
    457     ::testing::Values(
    458         CanReachAddressMapping(IPAddress::kFamilyIPv6,
    459                                "fe80:1000::/16", "fe80:2000::/16", true),
    460         CanReachAddressMapping(IPAddress::kFamilyIPv6,
    461                                "fe80:1000::/16", "fe80:2000::/32", true),
    462         CanReachAddressMapping(IPAddress::kFamilyIPv6,
    463                                "fe80:1000::/32", "fe80:2000::/16", false),
    464         CanReachAddressMapping(IPAddress::kFamilyIPv4,
    465                                "192.168.1.1/24", "192.168.1.2/24", true),
    466         CanReachAddressMapping(IPAddress::kFamilyIPv4,
    467                                "192.168.1.1/24", "192.168.2.2/24", false),
    468         CanReachAddressMapping(IPAddress::kFamilyIPv4,
    469                                "192.168.1.1/16", "192.168.2.2/24", true),
    470         CanReachAddressMapping(IPAddress::kFamilyIPv4,
    471                                "192.168.1.1/24", "192.168.2.2/16", false)));
    472 
    473 }  // namespace shill
    474