From b9ffe67f80daf6c7aeec0474508dffdf5e005897 Mon Sep 17 00:00:00 2001 From: David Blacka Date: Thu, 3 Jul 2008 23:00:47 -0400 Subject: [PATCH] add test for MemIndex.py; fix bug with adding lists of elements to Cidr/ComboMemIndex --- rwhoisd/MemIndex.py | 90 +------------------------- test/TestMemIndex.py | 151 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+), 88 deletions(-) create mode 100644 test/TestMemIndex.py diff --git a/rwhoisd/MemIndex.py b/rwhoisd/MemIndex.py index 4d9d365..e66cc71 100644 --- a/rwhoisd/MemIndex.py +++ b/rwhoisd/MemIndex.py @@ -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 index 0000000..4568a1f --- /dev/null +++ b/test/TestMemIndex.py @@ -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() -- 2.36.6