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