root / snf-cyclades-app / synnefo / db / pools / tests.py @ f6ff4b40
History | View | Annotate | Download (8 kB)
1 | 35e2f2d4 | Christos Stavrakakis | # Copyright 2012 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | 35e2f2d4 | Christos Stavrakakis | #
|
3 | 35e2f2d4 | Christos Stavrakakis | # Redistribution and use in source and binary forms, with or
|
4 | 35e2f2d4 | Christos Stavrakakis | # without modification, are permitted provided that the following
|
5 | 35e2f2d4 | Christos Stavrakakis | # conditions are met:
|
6 | 35e2f2d4 | Christos Stavrakakis | #
|
7 | 35e2f2d4 | Christos Stavrakakis | # 1. Redistributions of source code must retain the above
|
8 | 35e2f2d4 | Christos Stavrakakis | # copyright notice, this list of conditions and the following
|
9 | 35e2f2d4 | Christos Stavrakakis | # disclaimer.
|
10 | 35e2f2d4 | Christos Stavrakakis | #
|
11 | 35e2f2d4 | Christos Stavrakakis | # 2. Redistributions in binary form must reproduce the above
|
12 | 35e2f2d4 | Christos Stavrakakis | # copyright notice, this list of conditions and the following
|
13 | 35e2f2d4 | Christos Stavrakakis | # disclaimer in the documentation and/or other materials
|
14 | 35e2f2d4 | Christos Stavrakakis | # provided with the distribution.
|
15 | 35e2f2d4 | Christos Stavrakakis | #
|
16 | 35e2f2d4 | Christos Stavrakakis | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | 35e2f2d4 | Christos Stavrakakis | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | 35e2f2d4 | Christos Stavrakakis | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | 35e2f2d4 | Christos Stavrakakis | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | 35e2f2d4 | Christos Stavrakakis | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | 35e2f2d4 | Christos Stavrakakis | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | 35e2f2d4 | Christos Stavrakakis | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | 35e2f2d4 | Christos Stavrakakis | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | 35e2f2d4 | Christos Stavrakakis | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | 35e2f2d4 | Christos Stavrakakis | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | 35e2f2d4 | Christos Stavrakakis | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | 35e2f2d4 | Christos Stavrakakis | # POSSIBILITY OF SUCH DAMAGE.
|
28 | 35e2f2d4 | Christos Stavrakakis | #
|
29 | 35e2f2d4 | Christos Stavrakakis | # The views and conclusions contained in the software and
|
30 | 35e2f2d4 | Christos Stavrakakis | # documentation are those of the authors and should not be
|
31 | 35e2f2d4 | Christos Stavrakakis | # interpreted as representing official policies, either expressed
|
32 | 35e2f2d4 | Christos Stavrakakis | # or implied, of GRNET S.A.
|
33 | 35e2f2d4 | Christos Stavrakakis | |
34 | 35e2f2d4 | Christos Stavrakakis | |
35 | 35e2f2d4 | Christos Stavrakakis | from django.test import TestCase |
36 | 2dbe7563 | Christos Stavrakakis | from synnefo.db.pools import (PoolManager, EmptyPool, BridgePool, |
37 | b66e4833 | Christos Stavrakakis | MacPrefixPool, IPPool, find_padding, |
38 | b66e4833 | Christos Stavrakakis | bitarray_to_map) |
39 | 3e7c63f8 | Christos Stavrakakis | from bitarray import bitarray |
40 | 2dbe7563 | Christos Stavrakakis | |
41 | 2dbe7563 | Christos Stavrakakis | |
42 | 2dbe7563 | Christos Stavrakakis | class DummyObject(): |
43 | 2dbe7563 | Christos Stavrakakis | def __init__(self, size): |
44 | 2dbe7563 | Christos Stavrakakis | self.size = size
|
45 | 2dbe7563 | Christos Stavrakakis | |
46 | 2dbe7563 | Christos Stavrakakis | self.available_map = '' |
47 | 2dbe7563 | Christos Stavrakakis | self.reserved_map = '' |
48 | 2dbe7563 | Christos Stavrakakis | |
49 | 2dbe7563 | Christos Stavrakakis | def save(self): |
50 | 2dbe7563 | Christos Stavrakakis | pass
|
51 | 2dbe7563 | Christos Stavrakakis | |
52 | 2dbe7563 | Christos Stavrakakis | |
53 | 2dbe7563 | Christos Stavrakakis | class DummyPool(PoolManager): |
54 | 2dbe7563 | Christos Stavrakakis | def value_to_index(self, index): |
55 | 2dbe7563 | Christos Stavrakakis | return index
|
56 | 2dbe7563 | Christos Stavrakakis | |
57 | 2dbe7563 | Christos Stavrakakis | def index_to_value(self, value): |
58 | 2dbe7563 | Christos Stavrakakis | return value
|
59 | 2dbe7563 | Christos Stavrakakis | |
60 | 2dbe7563 | Christos Stavrakakis | |
61 | 35e2f2d4 | Christos Stavrakakis | class PoolManagerTestCase(TestCase): |
62 | 2dbe7563 | Christos Stavrakakis | def test_created_pool(self): |
63 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(42)
|
64 | 2dbe7563 | Christos Stavrakakis | pool = DummyPool(obj) |
65 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.to_01(), '1' * 42) |
66 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.to_map(), '.' * 42) |
67 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.available, bitarray('1' * 42 + '0' * 6)) |
68 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.reserved, bitarray('1' * 42 + '0' * 6)) |
69 | 2dbe7563 | Christos Stavrakakis | |
70 | 2dbe7563 | Christos Stavrakakis | def test_save_pool(self): |
71 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(42)
|
72 | 2dbe7563 | Christos Stavrakakis | pool = DummyPool(obj) |
73 | 2dbe7563 | Christos Stavrakakis | pool.save() |
74 | 2dbe7563 | Christos Stavrakakis | self.assertNotEqual(obj.available_map, '') |
75 | 2dbe7563 | Christos Stavrakakis | available_map = obj.available_map |
76 | 2dbe7563 | Christos Stavrakakis | b = DummyPool(obj) |
77 | 2dbe7563 | Christos Stavrakakis | b.save() |
78 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(obj.available_map, available_map)
|
79 | 2dbe7563 | Christos Stavrakakis | |
80 | 2dbe7563 | Christos Stavrakakis | def test_empty_pool(self): |
81 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(42)
|
82 | 2dbe7563 | Christos Stavrakakis | pool = DummyPool(obj) |
83 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.empty(), False) |
84 | 2dbe7563 | Christos Stavrakakis | for i in range(0, 42): |
85 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.get(), i)
|
86 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.empty(), True) |
87 | 2dbe7563 | Christos Stavrakakis | self.assertRaises(EmptyPool, pool.get)
|
88 | 2dbe7563 | Christos Stavrakakis | |
89 | 2dbe7563 | Christos Stavrakakis | def test_reserved_value(self): |
90 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(42)
|
91 | 2dbe7563 | Christos Stavrakakis | pool = DummyPool(obj) |
92 | 2dbe7563 | Christos Stavrakakis | available = pool.count_available() |
93 | 2dbe7563 | Christos Stavrakakis | value = pool.get() |
94 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.is_available(value), False) |
95 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.count_available(), available - 1) |
96 | 2dbe7563 | Christos Stavrakakis | pool.put(value) |
97 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.is_available(value), True) |
98 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.count_available(), available)
|
99 | 2dbe7563 | Christos Stavrakakis | |
100 | 2dbe7563 | Christos Stavrakakis | def test_external_reserved(self): |
101 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(42)
|
102 | 2dbe7563 | Christos Stavrakakis | pool = DummyPool(obj) |
103 | 2dbe7563 | Christos Stavrakakis | for i in range(42, 48): |
104 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.is_available(i), False) |
105 | 2dbe7563 | Christos Stavrakakis | pool.reserve(32, external=True) |
106 | 2dbe7563 | Christos Stavrakakis | values = [] |
107 | 2dbe7563 | Christos Stavrakakis | while True: |
108 | 2dbe7563 | Christos Stavrakakis | try:
|
109 | 2dbe7563 | Christos Stavrakakis | values.append(pool.get()) |
110 | 2dbe7563 | Christos Stavrakakis | except EmptyPool:
|
111 | 2dbe7563 | Christos Stavrakakis | break
|
112 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(32 not in values, True) |
113 | 2dbe7563 | Christos Stavrakakis | |
114 | 2dbe7563 | Christos Stavrakakis | def test_external_reserved_2(self): |
115 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(42)
|
116 | 2dbe7563 | Christos Stavrakakis | pool = DummyPool(obj) |
117 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.get(), 0) |
118 | 2dbe7563 | Christos Stavrakakis | pool.reserve(0, external=True) |
119 | 2dbe7563 | Christos Stavrakakis | pool.put(0)
|
120 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.get(), 1) |
121 | 2dbe7563 | Christos Stavrakakis | |
122 | 3e7c63f8 | Christos Stavrakakis | def test_extend_pool(self): |
123 | 3e7c63f8 | Christos Stavrakakis | obj = DummyObject(42)
|
124 | 3e7c63f8 | Christos Stavrakakis | pool = DummyPool(obj) |
125 | 3e7c63f8 | Christos Stavrakakis | pool.extend(7)
|
126 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.to_01(), '1' * 49) |
127 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.to_map(), '.' * 49) |
128 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.available, bitarray('1' * 49 + '0' * 7)) |
129 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.reserved, bitarray('1' * 49 + '0' * 7)) |
130 | 3e7c63f8 | Christos Stavrakakis | |
131 | 3e7c63f8 | Christos Stavrakakis | def test_shrink_pool(self): |
132 | 3e7c63f8 | Christos Stavrakakis | obj = DummyObject(42)
|
133 | 3e7c63f8 | Christos Stavrakakis | pool = DummyPool(obj) |
134 | 3e7c63f8 | Christos Stavrakakis | pool.shrink(3)
|
135 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.to_01(), '1' * 39) |
136 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.to_map(), '.' * 39) |
137 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.available, bitarray('1' * 39 + '0' * 1)) |
138 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.reserved, bitarray('1' * 39 + '0' * 1)) |
139 | 3e7c63f8 | Christos Stavrakakis | |
140 | b66e4833 | Christos Stavrakakis | def test_shrink_in_use(self): |
141 | b66e4833 | Christos Stavrakakis | obj = DummyObject(8)
|
142 | b66e4833 | Christos Stavrakakis | pool = DummyPool(obj) |
143 | b66e4833 | Christos Stavrakakis | pool._reserve(6)
|
144 | b66e4833 | Christos Stavrakakis | self.assertRaises(Exception, pool.shrink, 3) |
145 | b66e4833 | Christos Stavrakakis | |
146 | b66e4833 | Christos Stavrakakis | def test_count(self): |
147 | b66e4833 | Christos Stavrakakis | obj = DummyObject(10)
|
148 | b66e4833 | Christos Stavrakakis | pool = DummyPool(obj) |
149 | b66e4833 | Christos Stavrakakis | pool._reserve(1)
|
150 | b66e4833 | Christos Stavrakakis | pool._reserve(3)
|
151 | b66e4833 | Christos Stavrakakis | pool._reserve(4)
|
152 | b66e4833 | Christos Stavrakakis | pool._reserve(2, external=True) |
153 | b66e4833 | Christos Stavrakakis | self.assertEqual(pool.count_available(), 6) |
154 | b66e4833 | Christos Stavrakakis | self.assertEqual(pool.count_unavailable(), 4) |
155 | b66e4833 | Christos Stavrakakis | self.assertEqual(pool.count_reserved(), 1) |
156 | b66e4833 | Christos Stavrakakis | self.assertEqual(pool.count_unreserved(), 9) |
157 | b66e4833 | Christos Stavrakakis | |
158 | b66e4833 | Christos Stavrakakis | |
159 | b66e4833 | Christos Stavrakakis | class HelpersTestCase(TestCase): |
160 | b66e4833 | Christos Stavrakakis | def test_find_padding(self): |
161 | b66e4833 | Christos Stavrakakis | self.assertEqual(find_padding(1), 7) |
162 | b66e4833 | Christos Stavrakakis | self.assertEqual(find_padding(8), 0) |
163 | b66e4833 | Christos Stavrakakis | self.assertEqual(find_padding(12), 4) |
164 | b66e4833 | Christos Stavrakakis | self.assertEqual(find_padding(16), 0) |
165 | b66e4833 | Christos Stavrakakis | |
166 | b66e4833 | Christos Stavrakakis | def test_bitarray_to_map(self): |
167 | b66e4833 | Christos Stavrakakis | bt = bitarray('01001100101')
|
168 | b66e4833 | Christos Stavrakakis | map_ = bitarray_to_map(bt) |
169 | b66e4833 | Christos Stavrakakis | self.assertEqual(map_, 'X.XX..XX.X.') |
170 | b66e4833 | Christos Stavrakakis | |
171 | 2dbe7563 | Christos Stavrakakis | |
172 | 35e2f2d4 | Christos Stavrakakis | class BridgePoolTestCase(TestCase): |
173 | 2dbe7563 | Christos Stavrakakis | def test_bridge_conversion(self): |
174 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(13)
|
175 | 2dbe7563 | Christos Stavrakakis | obj.base = "bridge"
|
176 | 2dbe7563 | Christos Stavrakakis | pool = BridgePool(obj) |
177 | 2dbe7563 | Christos Stavrakakis | for i in range(0, 13): |
178 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual("bridge" + str(i + 1), pool.get()) |
179 | 2dbe7563 | Christos Stavrakakis | pool.put("bridge2")
|
180 | 2dbe7563 | Christos Stavrakakis | pool.put("bridge6")
|
181 | 2dbe7563 | Christos Stavrakakis | self.assertEqual("bridge2", pool.get()) |
182 | 2dbe7563 | Christos Stavrakakis | self.assertEqual("bridge6", pool.get()) |
183 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.empty(), True) |
184 | 2dbe7563 | Christos Stavrakakis | |
185 | 2dbe7563 | Christos Stavrakakis | |
186 | 35e2f2d4 | Christos Stavrakakis | class MacPrefixPoolTestCase(TestCase): |
187 | 2dbe7563 | Christos Stavrakakis | def test_invalid_mac_reservation(self): |
188 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(65636)
|
189 | 2dbe7563 | Christos Stavrakakis | obj.base = 'ab:ff:ff'
|
190 | 2dbe7563 | Christos Stavrakakis | pool = MacPrefixPool(obj) |
191 | 2dbe7563 | Christos Stavrakakis | for i in range(0, 65536): |
192 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.is_available(i, index=True), False) |
193 | 2dbe7563 | Christos Stavrakakis | |
194 | b66e4833 | Christos Stavrakakis | def test_mac_prefix_conversion(self): |
195 | b66e4833 | Christos Stavrakakis | obj = DummyObject(13)
|
196 | b66e4833 | Christos Stavrakakis | obj.base = 'aa:00:0'
|
197 | b66e4833 | Christos Stavrakakis | pool = MacPrefixPool(obj) |
198 | b66e4833 | Christos Stavrakakis | for i in range(1, 9): |
199 | b66e4833 | Christos Stavrakakis | self.assertEqual("aa:00:%s" % i, pool.get()) |
200 | b66e4833 | Christos Stavrakakis | |
201 | b66e4833 | Christos Stavrakakis | def test_value_to_index(self): |
202 | b66e4833 | Christos Stavrakakis | obj = DummyObject(13)
|
203 | b66e4833 | Christos Stavrakakis | obj.base = 'aa:00:0'
|
204 | b66e4833 | Christos Stavrakakis | pool = MacPrefixPool(obj) |
205 | b66e4833 | Christos Stavrakakis | index = pool.value_to_index('aa:bc:ee')
|
206 | b66e4833 | Christos Stavrakakis | val = pool.index_to_value(index) |
207 | b66e4833 | Christos Stavrakakis | self.assertEqual(val, 'aa:bc:ee') |
208 | b66e4833 | Christos Stavrakakis | |
209 | 35e2f2d4 | Christos Stavrakakis | |
210 | 35e2f2d4 | Christos Stavrakakis | class IPPoolTestCase(TestCase): |
211 | 2dbe7563 | Christos Stavrakakis | def test_auto_reservations(self): |
212 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(0)
|
213 | 2dbe7563 | Christos Stavrakakis | network = DummyObject(0)
|
214 | 2dbe7563 | Christos Stavrakakis | obj.network = network |
215 | 2dbe7563 | Christos Stavrakakis | network.subnet = '192.168.2.0/24'
|
216 | 2dbe7563 | Christos Stavrakakis | network.gateway = '192.168.2.1'
|
217 | 2dbe7563 | Christos Stavrakakis | pool = IPPool(obj) |
218 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.is_available('192.168.2.0'), False) |
219 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.is_available('192.168.2.1'), False) |
220 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.is_available('192.168.2.255'), False) |
221 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.count_available(), 253) |
222 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.get(), '192.168.2.2') |
223 | 2dbe7563 | Christos Stavrakakis | |
224 | 2dbe7563 | Christos Stavrakakis | def test_auto_reservations_2(self): |
225 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(0)
|
226 | 2dbe7563 | Christos Stavrakakis | network = DummyObject(0)
|
227 | 2dbe7563 | Christos Stavrakakis | obj.network = network |
228 | 2dbe7563 | Christos Stavrakakis | network.subnet = '192.168.2.0/31'
|
229 | 2dbe7563 | Christos Stavrakakis | network.gateway = '192.168.2.1'
|
230 | 2dbe7563 | Christos Stavrakakis | pool = IPPool(obj) |
231 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.is_available('192.168.2.0'), False) |
232 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.is_available('192.168.2.1'), False) |
233 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.size(), 8) |
234 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.empty(), True) |