Statistics
| Branch: | Tag: | Revision:

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