root / snf-common / synnefo / lib / singleton / tests.py @ 5f6ad491
History | View | Annotate | Download (6 kB)
1 | 19092a69 | Vangelis Koukis | #!/usr/bin/env python
|
---|---|---|---|
2 | 19092a69 | Vangelis Koukis | #
|
3 | 19092a69 | Vangelis Koukis | # -*- coding: utf-8 -*-
|
4 | 19092a69 | Vangelis Koukis | #
|
5 | 19092a69 | Vangelis Koukis | # Copyright 2011 GRNET S.A. All rights reserved.
|
6 | 19092a69 | Vangelis Koukis | #
|
7 | 19092a69 | Vangelis Koukis | # Redistribution and use in source and binary forms, with or
|
8 | 19092a69 | Vangelis Koukis | # without modification, are permitted provided that the following
|
9 | 19092a69 | Vangelis Koukis | # conditions are met:
|
10 | 19092a69 | Vangelis Koukis | #
|
11 | 19092a69 | Vangelis Koukis | # 1. Redistributions of source code must retain the above
|
12 | 19092a69 | Vangelis Koukis | # copyright notice, this list of conditions and the following
|
13 | 19092a69 | Vangelis Koukis | # disclaimer.
|
14 | 19092a69 | Vangelis Koukis | #
|
15 | 19092a69 | Vangelis Koukis | # 2. Redistributions in binary form must reproduce the above
|
16 | 19092a69 | Vangelis Koukis | # copyright notice, this list of conditions and the following
|
17 | 19092a69 | Vangelis Koukis | # disclaimer in the documentation and/or other materials
|
18 | 19092a69 | Vangelis Koukis | # provided with the distribution.
|
19 | 19092a69 | Vangelis Koukis | #
|
20 | 19092a69 | Vangelis Koukis | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
21 | 19092a69 | Vangelis Koukis | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
22 | 19092a69 | Vangelis Koukis | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
23 | 19092a69 | Vangelis Koukis | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
24 | 19092a69 | Vangelis Koukis | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
25 | 19092a69 | Vangelis Koukis | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
26 | 19092a69 | Vangelis Koukis | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
27 | 19092a69 | Vangelis Koukis | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
28 | 19092a69 | Vangelis Koukis | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
29 | 19092a69 | Vangelis Koukis | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
30 | 19092a69 | Vangelis Koukis | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
31 | 19092a69 | Vangelis Koukis | # POSSIBILITY OF SUCH DAMAGE.
|
32 | 19092a69 | Vangelis Koukis | #
|
33 | 19092a69 | Vangelis Koukis | # The views and conclusions contained in the software and
|
34 | 19092a69 | Vangelis Koukis | # documentation are those of the authors and should not be
|
35 | 19092a69 | Vangelis Koukis | # interpreted as representing official policies, either expressed
|
36 | 19092a69 | Vangelis Koukis | # or implied, of GRNET S.A.
|
37 | 19092a69 | Vangelis Koukis | #
|
38 | 19092a69 | Vangelis Koukis | #
|
39 | 19092a69 | Vangelis Koukis | |
40 | 749b8b8e | Vangelis Koukis | """Unit Tests for the Singleton classes in synnefo.lib.singleton
|
41 | 19092a69 | Vangelis Koukis |
|
42 | 19092a69 | Vangelis Koukis | Provides unit tests for the code implementing Singleton
|
43 | 749b8b8e | Vangelis Koukis | classes in the synnefo.lib.singleton module.
|
44 | 19092a69 | Vangelis Koukis |
|
45 | 19092a69 | Vangelis Koukis | """
|
46 | 19092a69 | Vangelis Koukis | |
47 | 19092a69 | Vangelis Koukis | import unittest |
48 | 19092a69 | Vangelis Koukis | |
49 | 749b8b8e | Vangelis Koukis | from synnefo.lib.singleton import ArgBasedSingleton, ArgBasedSingletonMeta |
50 | 19092a69 | Vangelis Koukis | |
51 | 19092a69 | Vangelis Koukis | |
52 | 19092a69 | Vangelis Koukis | class SubClassOne(ArgBasedSingleton): |
53 | 19092a69 | Vangelis Koukis | name = None
|
54 | 19092a69 | Vangelis Koukis | |
55 | 19092a69 | Vangelis Koukis | def __init__(self, name): |
56 | 19092a69 | Vangelis Koukis | self.name = name
|
57 | 19092a69 | Vangelis Koukis | |
58 | 19092a69 | Vangelis Koukis | |
59 | 19092a69 | Vangelis Koukis | class SubClassTwo(ArgBasedSingleton): |
60 | 19092a69 | Vangelis Koukis | name = None
|
61 | 19092a69 | Vangelis Koukis | |
62 | 19092a69 | Vangelis Koukis | def __init__(self, name): |
63 | 19092a69 | Vangelis Koukis | self.name = name
|
64 | 19092a69 | Vangelis Koukis | |
65 | 19092a69 | Vangelis Koukis | |
66 | 19092a69 | Vangelis Koukis | class SubClassThree(SubClassTwo): |
67 | 19092a69 | Vangelis Koukis | name2 = None
|
68 | 19092a69 | Vangelis Koukis | |
69 | 19092a69 | Vangelis Koukis | def __init__(self, name): |
70 | 19092a69 | Vangelis Koukis | self.name2 = name
|
71 | 19092a69 | Vangelis Koukis | |
72 | 19092a69 | Vangelis Koukis | |
73 | 19092a69 | Vangelis Koukis | class SubClassKwArgs(ArgBasedSingleton): |
74 | 19092a69 | Vangelis Koukis | name = None
|
75 | 19092a69 | Vangelis Koukis | |
76 | 19092a69 | Vangelis Koukis | def __init__(self, onearg, **kwargs): |
77 | 19092a69 | Vangelis Koukis | self.name = onearg
|
78 | 19092a69 | Vangelis Koukis | for x in kwargs: |
79 | 19092a69 | Vangelis Koukis | setattr(self, x, kwargs[x]) |
80 | 19092a69 | Vangelis Koukis | |
81 | 19092a69 | Vangelis Koukis | |
82 | 19092a69 | Vangelis Koukis | class SubClassNoReinit(ArgBasedSingleton): |
83 | 19092a69 | Vangelis Koukis | initialized = None
|
84 | 19092a69 | Vangelis Koukis | |
85 | 19092a69 | Vangelis Koukis | def __init__(self, *args, **kwargs): |
86 | 19092a69 | Vangelis Koukis | if self.initialized: |
87 | 19092a69 | Vangelis Koukis | raise Exception("__init__ called twice!") |
88 | 19092a69 | Vangelis Koukis | self.initialized = True |
89 | 19092a69 | Vangelis Koukis | |
90 | 19092a69 | Vangelis Koukis | |
91 | 19092a69 | Vangelis Koukis | class ArgBasedSingletonTestCase(unittest.TestCase): |
92 | 19092a69 | Vangelis Koukis | def test_same_object(self): |
93 | 19092a69 | Vangelis Koukis | o1 = ArgBasedSingleton() |
94 | 19092a69 | Vangelis Koukis | o2 = ArgBasedSingleton() |
95 | 19092a69 | Vangelis Koukis | self.assertTrue(o1 is o2) |
96 | 19092a69 | Vangelis Koukis | |
97 | 19092a69 | Vangelis Koukis | |
98 | 19092a69 | Vangelis Koukis | class MyMeta(ArgBasedSingletonMeta): |
99 | 19092a69 | Vangelis Koukis | def __call__(cls, *args, **kw): |
100 | 19092a69 | Vangelis Koukis | return super(MyMeta, cls).__call__(*args, **kw) |
101 | 19092a69 | Vangelis Koukis | |
102 | 19092a69 | Vangelis Koukis | |
103 | 19092a69 | Vangelis Koukis | class BaseClass(object): |
104 | 19092a69 | Vangelis Koukis | __metaclass__ = MyMeta |
105 | 749b8b8e | Vangelis Koukis | |
106 | 19092a69 | Vangelis Koukis | def ret5(self): |
107 | 19092a69 | Vangelis Koukis | return 5 |
108 | 19092a69 | Vangelis Koukis | |
109 | 19092a69 | Vangelis Koukis | |
110 | 19092a69 | Vangelis Koukis | class SubClassMultiple(BaseClass, ArgBasedSingleton): |
111 | 19092a69 | Vangelis Koukis | name = None
|
112 | 19092a69 | Vangelis Koukis | |
113 | 19092a69 | Vangelis Koukis | def __init__(self, name): |
114 | 19092a69 | Vangelis Koukis | name = name |
115 | 19092a69 | Vangelis Koukis | |
116 | 19092a69 | Vangelis Koukis | |
117 | 19092a69 | Vangelis Koukis | class SubClassTestCase(unittest.TestCase): |
118 | 19092a69 | Vangelis Koukis | def test_same_object(self): |
119 | 19092a69 | Vangelis Koukis | o1 = SubClassOne('one')
|
120 | 19092a69 | Vangelis Koukis | o2 = SubClassOne('two')
|
121 | 19092a69 | Vangelis Koukis | o1a = SubClassOne('one')
|
122 | 19092a69 | Vangelis Koukis | |
123 | 19092a69 | Vangelis Koukis | self.assertEqual(o1.name, 'one') |
124 | 19092a69 | Vangelis Koukis | self.assertEqual(o2.name, 'two') |
125 | 19092a69 | Vangelis Koukis | self.assertEqual(o1a.name, 'one') |
126 | 19092a69 | Vangelis Koukis | self.assertFalse(o1 is o2) |
127 | 19092a69 | Vangelis Koukis | self.assertTrue(o1 is o1a) |
128 | 19092a69 | Vangelis Koukis | |
129 | 19092a69 | Vangelis Koukis | def test_different_classes(self): |
130 | 19092a69 | Vangelis Koukis | o1 = SubClassOne('one')
|
131 | 19092a69 | Vangelis Koukis | o2 = SubClassTwo('one')
|
132 | 19092a69 | Vangelis Koukis | |
133 | 19092a69 | Vangelis Koukis | self.assertEqual(o1.name, 'one') |
134 | 19092a69 | Vangelis Koukis | self.assertEqual(o2.name, 'one') |
135 | 19092a69 | Vangelis Koukis | self.assertFalse(o1 is o2) |
136 | 19092a69 | Vangelis Koukis | |
137 | 19092a69 | Vangelis Koukis | |
138 | 19092a69 | Vangelis Koukis | class SubClassKwArgsTestCase(unittest.TestCase): |
139 | 19092a69 | Vangelis Koukis | def test_init_signature(self): |
140 | 19092a69 | Vangelis Koukis | self.assertRaises(TypeError, SubClassKwArgs, 'one', 'two') |
141 | 19092a69 | Vangelis Koukis | |
142 | 19092a69 | Vangelis Koukis | def test_distinct_kwargs(self): |
143 | 19092a69 | Vangelis Koukis | o1 = SubClassKwArgs('one', a=1) |
144 | 19092a69 | Vangelis Koukis | o2 = SubClassKwArgs('two')
|
145 | 19092a69 | Vangelis Koukis | o1a = SubClassKwArgs('one', a=2) |
146 | 19092a69 | Vangelis Koukis | o1b = SubClassKwArgs('one', a=1) |
147 | 19092a69 | Vangelis Koukis | o1c = SubClassKwArgs('one', a=1, b=2) |
148 | 19092a69 | Vangelis Koukis | o1d = SubClassKwArgs('one', b=2, a=1) |
149 | 19092a69 | Vangelis Koukis | |
150 | 19092a69 | Vangelis Koukis | self.assertEqual(o1.a, 1) |
151 | 19092a69 | Vangelis Koukis | self.assertEqual(o1a.a, 2) |
152 | 19092a69 | Vangelis Koukis | self.assertEqual(o1b.a, 1) |
153 | 19092a69 | Vangelis Koukis | self.assertRaises(AttributeError, getattr, o2, 'a') |
154 | 19092a69 | Vangelis Koukis | self.assertFalse(o1 is o2) |
155 | 19092a69 | Vangelis Koukis | self.assertFalse(o1 is o1a) |
156 | 19092a69 | Vangelis Koukis | self.assertTrue(o1 is o1b) |
157 | 19092a69 | Vangelis Koukis | self.assertTrue(o1c is o1d) |
158 | 19092a69 | Vangelis Koukis | |
159 | 19092a69 | Vangelis Koukis | |
160 | 19092a69 | Vangelis Koukis | class SubClassDistinctDicts(unittest.TestCase): |
161 | 19092a69 | Vangelis Koukis | def test_distinct_storage_per_subclass(self): |
162 | 19092a69 | Vangelis Koukis | o1 = SubClassOne('one')
|
163 | 19092a69 | Vangelis Koukis | o2 = SubClassTwo('one')
|
164 | 19092a69 | Vangelis Koukis | o1a = SubClassOne('two')
|
165 | 19092a69 | Vangelis Koukis | o2a = SubClassTwo('two')
|
166 | 19092a69 | Vangelis Koukis | |
167 | 19092a69 | Vangelis Koukis | self.assertEqual(o1.name, 'one') |
168 | 19092a69 | Vangelis Koukis | self.assertEqual(o2.name, 'one') |
169 | 19092a69 | Vangelis Koukis | self.assertEqual(o1a.name, 'two') |
170 | 19092a69 | Vangelis Koukis | self.assertEqual(o2a.name, 'two') |
171 | 19092a69 | Vangelis Koukis | self.assertTrue(o1._singles is o1a._singles) |
172 | 19092a69 | Vangelis Koukis | self.assertTrue(o2._singles is o2a._singles) |
173 | 19092a69 | Vangelis Koukis | self.assertFalse(o1._singles is o2._singles) |
174 | 19092a69 | Vangelis Koukis | self.assertFalse(o1a._singles is o2a._singles) |
175 | 19092a69 | Vangelis Koukis | |
176 | 19092a69 | Vangelis Koukis | |
177 | 19092a69 | Vangelis Koukis | class SubClassThreeTestCase(unittest.TestCase): |
178 | 19092a69 | Vangelis Koukis | def test_singleton_inheritance(self): |
179 | 19092a69 | Vangelis Koukis | o1 = SubClassThree('one')
|
180 | 19092a69 | Vangelis Koukis | o2 = SubClassThree('two')
|
181 | 19092a69 | Vangelis Koukis | o1a = SubClassThree('one')
|
182 | 19092a69 | Vangelis Koukis | |
183 | 19092a69 | Vangelis Koukis | self.assertEquals(o1.name2, 'one') |
184 | 19092a69 | Vangelis Koukis | self.assertEquals(o2.name2, 'two') |
185 | 19092a69 | Vangelis Koukis | self.assertEquals(o1a.name2, 'one') |
186 | 19092a69 | Vangelis Koukis | |
187 | 19092a69 | Vangelis Koukis | self.assertTrue(o1 is o1a) |
188 | 19092a69 | Vangelis Koukis | self.assertFalse(o1 is o2) |
189 | 19092a69 | Vangelis Koukis | |
190 | 19092a69 | Vangelis Koukis | |
191 | 19092a69 | Vangelis Koukis | class SubClassMultipleTestCase(unittest.TestCase): |
192 | 19092a69 | Vangelis Koukis | def test_multiple_inheritance(self): |
193 | 19092a69 | Vangelis Koukis | o1 = SubClassMultiple('one')
|
194 | 19092a69 | Vangelis Koukis | o2 = SubClassMultiple('two')
|
195 | 19092a69 | Vangelis Koukis | o1a = SubClassMultiple('one')
|
196 | 19092a69 | Vangelis Koukis | |
197 | 19092a69 | Vangelis Koukis | self.assertEquals(o1.ret5(), 5) |
198 | 19092a69 | Vangelis Koukis | self.assertEquals(o2.ret5(), 5) |
199 | 19092a69 | Vangelis Koukis | self.assertEquals(o1a.ret5(), 5) |
200 | 19092a69 | Vangelis Koukis | |
201 | 19092a69 | Vangelis Koukis | self.assertTrue(o1 is o1a) |
202 | 19092a69 | Vangelis Koukis | self.assertFalse(o1 is o2) |
203 | 19092a69 | Vangelis Koukis | |
204 | 19092a69 | Vangelis Koukis | |
205 | 19092a69 | Vangelis Koukis | class SubClassNoReinitTestCase(unittest.TestCase): |
206 | 19092a69 | Vangelis Koukis | def test_no_reinit(self): |
207 | 19092a69 | Vangelis Koukis | o1 = SubClassNoReinit('one')
|
208 | 19092a69 | Vangelis Koukis | o2 = SubClassNoReinit('one')
|
209 | 19092a69 | Vangelis Koukis | |
210 | 19092a69 | Vangelis Koukis | self.assertTrue(o1 is o2) |
211 | 19092a69 | Vangelis Koukis | |
212 | 19092a69 | Vangelis Koukis | |
213 | 19092a69 | Vangelis Koukis | if __name__ == '__main__': |
214 | 19092a69 | Vangelis Koukis | unittest.main() |