root / snf-cyclades-app / synnefo / db / pools / tests.py @ 406968dc
History | View | Annotate | Download (7.7 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 | ae994d2e | Christos Stavrakakis | bitarray_to_map, ValueNotAvailable, |
39 | ae994d2e | Christos Stavrakakis | InvalidValue) |
40 | 3e7c63f8 | Christos Stavrakakis | from bitarray import bitarray |
41 | 2dbe7563 | Christos Stavrakakis | |
42 | 2dbe7563 | Christos Stavrakakis | |
43 | 2dbe7563 | Christos Stavrakakis | class DummyObject(): |
44 | 2dbe7563 | Christos Stavrakakis | def __init__(self, size): |
45 | 2dbe7563 | Christos Stavrakakis | self.size = size
|
46 | 2dbe7563 | Christos Stavrakakis | |
47 | 2dbe7563 | Christos Stavrakakis | self.available_map = '' |
48 | 2dbe7563 | Christos Stavrakakis | self.reserved_map = '' |
49 | 2dbe7563 | Christos Stavrakakis | |
50 | 2dbe7563 | Christos Stavrakakis | def save(self): |
51 | 2dbe7563 | Christos Stavrakakis | pass
|
52 | 2dbe7563 | Christos Stavrakakis | |
53 | 2dbe7563 | Christos Stavrakakis | |
54 | 2dbe7563 | Christos Stavrakakis | class DummyPool(PoolManager): |
55 | 2dbe7563 | Christos Stavrakakis | def value_to_index(self, index): |
56 | 2dbe7563 | Christos Stavrakakis | return index
|
57 | 2dbe7563 | Christos Stavrakakis | |
58 | 2dbe7563 | Christos Stavrakakis | def index_to_value(self, value): |
59 | 2dbe7563 | Christos Stavrakakis | return value
|
60 | 2dbe7563 | Christos Stavrakakis | |
61 | 2dbe7563 | Christos Stavrakakis | |
62 | 35e2f2d4 | Christos Stavrakakis | class PoolManagerTestCase(TestCase): |
63 | 2dbe7563 | Christos Stavrakakis | def test_created_pool(self): |
64 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(42)
|
65 | 2dbe7563 | Christos Stavrakakis | pool = DummyPool(obj) |
66 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.to_01(), '1' * 42) |
67 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.to_map(), '.' * 42) |
68 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.available, bitarray('1' * 42 + '0' * 6)) |
69 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.reserved, bitarray('1' * 42 + '0' * 6)) |
70 | 2dbe7563 | Christos Stavrakakis | |
71 | 2dbe7563 | Christos Stavrakakis | def test_save_pool(self): |
72 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(42)
|
73 | 2dbe7563 | Christos Stavrakakis | pool = DummyPool(obj) |
74 | 2dbe7563 | Christos Stavrakakis | pool.save() |
75 | 2dbe7563 | Christos Stavrakakis | self.assertNotEqual(obj.available_map, '') |
76 | 2dbe7563 | Christos Stavrakakis | available_map = obj.available_map |
77 | 2dbe7563 | Christos Stavrakakis | b = DummyPool(obj) |
78 | 2dbe7563 | Christos Stavrakakis | b.save() |
79 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(obj.available_map, available_map)
|
80 | 2dbe7563 | Christos Stavrakakis | |
81 | 2dbe7563 | Christos Stavrakakis | def test_empty_pool(self): |
82 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(42)
|
83 | 2dbe7563 | Christos Stavrakakis | pool = DummyPool(obj) |
84 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.empty(), False) |
85 | 2dbe7563 | Christos Stavrakakis | for i in range(0, 42): |
86 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.get(), i)
|
87 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.empty(), True) |
88 | 2dbe7563 | Christos Stavrakakis | self.assertRaises(EmptyPool, pool.get)
|
89 | 2dbe7563 | Christos Stavrakakis | |
90 | 2dbe7563 | Christos Stavrakakis | def test_reserved_value(self): |
91 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(42)
|
92 | 2dbe7563 | Christos Stavrakakis | pool = DummyPool(obj) |
93 | 2dbe7563 | Christos Stavrakakis | available = pool.count_available() |
94 | 2dbe7563 | Christos Stavrakakis | value = pool.get() |
95 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.is_available(value), False) |
96 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.count_available(), available - 1) |
97 | 2dbe7563 | Christos Stavrakakis | pool.put(value) |
98 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.is_available(value), True) |
99 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.count_available(), available)
|
100 | 2dbe7563 | Christos Stavrakakis | |
101 | 2dbe7563 | Christos Stavrakakis | def test_external_reserved(self): |
102 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(42)
|
103 | 2dbe7563 | Christos Stavrakakis | pool = DummyPool(obj) |
104 | 2dbe7563 | Christos Stavrakakis | for i in range(42, 48): |
105 | 3b2984dc | Christos Stavrakakis | self.assertRaises(InvalidValue, pool.is_available, i)
|
106 | 2dbe7563 | Christos Stavrakakis | pool.reserve(32, external=True) |
107 | 2dbe7563 | Christos Stavrakakis | values = [] |
108 | 2dbe7563 | Christos Stavrakakis | while True: |
109 | 2dbe7563 | Christos Stavrakakis | try:
|
110 | 2dbe7563 | Christos Stavrakakis | values.append(pool.get()) |
111 | 2dbe7563 | Christos Stavrakakis | except EmptyPool:
|
112 | 2dbe7563 | Christos Stavrakakis | break
|
113 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(32 not in values, True) |
114 | 2dbe7563 | Christos Stavrakakis | |
115 | 2dbe7563 | Christos Stavrakakis | def test_external_reserved_2(self): |
116 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(42)
|
117 | 2dbe7563 | Christos Stavrakakis | pool = DummyPool(obj) |
118 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.get(), 0) |
119 | 2dbe7563 | Christos Stavrakakis | pool.reserve(0, external=True) |
120 | 2dbe7563 | Christos Stavrakakis | pool.put(0)
|
121 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.get(), 1) |
122 | 2dbe7563 | Christos Stavrakakis | |
123 | 3e7c63f8 | Christos Stavrakakis | def test_extend_pool(self): |
124 | 3e7c63f8 | Christos Stavrakakis | obj = DummyObject(42)
|
125 | 3e7c63f8 | Christos Stavrakakis | pool = DummyPool(obj) |
126 | 3e7c63f8 | Christos Stavrakakis | pool.extend(7)
|
127 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.to_01(), '1' * 49) |
128 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.to_map(), '.' * 49) |
129 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.available, bitarray('1' * 49 + '0' * 7)) |
130 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.reserved, bitarray('1' * 49 + '0' * 7)) |
131 | 3e7c63f8 | Christos Stavrakakis | |
132 | 3e7c63f8 | Christos Stavrakakis | def test_shrink_pool(self): |
133 | 3e7c63f8 | Christos Stavrakakis | obj = DummyObject(42)
|
134 | 3e7c63f8 | Christos Stavrakakis | pool = DummyPool(obj) |
135 | 3e7c63f8 | Christos Stavrakakis | pool.shrink(3)
|
136 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.to_01(), '1' * 39) |
137 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.to_map(), '.' * 39) |
138 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.available, bitarray('1' * 39 + '0' * 1)) |
139 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual(pool.reserved, bitarray('1' * 39 + '0' * 1)) |
140 | 3e7c63f8 | Christos Stavrakakis | |
141 | b66e4833 | Christos Stavrakakis | def test_shrink_in_use(self): |
142 | b66e4833 | Christos Stavrakakis | obj = DummyObject(8)
|
143 | b66e4833 | Christos Stavrakakis | pool = DummyPool(obj) |
144 | b66e4833 | Christos Stavrakakis | pool._reserve(6)
|
145 | b66e4833 | Christos Stavrakakis | self.assertRaises(Exception, pool.shrink, 3) |
146 | b66e4833 | Christos Stavrakakis | |
147 | b66e4833 | Christos Stavrakakis | def test_count(self): |
148 | b66e4833 | Christos Stavrakakis | obj = DummyObject(10)
|
149 | b66e4833 | Christos Stavrakakis | pool = DummyPool(obj) |
150 | b66e4833 | Christos Stavrakakis | pool._reserve(1)
|
151 | b66e4833 | Christos Stavrakakis | pool._reserve(3)
|
152 | b66e4833 | Christos Stavrakakis | pool._reserve(4)
|
153 | b66e4833 | Christos Stavrakakis | pool._reserve(2, external=True) |
154 | b66e4833 | Christos Stavrakakis | self.assertEqual(pool.count_available(), 6) |
155 | b66e4833 | Christos Stavrakakis | self.assertEqual(pool.count_unavailable(), 4) |
156 | b66e4833 | Christos Stavrakakis | self.assertEqual(pool.count_reserved(), 1) |
157 | b66e4833 | Christos Stavrakakis | self.assertEqual(pool.count_unreserved(), 9) |
158 | b66e4833 | Christos Stavrakakis | |
159 | b66e4833 | Christos Stavrakakis | |
160 | b66e4833 | Christos Stavrakakis | class HelpersTestCase(TestCase): |
161 | b66e4833 | Christos Stavrakakis | def test_find_padding(self): |
162 | b66e4833 | Christos Stavrakakis | self.assertEqual(find_padding(1), 7) |
163 | b66e4833 | Christos Stavrakakis | self.assertEqual(find_padding(8), 0) |
164 | b66e4833 | Christos Stavrakakis | self.assertEqual(find_padding(12), 4) |
165 | b66e4833 | Christos Stavrakakis | self.assertEqual(find_padding(16), 0) |
166 | b66e4833 | Christos Stavrakakis | |
167 | b66e4833 | Christos Stavrakakis | def test_bitarray_to_map(self): |
168 | b66e4833 | Christos Stavrakakis | bt = bitarray('01001100101')
|
169 | b66e4833 | Christos Stavrakakis | map_ = bitarray_to_map(bt) |
170 | b66e4833 | Christos Stavrakakis | self.assertEqual(map_, 'X.XX..XX.X.') |
171 | b66e4833 | Christos Stavrakakis | |
172 | 2dbe7563 | Christos Stavrakakis | |
173 | 35e2f2d4 | Christos Stavrakakis | class BridgePoolTestCase(TestCase): |
174 | 2dbe7563 | Christos Stavrakakis | def test_bridge_conversion(self): |
175 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(13)
|
176 | 2dbe7563 | Christos Stavrakakis | obj.base = "bridge"
|
177 | 2dbe7563 | Christos Stavrakakis | pool = BridgePool(obj) |
178 | 2dbe7563 | Christos Stavrakakis | for i in range(0, 13): |
179 | 3e7c63f8 | Christos Stavrakakis | self.assertEqual("bridge" + str(i + 1), pool.get()) |
180 | 2dbe7563 | Christos Stavrakakis | pool.put("bridge2")
|
181 | 2dbe7563 | Christos Stavrakakis | pool.put("bridge6")
|
182 | 2dbe7563 | Christos Stavrakakis | self.assertEqual("bridge2", pool.get()) |
183 | 2dbe7563 | Christos Stavrakakis | self.assertEqual("bridge6", pool.get()) |
184 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.empty(), True) |
185 | 2dbe7563 | Christos Stavrakakis | |
186 | 2dbe7563 | Christos Stavrakakis | |
187 | 35e2f2d4 | Christos Stavrakakis | class MacPrefixPoolTestCase(TestCase): |
188 | 2dbe7563 | Christos Stavrakakis | def test_invalid_mac_reservation(self): |
189 | 2dbe7563 | Christos Stavrakakis | obj = DummyObject(65636)
|
190 | 2dbe7563 | Christos Stavrakakis | obj.base = 'ab:ff:ff'
|
191 | 2dbe7563 | Christos Stavrakakis | pool = MacPrefixPool(obj) |
192 | 3b2984dc | Christos Stavrakakis | for i in range(0, 65535): |
193 | 2dbe7563 | Christos Stavrakakis | self.assertEqual(pool.is_available(i, index=True), False) |
194 | 2dbe7563 | Christos Stavrakakis | |
195 | b66e4833 | Christos Stavrakakis | def test_mac_prefix_conversion(self): |
196 | b66e4833 | Christos Stavrakakis | obj = DummyObject(13)
|
197 | b66e4833 | Christos Stavrakakis | obj.base = 'aa:00:0'
|
198 | b66e4833 | Christos Stavrakakis | pool = MacPrefixPool(obj) |
199 | b66e4833 | Christos Stavrakakis | for i in range(1, 9): |
200 | b66e4833 | Christos Stavrakakis | self.assertEqual("aa:00:%s" % i, pool.get()) |
201 | b66e4833 | Christos Stavrakakis | |
202 | b66e4833 | Christos Stavrakakis | def test_value_to_index(self): |
203 | b66e4833 | Christos Stavrakakis | obj = DummyObject(13)
|
204 | b66e4833 | Christos Stavrakakis | obj.base = 'aa:00:0'
|
205 | b66e4833 | Christos Stavrakakis | pool = MacPrefixPool(obj) |
206 | b66e4833 | Christos Stavrakakis | index = pool.value_to_index('aa:bc:ee')
|
207 | b66e4833 | Christos Stavrakakis | val = pool.index_to_value(index) |
208 | b66e4833 | Christos Stavrakakis | self.assertEqual(val, 'aa:bc:ee') |
209 | b66e4833 | Christos Stavrakakis | |
210 | 35e2f2d4 | Christos Stavrakakis | |
211 | 35e2f2d4 | Christos Stavrakakis | class IPPoolTestCase(TestCase): |
212 | 413fb1dd | Christos Stavrakakis | def test_get_with_value(self): |
213 | 3b2984dc | Christos Stavrakakis | obj = DummyObject(16)
|
214 | 413fb1dd | Christos Stavrakakis | subnet = DummyObject(0)
|
215 | 413fb1dd | Christos Stavrakakis | obj.subnet = subnet |
216 | 3b2984dc | Christos Stavrakakis | subnet.cidr = "192.168.2.0/28"
|
217 | f8ce6d44 | Christos Stavrakakis | subnet.gateway = None
|
218 | 3b2984dc | Christos Stavrakakis | obj.base = "192.168.2.0/28"
|
219 | 3b2984dc | Christos Stavrakakis | obj.offset = 0
|
220 | 413fb1dd | Christos Stavrakakis | pool = IPPool(obj) |
221 | 413fb1dd | Christos Stavrakakis | # Test if reserved
|
222 | 413fb1dd | Christos Stavrakakis | pool.reserve("192.168.2.2")
|
223 | 413fb1dd | Christos Stavrakakis | self.assertRaises(ValueNotAvailable, pool.get, "192.168.2.2") |
224 | 413fb1dd | Christos Stavrakakis | # Test if externally reserved
|
225 | 413fb1dd | Christos Stavrakakis | pool.reserve("192.168.2.3", external=True) |
226 | 413fb1dd | Christos Stavrakakis | self.assertRaises(ValueNotAvailable, pool.get, "192.168.2.3") |
227 | ae994d2e | Christos Stavrakakis | self.assertRaises(InvalidValue, pool.get, "192.168.2.16") |