3d386d70974915cc709cbc22bdf0219fbd9e1670
[tiramisu.git] / test / test_requires.py
1 # coding: utf-8
2 import autopath
3 from copy import copy
4 from tiramisu import setting
5 setting.expires_time = 1
6 from tiramisu.option import IPOption, OptionDescription, BoolOption, IntOption, StrOption
7 from tiramisu.config import Config
8 from tiramisu.error import PropertiesOptionError, RequirementError
9 from py.test import raises
10
11
12 def test_requires():
13     a = BoolOption('activate_service', '', True)
14     b = IPOption('ip_address_service', '',
15                  requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
16     od = OptionDescription('service', '', [a, b])
17     c = Config(od)
18     c.read_write()
19     c.ip_address_service
20     c.activate_service = False
21     props = []
22     try:
23         c.ip_address_service
24     except PropertiesOptionError as err:
25         props = err.proptype
26     assert props == ['disabled']
27
28
29 def test_requires_same_action():
30     a = BoolOption('activate_service', '', True)
31     b = BoolOption('activate_service_web', '', True,
32                    requires=[{'option': a, 'expected': False, 'action': 'new'}])
33
34     d = IPOption('ip_address_service_web', '',
35                  requires=[{'option': b, 'expected': False,
36                             'action': 'disabled', 'inverse': False,
37                             'transitive': True, 'same_action': False}])
38     od = OptionDescription('service', '', [a, b, d])
39     c = Config(od)
40     c.read_write()
41     c.cfgimpl_get_settings().append('new')
42     c.activate_service
43     c.activate_service_web
44     c.ip_address_service_web
45     c.activate_service = False
46     #
47     props = []
48     try:
49         c.activate_service_web
50     except PropertiesOptionError as err:
51         props = err.proptype
52     assert props == ['new']
53     #
54     props = []
55     try:
56         c.ip_address_service_web
57     except PropertiesOptionError as err:
58         props = err.proptype
59     assert props == ['disabled']
60
61
62 def test_multiple_requires():
63     a = StrOption('activate_service', '')
64     b = IPOption('ip_address_service', '',
65                  requires=[{'option': a, 'expected': 'yes', 'action': 'disabled'},
66                            {'option': a, 'expected': 'ok', 'action': 'disabled'}])
67     od = OptionDescription('service', '', [a, b])
68     c = Config(od)
69     c.read_write()
70     c.ip_address_service
71     c.activate_service = 'yes'
72     props = []
73     try:
74         c.ip_address_service
75     except PropertiesOptionError as err:
76         props = err.proptype
77     assert props == ['disabled']
78
79     c.activate_service = 'ok'
80     props = []
81     try:
82         c.ip_address_service
83     except PropertiesOptionError as err:
84         props = err.proptype
85     assert props == ['disabled']
86
87     c.activate_service = 'no'
88     c.ip_address_service
89
90
91 def test_multiple_requires_cumulative():
92     a = StrOption('activate_service', '')
93     b = IPOption('ip_address_service', '',
94                  requires=[{'option': a, 'expected': 'yes', 'action': 'disabled'},
95                            {'option': a, 'expected': 'yes', 'action': 'hidden'}])
96     od = OptionDescription('service', '', [a, b])
97     c = Config(od)
98     c.read_write()
99     c.ip_address_service
100     c.activate_service = 'yes'
101     props = []
102     try:
103         c.ip_address_service
104     except PropertiesOptionError as err:
105         props = err.proptype
106     assert set(props) == set(['hidden', 'disabled'])
107
108     c.activate_service = 'ok'
109     c.ip_address_service
110
111     c.activate_service = 'no'
112     c.ip_address_service
113
114
115 def test_multiple_requires_inverse():
116     a = StrOption('activate_service', '')
117     b = IPOption('ip_address_service', '',
118                  requires=[{'option': a, 'expected': 'yes', 'action': 'disabled', 'inverse': True},
119                            {'option': a, 'expected': 'ok', 'action': 'disabled', 'inverse': True}])
120     od = OptionDescription('service', '', [a, b])
121     c = Config(od)
122     c.read_write()
123     props = []
124     try:
125         c.ip_address_service
126     except PropertiesOptionError as err:
127         props = err.proptype
128     assert props == ['disabled']
129
130     c.activate_service = 'yes'
131     c.ip_address_service
132
133     c.activate_service = 'ok'
134     c.ip_address_service
135
136     c.activate_service = 'no'
137     props = []
138     try:
139         c.ip_address_service
140     except PropertiesOptionError as err:
141         props = err.proptype
142     assert props == ['disabled']
143
144
145 def test_requires_transitive():
146     a = BoolOption('activate_service', '', True)
147     b = BoolOption('activate_service_web', '', True,
148                    requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
149
150     d = IPOption('ip_address_service_web', '',
151                  requires=[{'option': b, 'expected': False, 'action': 'disabled'}])
152     od = OptionDescription('service', '', [a, b, d])
153     c = Config(od)
154     c.read_write()
155     c.activate_service
156     c.activate_service_web
157     c.ip_address_service_web
158     c.activate_service = False
159     #
160     props = []
161     try:
162         c.activate_service_web
163     except PropertiesOptionError as err:
164         props = err.proptype
165     assert props == ['disabled']
166     #
167     props = []
168     try:
169         c.ip_address_service_web
170     except PropertiesOptionError as err:
171         props = err.proptype
172     assert props == ['disabled']
173
174
175 def test_requires_transitive_bis():
176     a = BoolOption('activate_service', '', True)
177     abis = BoolOption('activate_service_bis', '', True)
178     b = BoolOption('activate_service_web', '', True,
179                    requires=[{'option': a, 'expected': True, 'action': 'disabled', 'inverse': True}])
180
181     d = IPOption('ip_address_service_web', '',
182                  requires=[{'option': b, 'expected': True, 'action': 'disabled', 'inverse': True}])
183     od = OptionDescription('service', '', [a, abis, b, d])
184     c = Config(od)
185     c.read_write()
186     #
187     c.activate_service_web
188     c.ip_address_service_web
189     c.activate_service = False
190     #
191     props = []
192     try:
193         c.activate_service_web
194     except PropertiesOptionError as err:
195         props = err.proptype
196     assert props == ['disabled']
197     #
198     props = []
199     try:
200         c.ip_address_service_web
201     except PropertiesOptionError as err:
202         props = err.proptype
203     assert props == ['disabled']
204
205
206 def test_requires_transitive_hidden_disabled():
207     a = BoolOption('activate_service', '', True)
208     b = BoolOption('activate_service_web', '', True,
209                    requires=[{'option': a, 'expected': False, 'action': 'hidden'}])
210     d = IPOption('ip_address_service_web', '',
211                  requires=[{'option': b, 'expected': False, 'action': 'disabled'}])
212     od = OptionDescription('service', '', [a, b, d])
213     c = Config(od)
214     c.read_write()
215     c.activate_service
216     c.activate_service_web
217     c.ip_address_service_web
218     c.activate_service = False
219     #
220     props = []
221     try:
222         c.activate_service_web
223     except PropertiesOptionError as err:
224         props = err.proptype
225     assert props == ['hidden']
226     raises(RequirementError, 'c.ip_address_service_web')
227
228
229 def test_requires_not_transitive():
230     a = BoolOption('activate_service', '', True)
231     b = BoolOption('activate_service_web', '', True,
232                    requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
233     d = IPOption('ip_address_service_web', '',
234                  requires=[{'option': b, 'expected': False,
235                             'action': 'disabled', 'transitive': False}])
236     od = OptionDescription('service', '', [a, b, d])
237     c = Config(od)
238     c.read_write()
239     c.activate_service
240     c.activate_service_web
241     c.ip_address_service_web
242     c.activate_service = False
243     #
244     props = []
245     try:
246         c.activate_service_web
247     except PropertiesOptionError as err:
248         props = err.proptype
249     assert props == ['disabled']
250     #
251     c.ip_address_service_web
252
253
254 def test_requires_None():
255     a = BoolOption('activate_service', '')
256     b = IPOption('ip_address_service', '',
257                  requires=[{'option': a, 'expected': None, 'action': 'disabled'}])
258     od = OptionDescription('service', '', [a, b])
259     c = Config(od)
260     c.read_write()
261     props = []
262     try:
263         c.ip_address_service
264     except PropertiesOptionError as err:
265         props = err.proptype
266     assert props == ['disabled']
267     c.activate_service = False
268     c.ip_address_service
269
270
271 def test_requires_multi_disabled():
272     a = BoolOption('activate_service', '')
273     b = IntOption('num_service', '')
274     c = IPOption('ip_address_service', '',
275                  requires=[{'option': a, 'expected': True, 'action': 'disabled'},
276                            {'option': b, 'expected': 1, 'action': 'disabled'}])
277     od = OptionDescription('service', '', [a, b, c])
278     c = Config(od)
279     c.read_write()
280
281     c.ip_address_service
282
283     c.activate_service = True
284     props = []
285     try:
286         c.ip_address_service
287     except PropertiesOptionError as err:
288         props = err.proptype
289     assert props == ['disabled']
290
291     c.activate_service = False
292     c.ip_address_service
293
294     c.num_service = 1
295     props = []
296     try:
297         c.ip_address_service
298     except PropertiesOptionError as err:
299         props = err.proptype
300     assert props == ['disabled']
301
302     c.activate_service = True
303     props = []
304     try:
305         c.ip_address_service
306     except PropertiesOptionError as err:
307         props = err.proptype
308     assert props == ['disabled']
309
310
311 def test_requires_multi_disabled_inverse():
312     a = BoolOption('activate_service', '')
313     b = IntOption('num_service', '')
314     c = IPOption('ip_address_service', '',
315                  requires=[{'option': a, 'expected': True,
316                             'action': 'disabled', 'inverse': True},
317                            {'option': b, 'expected': 1,
318                             'action': 'disabled', 'inverse': True}])
319     od = OptionDescription('service', '', [a, b, c])
320     c = Config(od)
321     c.read_write()
322
323     props = []
324     try:
325         c.ip_address_service
326     except PropertiesOptionError as err:
327         props = err.proptype
328     assert props == ['disabled']
329
330     c.activate_service = True
331     props = []
332     try:
333         c.ip_address_service
334     except PropertiesOptionError as err:
335         props = err.proptype
336     assert props == ['disabled']
337
338     c.activate_service = False
339     props = []
340     try:
341         c.ip_address_service
342     except PropertiesOptionError as err:
343         props = err.proptype
344     assert props == ['disabled']
345
346     c.num_service = 1
347     props = []
348     try:
349         c.ip_address_service
350     except PropertiesOptionError as err:
351         props = err.proptype
352     assert props == ['disabled']
353
354     c.activate_service = True
355     c.ip_address_service
356
357
358 def test_requires_multi_disabled_2():
359     a = BoolOption('a', '')
360     b = BoolOption('b', '')
361     c = BoolOption('c', '')
362     d = BoolOption('d', '')
363     e = BoolOption('e', '')
364     f = BoolOption('f', '')
365     g = BoolOption('g', '')
366     h = BoolOption('h', '')
367     i = BoolOption('i', '')
368     j = BoolOption('j', '')
369     k = BoolOption('k', '')
370     l = BoolOption('l', '')
371     m = BoolOption('m', '')
372     list_bools = [a, b, c, d, e, f, g, h, i, j, k, l, m]
373     requires = []
374     for boo in list_bools:
375         requires.append({'option': boo, 'expected': True, 'action': 'disabled'})
376     z = IPOption('z', '', requires=requires)
377     y = copy(list_bools)
378     y.append(z)
379     od = OptionDescription('service', '', y)
380     cfg = Config(od)
381     cfg.read_write()
382
383     cfg.z
384     for boo in list_bools:
385         setattr(cfg, boo._name, True)
386         props = []
387         try:
388             cfg.z
389         except PropertiesOptionError as err:
390             props = err.proptype
391         assert props == ['disabled']
392     for boo in list_bools:
393         setattr(cfg, boo._name, False)
394         if boo == m:
395             cfg.z
396         else:
397             props = []
398             try:
399                 cfg.z
400             except PropertiesOptionError as err:
401                 props = err.proptype
402             assert props == ['disabled']
403
404
405 def test_requires_multi_disabled_inverse_2():
406     a = BoolOption('a', '')
407     b = BoolOption('b', '')
408     c = BoolOption('c', '')
409     d = BoolOption('d', '')
410     e = BoolOption('e', '')
411     f = BoolOption('f', '')
412     g = BoolOption('g', '')
413     h = BoolOption('h', '')
414     i = BoolOption('i', '')
415     j = BoolOption('j', '')
416     k = BoolOption('k', '')
417     l = BoolOption('l', '')
418     m = BoolOption('m', '')
419     list_bools = [a, b, c, d, e, f, g, h, i, j, k, l, m]
420     requires = []
421     for boo in list_bools:
422         requires.append({'option': boo, 'expected': True, 'action': 'disabled',
423                          'inverse': True})
424     z = IPOption('z', '', requires=requires)
425     y = copy(list_bools)
426     y.append(z)
427     od = OptionDescription('service', '', y)
428     cfg = Config(od)
429     cfg.read_write()
430
431     props = []
432     try:
433         cfg.z
434     except PropertiesOptionError as err:
435         props = err.proptype
436     assert props == ['disabled']
437     for boo in list_bools:
438         setattr(cfg, boo._name, True)
439         if boo == m:
440             cfg.z
441         else:
442             props = []
443             try:
444                 cfg.z
445             except PropertiesOptionError as err:
446                 props = err.proptype
447             assert props == ['disabled']
448     for boo in list_bools:
449         setattr(cfg, boo._name, False)
450         props = []
451         try:
452             cfg.z
453         except PropertiesOptionError as err:
454             props = err.proptype
455         assert props == ['disabled']
456
457
458 def test_requires_requirement_append():
459     a = BoolOption('activate_service', '', True)
460     b = IPOption('ip_address_service', '',
461                  requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
462     od = OptionDescription('service', '', [a, b])
463     c = Config(od)
464     c.read_write()
465     str(c.cfgimpl_get_settings())
466     str(c.cfgimpl_get_settings()[b])
467     raises(ValueError, 'c.cfgimpl_get_settings()[b].append("disabled")')
468     c.activate_service = False
469     # disabled is now set, test to remove disabled before store in storage
470     c.cfgimpl_get_settings()[b].append("test")
471
472
473 def test_requires_recursive_path():
474     a = BoolOption('activate_service', '', True)
475     b = IPOption('ip_address_service', '',
476                  requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
477     od1 = OptionDescription('service', '', [a, b], requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
478     od = OptionDescription('base', '', [od1])
479     c = Config(od)
480     c.read_write()
481     raises(RequirementError, 'c.service.a')
482
483
484 def test_get_properties_with_None_path():
485     a = BoolOption('activate_service', '', True)
486     b = IPOption('ip_address_service', '',
487                  requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
488     od1 = OptionDescription('service', '', [a, b], requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
489     od = OptionDescription('base', '', [od1])
490     c = Config(od)
491     c.read_write()
492     raises(ValueError, "c.cfgimpl_get_settings()._getproperties(a)")
493
494
495 def test_set_item():
496     a = BoolOption('activate_service', '', True)
497     b = IPOption('ip_address_service', '')
498     od1 = OptionDescription('service', '', [a, b])
499     od = OptionDescription('base', '', [od1])
500     c = Config(od)
501     c.read_write()
502     raises(ValueError, 'c.cfgimpl_get_settings()[a] = ("test",)')