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