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