blob: 9a175deece96b00cb1a69602c3a059149853ef31 [file] [log] [blame]
Paul Stewart188a84a2012-01-20 16:28:15 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Paul Stewart1d18e8c2011-07-15 11:00:31 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <gtest/gtest.h>
6
7#include <arpa/inet.h>
8
9#include "shill/byte_string.h"
10#include "shill/ip_address.h"
11
Paul Stewart188a84a2012-01-20 16:28:15 -080012using std::string;
Paul Stewart1d18e8c2011-07-15 11:00:31 -070013using testing::Test;
14
15namespace shill {
16
17namespace {
18const char kV4String1[] = "192.168.10.1";
19const unsigned char kV4Address1[] = { 192, 168, 10, 1 };
20const char kV4String2[] = "192.168.10";
21const unsigned char kV4Address2[] = { 192, 168, 10 };
22const char kV6String1[] = "fe80::1aa9:5ff:7ebf:14c5";
23const unsigned char kV6Address1[] = { 0xfe, 0x80, 0x00, 0x00,
24 0x00, 0x00, 0x00, 0x00,
25 0x1a, 0xa9, 0x05, 0xff,
26 0x7e, 0xbf, 0x14, 0xc5 };
27const char kV6String2[] = "1980:0:1000:1b02:1aa9:5ff:7ebf";
28const unsigned char kV6Address2[] = { 0x19, 0x80, 0x00, 0x00,
29 0x10, 0x00, 0x1b, 0x02,
30 0x1a, 0xa9, 0x05, 0xff,
31 0x7e, 0xbf };
32} // namespace {}
33
34class IPAddressTest : public Test {
35 protected:
36 void TestAddress(IPAddress::Family family,
Paul Stewart188a84a2012-01-20 16:28:15 -080037 const string &good_string,
Paul Stewart1d18e8c2011-07-15 11:00:31 -070038 const ByteString &good_bytes,
Paul Stewart188a84a2012-01-20 16:28:15 -080039 const string &bad_string,
Paul Stewart1d18e8c2011-07-15 11:00:31 -070040 const ByteString &bad_bytes) {
41 IPAddress good_addr(family);
42
43 EXPECT_TRUE(good_addr.SetAddressFromString(good_string));
44 EXPECT_EQ(IPAddress::GetAddressLength(family), good_addr.GetLength());
45 EXPECT_EQ(family, good_addr.family());
46 EXPECT_FALSE(good_addr.IsDefault());
47 EXPECT_EQ(0, memcmp(good_addr.GetConstData(), good_bytes.GetConstData(),
48 good_bytes.GetLength()));
49 EXPECT_TRUE(good_addr.address().Equals(good_bytes));
Paul Stewart188a84a2012-01-20 16:28:15 -080050 string address_string;
mukesh agrawal2c15d2c2012-02-21 16:09:21 -080051 EXPECT_TRUE(good_addr.IntoString(&address_string));
Paul Stewart188a84a2012-01-20 16:28:15 -080052 EXPECT_EQ(good_string, address_string);
Paul Stewart1d18e8c2011-07-15 11:00:31 -070053
54 IPAddress good_addr_from_bytes(family, good_bytes);
55 EXPECT_TRUE(good_addr.Equals(good_addr_from_bytes));
56
57 IPAddress bad_addr(family);
58 EXPECT_FALSE(bad_addr.SetAddressFromString(bad_string));
59 EXPECT_FALSE(good_addr.Equals(bad_addr));
60
61 EXPECT_FALSE(bad_addr.IsValid());
62
63 IPAddress bad_addr_from_bytes(family, bad_bytes);
64 EXPECT_EQ(family, bad_addr_from_bytes.family());
65 EXPECT_FALSE(bad_addr_from_bytes.IsValid());
66
67 EXPECT_FALSE(bad_addr.Equals(bad_addr_from_bytes));
mukesh agrawal2c15d2c2012-02-21 16:09:21 -080068 EXPECT_FALSE(bad_addr.IntoString(&address_string));
Paul Stewart1d18e8c2011-07-15 11:00:31 -070069 }
70};
71
72TEST_F(IPAddressTest, Statics) {
Paul Stewart7355ce12011-09-02 10:47:01 -070073 EXPECT_EQ(4, IPAddress::GetAddressLength(IPAddress::kFamilyIPv4));
74 EXPECT_EQ(16, IPAddress::GetAddressLength(IPAddress::kFamilyIPv6));
Paul Stewart1d18e8c2011-07-15 11:00:31 -070075
Darin Petkov14c29ec2012-03-02 11:34:19 +010076 EXPECT_EQ(0, IPAddress::GetPrefixLengthFromMask(IPAddress::kFamilyIPv4,
77 "0.0.0.0"));
78 EXPECT_EQ(20, IPAddress::GetPrefixLengthFromMask(IPAddress::kFamilyIPv4,
79 "255.255.240.0"));
80 EXPECT_EQ(32, IPAddress::GetPrefixLengthFromMask(IPAddress::kFamilyIPv4,
81 "255.255.255.255"));
82 EXPECT_EQ(32, IPAddress::GetPrefixLengthFromMask(IPAddress::kFamilyIPv4,
83 ""));
84 EXPECT_EQ(32, IPAddress::GetPrefixLengthFromMask(IPAddress::kFamilyIPv4,
85 "foo"));
86
Paul Stewart7355ce12011-09-02 10:47:01 -070087 IPAddress addr4(IPAddress::kFamilyIPv4);
Paul Stewart1d18e8c2011-07-15 11:00:31 -070088 addr4.SetAddressToDefault();
89
90 EXPECT_EQ(4, addr4.GetLength());
Paul Stewart7355ce12011-09-02 10:47:01 -070091 EXPECT_EQ(IPAddress::kFamilyIPv4, addr4.family());
Paul Stewart1d18e8c2011-07-15 11:00:31 -070092 EXPECT_TRUE(addr4.IsDefault());
93 EXPECT_TRUE(addr4.address().IsZero());
94 EXPECT_TRUE(addr4.address().Equals(ByteString(4)));
95
96
Paul Stewart7355ce12011-09-02 10:47:01 -070097 IPAddress addr6(IPAddress::kFamilyIPv6);
Paul Stewart1d18e8c2011-07-15 11:00:31 -070098 addr6.SetAddressToDefault();
99
100 EXPECT_EQ(16, addr6.GetLength());
Paul Stewart7355ce12011-09-02 10:47:01 -0700101 EXPECT_EQ(addr6.family(), IPAddress::kFamilyIPv6);
Paul Stewart1d18e8c2011-07-15 11:00:31 -0700102 EXPECT_TRUE(addr6.IsDefault());
103 EXPECT_TRUE(addr6.address().IsZero());
104 EXPECT_TRUE(addr6.address().Equals(ByteString(16)));
105
106 EXPECT_FALSE(addr4.Equals(addr6));
107}
108
109TEST_F(IPAddressTest, IPv4) {
Paul Stewart7355ce12011-09-02 10:47:01 -0700110 TestAddress(IPAddress::kFamilyIPv4,
Paul Stewart1d18e8c2011-07-15 11:00:31 -0700111 kV4String1, ByteString(kV4Address1, sizeof(kV4Address1)),
112 kV4String2, ByteString(kV4Address2, sizeof(kV4Address2)));
113}
114
115
116TEST_F(IPAddressTest, IPv6) {
Paul Stewart7355ce12011-09-02 10:47:01 -0700117 TestAddress(IPAddress::kFamilyIPv6,
Paul Stewart1d18e8c2011-07-15 11:00:31 -0700118 kV6String1, ByteString(kV6Address1, sizeof(kV6Address1)),
119 kV6String2, ByteString(kV6Address2, sizeof(kV6Address2)));
120}
121
Paul Stewartf7bf9bf2012-04-17 17:30:14 -0700122TEST_F(IPAddressTest, SetAddressAndPrefixFromString) {
123 IPAddress address(IPAddress::kFamilyIPv4);
124 const string kString1(kV4String1);
125 const string kString2(kV4String2);
126 EXPECT_FALSE(address.SetAddressAndPrefixFromString(""));
127 EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString1));
128 EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString1 + "/"));
129 EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString1 + "/10x"));
130 EXPECT_FALSE(address.SetAddressAndPrefixFromString(kString2 + "/10"));
131 EXPECT_TRUE(address.SetAddressAndPrefixFromString(kString1 + "/10"));
132 EXPECT_EQ(10, address.prefix());
133 ByteString kAddress1(kV4Address1, sizeof(kV4Address1));
134 EXPECT_TRUE(kAddress1.Equals(address.address()));
135}
136
137struct PrefixMapping {
138 PrefixMapping() : family(IPAddress::kFamilyUnknown), prefix(0) {}
139 PrefixMapping(IPAddress::Family family_in,
140 size_t prefix_in,
141 const string &expected_address_in)
142 : family(family_in),
143 prefix(prefix_in),
144 expected_address(expected_address_in) {}
145 IPAddress::Family family;
146 size_t prefix;
147 string expected_address;
148};
149
150class IPAddressPrefixMappingTest
151 : public testing::TestWithParam<PrefixMapping> {};
152
153TEST_P(IPAddressPrefixMappingTest, TestPrefixMapping) {
154 IPAddress address = IPAddress::GetAddressMaskFromPrefix(GetParam().family,
155 GetParam().prefix);
156 IPAddress expected_address(GetParam().family);
157 EXPECT_TRUE(expected_address.SetAddressFromString(
158 GetParam().expected_address));
159 EXPECT_TRUE(expected_address.Equals(address));
160}
161
162INSTANTIATE_TEST_CASE_P(
163 IPAddressPrefixMappingTestRun,
164 IPAddressPrefixMappingTest,
165 ::testing::Values(
166 PrefixMapping(IPAddress::kFamilyIPv4, 0, "0.0.0.0"),
167 PrefixMapping(IPAddress::kFamilyIPv4, 1, "128.0.0.0"),
168 PrefixMapping(IPAddress::kFamilyIPv4, 4, "240.0.0.0"),
169 PrefixMapping(IPAddress::kFamilyIPv4, 7, "254.0.0.0"),
170 PrefixMapping(IPAddress::kFamilyIPv4, 10, "255.192.0.0"),
171 PrefixMapping(IPAddress::kFamilyIPv4, 13, "255.248.0.0"),
172 PrefixMapping(IPAddress::kFamilyIPv4, 16, "255.255.0.0"),
173 PrefixMapping(IPAddress::kFamilyIPv4, 19, "255.255.224.0"),
174 PrefixMapping(IPAddress::kFamilyIPv4, 22, "255.255.252.0"),
175 PrefixMapping(IPAddress::kFamilyIPv4, 25, "255.255.255.128"),
176 PrefixMapping(IPAddress::kFamilyIPv4, 28, "255.255.255.240"),
177 PrefixMapping(IPAddress::kFamilyIPv4, 31, "255.255.255.254"),
178 PrefixMapping(IPAddress::kFamilyIPv4, 32, "255.255.255.255"),
179 PrefixMapping(IPAddress::kFamilyIPv4, 33, "255.255.255.255"),
180 PrefixMapping(IPAddress::kFamilyIPv4, 34, "255.255.255.255"),
181 PrefixMapping(IPAddress::kFamilyIPv6, 0, "0::"),
182 PrefixMapping(IPAddress::kFamilyIPv6, 1, "8000::"),
183 PrefixMapping(IPAddress::kFamilyIPv6, 17, "ffff:8000::"),
184 PrefixMapping(IPAddress::kFamilyIPv6, 34, "ffff:ffff:c000::"),
185 PrefixMapping(IPAddress::kFamilyIPv6, 51, "ffff:ffff:ffff:e000::"),
186 PrefixMapping(IPAddress::kFamilyIPv6, 68,
187 "ffff:ffff:ffff:ffff:f000::"),
188 PrefixMapping(IPAddress::kFamilyIPv6, 85,
189 "ffff:ffff:ffff:ffff:ffff:f800::"),
190 PrefixMapping(IPAddress::kFamilyIPv6, 102,
191 "ffff:ffff:ffff:ffff:ffff:ffff:fc00::"),
192 PrefixMapping(IPAddress::kFamilyIPv6, 119,
193 "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fe00"),
194 PrefixMapping(IPAddress::kFamilyIPv6, 128,
195 "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"),
196 PrefixMapping(IPAddress::kFamilyIPv6, 136,
197 "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")));
198
199struct MaskMapping {
200 MaskMapping() : family(IPAddress::kFamilyUnknown) {}
201 MaskMapping(IPAddress::Family family_in,
202 const string &address_a_in,
203 const string &address_b_in,
204 const string &expected_address_in)
205 : family(family_in),
206 address_a(address_a_in),
207 address_b(address_b_in),
208 expected_address(expected_address_in) {}
209 IPAddress::Family family;
210 string address_a;
211 string address_b;
212 string expected_address;
213};
214
215class IPAddressMaskMappingTest
216 : public testing::TestWithParam<MaskMapping> {};
217
218TEST_P(IPAddressMaskMappingTest, TestMaskMapping) {
219 IPAddress address_a(GetParam().family);
220 EXPECT_TRUE(address_a.SetAddressFromString(GetParam().address_a));
221 IPAddress address_b(GetParam().family);
222 EXPECT_TRUE(address_b.SetAddressFromString(GetParam().address_b));
223 IPAddress expected_address(GetParam().family);
224 EXPECT_TRUE(expected_address.SetAddressFromString(
225 GetParam().expected_address));
226 EXPECT_TRUE(expected_address.Equals(address_a.MaskWith(address_b)));
227}
228
229INSTANTIATE_TEST_CASE_P(
230 IPAddressMaskMappingTestRun,
231 IPAddressMaskMappingTest,
232 ::testing::Values(
233 MaskMapping(IPAddress::kFamilyIPv4,
234 "255.255.255.255", "0.0.0.0", "0.0.0.0"),
235 MaskMapping(IPAddress::kFamilyIPv4,
236 "0.0.0.0", "255.255.255.255", "0.0.0.0"),
237 MaskMapping(IPAddress::kFamilyIPv4,
238 "170.170.170.170", "85.85.85.85", "0.0.0.0"),
239 MaskMapping(IPAddress::kFamilyIPv4,
240 "238.187.119.221", "119.221.238.187", "102.153.102.153")));
241
242struct NetworkPartMapping {
243 NetworkPartMapping() : family(IPAddress::kFamilyUnknown) {}
244 NetworkPartMapping(IPAddress::Family family_in,
245 const string &address_in,
246 size_t prefix_in,
247 const string &expected_address_in)
248 : family(family_in),
249 address(address_in),
250 prefix(prefix_in),
251 expected_address(expected_address_in) {}
252 IPAddress::Family family;
253 string address;
254 size_t prefix;
255 string expected_address;
256};
257
258class IPAddressNetworkPartMappingTest
259 : public testing::TestWithParam<NetworkPartMapping> {};
260
261TEST_P(IPAddressNetworkPartMappingTest, TestNetworkPartMapping) {
262 IPAddress address(GetParam().family);
263 EXPECT_TRUE(address.SetAddressFromString(GetParam().address));
264 IPAddress expected_address(GetParam().family);
265 EXPECT_TRUE(expected_address.SetAddressFromString(
266 GetParam().expected_address));
267 address.set_prefix(GetParam().prefix);
268 EXPECT_TRUE(expected_address.Equals(address.GetNetworkPart()));
269}
270
271INSTANTIATE_TEST_CASE_P(
272 IPAddressNetworkPartMappingTestRun,
273 IPAddressNetworkPartMappingTest,
274 ::testing::Values(
275 NetworkPartMapping(IPAddress::kFamilyIPv4,
276 "255.255.255.255", 0, "0.0.0.0"),
277 NetworkPartMapping(IPAddress::kFamilyIPv4,
278 "255.255.255.255", 32, "255.255.255.255"),
279 NetworkPartMapping(IPAddress::kFamilyIPv4,
280 "255.255.255.255", 24, "255.255.255.0"),
281 NetworkPartMapping(IPAddress::kFamilyIPv4,
282 "255.255.255.255", 16, "255.255.0.0")));
283
284struct MinPrefixLengthMapping {
285 MinPrefixLengthMapping() : family(IPAddress::kFamilyUnknown) {}
286 MinPrefixLengthMapping(IPAddress::Family family_in,
287 const string &address_in,
288 size_t expected_min_prefix_in)
289 : family(family_in),
290 address(address_in),
291 expected_min_prefix(expected_min_prefix_in) {}
292 IPAddress::Family family;
293 string address;
294 size_t expected_min_prefix;
295};
296
297class IPAddressMinPrefixLengthMappingTest
298 : public testing::TestWithParam<MinPrefixLengthMapping> {};
299
300TEST_P(IPAddressMinPrefixLengthMappingTest, TestMinPrefixLengthMapping) {
301 IPAddress address(GetParam().family);
302 EXPECT_TRUE(address.SetAddressFromString(GetParam().address));
303 EXPECT_EQ(GetParam().expected_min_prefix, address.GetMinPrefixLength());
304}
305
306INSTANTIATE_TEST_CASE_P(
307 IPAddressMinPrefixLengthMappingTestRun,
308 IPAddressMinPrefixLengthMappingTest,
309 ::testing::Values(
310 MinPrefixLengthMapping(IPAddress::kFamilyIPv6, "fe80::", 128),
311 MinPrefixLengthMapping(IPAddress::kFamilyIPv4, "255.255.255.255", 32),
312 MinPrefixLengthMapping(IPAddress::kFamilyIPv4, "224.0.0.0", 32),
313 MinPrefixLengthMapping(IPAddress::kFamilyIPv4, "192.168.0.0", 24),
314 MinPrefixLengthMapping(IPAddress::kFamilyIPv4, "172.16.0.0", 16),
315 MinPrefixLengthMapping(IPAddress::kFamilyIPv4, "10.10.10.10", 8)));
316
317struct CanReachAddressMapping {
318 CanReachAddressMapping() : family(IPAddress::kFamilyUnknown) {}
319 CanReachAddressMapping(IPAddress::Family family_in,
320 const string &address_a_in,
321 const string &address_b_in,
322 bool expected_result_in)
323 : family(family_in),
324 address_a(address_a_in),
325 address_b(address_b_in),
326 expected_result(expected_result_in) {}
327 IPAddress::Family family;
328 string address_a;
329 string address_b;
330 size_t expected_result;
331};
332
333class IPAddressCanReachAddressMappingTest
334 : public testing::TestWithParam<CanReachAddressMapping> {};
335
336TEST_P(IPAddressCanReachAddressMappingTest, TestCanReachAddressMapping) {
337 IPAddress address_a(GetParam().family);
338 EXPECT_TRUE(address_a.SetAddressAndPrefixFromString(GetParam().address_a));
339 IPAddress address_b(GetParam().family);
340 EXPECT_TRUE(address_b.SetAddressAndPrefixFromString(GetParam().address_b));
341 EXPECT_EQ(GetParam().expected_result, address_a.CanReachAddress(address_b));
342}
343
344INSTANTIATE_TEST_CASE_P(
345 IPAddressCanReachAddressMappingTestRun,
346 IPAddressCanReachAddressMappingTest,
347 ::testing::Values(
348 CanReachAddressMapping(IPAddress::kFamilyIPv6,
349 "fe80:1000::/16", "fe80:2000::/16", true),
350 CanReachAddressMapping(IPAddress::kFamilyIPv6,
351 "fe80:1000::/16", "fe80:2000::/32", true),
352 CanReachAddressMapping(IPAddress::kFamilyIPv6,
353 "fe80:1000::/32", "fe80:2000::/16", false),
354 CanReachAddressMapping(IPAddress::kFamilyIPv4,
355 "192.168.1.1/24", "192.168.1.2/24", true),
356 CanReachAddressMapping(IPAddress::kFamilyIPv4,
357 "192.168.1.1/24", "192.168.2.2/24", false),
358 CanReachAddressMapping(IPAddress::kFamilyIPv4,
359 "192.168.1.1/16", "192.168.2.2/24", true),
360 CanReachAddressMapping(IPAddress::kFamilyIPv4,
361 "192.168.1.1/24", "192.168.2.2/16", false)));
362
Paul Stewart1d18e8c2011-07-15 11:00:31 -0700363} // namespace shill