1
#include "include/ipaddr.h"
2
#include "gtest/gtest.h"
6
static void ipv4(struct sockaddr_in *addr, const char *s) {
9
addr->sin_family = AF_INET;
10
err = inet_pton(AF_INET, s, &addr->sin_addr);
14
static void ipv6(struct sockaddr_in6 *addr, const char *s) {
17
addr->sin6_family = AF_INET6;
18
err = inet_pton(AF_INET6, s, &addr->sin6_addr);
22
TEST(CommonIPAddr, TestNotFound)
24
struct ifaddrs one, two;
25
struct sockaddr_in a_one;
26
struct sockaddr_in6 a_two;
27
struct sockaddr_in net;
28
const struct sockaddr *result;
31
one.ifa_addr = (struct sockaddr*)&a_one;
34
two.ifa_addr = (struct sockaddr*)&a_two;
36
ipv4(&a_one, "10.11.12.13");
37
ipv6(&a_two, "2001:1234:5678:90ab::cdef");
38
ipv4(&net, "10.11.234.56");
40
result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 24);
44
TEST(CommonIPAddr, TestV4_Simple)
46
struct ifaddrs one, two;
47
struct sockaddr_in a_one;
48
struct sockaddr_in6 a_two;
49
struct sockaddr_in net;
50
const struct sockaddr *result;
53
one.ifa_addr = (struct sockaddr*)&a_one;
56
two.ifa_addr = (struct sockaddr*)&a_two;
58
ipv4(&a_one, "10.11.12.13");
59
ipv6(&a_two, "2001:1234:5678:90ab::cdef");
60
ipv4(&net, "10.11.12.42");
62
result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 24);
63
ASSERT_EQ((struct sockaddr*)&a_one, result);
66
TEST(CommonIPAddr, TestV4_Prefix25)
68
struct ifaddrs one, two;
69
struct sockaddr_in a_one;
70
struct sockaddr_in a_two;
71
struct sockaddr_in net;
72
const struct sockaddr *result;
75
one.ifa_addr = (struct sockaddr*)&a_one;
78
two.ifa_addr = (struct sockaddr*)&a_two;
80
ipv4(&a_one, "10.11.12.13");
81
ipv4(&a_two, "10.11.12.129");
82
ipv4(&net, "10.11.12.128");
84
result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 25);
85
ASSERT_EQ((struct sockaddr*)&a_two, result);
88
TEST(CommonIPAddr, TestV4_PrefixTooLong)
91
struct sockaddr_in a_one;
92
struct sockaddr_in net;
93
const struct sockaddr *result;
96
one.ifa_addr = (struct sockaddr*)&a_one;
98
ipv4(&a_one, "10.11.12.13");
99
ipv4(&net, "10.11.12.12");
101
result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 42);
102
ASSERT_EQ(0, result);
105
TEST(CommonIPAddr, TestV4_PrefixZero)
107
struct ifaddrs one, two;
108
struct sockaddr_in6 a_one;
109
struct sockaddr_in a_two;
110
struct sockaddr_in net;
111
const struct sockaddr *result;
114
one.ifa_addr = (struct sockaddr*)&a_one;
117
two.ifa_addr = (struct sockaddr*)&a_two;
119
ipv6(&a_one, "2001:1234:5678:900F::cdef");
120
ipv4(&a_two, "10.1.2.3");
121
ipv4(&net, "255.0.1.2");
123
result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 0);
124
ASSERT_EQ((struct sockaddr*)&a_two, result);
127
TEST(CommonIPAddr, TestV6_Simple)
129
struct ifaddrs one, two;
130
struct sockaddr_in a_one;
131
struct sockaddr_in6 a_two;
132
struct sockaddr_in6 net;
133
const struct sockaddr *result;
136
one.ifa_addr = (struct sockaddr*)&a_one;
139
two.ifa_addr = (struct sockaddr*)&a_two;
141
ipv4(&a_one, "10.11.12.13");
142
ipv6(&a_two, "2001:1234:5678:90ab::cdef");
143
ipv6(&net, "2001:1234:5678:90ab::dead:beef");
145
result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 64);
146
ASSERT_EQ((struct sockaddr*)&a_two, result);
149
TEST(CommonIPAddr, TestV6_Prefix57)
151
struct ifaddrs one, two;
152
struct sockaddr_in6 a_one;
153
struct sockaddr_in6 a_two;
154
struct sockaddr_in6 net;
155
const struct sockaddr *result;
158
one.ifa_addr = (struct sockaddr*)&a_one;
161
two.ifa_addr = (struct sockaddr*)&a_two;
163
ipv6(&a_one, "2001:1234:5678:900F::cdef");
164
ipv6(&a_two, "2001:1234:5678:90ab::cdef");
165
ipv6(&net, "2001:1234:5678:90ab::dead:beef");
167
result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 57);
168
ASSERT_EQ((struct sockaddr*)&a_two, result);
171
TEST(CommonIPAddr, TestV6_PrefixTooLong)
174
struct sockaddr_in6 a_one;
175
struct sockaddr_in6 net;
176
const struct sockaddr *result;
179
one.ifa_addr = (struct sockaddr*)&a_one;
181
ipv6(&a_one, "2001:1234:5678:900F::cdef");
182
ipv6(&net, "2001:1234:5678:900F::cdee");
184
result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 9000);
185
ASSERT_EQ(0, result);
188
TEST(CommonIPAddr, TestV6_PrefixZero)
190
struct ifaddrs one, two;
191
struct sockaddr_in a_one;
192
struct sockaddr_in6 a_two;
193
struct sockaddr_in6 net;
194
const struct sockaddr *result;
197
one.ifa_addr = (struct sockaddr*)&a_one;
200
two.ifa_addr = (struct sockaddr*)&a_two;
202
ipv4(&a_one, "10.2.3.4");
203
ipv6(&a_two, "2001:f00b::1");
204
ipv6(&net, "ff00::1");
206
result = find_ip_in_subnet(&one, (struct sockaddr*)&net, 0);
207
ASSERT_EQ((struct sockaddr*)&a_two, result);
210
TEST(CommonIPAddr, ParseNetwork_Empty)
212
struct sockaddr network;
213
unsigned int prefix_len;
216
ok = parse_network("", &network, &prefix_len);
217
ASSERT_EQ(false, ok);
220
TEST(CommonIPAddr, ParseNetwork_Bad_Junk)
222
struct sockaddr network;
223
unsigned int prefix_len;
226
ok = parse_network("foo", &network, &prefix_len);
227
ASSERT_EQ(false, ok);
230
TEST(CommonIPAddr, ParseNetwork_Bad_SlashNum)
232
struct sockaddr network;
233
unsigned int prefix_len;
236
ok = parse_network("/24", (struct sockaddr*)&network, &prefix_len);
237
ASSERT_EQ(false, ok);
240
TEST(CommonIPAddr, ParseNetwork_Bad_Slash)
242
struct sockaddr network;
243
unsigned int prefix_len;
246
ok = parse_network("/", (struct sockaddr*)&network, &prefix_len);
247
ASSERT_EQ(false, ok);
250
TEST(CommonIPAddr, ParseNetwork_Bad_IPv4)
252
struct sockaddr network;
253
unsigned int prefix_len;
256
ok = parse_network("123.123.123.123", &network, &prefix_len);
257
ASSERT_EQ(false, ok);
260
TEST(CommonIPAddr, ParseNetwork_Bad_IPv4Slash)
262
struct sockaddr network;
263
unsigned int prefix_len;
266
ok = parse_network("123.123.123.123/", &network, &prefix_len);
267
ASSERT_EQ(false, ok);
270
TEST(CommonIPAddr, ParseNetwork_Bad_IPv4SlashNegative)
272
struct sockaddr network;
273
unsigned int prefix_len;
276
ok = parse_network("123.123.123.123/-3", &network, &prefix_len);
277
ASSERT_EQ(false, ok);
280
TEST(CommonIPAddr, ParseNetwork_Bad_IPv4SlashJunk)
282
struct sockaddr network;
283
unsigned int prefix_len;
286
ok = parse_network("123.123.123.123/foo", &network, &prefix_len);
287
ASSERT_EQ(false, ok);
290
TEST(CommonIPAddr, ParseNetwork_Bad_IPv6)
292
struct sockaddr network;
293
unsigned int prefix_len;
296
ok = parse_network("2001:1234:5678:90ab::dead:beef", &network, &prefix_len);
297
ASSERT_EQ(false, ok);
300
TEST(CommonIPAddr, ParseNetwork_Bad_IPv6Slash)
302
struct sockaddr network;
303
unsigned int prefix_len;
306
ok = parse_network("2001:1234:5678:90ab::dead:beef/", &network, &prefix_len);
307
ASSERT_EQ(false, ok);
310
TEST(CommonIPAddr, ParseNetwork_Bad_IPv6SlashNegative)
312
struct sockaddr network;
313
unsigned int prefix_len;
316
ok = parse_network("2001:1234:5678:90ab::dead:beef/-3", &network, &prefix_len);
317
ASSERT_EQ(false, ok);
320
TEST(CommonIPAddr, ParseNetwork_Bad_IPv6SlashJunk)
322
struct sockaddr network;
323
unsigned int prefix_len;
326
ok = parse_network("2001:1234:5678:90ab::dead:beef/foo", &network, &prefix_len);
327
ASSERT_EQ(false, ok);
330
TEST(CommonIPAddr, ParseNetwork_IPv4_0)
332
struct sockaddr_in network;
333
unsigned int prefix_len;
336
ok = parse_network("123.123.123.123/0", (struct sockaddr*)&network, &prefix_len);
338
ASSERT_EQ(0U, prefix_len);
339
ASSERT_EQ(AF_INET, network.sin_family);
340
ASSERT_EQ(0, network.sin_port);
341
struct sockaddr_in want;
342
ipv4(&want, "123.123.123.123");
343
ASSERT_EQ(want.sin_addr.s_addr, network.sin_addr.s_addr);
346
TEST(CommonIPAddr, ParseNetwork_IPv4_13)
348
struct sockaddr_in network;
349
unsigned int prefix_len;
352
ok = parse_network("123.123.123.123/13", (struct sockaddr*)&network, &prefix_len);
354
ASSERT_EQ(13U, prefix_len);
355
ASSERT_EQ(AF_INET, network.sin_family);
356
ASSERT_EQ(0, network.sin_port);
357
struct sockaddr_in want;
358
ipv4(&want, "123.123.123.123");
359
ASSERT_EQ(want.sin_addr.s_addr, network.sin_addr.s_addr);
362
TEST(CommonIPAddr, ParseNetwork_IPv4_32)
364
struct sockaddr_in network;
365
unsigned int prefix_len;
368
ok = parse_network("123.123.123.123/32", (struct sockaddr*)&network, &prefix_len);
370
ASSERT_EQ(32U, prefix_len);
371
ASSERT_EQ(AF_INET, network.sin_family);
372
ASSERT_EQ(0, network.sin_port);
373
struct sockaddr_in want;
374
ipv4(&want, "123.123.123.123");
375
ASSERT_EQ(want.sin_addr.s_addr, network.sin_addr.s_addr);
378
TEST(CommonIPAddr, ParseNetwork_IPv4_42)
380
struct sockaddr_in network;
381
unsigned int prefix_len;
384
ok = parse_network("123.123.123.123/42", (struct sockaddr*)&network, &prefix_len);
386
ASSERT_EQ(42U, prefix_len);
387
ASSERT_EQ(AF_INET, network.sin_family);
388
ASSERT_EQ(0, network.sin_port);
389
struct sockaddr_in want;
390
ipv4(&want, "123.123.123.123");
391
ASSERT_EQ(want.sin_addr.s_addr, network.sin_addr.s_addr);
394
TEST(CommonIPAddr, ParseNetwork_IPv6_0)
396
struct sockaddr_in6 network;
397
unsigned int prefix_len;
400
ok = parse_network("2001:1234:5678:90ab::dead:beef/0", (struct sockaddr*)&network, &prefix_len);
402
ASSERT_EQ(0U, prefix_len);
403
ASSERT_EQ(AF_INET6, network.sin6_family);
404
ASSERT_EQ(0, network.sin6_port);
405
struct sockaddr_in6 want;
406
ipv6(&want, "2001:1234:5678:90ab::dead:beef");
407
ASSERT_EQ(0, memcmp(want.sin6_addr.s6_addr, network.sin6_addr.s6_addr, sizeof(network.sin6_addr.s6_addr)));
410
TEST(CommonIPAddr, ParseNetwork_IPv6_67)
412
struct sockaddr_in6 network;
413
unsigned int prefix_len;
416
ok = parse_network("2001:1234:5678:90ab::dead:beef/67", (struct sockaddr*)&network, &prefix_len);
418
ASSERT_EQ(67U, prefix_len);
419
ASSERT_EQ(AF_INET6, network.sin6_family);
420
ASSERT_EQ(0, network.sin6_port);
421
struct sockaddr_in6 want;
422
ipv6(&want, "2001:1234:5678:90ab::dead:beef");
423
ASSERT_EQ(0, memcmp(want.sin6_addr.s6_addr, network.sin6_addr.s6_addr, sizeof(network.sin6_addr.s6_addr)));
426
TEST(CommonIPAddr, ParseNetwork_IPv6_128)
428
struct sockaddr_in6 network;
429
unsigned int prefix_len;
432
ok = parse_network("2001:1234:5678:90ab::dead:beef/128", (struct sockaddr*)&network, &prefix_len);
434
ASSERT_EQ(128U, prefix_len);
435
ASSERT_EQ(AF_INET6, network.sin6_family);
436
ASSERT_EQ(0, network.sin6_port);
437
struct sockaddr_in6 want;
438
ipv6(&want, "2001:1234:5678:90ab::dead:beef");
439
ASSERT_EQ(0, memcmp(want.sin6_addr.s6_addr, network.sin6_addr.s6_addr, sizeof(network.sin6_addr.s6_addr)));
442
TEST(CommonIPAddr, ParseNetwork_IPv6_9000)
444
struct sockaddr_in6 network;
445
unsigned int prefix_len;
448
ok = parse_network("2001:1234:5678:90ab::dead:beef/9000", (struct sockaddr*)&network, &prefix_len);
450
ASSERT_EQ(9000U, prefix_len);
451
ASSERT_EQ(AF_INET6, network.sin6_family);
452
ASSERT_EQ(0, network.sin6_port);
453
struct sockaddr_in6 want;
454
ipv6(&want, "2001:1234:5678:90ab::dead:beef");
455
ASSERT_EQ(0, memcmp(want.sin6_addr.s6_addr, network.sin6_addr.s6_addr, sizeof(network.sin6_addr.s6_addr)));