899c1c3aec8450309917e2a77c4d180bd4bad1ac
[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, 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, err:
51         props = err.proptype
52     assert props == ['new']
53     #
54     props = []
55     try:
56         c.ip_address_service_web
57     except PropertiesOptionError, 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, 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, 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_inverse():
92     a = StrOption('activate_service', '')
93     b = IPOption('ip_address_service', '',
94                  requires=[{'option': a, 'expected': 'yes', 'action': 'disabled', 'inverse': True},
95                            {'option': a, 'expected': 'ok', 'action': 'disabled', 'inverse': True}])
96     od = OptionDescription('service', '', [a, b])
97     c = Config(od)
98     c.read_write()
99     props = []
100     try:
101         c.ip_address_service
102     except PropertiesOptionError, err:
103         props = err.proptype
104     assert props == ['disabled']
105
106     c.activate_service = 'yes'
107     c.ip_address_service
108
109     c.activate_service = 'ok'
110     c.ip_address_service
111
112     c.activate_service = 'no'
113     props = []
114     try:
115         c.ip_address_service
116     except PropertiesOptionError, err:
117         props = err.proptype
118     assert props == ['disabled']
119
120
121 def test_requires_transitive():
122     a = BoolOption('activate_service', '', True)
123     b = BoolOption('activate_service_web', '', True,
124                    requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
125
126     d = IPOption('ip_address_service_web', '',
127                  requires=[{'option': b, 'expected': False, 'action': 'disabled'}])
128     od = OptionDescription('service', '', [a, b, d])
129     c = Config(od)
130     c.read_write()
131     c.activate_service
132     c.activate_service_web
133     c.ip_address_service_web
134     c.activate_service = False
135     #
136     props = []
137     try:
138         c.activate_service_web
139     except PropertiesOptionError, err:
140         props = err.proptype
141     assert props == ['disabled']
142     #
143     props = []
144     try:
145         c.ip_address_service_web
146     except PropertiesOptionError, err:
147         props = err.proptype
148     assert props == ['disabled']
149
150
151 def test_requires_transitive_bis():
152     a = BoolOption('activate_service', '', True)
153     abis = BoolOption('activate_service_bis', '', True)
154     b = BoolOption('activate_service_web', '', True,
155                    requires=[{'option': a, 'expected': True, 'action': 'disabled', 'inverse': True}])
156
157     d = IPOption('ip_address_service_web', '',
158                  requires=[{'option': b, 'expected': True, 'action': 'disabled', 'inverse': True}])
159     od = OptionDescription('service', '', [a, abis, b, d])
160     c = Config(od)
161     c.read_write()
162     #
163     c.activate_service_web
164     c.ip_address_service_web
165     c.activate_service = False
166     #
167     props = []
168     try:
169         c.activate_service_web
170     except PropertiesOptionError, err:
171         props = err.proptype
172     assert props == ['disabled']
173     #
174     props = []
175     try:
176         c.ip_address_service_web
177     except PropertiesOptionError, err:
178         props = err.proptype
179     assert props == ['disabled']
180
181
182 def test_requires_transitive_hidden_disabled():
183     a = BoolOption('activate_service', '', True)
184     b = BoolOption('activate_service_web', '', True,
185                    requires=[{'option': a, 'expected': False, 'action': 'hidden'}])
186     d = IPOption('ip_address_service_web', '',
187                  requires=[{'option': b, 'expected': False, 'action': 'disabled'}])
188     od = OptionDescription('service', '', [a, b, d])
189     c = Config(od)
190     c.read_write()
191     c.activate_service
192     c.activate_service_web
193     c.ip_address_service_web
194     c.activate_service = False
195     #
196     props = []
197     try:
198         c.activate_service_web
199     except PropertiesOptionError, err:
200         props = err.proptype
201     assert props == ['hidden']
202     raises(RequirementError, 'c.ip_address_service_web')
203
204
205 def test_requires_not_transitive():
206     a = BoolOption('activate_service', '', True)
207     b = BoolOption('activate_service_web', '', True,
208                    requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
209     d = IPOption('ip_address_service_web', '',
210                  requires=[{'option': b, 'expected': False,
211                             'action': 'disabled', 'transitive': False}])
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, err:
224         props = err.proptype
225     assert props == ['disabled']
226     #
227     c.ip_address_service_web
228
229
230 def test_requires_None():
231     a = BoolOption('activate_service', '')
232     b = IPOption('ip_address_service', '',
233                  requires=[{'option': a, 'expected': None, 'action': 'disabled'}])
234     od = OptionDescription('service', '', [a, b])
235     c = Config(od)
236     c.read_write()
237     props = []
238     try:
239         c.ip_address_service
240     except PropertiesOptionError, err:
241         props = err.proptype
242     assert props == ['disabled']
243     c.activate_service = False
244     c.ip_address_service
245
246
247 def test_requires_multi_disabled():
248     a = BoolOption('activate_service', '')
249     b = IntOption('num_service', '')
250     c = IPOption('ip_address_service', '',
251                  requires=[{'option': a, 'expected': True, 'action': 'disabled'},
252                            {'option': b, 'expected': 1, 'action': 'disabled'}])
253     od = OptionDescription('service', '', [a, b, c])
254     c = Config(od)
255     c.read_write()
256
257     c.ip_address_service
258
259     c.activate_service = True
260     props = []
261     try:
262         c.ip_address_service
263     except PropertiesOptionError, err:
264         props = err.proptype
265     assert props == ['disabled']
266
267     c.activate_service = False
268     c.ip_address_service
269
270     c.num_service = 1
271     props = []
272     try:
273         c.ip_address_service
274     except PropertiesOptionError, err:
275         props = err.proptype
276     assert props == ['disabled']
277
278     c.activate_service = True
279     props = []
280     try:
281         c.ip_address_service
282     except PropertiesOptionError, err:
283         props = err.proptype
284     assert props == ['disabled']
285
286
287 def test_requires_multi_disabled_inverse():
288     a = BoolOption('activate_service', '')
289     b = IntOption('num_service', '')
290     c = IPOption('ip_address_service', '',
291                  requires=[{'option': a, 'expected': True,
292                             'action': 'disabled', 'inverse': True},
293                            {'option': b, 'expected': 1,
294                             'action': 'disabled', 'inverse': True}])
295     od = OptionDescription('service', '', [a, b, c])
296     c = Config(od)
297     c.read_write()
298
299     props = []
300     try:
301         c.ip_address_service
302     except PropertiesOptionError, err:
303         props = err.proptype
304     assert props == ['disabled']
305
306     c.activate_service = True
307     props = []
308     try:
309         c.ip_address_service
310     except PropertiesOptionError, err:
311         props = err.proptype
312     assert props == ['disabled']
313
314     c.activate_service = False
315     props = []
316     try:
317         c.ip_address_service
318     except PropertiesOptionError, err:
319         props = err.proptype
320     assert props == ['disabled']
321
322     c.num_service = 1
323     props = []
324     try:
325         c.ip_address_service
326     except PropertiesOptionError, err:
327         props = err.proptype
328     assert props == ['disabled']
329
330     c.activate_service = True
331     c.ip_address_service
332
333
334 def test_requires_multi_disabled_2():
335     a = BoolOption('a', '')
336     b = BoolOption('b', '')
337     c = BoolOption('c', '')
338     d = BoolOption('d', '')
339     e = BoolOption('e', '')
340     f = BoolOption('f', '')
341     g = BoolOption('g', '')
342     h = BoolOption('h', '')
343     i = BoolOption('i', '')
344     j = BoolOption('j', '')
345     k = BoolOption('k', '')
346     l = BoolOption('l', '')
347     m = BoolOption('m', '')
348     list_bools = [a, b, c, d, e, f, g, h, i, j, k, l, m]
349     requires = []
350     for boo in list_bools:
351         requires.append({'option': boo, 'expected': True, 'action': 'disabled'})
352     z = IPOption('z', '', requires=requires)
353     y = copy(list_bools)
354     y.append(z)
355     od = OptionDescription('service', '', y)
356     cfg = Config(od)
357     cfg.read_write()
358
359     cfg.z
360     for boo in list_bools:
361         setattr(cfg, boo._name, True)
362         props = []
363         try:
364             cfg.z
365         except PropertiesOptionError, err:
366             props = err.proptype
367         assert props == ['disabled']
368     for boo in list_bools:
369         setattr(cfg, boo._name, False)
370         if boo == m:
371             cfg.z
372         else:
373             props = []
374             try:
375                 cfg.z
376             except PropertiesOptionError, err:
377                 props = err.proptype
378             assert props == ['disabled']
379
380
381 def test_requires_multi_disabled_inverse_2():
382     a = BoolOption('a', '')
383     b = BoolOption('b', '')
384     c = BoolOption('c', '')
385     d = BoolOption('d', '')
386     e = BoolOption('e', '')
387     f = BoolOption('f', '')
388     g = BoolOption('g', '')
389     h = BoolOption('h', '')
390     i = BoolOption('i', '')
391     j = BoolOption('j', '')
392     k = BoolOption('k', '')
393     l = BoolOption('l', '')
394     m = BoolOption('m', '')
395     list_bools = [a, b, c, d, e, f, g, h, i, j, k, l, m]
396     requires = []
397     for boo in list_bools:
398         requires.append({'option': boo, 'expected': True, 'action': 'disabled',
399                          'inverse': True})
400     z = IPOption('z', '', requires=requires)
401     y = copy(list_bools)
402     y.append(z)
403     od = OptionDescription('service', '', y)
404     cfg = Config(od)
405     cfg.read_write()
406
407     props = []
408     try:
409         cfg.z
410     except PropertiesOptionError, err:
411         props = err.proptype
412     assert props == ['disabled']
413     for boo in list_bools:
414         setattr(cfg, boo._name, True)
415         if boo == m:
416             cfg.z
417         else:
418             props = []
419             try:
420                 cfg.z
421             except PropertiesOptionError, err:
422                 props = err.proptype
423             assert props == ['disabled']
424     for boo in list_bools:
425         setattr(cfg, boo._name, False)
426         props = []
427         try:
428             cfg.z
429         except PropertiesOptionError, err:
430             props = err.proptype
431         assert props == ['disabled']
432
433
434 def test_requires_requirement_append():
435     a = BoolOption('activate_service', '', True)
436     b = IPOption('ip_address_service', '',
437                  requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
438     od = OptionDescription('service', '', [a, b])
439     c = Config(od)
440     c.read_write()
441     raises(ValueError, 'c.cfgimpl_get_settings()[b].append("disabled")')
442
443
444 def test_requires_recursive_path():
445     a = BoolOption('activate_service', '', True)
446     b = IPOption('ip_address_service', '',
447                  requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
448     od1 = OptionDescription('service', '', [a, b], requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
449     od = OptionDescription('base', '', [od1])
450     c = Config(od)
451     c.read_write()
452     raises(RequirementError, 'c.service.a')