libi2ncommon: (tomj) new IP_RANGE::substract function + unit test
authorThomas Jarosch <thomas.jarosch@intra2net.com>
Sun, 5 Sep 2004 16:58:01 +0000 (16:58 +0000)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Sun, 5 Sep 2004 16:58:01 +0000 (16:58 +0000)
src/ipfunc.cpp
src/ipfunc.hxx
test/ip_range.cpp

index 626f9e7..2d02e7d 100644 (file)
@@ -277,6 +277,40 @@ vector<IP_RANGE> IP_RANGE::to_cidr(void) const
     return cidrs;
 }
 
+#include <iostream>
+
+vector<IP_RANGE> IP_RANGE::substract(const std::set<IP_RANGE> &to_substract) const
+{
+    vector<IP_RANGE> rtn;
+    
+    unsigned int ip_pos = turn_ip(ip), ip_end = turn_ip(end);
+    
+    set<IP_RANGE>::const_iterator sub = to_substract.begin(), to_substract_end = to_substract.end();
+    for (sub = to_substract.begin(); sub != to_substract_end; sub++) {
+        if (!sub->is_within(*this))
+            throw runtime_error("IP_RANGE::substract error: "+ sub->to_string() + " is not within " + to_string());
+    
+        // Get beginn of network/range/IP
+        unsigned int sub_begin = turn_ip(sub->get_base());
+        
+        // Got a fragment?
+        if (ip_pos < sub_begin)
+            rtn.push_back(IP_RANGE(ip_type::RANGE, turn_ip(ip_pos), turn_ip(sub_begin-1)));
+
+        // Set position to end if end is higher than current position
+        if (ip_pos < turn_ip(sub->get_broadcast())+1)
+            ip_pos = turn_ip(sub->get_broadcast())+1;
+    }
+
+    // Last fragment
+    if (ip_pos == ip_end)
+        rtn.push_back(IP_RANGE(ip_type::IP, turn_ip(ip_pos)));
+    else if (ip_pos < ip_end)
+        rtn.push_back(IP_RANGE(ip_type::RANGE, turn_ip(ip_pos), turn_ip(ip_end)));
+                        
+    return rtn;
+}
+
 unsigned int IP_RANGE::turn_ip(unsigned int src)
 {
     int dst;
index 6f238aa..6e11b71 100644 (file)
@@ -59,6 +59,9 @@ class IP_RANGE
         // returns the complete range in cidr blocks        
         std::vector<IP_RANGE> to_cidr(void) const;
         
+        // network<->IP subtraction
+        std::vector<IP_RANGE> substract(const std::set<IP_RANGE> &to_substract) const;
+        
         unsigned int get_mask_bits() const
             { return calc_netmask_bits(mask); }
         unsigned int get_broadcast() const
index b018d72..cedd20b 100644 (file)
@@ -101,7 +101,21 @@ class ip_range : public TestFixture
     CPPUNIT_TEST(Range2Cidr5);
     CPPUNIT_TEST(Range2Cidr6);
     CPPUNIT_TEST(Range2Cidr7);
-
+    CPPUNIT_TEST(Substract1);
+    CPPUNIT_TEST(Substract2);
+    CPPUNIT_TEST(Substract3);
+    CPPUNIT_TEST(Substract4);
+    CPPUNIT_TEST(Substract5);
+    CPPUNIT_TEST(Substract6);
+    CPPUNIT_TEST(Substract7);
+    CPPUNIT_TEST(Substract8);
+    CPPUNIT_TEST(Substract9);
+    CPPUNIT_TEST(Substract10);
+    CPPUNIT_TEST(Substract11);
+    CPPUNIT_TEST(Substract12);
+    CPPUNIT_TEST(Substract13);
+    CPPUNIT_TEST(Substract14);
+    
     CPPUNIT_TEST_SUITE_END();
     
     
@@ -596,6 +610,214 @@ class ip_range : public TestFixture
 
             CPPUNIT_ASSERT_EQUAL(check_cidrs,cidrs);
         }
+        
+        void Substract1()
+        {
+            IP_RANGE range("192.168.1.1-192.168.1.100");
+            set<IP_RANGE> to_sub;
+            to_sub.insert(IP_RANGE("192.168.1.3"));
+            
+            vector<IP_RANGE> new_range = range.substract(to_sub);
+            
+            vector<IP_RANGE> check_range;
+            check_range.push_back("192.168.1.1-192.168.1.2");
+            check_range.push_back("192.168.1.4-192.168.1.100");
+            
+            CPPUNIT_ASSERT_EQUAL(check_range,new_range);
+        }
+
+        void Substract2()
+        {
+            IP_RANGE range("192.168.1.1-192.168.1.100");
+            set<IP_RANGE> to_sub;
+            to_sub.insert(IP_RANGE("192.168.1.1"));
+            
+            vector<IP_RANGE> new_range = range.substract(to_sub);
+            
+            vector<IP_RANGE> check_range;
+            check_range.push_back("192.168.1.2-192.168.1.100");
+            
+            CPPUNIT_ASSERT_EQUAL(check_range,new_range);
+        }
+
+        void Substract3()
+        {
+            IP_RANGE range("192.168.1.1-192.168.1.100");
+            set<IP_RANGE> to_sub;
+            to_sub.insert(IP_RANGE("192.168.1.1"));
+            to_sub.insert(IP_RANGE("192.168.1.61"));
+            to_sub.insert(IP_RANGE("192.168.1.50-192.168.1.60"));
+            
+            vector<IP_RANGE> new_range = range.substract(to_sub);
+            
+            vector<IP_RANGE> check_range;
+            check_range.push_back("192.168.1.2-192.168.1.49");
+            check_range.push_back("192.168.1.62-192.168.1.100");
+            
+            CPPUNIT_ASSERT_EQUAL(check_range,new_range);
+        }
+
+        void Substract4()
+        {
+            IP_RANGE range("192.168.1.1-192.168.1.100");
+            set<IP_RANGE> to_sub;
+            to_sub.insert(IP_RANGE("192.168.1.50-192.168.1.100"));
+            
+            vector<IP_RANGE> new_range = range.substract(to_sub);
+            
+            vector<IP_RANGE> check_range;
+            check_range.push_back("192.168.1.1-192.168.1.49");
+            
+            CPPUNIT_ASSERT_EQUAL(check_range,new_range);
+        }
+
+        void Substract5()
+        {
+            IP_RANGE range("192.168.1.1-192.168.1.100");
+            set<IP_RANGE> to_sub;
+            to_sub.insert(IP_RANGE("192.168.1.50-192.168.1.99"));
+            
+            vector<IP_RANGE> new_range = range.substract(to_sub);
+            
+            vector<IP_RANGE> check_range;
+            check_range.push_back("192.168.1.1-192.168.1.49");
+            check_range.push_back("192.168.1.100-192.168.1.100");
+            
+            CPPUNIT_ASSERT_EQUAL(check_range,new_range);
+        }
+
+        void Substract6()
+        {
+            IP_RANGE range("192.168.1.1-192.168.1.100");
+            set<IP_RANGE> to_sub;
+            to_sub.insert(IP_RANGE("192.168.1.2-192.168.1.100"));
+            
+            vector<IP_RANGE> new_range = range.substract(to_sub);
+            
+            vector<IP_RANGE> check_range;
+            check_range.push_back("192.168.1.1");
+            
+            CPPUNIT_ASSERT_EQUAL(check_range,new_range);
+        }
+
+        void Substract7()
+        {
+            IP_RANGE range("192.168.1.1-192.168.1.100");
+            set<IP_RANGE> to_sub;
+            to_sub.insert(IP_RANGE("192.168.1.1-192.168.1.100"));
+            to_sub.insert(IP_RANGE("192.168.1.50-192.168.1.61"));
+            to_sub.insert(IP_RANGE("192.168.1.61"));
+            to_sub.insert(IP_RANGE("192.168.1.62"));
+            to_sub.insert(IP_RANGE("192.168.1.63"));
+            
+            vector<IP_RANGE> new_range = range.substract(to_sub);
+            
+            vector<IP_RANGE> check_range;
+            
+            CPPUNIT_ASSERT_EQUAL(check_range,new_range);
+        }
+        
+        void Substract8()
+        {
+            IP_RANGE range("192.168.1.1-192.168.1.100");
+            set<IP_RANGE> to_sub;
+            to_sub.insert(IP_RANGE("192.168.1.10-192.168.1.20"));
+            to_sub.insert(IP_RANGE("192.168.1.11-192.168.1.30"));
+            to_sub.insert(IP_RANGE("192.168.1.1-192.168.1.3"));
+            to_sub.insert(IP_RANGE("192.168.1.8"));
+            to_sub.insert(IP_RANGE("192.168.1.9"));
+            
+            vector<IP_RANGE> new_range = range.substract(to_sub);
+            
+            vector<IP_RANGE> check_range;
+            check_range.push_back("192.168.1.4-192.168.1.7");
+            check_range.push_back("192.168.1.31-192.168.1.100");
+            
+            CPPUNIT_ASSERT_EQUAL(check_range,new_range);
+        }
+
+        void Substract9()
+        {
+            IP_RANGE range("192.168.1.1-192.168.1.100");
+            set<IP_RANGE> to_sub;
+            to_sub.insert(IP_RANGE("192.168.1.9-192.168.1.15"));
+            to_sub.insert(IP_RANGE("192.168.1.10-192.168.1.20"));
+            
+            vector<IP_RANGE> new_range = range.substract(to_sub);
+            
+            vector<IP_RANGE> check_range;
+            check_range.push_back("192.168.1.1-192.168.1.8");
+            check_range.push_back("192.168.1.21-192.168.1.100");
+            
+            CPPUNIT_ASSERT_EQUAL(check_range,new_range);
+        }
+
+        void Substract10()
+        {
+            IP_RANGE range("192.168.1.1-192.168.1.2");
+            set<IP_RANGE> to_sub;
+            to_sub.insert(IP_RANGE("192.168.1.1"));
+            
+            vector<IP_RANGE> new_range = range.substract(to_sub);
+            
+            vector<IP_RANGE> check_range;
+            check_range.push_back("192.168.1.2");
+            
+            CPPUNIT_ASSERT_EQUAL(check_range,new_range);
+        }
+
+        void Substract11()
+        {
+            IP_RANGE range("192.168.1.1-192.168.1.2");
+            set<IP_RANGE> to_sub;
+            to_sub.insert(IP_RANGE("192.168.1.2"));
+            
+            vector<IP_RANGE> new_range = range.substract(to_sub);
+            
+            vector<IP_RANGE> check_range;
+            check_range.push_back("192.168.1.1");
+            
+            CPPUNIT_ASSERT_EQUAL(check_range,new_range);
+        }
+
+        void Substract12()
+        {
+            IP_RANGE range("192.168.1.1");
+            set<IP_RANGE> to_sub;
+            to_sub.insert(IP_RANGE("192.168.1.1"));
+            
+            vector<IP_RANGE> new_range = range.substract(to_sub);
+            
+            vector<IP_RANGE> check_range;
+            
+            CPPUNIT_ASSERT_EQUAL(check_range,new_range);
+        }
+
+        void Substract13()
+        {
+            IP_RANGE range("192.168.1.1");
+            
+            set<IP_RANGE> to_sub;
+            vector<IP_RANGE> new_range = range.substract(to_sub);
+            
+            vector<IP_RANGE> check_range;
+            check_range.push_back("192.168.1.1");
+            
+            CPPUNIT_ASSERT_EQUAL(check_range,new_range);
+        }
+
+        void Substract14()
+        {
+            IP_RANGE range("192.168.1.1-192.168.1.100");
+            set<IP_RANGE> to_sub;
+            
+            vector<IP_RANGE> new_range = range.substract(to_sub);
+            
+            vector<IP_RANGE> check_range;
+            check_range.push_back("192.168.1.1-192.168.1.100");
+            
+            CPPUNIT_ASSERT_EQUAL(check_range,new_range);
+        }
 };
 
 CPPUNIT_TEST_SUITE_REGISTRATION(ip_range);