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