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