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