add test for MemIndex.py; fix bug with adding lists of elements to Cidr/ComboMemIndex
[python-rwhoisd.git] / test / TestMemIndex.py
1 # This file is part of python-rwhoisd
2 #
3 # Copyright (C) 2008 David E. Blacka
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 # General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18 # USA
19
20
21 import path
22 import MemIndex, Cidr
23 import unittest, types
24
25 class MemIndexTest(unittest.TestCase):
26
27     source = [ ("foo", "foo-id"), ("bar", "bar-id"), ("baz", "baz-id"),
28                ("foobar", "foo-id-2"), ("barnone", "bar-id-2"),
29                ("zygnax", "z-id") ]
30
31     def setUp(self):
32         self.memindex = MemIndex.MemIndex()
33         self.memindex.addlist(self.source)
34
35     def testDirectMatch(self):
36         for key, val in self.source:
37             res = self.memindex.find(key)
38             self.assertEquals(res, [val])
39
40     def testPrefixMatch(self):
41         res = self.memindex.find("foo", 1)
42         self.assertEquals(res, ["foo-id", "foo-id-2"])
43         res = self.memindex.find("barn", 1)
44         self.assertEquals(res, ["bar-id-2"])
45
46     def testMaxMatch(self):
47         res = self.memindex.find("foo", 1, 1)
48         self.assertEquals(res, ["foo-id"])
49
50     def testAdd(self):
51         self.memindex.add("bork", "bork-id")
52         res = self.memindex.find("b", 1)
53         # note, values will come back in the alphabetical order of the
54         # keys.
55         self.assertEquals(res, ["bar-id", "bar-id-2", "baz-id", "bork-id"])
56
57
58 class CidrMemIndexTest(unittest.TestCase):
59
60     source = [ ("127.0.0.1/24", "net-local-1"),
61                ("127.0.0.1/32", "net-local-2"),
62                ("24.36.191.0/24", "net-foo-c"),
63                ("24.36.191.32/27", "net-foo-sub-c"),
64                ("24.36.0/16", "net-foo-b"),
65                ("3ffe:4:5::0/48", "net-foo-d6"),
66                ("3ffe:4:5:6::0/64", "net-foo-e6"),
67                ("48.12.6.0 - 48.12.6.95", "net-bar-1") ]
68
69     def setUp(self):
70         self.ci = MemIndex.CidrMemIndex()
71         self.ci.addlist(self.source)
72         self.ci.add(Cidr.new("216.168.224.0", 22), "net-vrsn-1")
73         self.ci.add(Cidr.new("216.168.252.1", 32), "net-vrsn-2")
74
75     def testFindExact(self):
76         res = self.ci.find_exact("127.0.0.0/24")
77         self.assertEquals(res, ["net-local-1"])
78         res = self.ci.find_exact(Cidr.new("216.168.224.0/22"))
79         self.assertEquals(res, ["net-vrsn-1"])
80         # isn't in the index.
81         res = self.ci.find_exact("127.0.0.16/32")
82         self.assertEquals(res, [])
83         res = self.ci.find_exact("3ffe:0004:0005:0::0/48")
84         self.assertEquals(res, ["net-foo-d6"])
85
86     def testFindSupernets(self):
87         res = self.ci.find_supernets("127.0.0.16/32")
88         self.assertEquals(res, ["net-local-1"])
89         res = self.ci.find_supernets("127.0.0.1")
90         self.assertEquals(res, ["net-local-2", "net-local-1"])
91         res = self.ci.find_supernets(Cidr.valid_cidr("24.36.191.63"))
92         self.assertEquals(res, ["net-foo-sub-c", "net-foo-c", "net-foo-b"])
93         res = self.ci.find_supernets("48.12.6.92")
94         self.assertEquals(res, ["net-bar-1"])
95         res = self.ci.find_supernets("24.0.0.0/8")
96         self.assertEquals(res, [])
97
98     def testFindSubnets(self):
99         res = self.ci.find_subnets("127.0.0.0/24")
100         self.assertEquals(res, ["net-local-2", "net-local-1"])
101         res = self.ci.find_subnets("24.36.128.0/17")
102         self.assertEquals(res, ["net-foo-sub-c", "net-foo-c"])
103         res = self.ci.find_subnets("24.36.0/17")
104         self.assertEquals(res, [])
105         res = self.ci.find_subnets("3ffe:4::/32")
106         self.assertEquals(res, ["net-foo-e6", "net-foo-d6"])
107         res = self.ci.find_subnets("48.12.6.0/24")
108         self.assertEquals(res, ["net-bar-1"])
109         res = self.ci.find_subnets("216.168.224.0/19")
110         self.assertEquals(res, ["net-vrsn-1", "net-vrsn-2"])
111
112     def testFind(self):
113         res = self.ci.find("24.36.191.63")
114         self.assertEquals(res, ["net-foo-sub-c"])
115         res = self.ci.find("24.36.191.63", True, 2)
116         self.assertEquals(res, ["net-foo-sub-c", "net-foo-c"])
117         res = self.ci.find("24.36.191.32/27")
118         self.assertEquals(res, ["net-foo-sub-c"])
119         res = self.ci.find("216.168.252.1")
120         self.assertEquals(res, ["net-vrsn-2"])
121
122
123 class ComboMemIndexTest(unittest.TestCase):
124     source = [ ("127.0.0.1/24", "net-local-1"),
125                ("127.0.0.1/32", "net-local-2"),
126                ("3ffe:4:5::0/48", "net-foo-d6"),
127                ("3ffe:4:5:6::0/64", "net-foo-e6"),
128                ("48.12.6.0 - 48.12.6.95", "net-bar-1"),
129                ("foo", "foo-id"), ("bar", "bar-id"), ("baz", "baz-id"),
130                ("foobar", "foo-id-2"), ("barnone", "bar-id-2"),
131                ("zygnax", "z-id") ]
132
133     def setUp(self):
134         self.ci = MemIndex.ComboMemIndex()
135         self.ci.addlist(self.source)
136
137     def testFind(self):
138         res = self.ci.find("foo")
139         self.assertEquals(res, ["foo-id"])
140         res = self.ci.find("foo", True)
141         self.assertEquals(res, ["foo-id", "foo-id-2"])
142         res = self.ci.find("127.0.0.8")
143         self.assertEquals(res, ["net-local-1"])
144         res = self.ci.find("3ffe:4:5:6:7:8::ffff")
145         self.assertEquals(res, ["net-foo-e6"])
146         res = self.ci.find("3ffe:4:5:6:7:8::ffff", True)
147         self.assertEquals(res, ["net-foo-e6", "net-foo-d6"])
148
149
150 if __name__ == "__main__":
151     unittest.main()