Merge branch 'daemon-ext'
[libi2ncommon] / test / ip_range.cpp
1 /*
2 The software in this package is distributed under the GNU General
3 Public License version 2 (with a special exception described below).
4
5 A copy of GNU General Public License (GPL) is included in this distribution,
6 in the file COPYING.GPL.
7
8 As a special exception, if other files instantiate templates or use macros
9 or inline functions from this file, or you compile this file and link it
10 with other works to produce a work based on this file, this file
11 does not by itself cause the resulting work to be covered
12 by the GNU General Public License.
13
14 However the source code for this file must still be made available
15 in accordance with section (3) of the GNU General Public License.
16
17 This exception does not invalidate any other reasons why a work based
18 on this file might be covered by the GNU General Public License.
19 */
20 /***************************************************************************
21  *   Copyright (C) 2004 by Intra2net AG                                    *
22  *                                                                         *
23  ***************************************************************************/
24
25 #include <iostream>
26 #include <string>
27 #include <sstream>
28 #include <stdexcept>
29
30 #define BOOST_TEST_MAIN
31 #define BOOST_TEST_DYN_LINK
32 #include <boost/test/unit_test.hpp>
33
34 #include <ipfunc.hxx>
35
36 namespace std
37 {
38
39 template <class charT, class traits>
40 inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& os,
41                                                      const std::vector<IP_RANGE>& x)
42 {
43     bool is_first = true;
44     for (std::vector<IP_RANGE>::const_iterator i=x.begin(); i!=x.end(); i++)
45     {
46         if (!is_first)
47             os << ", ";
48         os << i->to_string();
49         is_first = false;
50     }
51
52     return os;
53 }
54
55 template <class charT, class traits>
56 inline std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& os,
57                                                      const IP_RANGE& x)
58 {
59     os << x.to_string();
60     return os;
61 }
62
63 } // eo namespace std
64
65
66 using namespace std;
67
68 BOOST_AUTO_TEST_SUITE(ip_range)
69
70 BOOST_AUTO_TEST_CASE(ConstructIP1)
71 {
72     IP_RANGE i("192.168.1.1");
73     BOOST_CHECK_EQUAL(string("192.168.1.1"),i.to_string());
74 }
75
76 BOOST_AUTO_TEST_CASE(ConstructIP2)
77 {
78     IP_RANGE i(ip_type::IP,"192.168.1.1");
79     BOOST_CHECK_EQUAL(string("192.168.1.1"),i.to_string());
80 }
81
82 BOOST_AUTO_TEST_CASE(ConstructNet1)
83 {
84     IP_RANGE i("192.168.1.1/255.255.255.0");
85     BOOST_CHECK_EQUAL(string("192.168.1.0/255.255.255.0"),i.to_string());
86 }
87
88 BOOST_AUTO_TEST_CASE(ConstructNet2)
89 {
90     IP_RANGE i(ip_type::NETWORK,"192.168.1.1","255.255.255.0");
91     BOOST_CHECK_EQUAL(string("192.168.1.0/255.255.255.0"),i.to_string());
92 }
93
94 BOOST_AUTO_TEST_CASE(ConstructNet3)
95 {
96     IP_RANGE i("172.16.0.0/16");
97     BOOST_CHECK_EQUAL(string("172.16.0.0/255.255.0.0"),i.to_string());
98 }
99
100 BOOST_AUTO_TEST_CASE(ConstructRange1)
101 {
102     IP_RANGE i("192.168.1.5-192.168.3.1");
103     BOOST_CHECK_EQUAL(string("192.168.1.5-192.168.3.1"),i.to_string());
104 }
105
106 BOOST_AUTO_TEST_CASE(ConstructRange2)
107 {
108     IP_RANGE i(ip_type::RANGE,"192.168.1.5","192.168.3.1");
109     BOOST_CHECK_EQUAL(string("192.168.1.5-192.168.3.1"),i.to_string());
110 }
111
112 BOOST_AUTO_TEST_CASE(ConstructRangeSwap)
113 {
114     IP_RANGE i(ip_type::RANGE,"192.168.3.1","192.168.1.5");
115     BOOST_CHECK_EQUAL(string("192.168.1.5-192.168.3.1"),i.to_string());
116 }
117
118 BOOST_AUTO_TEST_CASE(OverlapIP)
119 {
120     IP_RANGE a("192.168.1.5");
121     IP_RANGE b("192.168.1.5");
122
123     BOOST_CHECK_EQUAL(true,a.overlapping(b));
124 }
125
126 BOOST_AUTO_TEST_CASE(OverlapNet1)
127 {
128     IP_RANGE a("192.168.1.5/255.255.255.0");
129     IP_RANGE b("192.168.1.6");
130
131     BOOST_CHECK_EQUAL(true,a.overlapping(b));
132 }
133
134 BOOST_AUTO_TEST_CASE(OverlapNet2)
135 {
136     IP_RANGE a("192.168.1.5/255.255.255.0");
137     IP_RANGE b("192.168.1.44/255.255.255.248");
138
139     BOOST_CHECK_EQUAL(true,a.overlapping(b));
140 }
141
142 BOOST_AUTO_TEST_CASE(OverlapNet3)
143 {
144     IP_RANGE a("192.168.1.5/255.255.255.0");
145     IP_RANGE b("192.168.0.0/255.255.0.0");
146
147     BOOST_CHECK_EQUAL(true,a.overlapping(b));
148 }
149
150 BOOST_AUTO_TEST_CASE(OverlapNet4)
151 {
152     IP_RANGE a("192.169.1.5/255.255.255.0");
153     IP_RANGE b("192.168.0.0/255.255.0.0");
154
155     BOOST_CHECK_EQUAL(false,a.overlapping(b));
156 }
157
158 BOOST_AUTO_TEST_CASE(OverlapRange1)
159 {
160     IP_RANGE a("192.168.1.5-192.168.1.50");
161     IP_RANGE b("192.168.1.6");
162
163     BOOST_CHECK_EQUAL(true,a.overlapping(b));
164 }
165
166 BOOST_AUTO_TEST_CASE(OverlapRange2)
167 {
168     IP_RANGE a("192.168.1.5-192.168.1.50");
169     IP_RANGE b("192.168.1.0/255.255.255.128");
170
171     BOOST_CHECK_EQUAL(true,a.overlapping(b));
172 }
173
174 BOOST_AUTO_TEST_CASE(OverlapRange3)
175 {
176     IP_RANGE a("192.168.1.5-192.168.1.50");
177     IP_RANGE b("192.168.0.0/255.255.0.0");
178
179     BOOST_CHECK_EQUAL(true,a.overlapping(b));
180 }
181
182 BOOST_AUTO_TEST_CASE(OverlapRange4)
183 {
184     IP_RANGE a("192.168.1.5-192.168.1.50");
185     IP_RANGE b("192.168.1.1-192.168.1.5");
186
187     BOOST_CHECK_EQUAL(true,a.overlapping(b));
188 }
189
190 BOOST_AUTO_TEST_CASE(OverlapRange5)
191 {
192     IP_RANGE a("192.168.1.5-192.168.1.50");
193     IP_RANGE b("192.168.1.1-192.168.1.4");
194
195     BOOST_CHECK_EQUAL(false,a.overlapping(b));
196 }
197
198 BOOST_AUTO_TEST_CASE(OverlapRange6)
199 {
200     IP_RANGE a("192.168.1.5-192.168.1.50");
201     IP_RANGE b("192.168.1.1-192.168.2.4");
202
203     BOOST_CHECK_EQUAL(true,a.overlapping(b));
204 }
205
206 BOOST_AUTO_TEST_CASE(OverlapRange7)
207 {
208     IP_RANGE a("192.168.1.5-192.168.1.50");
209     IP_RANGE b("192.168.1.6-192.168.1.7");
210
211     BOOST_CHECK_EQUAL(true,a.overlapping(b));
212 }
213
214 BOOST_AUTO_TEST_CASE(WithinNet1)
215 {
216     IP_RANGE a("192.168.1.0/255.255.255.0");
217     IP_RANGE b("192.168.1.6");
218
219     BOOST_CHECK_EQUAL(false,a.is_within(b));
220 }
221
222 BOOST_AUTO_TEST_CASE(WithinNet2)
223 {
224     IP_RANGE a("192.168.1.6");
225     IP_RANGE b("192.168.1.0/255.255.255.0");
226
227     BOOST_CHECK_EQUAL(true,a.is_within(b));
228 }
229
230 BOOST_AUTO_TEST_CASE(WithinNet3)
231 {
232     IP_RANGE a("192.168.1.6/255.255.255.248");
233     IP_RANGE b("192.168.1.0/255.255.255.0");
234
235     BOOST_CHECK_EQUAL(true,a.is_within(b));
236 }
237
238 BOOST_AUTO_TEST_CASE(WithinNet4)
239 {
240     IP_RANGE a("192.168.0.0/255.255.0.0");
241     IP_RANGE b("192.168.1.0/255.255.255.0");
242
243     BOOST_CHECK_EQUAL(false,a.is_within(b));
244 }
245
246 BOOST_AUTO_TEST_CASE(WithinNet5)
247 {
248     IP_RANGE a("192.168.1.0/255.255.255.0");
249     IP_RANGE b("192.168.1.0/255.255.255.0");
250
251     BOOST_CHECK_EQUAL(true,a.is_within(b));
252 }
253
254 BOOST_AUTO_TEST_CASE(WithinNet6)
255 {
256     IP_RANGE a("192.168.1.0/255.255.255.0");
257     IP_RANGE b("192.168.1.0/255.255.255.128");
258
259     BOOST_CHECK_EQUAL(false,a.is_within(b));
260 }
261
262 BOOST_AUTO_TEST_CASE(WithinNet7)
263 {
264     IP_RANGE a("192.168.1.0/255.255.255.128");
265     IP_RANGE b("192.168.1.0/255.255.255.0");
266
267     BOOST_CHECK_EQUAL(true,a.is_within(b));
268 }
269
270 BOOST_AUTO_TEST_CASE(WithinRange1)
271 {
272     IP_RANGE a("192.168.1.0/255.255.255.0");
273     IP_RANGE b("192.168.1.0-192.168.1.255");
274
275     BOOST_CHECK_EQUAL(true,a.is_within(b));
276 }
277
278 BOOST_AUTO_TEST_CASE(WithinRange2)
279 {
280     IP_RANGE a("192.168.1.0");
281     IP_RANGE b("192.168.1.0-192.168.1.255");
282
283     BOOST_CHECK_EQUAL(true,a.is_within(b));
284 }
285
286 BOOST_AUTO_TEST_CASE(WithinRange3)
287 {
288     IP_RANGE a("192.168.1.1-192.168.1.1");
289     IP_RANGE b("192.168.1.0-192.168.1.255");
290
291     BOOST_CHECK_EQUAL(true,a.is_within(b));
292 }
293
294 BOOST_AUTO_TEST_CASE(WithinRange4)
295 {
296     IP_RANGE a("192.168.1.0-192.168.1.2");
297     IP_RANGE b("192.168.1.1-192.168.1.255");
298
299     BOOST_CHECK_EQUAL(false,a.is_within(b));
300 }
301
302 BOOST_AUTO_TEST_CASE(WithinRange5)
303 {
304     IP_RANGE a("192.168.1.199-192.168.1.202");
305     IP_RANGE b("192.168.1.1-192.168.1.200");
306
307     BOOST_CHECK_EQUAL(false,a.is_within(b));
308 }
309
310 BOOST_AUTO_TEST_CASE(WithinRange6)
311 {
312     IP_RANGE a("192.168.1.0-192.168.1.202");
313     IP_RANGE b("192.168.1.1-192.168.1.200");
314
315     BOOST_CHECK_EQUAL(false,a.is_within(b));
316 }
317
318 BOOST_AUTO_TEST_CASE(WithinRange7)
319 {
320     IP_RANGE a("192.168.1.0-192.168.1.202");
321     IP_RANGE b("192.168.1.0/255.255.255.0");
322
323     BOOST_CHECK_EQUAL(true,a.is_within(b));
324 }
325
326 BOOST_AUTO_TEST_CASE(WithinRange8)
327 {
328     IP_RANGE a("192.168.0.0-192.168.1.202");
329     IP_RANGE b("192.168.1.0/255.255.255.0");
330
331     BOOST_CHECK_EQUAL(false,a.is_within(b));
332 }
333
334 BOOST_AUTO_TEST_CASE(WithinRange9)
335 {
336     IP_RANGE a("192.168.0.0-192.168.2.202");
337     IP_RANGE b("192.168.1.0/255.255.255.0");
338
339     BOOST_CHECK_EQUAL(false,a.is_within(b));
340 }
341
342 BOOST_AUTO_TEST_CASE(WithinRange10)
343 {
344     IP_RANGE a("192.168.1.10-192.168.2.0");
345     IP_RANGE b("192.168.1.0/255.255.255.0");
346
347     BOOST_CHECK_EQUAL(false,a.is_within(b));
348 }
349
350 BOOST_AUTO_TEST_CASE(OperatorPlus1)
351 {
352     IP_RANGE a("192.168.2.0/255.255.255.0");
353
354     a=a+256;
355
356     BOOST_CHECK_EQUAL(string("192.168.3.0/255.255.255.0"),a.to_string());
357 }
358
359 BOOST_AUTO_TEST_CASE(OperatorPlus2)
360 {
361     IP_RANGE a("192.168.2.0/255.255.255.0");
362
363     a=a+13;
364
365     BOOST_CHECK_EQUAL(string("192.168.2.13-192.168.3.12"),a.to_string());
366 }
367
368 BOOST_AUTO_TEST_CASE(OperatorPlusOverflow)
369 {
370     IP_RANGE a("255.255.255.0/255.255.255.0");
371     BOOST_REQUIRE_THROW(a=a+1, std::range_error);
372 }
373
374 BOOST_AUTO_TEST_CASE(OperatorMinus)
375 {
376     IP_RANGE a("192.168.2.0/255.255.255.0");
377     IP_RANGE b("192.168.1.0/255.255.255.0");
378
379     BOOST_CHECK_EQUAL(256,a-b);
380 }
381
382 BOOST_AUTO_TEST_CASE(NetmaskToBits1)
383 {
384     IP_RANGE a("255.255.255.255");
385     int bits = a.calc_netmask_bits(a.get_base());
386     BOOST_CHECK_EQUAL(32,bits);
387 }
388
389 BOOST_AUTO_TEST_CASE(NetmaskToBits2)
390 {
391     IP_RANGE a("255.255.255.0");
392     int bits = a.calc_netmask_bits(a.get_base());
393     BOOST_CHECK_EQUAL(24,bits);
394 }
395
396 BOOST_AUTO_TEST_CASE(NetmaskToBits3)
397 {
398     IP_RANGE a("255.255.0.0");
399     int bits = a.calc_netmask_bits(a.get_base());
400     BOOST_CHECK_EQUAL(16,bits);
401 }
402
403 BOOST_AUTO_TEST_CASE(NetmaskToBits4)
404 {
405     IP_RANGE a("255.0.0.0");
406     int bits = a.calc_netmask_bits(a.get_base());
407     BOOST_CHECK_EQUAL(8,bits);
408 }
409 BOOST_AUTO_TEST_CASE(Range2Cidr1)
410 {
411     IP_RANGE range("192.168.1.100-192.168.1.227");
412     vector<IP_RANGE> cidrs = range.to_cidr();
413
414     vector<IP_RANGE> check_cidrs;
415     check_cidrs.push_back("192.168.1.100/30");
416     check_cidrs.push_back("192.168.1.104/29");
417     check_cidrs.push_back("192.168.1.112/28");
418     check_cidrs.push_back("192.168.1.128/26");
419     check_cidrs.push_back("192.168.1.192/27");
420     check_cidrs.push_back("192.168.1.224/30");
421
422     BOOST_CHECK_EQUAL(check_cidrs,cidrs);
423 }
424
425 BOOST_AUTO_TEST_CASE(Range2Cidr2)
426 {
427     IP_RANGE range("0.0.0.0-255.255.255.255");
428     vector<IP_RANGE> cidrs = range.to_cidr();
429
430     vector<IP_RANGE> check_cidrs;
431     check_cidrs.push_back("0.0.0.0/0");
432
433     BOOST_CHECK_EQUAL(check_cidrs,cidrs);
434 }
435
436 BOOST_AUTO_TEST_CASE(Range2Cidr3)
437 {
438     IP_RANGE range("192.168.1.3");
439     vector<IP_RANGE> cidrs = range.to_cidr();
440
441     vector<IP_RANGE> check_cidrs;
442     check_cidrs.push_back("192.168.1.3/32");
443
444     BOOST_CHECK_EQUAL(check_cidrs,cidrs);
445 }
446
447 BOOST_AUTO_TEST_CASE(Range2Cidr4)
448 {
449     IP_RANGE range("172.16.0.0/16");
450     vector<IP_RANGE> cidrs = range.to_cidr();
451
452     vector<IP_RANGE> check_cidrs;
453     check_cidrs.push_back("172.16.0.0/16");
454
455     BOOST_CHECK_EQUAL(check_cidrs,cidrs);
456 }
457
458 BOOST_AUTO_TEST_CASE(Range2Cidr5)
459 {
460     IP_RANGE range(ip_type::NETWORK, "172.16.0.0", "255.255.0.0");
461     vector<IP_RANGE> cidrs = range.to_cidr();
462
463     vector<IP_RANGE> check_cidrs;
464     check_cidrs.push_back("172.16.0.0/16");
465
466     BOOST_CHECK_EQUAL(check_cidrs,cidrs);
467 }
468 BOOST_AUTO_TEST_CASE(Range2Cidr6)
469 {
470     IP_RANGE range("192.168.1.0-192.168.2.0");
471     vector<IP_RANGE> cidrs = range.to_cidr();
472
473     vector<IP_RANGE> check_cidrs;
474     check_cidrs.push_back("192.168.1.0/24");
475     check_cidrs.push_back("192.168.2.0/32");
476
477     BOOST_CHECK_EQUAL(check_cidrs,cidrs);
478 }
479
480 BOOST_AUTO_TEST_CASE(Range2Cidr7)
481 {
482     IP_RANGE range("0.0.0.1-255.255.255.254");
483     vector<IP_RANGE> cidrs = range.to_cidr();
484
485     vector<IP_RANGE> check_cidrs;
486     check_cidrs.push_back("0.0.0.1/32");
487     check_cidrs.push_back("0.0.0.2/31");
488     check_cidrs.push_back("0.0.0.4/30");
489     check_cidrs.push_back("0.0.0.8/29");
490     check_cidrs.push_back("0.0.0.16/28");
491     check_cidrs.push_back("0.0.0.32/27");
492     check_cidrs.push_back("0.0.0.64/26");
493     check_cidrs.push_back("0.0.0.128/25");
494     check_cidrs.push_back("0.0.1.0/24");
495     check_cidrs.push_back("0.0.2.0/23");
496     check_cidrs.push_back("0.0.4.0/22");
497     check_cidrs.push_back("0.0.8.0/21");
498     check_cidrs.push_back("0.0.16.0/20");
499     check_cidrs.push_back("0.0.32.0/19");
500     check_cidrs.push_back("0.0.64.0/18");
501     check_cidrs.push_back("0.0.128.0/17");
502     check_cidrs.push_back("0.1.0.0/16");
503     check_cidrs.push_back("0.2.0.0/15");
504     check_cidrs.push_back("0.4.0.0/14");
505     check_cidrs.push_back("0.8.0.0/13");
506     check_cidrs.push_back("0.16.0.0/12");
507     check_cidrs.push_back("0.32.0.0/11");
508     check_cidrs.push_back("0.64.0.0/10");
509     check_cidrs.push_back("0.128.0.0/9");
510     check_cidrs.push_back("1.0.0.0/8");
511     check_cidrs.push_back("2.0.0.0/7");
512     check_cidrs.push_back("4.0.0.0/6");
513     check_cidrs.push_back("8.0.0.0/5");
514     check_cidrs.push_back("16.0.0.0/4");
515     check_cidrs.push_back("32.0.0.0/3");
516     check_cidrs.push_back("64.0.0.0/2");
517     check_cidrs.push_back("128.0.0.0/2");
518     check_cidrs.push_back("192.0.0.0/3");
519     check_cidrs.push_back("224.0.0.0/4");
520     check_cidrs.push_back("240.0.0.0/5");
521     check_cidrs.push_back("248.0.0.0/6");
522     check_cidrs.push_back("252.0.0.0/7");
523     check_cidrs.push_back("254.0.0.0/8");
524     check_cidrs.push_back("255.0.0.0/9");
525     check_cidrs.push_back("255.128.0.0/10");
526     check_cidrs.push_back("255.192.0.0/11");
527     check_cidrs.push_back("255.224.0.0/12");
528     check_cidrs.push_back("255.240.0.0/13");
529     check_cidrs.push_back("255.248.0.0/14");
530     check_cidrs.push_back("255.252.0.0/15");
531     check_cidrs.push_back("255.254.0.0/16");
532     check_cidrs.push_back("255.255.0.0/17");
533     check_cidrs.push_back("255.255.128.0/18");
534     check_cidrs.push_back("255.255.192.0/19");
535     check_cidrs.push_back("255.255.224.0/20");
536     check_cidrs.push_back("255.255.240.0/21");
537     check_cidrs.push_back("255.255.248.0/22");
538     check_cidrs.push_back("255.255.252.0/23");
539     check_cidrs.push_back("255.255.254.0/24");
540     check_cidrs.push_back("255.255.255.0/25");
541     check_cidrs.push_back("255.255.255.128/26");
542     check_cidrs.push_back("255.255.255.192/27");
543     check_cidrs.push_back("255.255.255.224/28");
544     check_cidrs.push_back("255.255.255.240/29");
545     check_cidrs.push_back("255.255.255.248/30");
546     check_cidrs.push_back("255.255.255.252/31");
547     check_cidrs.push_back("255.255.255.254/32");
548
549     BOOST_CHECK_EQUAL(check_cidrs,cidrs);
550 }
551
552 BOOST_AUTO_TEST_CASE(Substract1)
553 {
554     IP_RANGE range("192.168.1.1-192.168.1.100");
555     set<IP_RANGE> to_sub;
556     to_sub.insert(IP_RANGE("192.168.1.3"));
557
558     vector<IP_RANGE> new_range = range.substract(to_sub);
559
560     vector<IP_RANGE> check_range;
561     check_range.push_back("192.168.1.1-192.168.1.2");
562     check_range.push_back("192.168.1.4-192.168.1.100");
563
564     BOOST_CHECK_EQUAL(check_range,new_range);
565 }
566
567 BOOST_AUTO_TEST_CASE(Substract2)
568 {
569     IP_RANGE range("192.168.1.1-192.168.1.100");
570     set<IP_RANGE> to_sub;
571     to_sub.insert(IP_RANGE("192.168.1.1"));
572
573     vector<IP_RANGE> new_range = range.substract(to_sub);
574
575     vector<IP_RANGE> check_range;
576     check_range.push_back("192.168.1.2-192.168.1.100");
577
578     BOOST_CHECK_EQUAL(check_range,new_range);
579 }
580
581 BOOST_AUTO_TEST_CASE(Substract3)
582 {
583     IP_RANGE range("192.168.1.1-192.168.1.100");
584     set<IP_RANGE> to_sub;
585     to_sub.insert(IP_RANGE("192.168.1.1"));
586     to_sub.insert(IP_RANGE("192.168.1.61"));
587     to_sub.insert(IP_RANGE("192.168.1.50-192.168.1.60"));
588
589     vector<IP_RANGE> new_range = range.substract(to_sub);
590
591     vector<IP_RANGE> check_range;
592     check_range.push_back("192.168.1.2-192.168.1.49");
593     check_range.push_back("192.168.1.62-192.168.1.100");
594
595     BOOST_CHECK_EQUAL(check_range,new_range);
596 }
597
598 BOOST_AUTO_TEST_CASE(Substract4)
599 {
600     IP_RANGE range("192.168.1.1-192.168.1.100");
601     set<IP_RANGE> to_sub;
602     to_sub.insert(IP_RANGE("192.168.1.50-192.168.1.100"));
603
604     vector<IP_RANGE> new_range = range.substract(to_sub);
605
606     vector<IP_RANGE> check_range;
607     check_range.push_back("192.168.1.1-192.168.1.49");
608
609     BOOST_CHECK_EQUAL(check_range,new_range);
610 }
611
612 BOOST_AUTO_TEST_CASE(Substract5)
613 {
614     IP_RANGE range("192.168.1.1-192.168.1.100");
615     set<IP_RANGE> to_sub;
616     to_sub.insert(IP_RANGE("192.168.1.50-192.168.1.99"));
617
618     vector<IP_RANGE> new_range = range.substract(to_sub);
619
620     vector<IP_RANGE> check_range;
621     check_range.push_back("192.168.1.1-192.168.1.49");
622     check_range.push_back("192.168.1.100-192.168.1.100");
623
624     BOOST_CHECK_EQUAL(check_range,new_range);
625 }
626
627 BOOST_AUTO_TEST_CASE(Substract6)
628 {
629     IP_RANGE range("192.168.1.1-192.168.1.100");
630     set<IP_RANGE> to_sub;
631     to_sub.insert(IP_RANGE("192.168.1.2-192.168.1.100"));
632
633     vector<IP_RANGE> new_range = range.substract(to_sub);
634
635     vector<IP_RANGE> check_range;
636     check_range.push_back("192.168.1.1");
637
638     BOOST_CHECK_EQUAL(check_range,new_range);
639 }
640
641 BOOST_AUTO_TEST_CASE(Substract7)
642 {
643     IP_RANGE range("192.168.1.1-192.168.1.100");
644     set<IP_RANGE> to_sub;
645     to_sub.insert(IP_RANGE("192.168.1.1-192.168.1.100"));
646     to_sub.insert(IP_RANGE("192.168.1.50-192.168.1.61"));
647     to_sub.insert(IP_RANGE("192.168.1.61"));
648     to_sub.insert(IP_RANGE("192.168.1.62"));
649     to_sub.insert(IP_RANGE("192.168.1.63"));
650
651     vector<IP_RANGE> new_range = range.substract(to_sub);
652
653     vector<IP_RANGE> check_range;
654
655     BOOST_CHECK_EQUAL(check_range,new_range);
656 }
657
658 BOOST_AUTO_TEST_CASE(Substract8)
659 {
660     IP_RANGE range("192.168.1.1-192.168.1.100");
661     set<IP_RANGE> to_sub;
662     to_sub.insert(IP_RANGE("192.168.1.10-192.168.1.20"));
663     to_sub.insert(IP_RANGE("192.168.1.11-192.168.1.30"));
664     to_sub.insert(IP_RANGE("192.168.1.1-192.168.1.3"));
665     to_sub.insert(IP_RANGE("192.168.1.8"));
666     to_sub.insert(IP_RANGE("192.168.1.9"));
667
668     vector<IP_RANGE> new_range = range.substract(to_sub);
669
670     vector<IP_RANGE> check_range;
671     check_range.push_back("192.168.1.4-192.168.1.7");
672     check_range.push_back("192.168.1.31-192.168.1.100");
673
674     BOOST_CHECK_EQUAL(check_range,new_range);
675 }
676
677 BOOST_AUTO_TEST_CASE(Substract9)
678 {
679     IP_RANGE range("192.168.1.1-192.168.1.100");
680     set<IP_RANGE> to_sub;
681     to_sub.insert(IP_RANGE("192.168.1.9-192.168.1.15"));
682     to_sub.insert(IP_RANGE("192.168.1.10-192.168.1.20"));
683
684     vector<IP_RANGE> new_range = range.substract(to_sub);
685
686     vector<IP_RANGE> check_range;
687     check_range.push_back("192.168.1.1-192.168.1.8");
688     check_range.push_back("192.168.1.21-192.168.1.100");
689
690     BOOST_CHECK_EQUAL(check_range,new_range);
691 }
692
693 BOOST_AUTO_TEST_CASE(Substract10)
694 {
695     IP_RANGE range("192.168.1.1-192.168.1.2");
696     set<IP_RANGE> to_sub;
697     to_sub.insert(IP_RANGE("192.168.1.1"));
698
699     vector<IP_RANGE> new_range = range.substract(to_sub);
700
701     vector<IP_RANGE> check_range;
702     check_range.push_back("192.168.1.2");
703
704     BOOST_CHECK_EQUAL(check_range,new_range);
705 }
706
707 BOOST_AUTO_TEST_CASE(Substract11)
708 {
709     IP_RANGE range("192.168.1.1-192.168.1.2");
710     set<IP_RANGE> to_sub;
711     to_sub.insert(IP_RANGE("192.168.1.2"));
712
713     vector<IP_RANGE> new_range = range.substract(to_sub);
714
715     vector<IP_RANGE> check_range;
716     check_range.push_back("192.168.1.1");
717
718     BOOST_CHECK_EQUAL(check_range,new_range);
719 }
720
721 BOOST_AUTO_TEST_CASE(Substract12)
722 {
723     IP_RANGE range("192.168.1.1");
724     set<IP_RANGE> to_sub;
725     to_sub.insert(IP_RANGE("192.168.1.1"));
726
727     vector<IP_RANGE> new_range = range.substract(to_sub);
728
729     vector<IP_RANGE> check_range;
730
731     BOOST_CHECK_EQUAL(check_range,new_range);
732 }
733
734 BOOST_AUTO_TEST_CASE(Substract13)
735 {
736     IP_RANGE range("192.168.1.1");
737
738     set<IP_RANGE> to_sub;
739     vector<IP_RANGE> new_range = range.substract(to_sub);
740
741     vector<IP_RANGE> check_range;
742     check_range.push_back("192.168.1.1");
743
744     BOOST_CHECK_EQUAL(check_range,new_range);
745 }
746
747 BOOST_AUTO_TEST_CASE(Substract14)
748 {
749     IP_RANGE range("192.168.1.1-192.168.1.100");
750     set<IP_RANGE> to_sub;
751
752     vector<IP_RANGE> new_range = range.substract(to_sub);
753
754     vector<IP_RANGE> check_range;
755     check_range.push_back("192.168.1.1-192.168.1.100");
756
757     BOOST_CHECK_EQUAL(check_range,new_range);
758 }
759
760 BOOST_AUTO_TEST_CASE(Substract15)
761 {
762     IP_RANGE range("192.168.1.1-192.168.1.100");
763     set<IP_RANGE> to_sub;
764     to_sub.insert(IP_RANGE("192.168.1.1-192.168.1.60"));
765     to_sub.insert(IP_RANGE("192.168.1.62-192.168.1.100"));
766
767     vector<IP_RANGE> new_range = range.substract(to_sub);
768
769     vector<IP_RANGE> check_range;
770     check_range.push_back("192.168.1.61");
771
772     BOOST_CHECK_EQUAL(check_range,new_range);
773 }
774
775 BOOST_AUTO_TEST_CASE(IpNumString1)
776 {
777     IP_RANGE myip("192.168.1.50");
778     string expected("192168001050");
779
780     BOOST_CHECK_EQUAL(expected,IP_RANGE::ip_num_string(myip.get_base()));
781 }
782
783 BOOST_AUTO_TEST_CASE(IpNumString2)
784 {
785     IP_RANGE myip("0.0.0.0");
786     string expected("000000000000");
787
788     BOOST_CHECK_EQUAL(expected,IP_RANGE::ip_num_string(myip.get_base()));
789 }
790
791 BOOST_AUTO_TEST_CASE(IpNumString3)
792 {
793     IP_RANGE myip("255.255.255.255");
794     string expected("255255255255");
795
796     BOOST_CHECK_EQUAL(expected,IP_RANGE::ip_num_string(myip.get_base()));
797 }
798
799 BOOST_AUTO_TEST_CASE(NetmapValidation1)
800 {
801     IP_RANGE myip("192.168.1.11");
802     IP_RANGE original("192.168.1.0/255.255.255.0");
803     IP_RANGE target("192.168.2.0/255.255.0.0");
804
805     BOOST_CHECK_EQUAL(false,myip.netmap(original,target));
806 }
807
808 BOOST_AUTO_TEST_CASE(NetmapValidation2)
809 {
810     IP_RANGE myip("192.168.3.11");
811     IP_RANGE original("192.168.1.0/255.255.255.0");
812     IP_RANGE target("192.168.2.0/255.255.255.0");
813
814     BOOST_CHECK_EQUAL(false,myip.netmap(original,target));
815 }
816
817 BOOST_AUTO_TEST_CASE(NetmapValidation3)
818 {
819     IP_RANGE myip("192.168.1.70-192.168.2.20");
820     IP_RANGE original("192.168.1.0/255.255.255.0");
821     IP_RANGE target("192.168.2.0/255.255.255.0");
822
823     BOOST_CHECK_EQUAL(false,myip.netmap(original,target));
824 }
825
826 BOOST_AUTO_TEST_CASE(Netmap1)
827 {
828     IP_RANGE myip("192.168.1.11");
829     IP_RANGE original("192.168.1.0/255.255.255.0");
830     IP_RANGE target("192.168.2.0/255.255.255.0");
831
832     BOOST_CHECK_EQUAL(true,myip.netmap(original,target));
833     BOOST_CHECK_EQUAL(IP_RANGE("192.168.2.11"),myip);
834 }
835
836 BOOST_AUTO_TEST_CASE(Netmap2)
837 {
838     IP_RANGE myip("192.168.1.11-192.168.1.22");
839     IP_RANGE original("192.168.1.0/255.255.255.0");
840     IP_RANGE target("192.168.2.0/255.255.255.0");
841
842     BOOST_CHECK_EQUAL(true,myip.netmap(original,target));
843     BOOST_CHECK_EQUAL(IP_RANGE("192.168.2.11-192.168.2.22"),myip);
844 }
845
846 BOOST_AUTO_TEST_CASE(Netmap3)
847 {
848     IP_RANGE myip("192.168.1.0/255.255.255.0");
849     IP_RANGE original("192.168.1.0/255.255.255.0");
850     IP_RANGE target("192.168.2.0/255.255.255.0");
851
852     BOOST_CHECK_EQUAL(true,myip.netmap(original,target));
853     BOOST_CHECK_EQUAL(IP_RANGE("192.168.2.0/255.255.255.0"),myip);
854 }
855
856 BOOST_AUTO_TEST_CASE(ResolveDNS)
857 {
858     IP_RANGE test;
859     BOOST_CHECK_EQUAL("127.0.0.1", test.resolve_ip("localhost"));
860 }
861
862 /*
863 // Note: Disabled on the Intranator
864 BOOST_AUTO_TEST_CASE(ResolveDNSIPv6)
865 {
866     IP_RANGE test;
867     BOOST_CHECK_EQUAL("::1", test.resolve_ip("localhost", true));
868 }
869 */
870
871 BOOST_AUTO_TEST_CASE(ResolveExistingIP)
872 {
873     IP_RANGE test;
874     BOOST_CHECK_EQUAL("192.168.1.254", test.resolve_ip("192.168.1.254"));
875 }
876
877
878 BOOST_AUTO_TEST_SUITE_END()