Statistics
| Branch: | Tag: | Revision:

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")