8739789a9e041dddb3b8a2027c5f702b28976d30
[tiramisu.git] / test / test_state.py
1 import autopath
2
3 from tiramisu.option import BoolOption, UnicodeOption, SymLinkOption, \
4     IntOption, OptionDescription
5 from tiramisu.config import Config, GroupConfig, MetaConfig
6 from tiramisu.setting import owners
7 from tiramisu.storage import delete_session
8 from tiramisu.error import ConfigError
9 from pickle import dumps, loads
10 from py.test import raises
11
12
13 def return_value(value=None):
14         return value
15
16
17 def _get_slots(opt):
18     slots = set()
19     for subclass in opt.__class__.__mro__:
20         if subclass is not object:
21             slots.update(subclass.__slots__)
22     return slots
23
24
25 def _no_state(opt):
26     for attr in _get_slots(opt):
27         if 'state' in attr:
28             try:
29                 getattr(opt, attr)
30             except:
31                 pass
32             else:
33                 raise Exception('opt should have already attribute {0}'.format(attr))
34
35
36 def _diff_opt(opt1, opt2):
37     attr1 = set(_get_slots(opt1))
38     attr2 = set(_get_slots(opt2))
39     diff1 = attr1 - attr2
40     diff2 = attr2 - attr1
41     if diff1 != set():
42         raise Exception('more attribute in opt1 {0}'.format(list(diff1)))
43     if diff2 != set():
44         raise Exception('more attribute in opt2 {0}'.format(list(diff2)))
45     for attr in attr1:
46         if attr in ['_cache_paths', '_cache_consistencies']:
47             continue
48         err1 = False
49         err2 = False
50         val1 = None
51         val2 = None
52         try:
53             val1 = getattr(opt1, attr)
54         except:
55             err1 = True
56
57         try:
58             val2 = getattr(opt2, attr)
59         except:
60             err2 = True
61         assert err1 == err2
62         if val1 is None:
63             assert val1 == val2
64         elif attr == '_children':
65             assert val1[0] == val2[0]
66             for index, _opt in enumerate(val1[1]):
67                 assert _opt._name == val2[1][index]._name
68         elif attr == '_requires':
69             assert val1[0][0][0]._name == val2[0][0][0]._name
70             assert val1[0][0][1:] == val2[0][0][1:]
71         elif attr == '_opt':
72             assert val1._name == val2._name
73         elif attr == '_consistencies':
74             # dict is only a cache
75             if isinstance(val1, list):
76                 for index, consistency in enumerate(val1):
77                     assert consistency[0] == val2[index][0]
78                     for idx, opt in enumerate(consistency[1]):
79                         assert opt._name == val2[index][1][idx]._name
80         elif attr == '_callback':
81             assert val1[0] == val2[0]
82             if val1[1] is not None:
83                 for key, values in val1[1].items():
84                     for idx, value in enumerate(values):
85                         if isinstance(value, tuple):
86                             assert val1[1][key][idx][0]._name == val2[1][key][idx][0]._name
87                             assert val1[1][key][idx][1] == val2[1][key][idx][1]
88                         else:
89                             assert val1[1][key][idx] == val2[1][key][idx]
90             else:
91                 assert val1[1] == val2[1]
92         else:
93             assert val1 == val2
94
95
96 def _diff_conf(cfg1, cfg2):
97     attr1 = set(_get_slots(cfg1))
98     attr2 = set(_get_slots(cfg2))
99     diff1 = attr1 - attr2
100     diff2 = attr2 - attr1
101     if diff1 != set():
102         raise Exception('more attribute in cfg1 {0}'.format(list(diff1)))
103     if diff2 != set():
104         raise Exception('more attribute in cfg2 {0}'.format(list(diff2)))
105     for attr in attr1:
106         if attr in ('_impl_context', '__weakref__'):
107             continue
108         err1 = False
109         err2 = False
110         val1 = None
111         val2 = None
112         try:
113             val1 = getattr(cfg1, attr)
114         except:
115             err1 = True
116
117         try:
118             val2 = getattr(cfg2, attr)
119         except:
120             err2 = True
121         assert err1 == err2
122         if val1 is None:
123             assert val1 == val2
124         elif attr == '_impl_values':
125             assert cfg1.cfgimpl_get_values().get_modified_values() == cfg2.cfgimpl_get_values().get_modified_values()
126         elif attr == '_impl_settings':
127             assert cfg1.cfgimpl_get_settings().get_modified_properties() == cfg2.cfgimpl_get_settings().get_modified_properties()
128             assert cfg1.cfgimpl_get_settings().get_modified_permissives() == cfg2.cfgimpl_get_settings().get_modified_permissives()
129         elif attr == '_impl_descr':
130             _diff_opt(cfg1.cfgimpl_get_description(), cfg2.cfgimpl_get_description())
131         else:
132             assert val1 == val2
133
134
135 #def test_diff_opt():
136 #    b = BoolOption('b', '')
137 #    u = UnicodeOption('u', '', requires=[{'option': b, 'expected': True, 'action': 'disabled', 'inverse': True}])
138 #    s = SymLinkOption('s', u)
139 #    o = OptionDescription('o', '', [b, u, s])
140 #    o1 = OptionDescription('o1', '', [o])
141 #
142 #    a = dumps(o1)
143 #    q = loads(a)
144 #    _diff_opt(o1, q)
145 #    _diff_opt(o1.o, q.o)
146 #    _diff_opt(o1.o.b, q.o.b)
147 #    _diff_opt(o1.o.u, q.o.u)
148 #    _diff_opt(o1.o.s, q.o.s)
149 #
150 #
151 #def test_only_optiondescription():
152 #    b = BoolOption('b', '')
153 #    raises(SystemError, "a = dumps(b)")
154 #
155 #
156 #def test_diff_opt_cache():
157 #    b = BoolOption('b', '')
158 #    u = UnicodeOption('u', '', requires=[{'option': b, 'expected': True, 'action': 'disabled', 'inverse': True}])
159 #    u.impl_add_consistency('not_equal', b)
160 #    s = SymLinkOption('s', u)
161 #    o = OptionDescription('o', '', [b, u, s])
162 #    o1 = OptionDescription('o1', '', [o])
163 #    o1.impl_build_cache()
164 #
165 #    a = dumps(o1)
166 #    q = loads(a)
167 #    _diff_opt(o1, q)
168 #    _diff_opt(o1.o, q.o)
169 #    _diff_opt(o1.o.b, q.o.b)
170 #    _diff_opt(o1.o.u, q.o.u)
171 #    _diff_opt(o1.o.s, q.o.s)
172 #
173 #
174 #def test_diff_opt_callback():
175 #    b = BoolOption('b', '', callback=return_value)
176 #    b2 = BoolOption('b2', '', callback=return_value, callback_params={'': ('yes',)})
177 #    b3 = BoolOption('b3', '', callback=return_value, callback_params={'': ('yes', (b, False)), 'value': ('no',)})
178 #    o = OptionDescription('o', '', [b, b2, b3])
179 #    o1 = OptionDescription('o1', '', [o])
180 #    o1.impl_build_cache()
181 #
182 #    a = dumps(o1)
183 #    q = loads(a)
184 #    _diff_opt(o1, q)
185 #    _diff_opt(o1.o, q.o)
186 #    _diff_opt(o1.o.b, q.o.b)
187 #    _diff_opt(o1.o.b2, q.o.b2)
188 #    _diff_opt(o1.o.b3, q.o.b3)
189 #
190 #
191 #def test_no_state_attr():
192 #    # all _state_xxx attributes should be deleted
193 #    b = BoolOption('b', '')
194 #    u = UnicodeOption('u', '', requires=[{'option': b, 'expected': True, 'action': 'disabled', 'inverse': True}])
195 #    s = SymLinkOption('s', u)
196 #    o = OptionDescription('o', '', [b, u, s])
197 #    o1 = OptionDescription('o1', '', [o])
198 #
199 #    a = dumps(o1)
200 #    q = loads(a)
201 #    _no_state(q)
202 #    _no_state(q.o)
203 #    _no_state(q.o.b)
204 #    _no_state(q.o.u)
205 #    _no_state(q.o.s)
206 #
207 #
208 #def test_state_config():
209 #    val1 = BoolOption('val1', "")
210 #    maconfig = OptionDescription('rootconfig', '', [val1])
211 #    try:
212 #        cfg = Config(maconfig, persistent=True, session_id='29090931')
213 #    except ValueError:
214 #        cfg = Config(maconfig, session_id='29090931')
215 #        cfg._impl_test = True
216 #    a = dumps(cfg)
217 #    q = loads(a)
218 #    _diff_conf(cfg, q)
219 #    try:
220 #        delete_session('29090931')
221 #    except ConfigError:
222 #        pass
223 #
224 #
225 #def test_state_properties():
226 #    val1 = BoolOption('val1', "")
227 #    maconfig = OptionDescription('rootconfig', '', [val1])
228 #    try:
229 #        cfg = Config(maconfig, persistent=True, session_id='29090932')
230 #    except ValueError:
231 #        cfg = Config(maconfig, session_id='29090932')
232 #        cfg._impl_test = True
233 #    cfg.read_write()
234 #    cfg.cfgimpl_get_settings()[val1].append('test')
235 #    a = dumps(cfg)
236 #    q = loads(a)
237 #    _diff_conf(cfg, q)
238 #    try:
239 #        delete_session('29090932')
240 #    except ConfigError:
241 #        pass
242 #
243 #
244 #def test_state_values():
245 #    val1 = BoolOption('val1', "")
246 #    maconfig = OptionDescription('rootconfig', '', [val1])
247 #    try:
248 #        cfg = Config(maconfig, persistent=True, session_id='29090933')
249 #    except ValueError:
250 #        cfg = Config(maconfig, session_id='29090933')
251 #        cfg._impl_test = True
252 #    cfg.val1 = True
253 #    a = dumps(cfg)
254 #    q = loads(a)
255 #    _diff_conf(cfg, q)
256 #    q.val1 = False
257 #    #assert cfg.val1 is True
258 #    assert q.val1 is False
259 #    try:
260 #        delete_session('29090933')
261 #    except ConfigError:
262 #        pass
263 #
264 #
265 #def test_state_values_owner():
266 #    val1 = BoolOption('val1', "")
267 #    maconfig = OptionDescription('rootconfig', '', [val1])
268 #    try:
269 #        cfg = Config(maconfig, persistent=True, session_id='29090934')
270 #    except ValueError:
271 #        cfg = Config(maconfig, session_id='29090934')
272 #        cfg._impl_test = True
273 #    owners.addowner('newowner')
274 #    cfg.cfgimpl_get_settings().setowner(owners.newowner)
275 #    cfg.val1 = True
276 #    a = dumps(cfg)
277 #    q = loads(a)
278 #    _diff_conf(cfg, q)
279 #    q.val1 = False
280 #    nval1 = q.cfgimpl_get_description().val1
281 #    assert q.getowner(nval1) == owners.newowner
282 #    try:
283 #        delete_session('29090934')
284 #    except ConfigError:
285 #        pass
286 #
287 #
288 #def test_state_metaconfig():
289 #    i1 = IntOption('i1', '')
290 #    od1 = OptionDescription('od1', '', [i1])
291 #    od2 = OptionDescription('od2', '', [od1])
292 #    conf1 = Config(od2, session_id='29090935')
293 #    conf1._impl_test = True
294 #    conf2 = Config(od2, session_id='29090936')
295 #    conf2._impl_test = True
296 #    meta = MetaConfig([conf1, conf2], session_id='29090937')
297 #    meta._impl_test = True
298 #    raises(ConfigError, "dumps(meta)")
299 #    try:
300 #        delete_session('29090935')
301 #        delete_session('29090936')
302 #        delete_session('29090937')
303 #    except ConfigError:
304 #        pass
305 #
306 #
307 #def test_state_groupconfig():
308 #    i1 = IntOption('i1', '')
309 #    od1 = OptionDescription('od1', '', [i1])
310 #    od2 = OptionDescription('od2', '', [od1])
311 #    conf1 = Config(od2, session_id='29090935')
312 #    conf1._impl_test = True
313 #    conf2 = Config(od2, session_id='29090936')
314 #    conf2._impl_test = True
315 #    meta = GroupConfig([conf1, conf2], session_id='29090937')
316 #    meta._impl_test = True
317 #    a = dumps(meta)
318 #    q = loads(a)
319 #    _diff_conf(meta, q)
320 #    try:
321 #        delete_session('29090935')
322 #        delete_session('29090936')
323 #        delete_session('29090937')
324 #    except ConfigError:
325 #        pass
326 #
327 #
328 #def test_state_unkown_setting_owner():
329 #    """load an unknow _owner, should create it"""
330 #    assert not 'supernewuser' in owners.__dict__
331 #    loads("""ccopy_reg
332 #_reconstructor
333 #p0
334 #(ctiramisu.setting
335 #Settings
336 #p1
337 #c__builtin__
338 #object
339 #p2
340 #Ntp3
341 #Rp4
342 #(dp5
343 #S'_owner'
344 #p6
345 #S'supernewuser'
346 #p7
347 #sS'_p_'
348 #p8
349 #g0
350 #(ctiramisu.storage.dictionary.setting
351 #Settings
352 #p9
353 #g2
354 #Ntp10
355 #Rp11
356 #(dp12
357 #S'_cache'
358 #p13
359 #(dp14
360 #sS'_permissives'
361 #p15
362 #(dp16
363 #sS'_properties'
364 #p17
365 #(dp18
366 #sbsb.
367 #.""")
368 #    assert 'supernewuser' in owners.__dict__