]> git.ipfire.org Git - thirdparty/squid.git/blame - src/ip/testIpAddress.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / ip / testIpAddress.cc
CommitLineData
8e46cda5 1#define SQUID_UNIT_TEST 1
b610642c 2#include "config.h"
27bc2077 3#include "compat/getaddrinfo.h"
27e059d4
AJ
4#include "testIpAddress.h"
5#include "ip/IpAddress.h"
41d93087 6
27e059d4 7#if HAVE_CSTRING
b610642c 8#include <cstring>
27e059d4
AJ
9#endif
10#if HAVE_NETINET_IN_H
41d93087 11#include <netinet/in.h>
27e059d4
AJ
12#endif
13#if HAVE_ARPA_INET_H
41d93087 14#include <arpa/inet.h>
27e059d4
AJ
15#endif
16#if HAVE_NETDB_H
41d93087 17#include <netdb.h>
27e059d4
AJ
18#endif
19#if HAVE_STRING
41d93087 20#include <string>
27e059d4
AJ
21#endif
22#if HAVE_STDEXCEPT
23#include <stdexcept>
24#endif
41d93087 25
41d93087 26
565b233e 27CPPUNIT_TEST_SUITE_REGISTRATION( testIpAddress );
41d93087 28
d7bbb487
AJ
29/* so that we don't break POD dependency just for the test */
30struct timeval current_time;
31double current_dtime;
32time_t squid_curtime = 0;
82b7abe3 33int shutting_down = 0;
41d93087 34
35void
565b233e 36testIpAddress::testDefaults()
41d93087 37{
b7ac5457 38 Ip::Address anIPA;
41d93087 39
40 /* test stored values */
41 CPPUNIT_ASSERT( anIPA.IsAnyAddr() );
42 CPPUNIT_ASSERT( !anIPA.IsNoAddr() );
43 CPPUNIT_ASSERT( anIPA.IsIPv4() );
44 CPPUNIT_ASSERT( !anIPA.IsSockAddr() );
45 CPPUNIT_ASSERT_EQUAL( (u_short) 0 , anIPA.GetPort() );
46#if USE_IPV6
47 CPPUNIT_ASSERT( anIPA.IsIPv6() );
48#else
49 CPPUNIT_ASSERT( !anIPA.IsIPv6() );
50#endif
51}
52
53void
565b233e 54testIpAddress::testInAddrConstructor()
41d93087 55{
56 struct in_addr inval;
57 struct in_addr outval;
58
59 inval.s_addr = htonl(0xC0A8640C);
60 outval.s_addr = htonl(0x00000000);
61
b7ac5457 62 Ip::Address anIPA(inval);
41d93087 63
64 /* test stored values */
65 CPPUNIT_ASSERT( !anIPA.IsAnyAddr() );
66 CPPUNIT_ASSERT( !anIPA.IsNoAddr() );
67 CPPUNIT_ASSERT( anIPA.IsIPv4() );
68 CPPUNIT_ASSERT( !anIPA.IsIPv6() );
69 CPPUNIT_ASSERT( !anIPA.IsSockAddr() );
70 CPPUNIT_ASSERT_EQUAL( (u_short) 0 , anIPA.GetPort() );
71 anIPA.GetInAddr(outval);
72 CPPUNIT_ASSERT( memcmp(&inval, &outval, sizeof(struct in_addr)) == 0 );
73}
74
75#if USE_IPV6
76void
565b233e 77testIpAddress::testInAddr6Constructor()
41d93087 78{
79 struct in6_addr inval;
80 struct in6_addr outval = IN6ADDR_ANY_INIT;
81
82 inval.s6_addr32[0] = htonl(0xC0A8640C);
83 inval.s6_addr32[1] = htonl(0xFFFFFFFF);
84 inval.s6_addr32[2] = htonl(0xFFFFFFFF);
85 inval.s6_addr32[3] = htonl(0xFFFFFFFF);
86
b7ac5457 87 Ip::Address anIPA(inval);
41d93087 88
89 /* test stored values */
90 CPPUNIT_ASSERT( !anIPA.IsAnyAddr() );
91 CPPUNIT_ASSERT( !anIPA.IsNoAddr() );
92 CPPUNIT_ASSERT( !anIPA.IsIPv4() );
93 CPPUNIT_ASSERT( anIPA.IsIPv6() );
94 CPPUNIT_ASSERT( !anIPA.IsSockAddr() );
95 CPPUNIT_ASSERT_EQUAL( (u_short) 0 , anIPA.GetPort() );
96 anIPA.GetInAddr(outval);
97 CPPUNIT_ASSERT( memcmp( &inval, &outval, sizeof(struct in6_addr)) == 0 );
98}
99#endif
100
101void
565b233e 102testIpAddress::testSockAddrConstructor()
41d93087 103{
104 struct sockaddr_in insock;
105 struct sockaddr_in outsock;
106
107 memset(&insock, 0, sizeof(struct sockaddr_in));
108 memset(&outsock, 0, sizeof(struct sockaddr_in));
109
110 insock.sin_family = AF_INET;
111 insock.sin_port = htons(80);
112 insock.sin_addr.s_addr = htonl(0xC0A8640C);
1ef0b9ce
AJ
113#if HAVE_SIN_LEN_IN_SAI
114 insock.sin_len = sizeof(struct sockaddr_in);
115#endif
41d93087 116
b7ac5457 117 Ip::Address anIPA((const struct sockaddr_in)insock);
41d93087 118
119 /* test stored values */
120 CPPUNIT_ASSERT( !anIPA.IsAnyAddr() );
121 CPPUNIT_ASSERT( !anIPA.IsNoAddr() );
122 CPPUNIT_ASSERT( anIPA.IsIPv4() );
123 CPPUNIT_ASSERT( !anIPA.IsIPv6() );
124 CPPUNIT_ASSERT( anIPA.IsSockAddr() );
125 CPPUNIT_ASSERT_EQUAL( (u_short) 80 , anIPA.GetPort() );
126 anIPA.GetSockAddr(outsock);
127 CPPUNIT_ASSERT( memcmp( &insock, &outsock, sizeof(struct sockaddr_in)) == 0 );
128}
129
130#if USE_IPV6
131void
565b233e 132testIpAddress::testSockAddr6Constructor()
41d93087 133{
134 struct sockaddr_in6 insock;
135 struct sockaddr_in6 outsock;
136
137 memset(&insock, 0, sizeof(struct sockaddr_in6));
138 memset(&outsock, 0, sizeof(struct sockaddr_in6));
139
140 insock.sin6_family = AF_INET6;
141 insock.sin6_port = htons(80);
142 insock.sin6_addr.s6_addr32[0] = htonl(0xFFFFFFFF);
143 insock.sin6_addr.s6_addr32[1] = htonl(0x00000000);
144 insock.sin6_addr.s6_addr32[2] = htonl(0x0000FFFF);
145 insock.sin6_addr.s6_addr32[3] = htonl(0xC0A8640C);
1ef0b9ce
AJ
146#if HAVE_SIN6_LEN_IN_SAI
147 insock.sin6_len = sizeof(struct sockaddr_in6);
148#endif
41d93087 149
b7ac5457 150 Ip::Address anIPA((const struct sockaddr_in6)insock);
41d93087 151
152 /* test stored values */
153 CPPUNIT_ASSERT( !anIPA.IsAnyAddr() );
154 CPPUNIT_ASSERT( !anIPA.IsNoAddr() );
155 CPPUNIT_ASSERT( !anIPA.IsIPv4() );
156 CPPUNIT_ASSERT( anIPA.IsIPv6() );
157 CPPUNIT_ASSERT( anIPA.IsSockAddr() );
158 CPPUNIT_ASSERT_EQUAL( (u_short) 80 , anIPA.GetPort() );
159 anIPA.GetSockAddr(outsock);
160 CPPUNIT_ASSERT( memcmp( &insock, &outsock, sizeof(struct sockaddr_in6)) == 0 );
161}
162#endif
163
164
165void
565b233e 166testIpAddress::testCopyConstructor()
41d93087 167{
168 struct sockaddr_in insock;
169 struct sockaddr_in outsock;
170
171 memset(&insock, 0, sizeof(struct sockaddr_in));
172 memset(&outsock, 0, sizeof(struct sockaddr_in));
173
174 insock.sin_family = AF_INET;
175 insock.sin_port = htons(80);
176 insock.sin_addr.s_addr = htonl(0xC0A8640C);
1ef0b9ce
AJ
177#if HAVE_SIN_LEN_IN_SAI
178 insock.sin_len = sizeof(struct sockaddr_in);
179#endif
41d93087 180
b7ac5457
AJ
181 Ip::Address inIPA(insock);
182 Ip::Address outIPA(inIPA);
41d93087 183
184
185 /* test stored values */
186 CPPUNIT_ASSERT( !outIPA.IsAnyAddr() );
187 CPPUNIT_ASSERT( !outIPA.IsNoAddr() );
188 CPPUNIT_ASSERT( outIPA.IsIPv4() );
189 CPPUNIT_ASSERT( !outIPA.IsIPv6() );
190 CPPUNIT_ASSERT( outIPA.IsSockAddr() );
191 CPPUNIT_ASSERT_EQUAL( (u_short) 80 , outIPA.GetPort() );
192 outIPA.GetSockAddr(outsock);
193 CPPUNIT_ASSERT( memcmp( &insock, &outsock, sizeof(struct sockaddr_in)) == 0 );
194}
195
196void
565b233e 197testIpAddress::testHostentConstructor()
41d93087 198{
199 struct hostent *hp = NULL;
200 struct in_addr outval;
201 struct in_addr expectval;
202
203 expectval.s_addr = htonl(0xC0A8640C);
204
205 hp = gethostbyname("192.168.100.12");
206 CPPUNIT_ASSERT( hp != NULL /* gethostbyname failure.*/ );
207
b7ac5457 208 Ip::Address anIPA(*hp);
41d93087 209
210 /* test stored values */
211 CPPUNIT_ASSERT( !anIPA.IsAnyAddr() );
212 CPPUNIT_ASSERT( !anIPA.IsNoAddr() );
213 CPPUNIT_ASSERT( anIPA.IsIPv4() );
214 CPPUNIT_ASSERT( !anIPA.IsIPv6() );
215 CPPUNIT_ASSERT( !anIPA.IsSockAddr() );
216 CPPUNIT_ASSERT_EQUAL( (u_short) 0 , anIPA.GetPort() );
217 anIPA.GetInAddr(outval);
218 CPPUNIT_ASSERT( memcmp( &expectval, &outval, sizeof(struct in_addr)) == 0 );
219}
220
221void
565b233e 222testIpAddress::testStringConstructor()
41d93087 223{
224 struct in_addr outval;
225 struct in_addr expectval;
226
227 expectval.s_addr = htonl(0xC0A8640C);
228
b7ac5457 229 Ip::Address anIPA = "192.168.100.12";
41d93087 230
231 /* test stored values */
232 CPPUNIT_ASSERT( !anIPA.IsAnyAddr() );
233 CPPUNIT_ASSERT( !anIPA.IsNoAddr() );
234 CPPUNIT_ASSERT( anIPA.IsIPv4() );
235 CPPUNIT_ASSERT( !anIPA.IsIPv6() );
236 CPPUNIT_ASSERT_EQUAL( (u_short) 0 , anIPA.GetPort() );
237 CPPUNIT_ASSERT( !anIPA.IsSockAddr() );
238 anIPA.GetInAddr(outval);
239 CPPUNIT_ASSERT( memcmp( &expectval, &outval, sizeof(struct in_addr)) == 0 );
240
241#if USE_IPV6
242 struct in6_addr expectv6;
243 struct in6_addr outval6;
244
245 expectv6.s6_addr32[0] = htonl(0x20000800);
246 expectv6.s6_addr32[1] = htonl(0x00000000);
247 expectv6.s6_addr32[2] = htonl(0x00000000);
248 expectv6.s6_addr32[3] = htonl(0x00000045);
249
b7ac5457 250 Ip::Address bnIPA = "2000:800::45";
41d93087 251
252 /* test stored values */
253 CPPUNIT_ASSERT( !bnIPA.IsAnyAddr() );
254 CPPUNIT_ASSERT( !bnIPA.IsNoAddr() );
255 CPPUNIT_ASSERT( !bnIPA.IsIPv4() );
256 CPPUNIT_ASSERT( bnIPA.IsIPv6() );
257 CPPUNIT_ASSERT( !bnIPA.IsSockAddr() );
258 CPPUNIT_ASSERT_EQUAL( (u_short) 0 , bnIPA.GetPort() );
259 bnIPA.GetInAddr(outval6);
260 CPPUNIT_ASSERT( memcmp( &expectv6, &outval6, sizeof(struct in6_addr)) == 0 );
261
262 /* test IPv6 as an old netmask format. This is invalid but sometimes use. */
b7ac5457 263 Ip::Address cnIPA = "ffff:ffff:fff0::";
41d93087 264
265 expectv6.s6_addr32[0] = htonl(0xFFFFFFFF);
266 expectv6.s6_addr32[1] = htonl(0xFFF00000);
267 expectv6.s6_addr32[2] = htonl(0x00000000);
268 expectv6.s6_addr32[3] = htonl(0x00000000);
269
270 /* test stored values */
271 CPPUNIT_ASSERT( !cnIPA.IsAnyAddr() );
272 CPPUNIT_ASSERT( !cnIPA.IsNoAddr() );
273 CPPUNIT_ASSERT( !cnIPA.IsIPv4() );
274 CPPUNIT_ASSERT( cnIPA.IsIPv6() );
275 CPPUNIT_ASSERT( !cnIPA.IsSockAddr() );
276 CPPUNIT_ASSERT_EQUAL( (u_short) 0 , cnIPA.GetPort() );
277 cnIPA.GetInAddr(outval6);
278 CPPUNIT_ASSERT( memcmp( &expectv6, &outval6, sizeof(struct in6_addr)) == 0 );
279#endif
280}
281
282void
565b233e 283testIpAddress::testSetEmpty()
41d93087 284{
b7ac5457 285 Ip::Address anIPA;
41d93087 286 struct in_addr inval;
287
288 inval.s_addr = htonl(0xC0A8640C);
289
290 anIPA = inval;
291
292 /* test stored values before empty */
293 CPPUNIT_ASSERT( !anIPA.IsAnyAddr() );
294 CPPUNIT_ASSERT( !anIPA.IsNoAddr() );
295 CPPUNIT_ASSERT( anIPA.IsIPv4() );
296 CPPUNIT_ASSERT( !anIPA.IsIPv6() );
297 CPPUNIT_ASSERT( !anIPA.IsSockAddr() );
298 CPPUNIT_ASSERT_EQUAL( (u_short) 0 , anIPA.GetPort() );
299
300 anIPA.SetEmpty();
301
302 /* test stored values after empty */
303 CPPUNIT_ASSERT( anIPA.IsAnyAddr() );
304 CPPUNIT_ASSERT( !anIPA.IsNoAddr() );
305 CPPUNIT_ASSERT( anIPA.IsIPv4() );
306#if USE_IPV6
307 CPPUNIT_ASSERT( anIPA.IsIPv6() );
308#else
309 CPPUNIT_ASSERT( !anIPA.IsIPv6() );
310#endif
311 CPPUNIT_ASSERT( !anIPA.IsSockAddr() );
312 CPPUNIT_ASSERT_EQUAL( (u_short) 0 , anIPA.GetPort() );
313}
314
315void
565b233e 316testIpAddress::testBooleans()
41d93087 317{
b7ac5457
AJ
318 Ip::Address lhsIPA;
319 Ip::Address rhsIPA;
41d93087 320 struct in_addr valLow;
321 struct in_addr valHigh;
322
323 valLow.s_addr = htonl(0xC0A8640C);
324 valHigh.s_addr = htonl(0xC0A8640F);
325
26ac0430
AJ
326 /* test equality */
327 lhsIPA = valLow;
328 rhsIPA = valLow;
329 CPPUNIT_ASSERT( lhsIPA.matchIPAddr(rhsIPA) == 0 );
330 CPPUNIT_ASSERT( ( lhsIPA == rhsIPA ) );
331 CPPUNIT_ASSERT( !( lhsIPA != rhsIPA ) );
332 CPPUNIT_ASSERT( ( lhsIPA >= rhsIPA ) );
333 CPPUNIT_ASSERT( !( lhsIPA > rhsIPA ) );
334 CPPUNIT_ASSERT( ( lhsIPA <= rhsIPA ) );
335 CPPUNIT_ASSERT( !( lhsIPA < rhsIPA ) );
336
337 /* test inequality (less than) */
338 lhsIPA = valLow;
339 rhsIPA = valHigh;
340 CPPUNIT_ASSERT( lhsIPA.matchIPAddr(rhsIPA) < 0 );
341 CPPUNIT_ASSERT( !( lhsIPA == rhsIPA ) );
342 CPPUNIT_ASSERT( ( lhsIPA != rhsIPA ) );
343 CPPUNIT_ASSERT( !( lhsIPA >= rhsIPA ) );
344 CPPUNIT_ASSERT( !( lhsIPA > rhsIPA ) );
345 CPPUNIT_ASSERT( ( lhsIPA <= rhsIPA ) );
346 CPPUNIT_ASSERT( ( lhsIPA < rhsIPA ) );
347
348 /* test inequality (greater than) */
349 lhsIPA = valHigh;
350 rhsIPA = valLow;
351 CPPUNIT_ASSERT( lhsIPA.matchIPAddr(rhsIPA) > 0 );
352 CPPUNIT_ASSERT( !( lhsIPA == rhsIPA ) );
353 CPPUNIT_ASSERT( ( lhsIPA != rhsIPA ) );
354 CPPUNIT_ASSERT( ( lhsIPA >= rhsIPA ) );
355 CPPUNIT_ASSERT( ( lhsIPA > rhsIPA ) );
356 CPPUNIT_ASSERT( !( lhsIPA <= rhsIPA ) );
357 CPPUNIT_ASSERT( !( lhsIPA < rhsIPA ) );
41d93087 358
359}
360
361void
565b233e 362testIpAddress::testNtoA()
41d93087 363{
364 struct in_addr inval;
365 char buf[MAX_IPSTRLEN];
b7ac5457 366 Ip::Address anIPA;
41d93087 367
368 anIPA.SetAnyAddr();
369
370 /* test AnyAddr display values */
371#if USE_IPV6
372 CPPUNIT_ASSERT( memcmp("::", anIPA.NtoA(buf,MAX_IPSTRLEN), 2) == 0 );
373#else
374 CPPUNIT_ASSERT( memcmp("0.0.0.0",anIPA.NtoA(buf,MAX_IPSTRLEN), 7) == 0 );
375#endif
376
377 inval.s_addr = htonl(0xC0A8640C);
378 anIPA = inval;
379
380 /* test IP display */
381 CPPUNIT_ASSERT( memcmp("192.168.100.12",anIPA.NtoA(buf,MAX_IPSTRLEN), 14) == 0 );
382
383 anIPA.SetNoAddr();
384
385 /* test NoAddr display values */
386#if USE_IPV6
387 CPPUNIT_ASSERT( memcmp("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",anIPA.NtoA(buf,MAX_IPSTRLEN), 39) == 0 );
388#else
389 CPPUNIT_ASSERT( memcmp("255.255.255.255",anIPA.NtoA(buf,MAX_IPSTRLEN), 15) == 0 );
390#endif
391}
392
393void
565b233e 394testIpAddress::testToURL_fromInAddr()
41d93087 395{
26ac0430
AJ
396 char buf[MAX_IPSTRLEN];
397 buf[0] = '\0';
41d93087 398 struct in_addr inval;
399
400 inval.s_addr = htonl(0xC0A8640C);
401
b7ac5457 402 Ip::Address anIPA(inval);
41d93087 403
404 /* test values */
405 anIPA.ToURL(buf,MAX_IPSTRLEN);
406 CPPUNIT_ASSERT( memcmp("192.168.100.12", buf, 14) == 0 );
407
408#if USE_IPV6
409
410 /* test output when constructed from in6_addr with IPv6 */
411 struct in6_addr ip6val;
412
413 ip6val.s6_addr32[0] = htonl(0xC0A8640C);
414 ip6val.s6_addr32[1] = htonl(0xFFFFFFFF);
415 ip6val.s6_addr32[2] = htonl(0xFFFFFFFF);
416 ip6val.s6_addr32[3] = htonl(0xFFFFFFFF);
417
b7ac5457 418 Ip::Address bnIPA(ip6val);
41d93087 419
420 bnIPA.ToURL(buf,MAX_IPSTRLEN);
421 CPPUNIT_ASSERT( memcmp("[c0a8:640c:ffff:ffff:ffff:ffff:ffff:ffff]", buf, 41) == 0 );
422
423#endif
424}
425
426void
565b233e 427testIpAddress::testToURL_fromSockAddr()
41d93087 428{
429 struct sockaddr_in sock;
430 sock.sin_addr.s_addr = htonl(0xC0A8640C);
431 sock.sin_port = htons(80);
432 sock.sin_family = AF_INET;
1ef0b9ce
AJ
433#if HAVE_SIN_LEN_IN_SAI
434 sock.sin_len = sizeof(struct sockaddr_in);
435#endif
436
b7ac5457 437 Ip::Address anIPA(sock);
41d93087 438 char buf[MAX_IPSTRLEN];
439
440 /* test values */
441 anIPA.ToURL(buf,MAX_IPSTRLEN);
442 CPPUNIT_ASSERT( memcmp("192.168.100.12:80", buf, 17) == 0 );
443
444#if USE_IPV6
445
446 /* test output when constructed from in6_addr with IPv6 */
447 struct sockaddr_in6 ip6val;
448
449 ip6val.sin6_addr.s6_addr32[0] = htonl(0xC0A8640C);
450 ip6val.sin6_addr.s6_addr32[1] = htonl(0xFFFFFFFF);
451 ip6val.sin6_addr.s6_addr32[2] = htonl(0xFFFFFFFF);
452 ip6val.sin6_addr.s6_addr32[3] = htonl(0xFFFFFFFF);
453 ip6val.sin6_port = htons(80);
454 ip6val.sin6_family = AF_INET6;
1ef0b9ce
AJ
455#if HAVE_SIN6_LEN_IN_SAI
456 ip6val.sin6_len = sizeof(struct sockaddr_in6);
457#endif
41d93087 458
b7ac5457 459 Ip::Address bnIPA(ip6val);
41d93087 460
461 bnIPA.ToURL(buf,MAX_IPSTRLEN);
462 CPPUNIT_ASSERT( memcmp("[c0a8:640c:ffff:ffff:ffff:ffff:ffff:ffff]:80", buf, 44) == 0 );
463
464#endif
465
466}
467
468void
565b233e 469testIpAddress::testGetReverseString()
41d93087 470{
471 char buf[MAX_IPSTRLEN];
472
473 struct in_addr ipv4val;
474 ipv4val.s_addr = htonl(0xC0A8640C);
475
b7ac5457 476 Ip::Address v4IPA(ipv4val);
41d93087 477
478 /* test IPv4 output */
479 v4IPA.GetReverseString(buf);
480 CPPUNIT_ASSERT( memcmp("12.100.168.192.in-addr.arpa.",buf, 28) == 0 );
481
482 v4IPA.GetReverseString(buf,AF_INET);
483 CPPUNIT_ASSERT( memcmp("12.100.168.192.in-addr.arpa.",buf, 28) == 0 );
484
485 v4IPA.GetReverseString(buf,AF_INET6);
486 CPPUNIT_ASSERT( memcmp("",buf, 1) == 0 );
487
488
489#if USE_IPV6
490 struct in6_addr ip6val;
491
492 ip6val.s6_addr32[0] = htonl(0xC0A8640C);
493 ip6val.s6_addr32[1] = htonl(0xFFFFFFFF);
494 ip6val.s6_addr32[2] = htonl(0xFFFFFFFF);
495 ip6val.s6_addr32[3] = htonl(0xFFFFFFFF);
496
b7ac5457 497 Ip::Address v6IPA(ip6val);
41d93087 498
499 /* test IPv6 output */
500 v6IPA.GetReverseString(buf);
501 CPPUNIT_ASSERT( memcmp("f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.c.0.4.6.8.a.0.c.ip6.arpa.",buf,73) == 0 );
502
503#endif
504
505}
506
507void
565b233e 508testIpAddress::testMasking()
41d93087 509{
510 char buf[MAX_IPSTRLEN];
b7ac5457
AJ
511 Ip::Address anIPA;
512 Ip::Address maskIPA;
41d93087 513
514 /* Test Basic CIDR Routine */
515 anIPA.SetAnyAddr();
516 CPPUNIT_ASSERT_EQUAL( 0 ,anIPA.GetCIDR() );
517
518 anIPA.SetNoAddr();
519#if USE_IPV6
520 CPPUNIT_ASSERT_EQUAL( 128 , anIPA.GetCIDR() );
521#else
522 CPPUNIT_ASSERT_EQUAL( 32 , anIPA.GetCIDR() );
523#endif
524
525 /* Test Numeric ApplyCIDR */
526 anIPA.SetNoAddr();
527 CPPUNIT_ASSERT( !anIPA.ApplyMask(129) );
528#if !USE_IPV6
529 CPPUNIT_ASSERT( !anIPA.ApplyMask(33) );
530#endif
531 CPPUNIT_ASSERT( anIPA.ApplyMask(31) );
532 CPPUNIT_ASSERT_EQUAL( 31 , anIPA.GetCIDR() );
533
534 anIPA.SetNoAddr();
535 anIPA.ApplyMask(31, AF_INET);
536#if USE_IPV6
537 CPPUNIT_ASSERT_EQUAL( 127 , anIPA.GetCIDR() );
538#else
539 CPPUNIT_ASSERT_EQUAL( 31 , anIPA.GetCIDR() );
540#endif
541
542#if USE_IPV6
543 anIPA.SetNoAddr();
544 anIPA.ApplyMask(80,AF_INET6);
545 CPPUNIT_ASSERT_EQUAL( 80 , anIPA.GetCIDR() );
546 /* BUG Check: test values by display. */
547 CPPUNIT_ASSERT( anIPA.NtoA(buf,MAX_IPSTRLEN) != NULL );
548 CPPUNIT_ASSERT( memcmp("ffff:ffff:ffff:ffff:ffff::", buf, 26) == 0 );
549#endif
550
b7ac5457 551 /* Test Network Bitmask from Ip::Address */
41d93087 552 anIPA.SetNoAddr();
553 maskIPA = "255.255.240.0";
554 CPPUNIT_ASSERT_EQUAL( 20 , maskIPA.GetCIDR() );
555 anIPA.ApplyMask(maskIPA);
556 CPPUNIT_ASSERT_EQUAL( 20 , anIPA.GetCIDR() );
557
558 /* BUG Check: test values memory after masking. */
559 struct in_addr btest;
560 CPPUNIT_ASSERT( anIPA.IsIPv4() );
561 CPPUNIT_ASSERT( !anIPA.IsIPv6() );
562 anIPA.GetInAddr(btest);
563 CPPUNIT_ASSERT_EQUAL( (uint32_t)htonl(0xFFFFF000) , btest.s_addr );
564
565 /* BUG Check failing test. Masked values for display. */
566 CPPUNIT_ASSERT( memcmp("255.255.240.0",anIPA.NtoA(buf,MAX_IPSTRLEN), 13) == 0 );
567
568
569#if USE_IPV6
570 anIPA.SetNoAddr();
571 maskIPA.SetNoAddr();
572
26ac0430
AJ
573 /* IPv6 masks MUST be CIDR representations. */
574 /* however as with IPv4 they can technically be represented as a bitmask */
41d93087 575 maskIPA = "ffff:ffff:fff0::";
576 CPPUNIT_ASSERT( !maskIPA.IsAnyAddr() );
577 CPPUNIT_ASSERT( !maskIPA.IsNoAddr() );
578 anIPA.ApplyMask(maskIPA);
579 CPPUNIT_ASSERT( !anIPA.IsNoAddr() );
580 CPPUNIT_ASSERT_EQUAL( 44 , anIPA.GetCIDR() );
581
582 anIPA.SetNoAddr();
583 maskIPA.SetNoAddr();
584
26ac0430 585 /* IPv4 masks represented in IPv6 as IPv4 bitmasks. */
41d93087 586 maskIPA = "::ffff:ffff:f000";
587 CPPUNIT_ASSERT( !maskIPA.IsAnyAddr() );
588 CPPUNIT_ASSERT( !maskIPA.IsNoAddr() );
589 CPPUNIT_ASSERT( maskIPA.IsIPv4() );
590 CPPUNIT_ASSERT( !maskIPA.IsIPv6() );
591 anIPA.ApplyMask(maskIPA);
592 CPPUNIT_ASSERT( !maskIPA.IsAnyAddr() );
593 CPPUNIT_ASSERT( !maskIPA.IsNoAddr() );
594 CPPUNIT_ASSERT( maskIPA.IsIPv4() );
595 CPPUNIT_ASSERT( !maskIPA.IsIPv6() );
596 CPPUNIT_ASSERT_EQUAL( 20 , anIPA.GetCIDR() );
597#endif
598
599}
600
601void
565b233e 602testIpAddress::testAddrInfo()
41d93087 603{
604 struct addrinfo *expect;
605 struct addrinfo *ipval = NULL;
606 struct addrinfo hints;
607
608 memset(&hints, 0, sizeof(struct addrinfo));
609
610 hints.ai_flags = AI_NUMERICHOST;
611
b7ac5457 612 Ip::Address anIP = "127.0.0.1";
41d93087 613
614 /* assert this just to check that getaddrinfo is working properly */
27bc2077 615 CPPUNIT_ASSERT( getaddrinfo("127.0.0.1", NULL, &hints, &expect ) == 0 );
41d93087 616
617 anIP.GetAddrInfo(ipval);
618
1ef0b9ce 619#if 0
41d93087 620 /* display a byte-by-byte hex comparison of the addr cores */
621 unsigned int *p;
622 p = (unsigned int*)expect;
12f45551
AJ
623 printf("\nSYS-ADDRINFO: %2x %2x %2x %2x %2x %2x",
624 p[0],p[1],p[2],p[3],p[4],p[5]);
41d93087 625
626 p = (unsigned int*)ipval;
12f45551 627 printf("\nSQD-ADDRINFO: %2x %2x %2x %2x %2x %2x",
26ac0430 628 p[0],p[1],p[2],p[3],p[4],p[5] );
41d93087 629 printf("\n");
1ef0b9ce 630#endif /*0*/
41d93087 631
632 // check the addrinfo object core. (BUT not the two ptrs at the tail)
be8fdd56 633 // details
634 CPPUNIT_ASSERT_EQUAL( expect->ai_flags, ipval->ai_flags );
635 CPPUNIT_ASSERT_EQUAL( expect->ai_family, ipval->ai_family );
41d93087 636 // check the sockaddr it points to.
637 CPPUNIT_ASSERT_EQUAL( expect->ai_addrlen, ipval->ai_addrlen );
1ef0b9ce
AJ
638
639#if 0
12f45551 640 p = (unsigned int*)(expect->ai_addr);
1ef0b9ce 641 printf("\nSYS-ADDR: (%d) %x %x %x %x %x %x %x %x ...",
9e008dda 642 expect->ai_addrlen,
12f45551
AJ
643 p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7] );
644
645 p = (unsigned int*)(ipval->ai_addr);
1ef0b9ce 646 printf("\nSQD-ADDR: (%d) %x %x %x %x %x %x %x %x ...",
9e008dda 647 ipval->ai_addrlen,
12f45551
AJ
648 p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7] );
649 printf("\n");
12f45551
AJ
650#if HAVE_SS_LEN_IN_SS
651 printf("\nSYS SS_LEN=%d\nSQD SS_LEN=%d\n",((struct sockaddr_storage*)expect->ai_addr)->ss_len,
652 ((struct sockaddr_storage*)ipval->ai_addr)->ss_len );
1ef0b9ce
AJ
653#endif
654#endif /*0*/
655
656#if USE_IPV6
657#if HAVE_SS_LEN_IN_SS
12f45551
AJ
658 CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_storage*)expect->ai_addr)->ss_len,
659 ((struct sockaddr_storage*)ipval->ai_addr)->ss_len );
660 CPPUNIT_ASSERT_EQUAL( (socklen_t)((struct sockaddr_storage*)ipval->ai_addr)->ss_len, ipval->ai_addrlen );
661#endif
662#if HAVE_SIN6_LEN_IN_SAI
663 CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_in6*)expect->ai_addr)->sin6_len,
664 ((struct sockaddr_in6*)ipval->ai_addr)->sin6_len );
665 CPPUNIT_ASSERT_EQUAL( (socklen_t)((struct sockaddr_in6*)ipval->ai_addr)->sin6_len, ipval->ai_addrlen );
1ef0b9ce
AJ
666#endif
667#if HAVE_SIN_LEN_IN_SAI
668 CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_in*)expect->ai_addr)->sin_len,
669 ((struct sockaddr_in*)ipval->ai_addr)->sin_len );
670 CPPUNIT_ASSERT_EQUAL( (socklen_t)((struct sockaddr_in*)ipval->ai_addr)->sin_len, ipval->ai_addrlen );
12f45551
AJ
671#endif
672 CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_in6*)expect->ai_addr)->sin6_family,
673 ((struct sockaddr_in6*)ipval->ai_addr)->sin6_family );
674 CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_in6*)expect->ai_addr)->sin6_port,
675 ((struct sockaddr_in6*)ipval->ai_addr)->sin6_port );
676#else
677#if HAVE_SS_LEN_IN_SS
12f45551
AJ
678 CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_storage*)expect->ai_addr)->ss_len,
679 ((struct sockaddr_storage*)ipval->ai_addr)->ss_len );
680 CPPUNIT_ASSERT_EQUAL( (socklen_t)((struct sockaddr_storage*)ipval->ai_addr)->ss_len, ipval->ai_addrlen );
681#endif
682#if HAVE_SIN_LEN_IN_SAI
683 CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_in*)expect->ai_addr)->sin_len,
684 ((struct sockaddr_in*)ipval->ai_addr)->sin_len );
685 CPPUNIT_ASSERT_EQUAL( (socklen_t)((struct sockaddr_in*)ipval->ai_addr)->sin_len, ipval->ai_addrlen );
686#endif
687 CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_in*)expect->ai_addr)->sin_family,
688 ((struct sockaddr_in*)ipval->ai_addr)->sin_family );
689 CPPUNIT_ASSERT_EQUAL( ((struct sockaddr_in*)expect->ai_addr)->sin_port,
690 ((struct sockaddr_in*)ipval->ai_addr)->sin_port );
691#endif /* USE_IPV6 */
692
be8fdd56 693 CPPUNIT_ASSERT( memcmp( expect->ai_addr, ipval->ai_addr, expect->ai_addrlen ) == 0 );
41d93087 694
27bc2077 695 freeaddrinfo(expect);
41d93087 696}
697
698void
565b233e 699testIpAddress::testBugNullingDisplay()
41d93087 700{
701 // Weird Bug: address set to empty during string conversion somewhere.
702 // initial string gets created and returned OK.
703 // but at the end of the process m_SocketAddr is left NULL'ed
704
705 char ntoabuf[MAX_IPSTRLEN];
706 char hostbuf[MAX_IPSTRLEN];
707 char urlbuf[MAX_IPSTRLEN];
708
709 struct in_addr outval;
710 struct in_addr expectval;
711
712 expectval.s_addr = htonl(0xC0A8640C);
713
b7ac5457 714 Ip::Address anIPA = "192.168.100.12";
41d93087 715
716
26ac0430 717 /* test stored values */
41d93087 718 CPPUNIT_ASSERT( !anIPA.IsAnyAddr() );
719 CPPUNIT_ASSERT( !anIPA.IsNoAddr() );
720 CPPUNIT_ASSERT( anIPA.IsIPv4() );
721 CPPUNIT_ASSERT( !anIPA.IsIPv6() );
722 CPPUNIT_ASSERT_EQUAL( (u_short) 0 , anIPA.GetPort() );
723 CPPUNIT_ASSERT( !anIPA.IsSockAddr() );
724 anIPA.GetInAddr(outval);
725 CPPUNIT_ASSERT( memcmp( &expectval, &outval, sizeof(struct in_addr)) == 0 );
726
727
26ac0430 728 /* POKE NtoA display function to see what it is doing */
41d93087 729 anIPA.NtoA(ntoabuf,MAX_IPSTRLEN);
730 CPPUNIT_ASSERT( !anIPA.IsAnyAddr() );
26ac0430 731 /* test stored values */
41d93087 732 CPPUNIT_ASSERT( !anIPA.IsAnyAddr() );
733 CPPUNIT_ASSERT( !anIPA.IsNoAddr() );
734 CPPUNIT_ASSERT( anIPA.IsIPv4() );
735 CPPUNIT_ASSERT( !anIPA.IsIPv6() );
736 CPPUNIT_ASSERT_EQUAL( (u_short) 0 , anIPA.GetPort() );
737 CPPUNIT_ASSERT( !anIPA.IsSockAddr() );
738 anIPA.GetInAddr(outval);
739 CPPUNIT_ASSERT( memcmp( &expectval, &outval, sizeof(struct in_addr)) == 0 );
740
741
742
26ac0430 743 /* POKE ToHostname display function to see what it is doing */
41d93087 744 anIPA.ToHostname(hostbuf,MAX_IPSTRLEN);
745 CPPUNIT_ASSERT( !anIPA.IsAnyAddr() );
26ac0430 746 /* test stored values */
41d93087 747 CPPUNIT_ASSERT( !anIPA.IsAnyAddr() );
748 CPPUNIT_ASSERT( !anIPA.IsNoAddr() );
749 CPPUNIT_ASSERT( anIPA.IsIPv4() );
750 CPPUNIT_ASSERT( !anIPA.IsIPv6() );
751 CPPUNIT_ASSERT_EQUAL( (u_short) 0 , anIPA.GetPort() );
752 CPPUNIT_ASSERT( !anIPA.IsSockAddr() );
753 anIPA.GetInAddr(outval);
754 CPPUNIT_ASSERT( memcmp( &expectval, &outval, sizeof(struct in_addr)) == 0 );
755
756
26ac0430 757 /* POKE ToURL display function to see what it is doing */
41d93087 758 anIPA.ToURL(urlbuf,MAX_IPSTRLEN);
759 CPPUNIT_ASSERT( !anIPA.IsAnyAddr() );
26ac0430 760 /* test stored values */
41d93087 761 CPPUNIT_ASSERT( !anIPA.IsAnyAddr() );
762 CPPUNIT_ASSERT( !anIPA.IsNoAddr() );
763 CPPUNIT_ASSERT( anIPA.IsIPv4() );
764 CPPUNIT_ASSERT( !anIPA.IsIPv6() );
765 CPPUNIT_ASSERT_EQUAL( (u_short) 0 , anIPA.GetPort() );
766 CPPUNIT_ASSERT( !anIPA.IsSockAddr() );
767 anIPA.GetInAddr(outval);
768 CPPUNIT_ASSERT( memcmp( &expectval, &outval, sizeof(struct in_addr)) == 0 );
769
770}