add test for MemIndex.py; fix bug with adding lists of elements to Cidr/ComboMemIndex
authorDavid Blacka <david@blacka.com>
Fri, 4 Jul 2008 03:00:47 +0000 (23:00 -0400)
committerDavid Blacka <david@blacka.com>
Fri, 4 Jul 2008 03:00:47 +0000 (23:00 -0400)
rwhoisd/MemIndex.py
test/TestMemIndex.py [new file with mode: 0644]

index 4d9d365..e66cc71 100644 (file)
@@ -179,6 +179,8 @@ class CidrMemIndex(MemIndex):
                 l = self._conv_key_value(i.key, i.value)
             res_list.append(l)
 
+        # flatten the list of lists of tuples to just a list of tuples
+        res_list = [ x for y in res_list for x in y ]
         MemIndex.addlist(self, res_list)
         return
 
@@ -387,91 +389,3 @@ class element:
         if not isinstance(other, type(self)): return False
         return self.key == other.key and self.value == other.value
 
-if __name__ == "__main__":
-
-    source = [ ("foo", "foo-id"), ("bar", "bar-id"), ("baz", "baz-id"),
-               ("foobar", "foo-id-2"), ("barnone", "bar-id-2"),
-               ("zygnax", "z-id") ]
-
-    mi = MemIndex()
-    mi.addlist(source)
-
-    print "finding foobar:"
-    res = mi.find("foobar")
-    print res
-
-    print "finding foo*:"
-    res = mi.find("foo", 1)
-    print res
-
-    print "finding baz:"
-    res = mi.find("baz")
-    print res
-
-    print "adding bork"
-    mi.add("bork", "bork-id")
-
-    print "finding b*:"
-    res = mi.find("b", 1)
-    print res
-
-    ci = CidrMemIndex()
-
-    ci.add("127.0.0.1/24", "net-local-1");
-    ci.add("127.0.0.1/32", "net-local-2");
-    ci.add(Cidr.new("216.168.224.0", 22), "net-vrsn-1")
-    ci.add(Cidr.new("216.168.252.1", 32), "net-vrsn-2")
-    ci.add("24.36.191.0/24", "net-foo-c")
-    ci.add("24.36.191.32/27", "net-foo-sub-c")
-    ci.add("24.36/16", "net-foo-b")
-    ci.add("3ffe:4:5::0/48", "net-foo-d6")
-    ci.add("3ffe:4:5:6::0/64", "net-foo-e6")
-    ci.add("48.12.6.0 - 48.12.6.95", "net-bar-1")
-
-    print "finding exactly 127.0.0.0/24"
-    res = ci.find(Cidr.new("127.0.0.0/24"))
-    print res
-
-    print "finding exactly 127.0.0.16/32"
-    res = ci.find(Cidr.new("127.0.0.16/32"))
-    print res
-
-    print "finding exactly 3ffe:4:5:6::0/64"
-    res = ci.find(Cidr.valid_cidr("3ffe:4:5:6::/64"))
-    print res
-
-    print "finding supernets of 127.0.0.16/32"
-    res = ci.find_supernets(Cidr.new("127.0.0.16/32"))
-    print res
-
-    print "finding supernets of 24.36.191.32/27"
-    res = ci.find(Cidr.new("24.36.191.32/27"), 1)
-    print res
-
-    print "finding supernets of 24.36.191.33/27"
-    res = ci.find_supernets(Cidr.new("24.36.191.33/27"))
-    print res
-
-    print "finding supernets of 24.36.191.64/27"
-    res = ci.find_supernets(Cidr.new("24.36.191.64/27"))
-    print res
-
-    print "finding supernets of 3ffe:4:5:6:7::0/80"
-    res = ci.find_supernets(Cidr.valid_cidr("3ffe:4:5:6:7::0/80"))
-    print res
-
-    print "finding supernets of 48.12.6.90"
-    res = ci.find_supernets(Cidr.valid_cidr("48.12.6.90"))
-    print res
-
-    print "finding subnets of 127.0/16"
-    res = ci.find_subnets(Cidr.new("127.0/16"))
-    print res
-
-    print "finding subnets of 3ffe:4::0/32"
-    res = ci.find_subnets(Cidr.valid_cidr("3ffe:4::0/32"))
-    print res
-
-    print "finding subnets of 48.12.0.0/16"
-    res = ci.find_subnets(Cidr.valid_cidr("48.12.0.0/16"))
-    print res
diff --git a/test/TestMemIndex.py b/test/TestMemIndex.py
new file mode 100644 (file)
index 0000000..4568a1f
--- /dev/null
@@ -0,0 +1,151 @@
+# This file is part of python-rwhoisd
+#
+# Copyright (C) 2008 David E. Blacka
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+# USA
+
+
+import path
+import MemIndex, Cidr
+import unittest, types
+
+class MemIndexTest(unittest.TestCase):
+
+    source = [ ("foo", "foo-id"), ("bar", "bar-id"), ("baz", "baz-id"),
+               ("foobar", "foo-id-2"), ("barnone", "bar-id-2"),
+               ("zygnax", "z-id") ]
+
+    def setUp(self):
+        self.memindex = MemIndex.MemIndex()
+        self.memindex.addlist(self.source)
+
+    def testDirectMatch(self):
+        for key, val in self.source:
+            res = self.memindex.find(key)
+            self.assertEquals(res, [val])
+
+    def testPrefixMatch(self):
+        res = self.memindex.find("foo", 1)
+        self.assertEquals(res, ["foo-id", "foo-id-2"])
+        res = self.memindex.find("barn", 1)
+        self.assertEquals(res, ["bar-id-2"])
+
+    def testMaxMatch(self):
+        res = self.memindex.find("foo", 1, 1)
+        self.assertEquals(res, ["foo-id"])
+
+    def testAdd(self):
+        self.memindex.add("bork", "bork-id")
+        res = self.memindex.find("b", 1)
+        # note, values will come back in the alphabetical order of the
+        # keys.
+        self.assertEquals(res, ["bar-id", "bar-id-2", "baz-id", "bork-id"])
+
+
+class CidrMemIndexTest(unittest.TestCase):
+
+    source = [ ("127.0.0.1/24", "net-local-1"),
+               ("127.0.0.1/32", "net-local-2"),
+               ("24.36.191.0/24", "net-foo-c"),
+               ("24.36.191.32/27", "net-foo-sub-c"),
+               ("24.36.0/16", "net-foo-b"),
+               ("3ffe:4:5::0/48", "net-foo-d6"),
+               ("3ffe:4:5:6::0/64", "net-foo-e6"),
+               ("48.12.6.0 - 48.12.6.95", "net-bar-1") ]
+
+    def setUp(self):
+        self.ci = MemIndex.CidrMemIndex()
+        self.ci.addlist(self.source)
+        self.ci.add(Cidr.new("216.168.224.0", 22), "net-vrsn-1")
+        self.ci.add(Cidr.new("216.168.252.1", 32), "net-vrsn-2")
+
+    def testFindExact(self):
+        res = self.ci.find_exact("127.0.0.0/24")
+        self.assertEquals(res, ["net-local-1"])
+        res = self.ci.find_exact(Cidr.new("216.168.224.0/22"))
+        self.assertEquals(res, ["net-vrsn-1"])
+        # isn't in the index.
+        res = self.ci.find_exact("127.0.0.16/32")
+        self.assertEquals(res, [])
+        res = self.ci.find_exact("3ffe:0004:0005:0::0/48")
+        self.assertEquals(res, ["net-foo-d6"])
+
+    def testFindSupernets(self):
+        res = self.ci.find_supernets("127.0.0.16/32")
+        self.assertEquals(res, ["net-local-1"])
+        res = self.ci.find_supernets("127.0.0.1")
+        self.assertEquals(res, ["net-local-2", "net-local-1"])
+        res = self.ci.find_supernets(Cidr.valid_cidr("24.36.191.63"))
+        self.assertEquals(res, ["net-foo-sub-c", "net-foo-c", "net-foo-b"])
+        res = self.ci.find_supernets("48.12.6.92")
+        self.assertEquals(res, ["net-bar-1"])
+        res = self.ci.find_supernets("24.0.0.0/8")
+        self.assertEquals(res, [])
+
+    def testFindSubnets(self):
+        res = self.ci.find_subnets("127.0.0.0/24")
+        self.assertEquals(res, ["net-local-2", "net-local-1"])
+        res = self.ci.find_subnets("24.36.128.0/17")
+        self.assertEquals(res, ["net-foo-sub-c", "net-foo-c"])
+        res = self.ci.find_subnets("24.36.0/17")
+        self.assertEquals(res, [])
+        res = self.ci.find_subnets("3ffe:4::/32")
+        self.assertEquals(res, ["net-foo-e6", "net-foo-d6"])
+        res = self.ci.find_subnets("48.12.6.0/24")
+        self.assertEquals(res, ["net-bar-1"])
+        res = self.ci.find_subnets("216.168.224.0/19")
+        self.assertEquals(res, ["net-vrsn-1", "net-vrsn-2"])
+
+    def testFind(self):
+        res = self.ci.find("24.36.191.63")
+        self.assertEquals(res, ["net-foo-sub-c"])
+        res = self.ci.find("24.36.191.63", True, 2)
+        self.assertEquals(res, ["net-foo-sub-c", "net-foo-c"])
+        res = self.ci.find("24.36.191.32/27")
+        self.assertEquals(res, ["net-foo-sub-c"])
+        res = self.ci.find("216.168.252.1")
+        self.assertEquals(res, ["net-vrsn-2"])
+
+
+class ComboMemIndexTest(unittest.TestCase):
+    source = [ ("127.0.0.1/24", "net-local-1"),
+               ("127.0.0.1/32", "net-local-2"),
+               ("3ffe:4:5::0/48", "net-foo-d6"),
+               ("3ffe:4:5:6::0/64", "net-foo-e6"),
+               ("48.12.6.0 - 48.12.6.95", "net-bar-1"),
+               ("foo", "foo-id"), ("bar", "bar-id"), ("baz", "baz-id"),
+               ("foobar", "foo-id-2"), ("barnone", "bar-id-2"),
+               ("zygnax", "z-id") ]
+
+    def setUp(self):
+        self.ci = MemIndex.ComboMemIndex()
+        self.ci.addlist(self.source)
+
+    def testFind(self):
+        res = self.ci.find("foo")
+        self.assertEquals(res, ["foo-id"])
+        res = self.ci.find("foo", True)
+        self.assertEquals(res, ["foo-id", "foo-id-2"])
+        res = self.ci.find("127.0.0.8")
+        self.assertEquals(res, ["net-local-1"])
+        res = self.ci.find("3ffe:4:5:6:7:8::ffff")
+        self.assertEquals(res, ["net-foo-e6"])
+        res = self.ci.find("3ffe:4:5:6:7:8::ffff", True)
+        self.assertEquals(res, ["net-foo-e6", "net-foo-d6"])
+
+
+if __name__ == "__main__":
+    unittest.main()