Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / db / pools / tests.py @ b66e4833

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)