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