+# 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()