python 3.5 support
[tiramisu.git] / test / test_requires.py
1 # coding: utf-8
2 from .autopath import do_autopath
3 do_autopath()
4
5 from copy import copy
6 from tiramisu.setting import groups
7 from tiramisu import setting
8 setting.expires_time = 1
9 from tiramisu.option import IPOption, OptionDescription, BoolOption, IntOption, StrOption
10 from tiramisu.config import Config
11 from tiramisu.error import PropertiesOptionError, RequirementError
12 from py.test import raises
13
14
15 def test_requires():
16     a = BoolOption('activate_service', '', True)
17     b = IPOption('ip_address_service', '',
18                  requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
19     od = OptionDescription('service', '', [a, b])
20     c = Config(od)
21     c.read_write()
22     c.ip_address_service
23     c.activate_service = False
24     props = []
25     try:
26         c.ip_address_service
27     except PropertiesOptionError as err:
28         props = err.proptype
29     assert props == ['disabled']
30     c.activate_service = True
31     c.ip_address_service
32
33
34 def test_requires_with_requires():
35     a = BoolOption('activate_service', '', True)
36     b = IPOption('ip_address_service', '',
37                  requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
38     od = OptionDescription('service', '', [a, b])
39     c = Config(od)
40     c.read_write()
41     c.cfgimpl_get_settings()[b].append('test')
42     c.ip_address_service
43     c.activate_service = False
44     props = []
45     try:
46         c.ip_address_service
47     except PropertiesOptionError as err:
48         props = err.proptype
49     assert props == ['disabled']
50     c.activate_service = True
51     c.ip_address_service
52
53
54 def test_requires_invalid():
55     a = BoolOption('activate_service', '', True)
56     a
57     raises(ValueError, "IPOption('ip_address_service', '', requires='string')")
58     raises(ValueError, "IPOption('ip_address_service', '', requires=[{'option': a, 'expected': False, 'action': 'disabled', 'unknown': True}])")
59     raises(ValueError, "IPOption('ip_address_service', '', requires=[{'option': a, 'expected': False}])")
60     raises(ValueError, "IPOption('ip_address_service', '', requires=[{'option': a, 'action': 'disabled'}])")
61     raises(ValueError, "IPOption('ip_address_service', '', requires=[{'expected': False, 'action': 'disabled'}])")
62     raises(ValueError, "IPOption('ip_address_service', '', requires=[{'option': a, 'expected': False, 'action': 'disabled', 'inverse': 'string'}])")
63     raises(ValueError, "IPOption('ip_address_service', '', requires=[{'option': a, 'expected': False, 'action': 'disabled', 'transitive': 'string'}])")
64     raises(ValueError, "IPOption('ip_address_service', '', requires=[{'option': a, 'expected': False, 'action': 'disabled', 'same_action': 'string'}])")
65     raises(ValueError, "IPOption('ip_address_service', '', requires=[{'option': 'string', 'expected': False, 'action': 'disabled'}])")
66     raises(ValueError, "IPOption('ip_address_service', '', requires=[{'option': a, 'expected': 'string', 'action': 'disabled'}])")
67
68
69 def test_requires_same_action():
70     a = BoolOption('activate_service', '', True)
71     b = BoolOption('activate_service_web', '', True,
72                    requires=[{'option': a, 'expected': False, 'action': 'new'}])
73
74     d = IPOption('ip_address_service_web', '',
75                  requires=[{'option': b, 'expected': False,
76                             'action': 'disabled', 'inverse': False,
77                             'transitive': True, 'same_action': False}])
78     od = OptionDescription('service', '', [a, b, d])
79     c = Config(od)
80     c.read_write()
81     c.cfgimpl_get_settings().append('new')
82     c.activate_service
83     c.activate_service_web
84     c.ip_address_service_web
85     c.activate_service = False
86     #
87     props = []
88     try:
89         c.activate_service_web
90     except PropertiesOptionError as err:
91         props = err.proptype
92     assert props == ['new']
93     #
94     props = []
95     try:
96         c.ip_address_service_web
97     except PropertiesOptionError as err:
98         props = err.proptype
99     assert props == ['disabled']
100
101
102 def test_multiple_requires():
103     a = StrOption('activate_service', '')
104     b = IPOption('ip_address_service', '',
105                  requires=[{'option': a, 'expected': 'yes', 'action': 'disabled'},
106                            {'option': a, 'expected': 'ok', 'action': 'disabled'}])
107     od = OptionDescription('service', '', [a, b])
108     c = Config(od)
109     c.read_write()
110     c.ip_address_service
111     c.activate_service = 'yes'
112     props = []
113     try:
114         c.ip_address_service
115     except PropertiesOptionError as err:
116         props = err.proptype
117     assert props == ['disabled']
118
119     c.activate_service = 'ok'
120     props = []
121     try:
122         c.ip_address_service
123     except PropertiesOptionError as err:
124         props = err.proptype
125     assert props == ['disabled']
126
127     c.activate_service = 'no'
128     c.ip_address_service
129
130
131 def test_multiple_requires_cumulative():
132     a = StrOption('activate_service', '')
133     b = IPOption('ip_address_service', '',
134                  requires=[{'option': a, 'expected': 'yes', 'action': 'disabled'},
135                            {'option': a, 'expected': 'yes', 'action': 'hidden'}])
136     od = OptionDescription('service', '', [a, b])
137     c = Config(od)
138     c.read_write()
139     c.ip_address_service
140     c.activate_service = 'yes'
141     props = []
142     try:
143         c.ip_address_service
144     except PropertiesOptionError as err:
145         props = err.proptype
146     assert set(props) == set(['hidden', 'disabled'])
147
148     c.activate_service = 'ok'
149     c.ip_address_service
150
151     c.activate_service = 'no'
152     c.ip_address_service
153
154
155 def test_multiple_requires_cumulative_inverse():
156     a = StrOption('activate_service', '')
157     b = IPOption('ip_address_service', '',
158                  requires=[{'option': a, 'expected': 'yes', 'action': 'disabled', 'inverse': True},
159                            {'option': a, 'expected': 'yes', 'action': 'hidden', 'inverse': True}])
160     od = OptionDescription('service', '', [a, b])
161     c = Config(od)
162     c.read_write()
163     props = []
164     try:
165         c.ip_address_service
166     except PropertiesOptionError as err:
167         props = err.proptype
168     assert set(props) == set(['hidden', 'disabled'])
169     c.activate_service = 'yes'
170     c.ip_address_service
171
172     c.activate_service = 'ok'
173     props = []
174     try:
175         c.ip_address_service
176     except PropertiesOptionError as err:
177         props = err.proptype
178     assert set(props) == set(['hidden', 'disabled'])
179
180     c.activate_service = 'no'
181     props = []
182     try:
183         c.ip_address_service
184     except PropertiesOptionError as err:
185         props = err.proptype
186     assert set(props) == set(['hidden', 'disabled'])
187
188
189 def test_multiple_requires_inverse():
190     a = StrOption('activate_service', '')
191     b = IPOption('ip_address_service', '',
192                  requires=[{'option': a, 'expected': 'yes', 'action': 'disabled', 'inverse': True},
193                            {'option': a, 'expected': 'ok', 'action': 'disabled', 'inverse': True}])
194     od = OptionDescription('service', '', [a, b])
195     c = Config(od)
196     c.read_write()
197     props = []
198     try:
199         c.ip_address_service
200     except PropertiesOptionError as err:
201         props = err.proptype
202     assert props == ['disabled']
203
204     c.activate_service = 'yes'
205     c.ip_address_service
206
207     c.activate_service = 'ok'
208     c.ip_address_service
209
210     c.activate_service = 'no'
211     props = []
212     try:
213         c.ip_address_service
214     except PropertiesOptionError as err:
215         props = err.proptype
216     assert props == ['disabled']
217
218
219 def test_requires_transitive():
220     a = BoolOption('activate_service', '', True)
221     b = BoolOption('activate_service_web', '', True,
222                    requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
223
224     d = IPOption('ip_address_service_web', '',
225                  requires=[{'option': b, 'expected': False, 'action': 'disabled'}])
226     od = OptionDescription('service', '', [a, b, d])
227     c = Config(od)
228     c.read_write()
229     c.activate_service
230     c.activate_service_web
231     c.ip_address_service_web
232     c.activate_service = False
233     #
234     props = []
235     try:
236         c.activate_service_web
237     except PropertiesOptionError as err:
238         props = err.proptype
239     assert props == ['disabled']
240     #
241     props = []
242     try:
243         c.ip_address_service_web
244     except PropertiesOptionError as err:
245         props = err.proptype
246     assert props == ['disabled']
247
248
249 def test_requires_transitive_owner():
250     a = BoolOption('activate_service', '', True)
251     b = BoolOption('activate_service_web', '', True,
252                    requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
253
254     d = IPOption('ip_address_service_web', '',
255                  requires=[{'option': b, 'expected': False, 'action': 'disabled'}])
256     od = OptionDescription('service', '', [a, b, d])
257     c = Config(od)
258     c.read_write()
259     c.activate_service
260     c.activate_service_web
261     c.ip_address_service_web
262     #no more default value
263     c.ip_address_service_web = '1.1.1.1'
264     c.activate_service = False
265     props = []
266     try:
267         c.ip_address_service_web
268     except PropertiesOptionError as err:
269         props = err.proptype
270     assert props == ['disabled']
271
272
273 def test_requires_transitive_bis():
274     a = BoolOption('activate_service', '', True)
275     abis = BoolOption('activate_service_bis', '', True)
276     b = BoolOption('activate_service_web', '', True,
277                    requires=[{'option': a, 'expected': True, 'action': 'disabled', 'inverse': True}])
278
279     d = IPOption('ip_address_service_web', '',
280                  requires=[{'option': b, 'expected': True, 'action': 'disabled', 'inverse': True}])
281     od = OptionDescription('service', '', [a, abis, b, d])
282     c = Config(od)
283     c.read_write()
284     #
285     c.activate_service_web
286     c.ip_address_service_web
287     c.activate_service = False
288     #
289     props = []
290     try:
291         c.activate_service_web
292     except PropertiesOptionError as err:
293         props = err.proptype
294     assert props == ['disabled']
295     #
296     props = []
297     try:
298         c.ip_address_service_web
299     except PropertiesOptionError as err:
300         props = err.proptype
301     assert props == ['disabled']
302
303
304 def test_requires_transitive_hidden_disabled():
305     a = BoolOption('activate_service', '', True)
306     b = BoolOption('activate_service_web', '', True,
307                    requires=[{'option': a, 'expected': False, 'action': 'hidden'}])
308     d = IPOption('ip_address_service_web', '',
309                  requires=[{'option': b, 'expected': False, 'action': 'disabled'}])
310     od = OptionDescription('service', '', [a, b, d])
311     c = Config(od)
312     c.read_write()
313     c.activate_service
314     c.activate_service_web
315     c.ip_address_service_web
316     c.activate_service = False
317     #
318     props = []
319     try:
320         c.activate_service_web
321     except PropertiesOptionError as err:
322         props = err.proptype
323     assert props == ['hidden']
324     raises(RequirementError, 'c.ip_address_service_web')
325
326
327 def test_requires_not_transitive():
328     a = BoolOption('activate_service', '', True)
329     b = BoolOption('activate_service_web', '', True,
330                    requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
331     d = IPOption('ip_address_service_web', '',
332                  requires=[{'option': b, 'expected': False,
333                             'action': 'disabled', 'transitive': False}])
334     od = OptionDescription('service', '', [a, b, d])
335     c = Config(od)
336     c.read_write()
337     c.activate_service
338     c.activate_service_web
339     c.ip_address_service_web
340     c.activate_service = False
341     #
342     props = []
343     try:
344         c.activate_service_web
345     except PropertiesOptionError as err:
346         props = err.proptype
347     assert props == ['disabled']
348     #
349     c.ip_address_service_web
350
351
352 def test_requires_not_transitive_not_same_action():
353     a = BoolOption('activate_service', '', True)
354     b = BoolOption('activate_service_web', '', True,
355                    requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
356     d = IPOption('ip_address_service_web', '',
357                  requires=[{'option': b, 'expected': False,
358                             'action': 'hidden', 'transitive': False}])
359     od = OptionDescription('service', '', [a, b, d])
360     c = Config(od)
361     c.read_write()
362     c.activate_service
363     c.activate_service_web
364     c.ip_address_service_web
365     c.activate_service = False
366     #
367     props = []
368     try:
369         c.activate_service_web
370     except PropertiesOptionError as err:
371         props = err.proptype
372     assert props == ['disabled']
373     #
374     raises(RequirementError, "c.ip_address_service_web")
375
376
377 def test_requires_None():
378     a = BoolOption('activate_service', '')
379     b = IPOption('ip_address_service', '',
380                  requires=[{'option': a, 'expected': None, 'action': 'disabled'}])
381     od = OptionDescription('service', '', [a, b])
382     c = Config(od)
383     c.read_write()
384     props = []
385     try:
386         c.ip_address_service
387     except PropertiesOptionError as err:
388         props = err.proptype
389     assert props == ['disabled']
390     c.activate_service = False
391     c.ip_address_service
392
393
394 def test_requires_multi_disabled():
395     a = BoolOption('activate_service', '')
396     b = IntOption('num_service', '')
397     c = IPOption('ip_address_service', '',
398                  requires=[{'option': a, 'expected': True, 'action': 'disabled'},
399                            {'option': b, 'expected': 1, 'action': 'disabled'}])
400     od = OptionDescription('service', '', [a, b, c])
401     c = Config(od)
402     c.read_write()
403
404     c.ip_address_service
405
406     c.activate_service = True
407     props = []
408     try:
409         c.ip_address_service
410     except PropertiesOptionError as err:
411         props = err.proptype
412     assert props == ['disabled']
413
414     c.activate_service = False
415     c.ip_address_service
416
417     c.num_service = 1
418     props = []
419     try:
420         c.ip_address_service
421     except PropertiesOptionError as err:
422         props = err.proptype
423     assert props == ['disabled']
424
425     c.activate_service = True
426     props = []
427     try:
428         c.ip_address_service
429     except PropertiesOptionError as err:
430         props = err.proptype
431     assert props == ['disabled']
432
433
434 def test_requires_multi_disabled_new_format():
435     a = BoolOption('activate_service', '')
436     b = IntOption('num_service', '')
437     c = IPOption('ip_address_service', '',
438             requires=[{'expected': [{'option': a, 'value': True}, {'option': b, 'value': 1}], 'action': 'disabled'}])
439     od = OptionDescription('service', '', [a, b, c])
440     c = Config(od)
441     c.read_write()
442
443     c.ip_address_service
444
445     c.activate_service = True
446     props = []
447     try:
448         c.ip_address_service
449     except PropertiesOptionError as err:
450         props = err.proptype
451     assert props == ['disabled']
452
453     c.activate_service = False
454     c.ip_address_service
455
456     c.num_service = 1
457     props = []
458     try:
459         c.ip_address_service
460     except PropertiesOptionError as err:
461         props = err.proptype
462     assert props == ['disabled']
463
464     c.activate_service = True
465     props = []
466     try:
467         c.ip_address_service
468     except PropertiesOptionError as err:
469         props = err.proptype
470     assert props == ['disabled']
471
472
473 def test_requires_multi_disabled_new_format_and():
474     a = BoolOption('activate_service', '')
475     b = IntOption('num_service', '')
476     c = IPOption('ip_address_service', '',
477             requires=[{'expected': [{'option': a, 'value': True}, {'option': b, 'value': 1}], 'action': 'disabled', 'operator': 'and'}])
478     od = OptionDescription('service', '', [a, b, c])
479     c = Config(od)
480     c.read_write()
481
482     c.ip_address_service
483
484     c.activate_service = True
485     props = []
486     try:
487         c.ip_address_service
488     except PropertiesOptionError as err:
489         props = err.proptype
490     assert props == []
491
492     c.activate_service = False
493     c.ip_address_service
494
495     c.num_service = 1
496     props = []
497     try:
498         c.ip_address_service
499     except PropertiesOptionError as err:
500         props = err.proptype
501     assert props == []
502
503     c.activate_service = True
504     props = []
505     try:
506         c.ip_address_service
507     except PropertiesOptionError as err:
508         props = err.proptype
509     assert props == ['disabled']
510
511
512 def test_requires_multi_disabled_new_format_and_2():
513     a = BoolOption('activate_service', '')
514     b = IntOption('num_service', '')
515     c = IPOption('ip_address_service', '',
516             requires=[{'expected': [{'option': a, 'value': True}, {'option': b, 'value': 1}], 'action': 'disabled', 'operator': 'and'},
517                       {'expected': [{'option': a, 'value': False}, {'option': b, 'value': 1}], 'action': 'expert'}])
518     od = OptionDescription('service', '', [a, b, c])
519     c = Config(od)
520     c.cfgimpl_get_settings().append('expert')
521     c.read_write()
522     c.ip_address_service
523
524     c.activate_service = True
525     props = []
526     try:
527         c.ip_address_service
528     except PropertiesOptionError as err:
529         props = err.proptype
530     assert props == []
531
532     c.activate_service = False
533     c.num_service = 1
534     props = []
535     try:
536         c.ip_address_service
537     except PropertiesOptionError as err:
538         props = err.proptype
539     assert props == ['expert']
540
541     c.activate_service = True
542     props = []
543     try:
544         c.ip_address_service
545     except PropertiesOptionError as err:
546         props = err.proptype
547     assert props == ['disabled', 'expert']
548
549
550 def test_requires_multi_disabled_inverse():
551     a = BoolOption('activate_service', '')
552     b = IntOption('num_service', '')
553     c = IPOption('ip_address_service', '',
554                  requires=[{'option': a, 'expected': True,
555                             'action': 'disabled', 'inverse': True},
556                            {'option': b, 'expected': 1,
557                             'action': 'disabled', 'inverse': True}])
558     od = OptionDescription('service', '', [a, b, c])
559     c = Config(od)
560     c.read_write()
561
562     props = []
563     try:
564         c.ip_address_service
565     except PropertiesOptionError as err:
566         props = err.proptype
567     assert props == ['disabled']
568
569     c.activate_service = True
570     props = []
571     try:
572         c.ip_address_service
573     except PropertiesOptionError as err:
574         props = err.proptype
575     assert props == ['disabled']
576
577     c.activate_service = False
578     props = []
579     try:
580         c.ip_address_service
581     except PropertiesOptionError as err:
582         props = err.proptype
583     assert props == ['disabled']
584
585     c.num_service = 1
586     props = []
587     try:
588         c.ip_address_service
589     except PropertiesOptionError as err:
590         props = err.proptype
591     assert props == ['disabled']
592
593     c.activate_service = True
594     c.ip_address_service
595
596
597 def test_requires_multi_disabled_2():
598     a = BoolOption('a', '')
599     b = BoolOption('b', '')
600     c = BoolOption('c', '')
601     d = BoolOption('d', '')
602     e = BoolOption('e', '')
603     f = BoolOption('f', '')
604     g = BoolOption('g', '')
605     h = BoolOption('h', '')
606     i = BoolOption('i', '')
607     j = BoolOption('j', '')
608     k = BoolOption('k', '')
609     l = BoolOption('l', '')
610     m = BoolOption('m', '')
611     list_bools = [a, b, c, d, e, f, g, h, i, j, k, l, m]
612     requires = []
613     for boo in list_bools:
614         requires.append({'option': boo, 'expected': True, 'action': 'disabled'})
615     z = IPOption('z', '', requires=requires)
616     y = copy(list_bools)
617     y.append(z)
618     od = OptionDescription('service', '', y)
619     cfg = Config(od)
620     cfg.read_write()
621
622     cfg.z
623     for boo in list_bools:
624         setattr(cfg, boo._name, True)
625         props = []
626         try:
627             cfg.z
628         except PropertiesOptionError as err:
629             props = err.proptype
630         assert props == ['disabled']
631     for boo in list_bools:
632         setattr(cfg, boo._name, False)
633         if boo == m:
634             cfg.z
635         else:
636             props = []
637             try:
638                 cfg.z
639             except PropertiesOptionError as err:
640                 props = err.proptype
641             assert props == ['disabled']
642
643
644 def test_requires_multi_disabled_inverse_2():
645     a = BoolOption('a', '')
646     b = BoolOption('b', '')
647     c = BoolOption('c', '')
648     d = BoolOption('d', '')
649     e = BoolOption('e', '')
650     f = BoolOption('f', '')
651     g = BoolOption('g', '')
652     h = BoolOption('h', '')
653     i = BoolOption('i', '')
654     j = BoolOption('j', '')
655     k = BoolOption('k', '')
656     l = BoolOption('l', '')
657     m = BoolOption('m', '')
658     list_bools = [a, b, c, d, e, f, g, h, i, j, k, l, m]
659     requires = []
660     for boo in list_bools:
661         requires.append({'option': boo, 'expected': True, 'action': 'disabled',
662                          'inverse': True})
663     z = IPOption('z', '', requires=requires)
664     y = copy(list_bools)
665     y.append(z)
666     od = OptionDescription('service', '', y)
667     cfg = Config(od)
668     cfg.read_write()
669
670     props = []
671     try:
672         cfg.z
673     except PropertiesOptionError as err:
674         props = err.proptype
675     assert props == ['disabled']
676     for boo in list_bools:
677         setattr(cfg, boo._name, True)
678         if boo == m:
679             cfg.z
680         else:
681             props = []
682             try:
683                 cfg.z
684             except PropertiesOptionError as err:
685                 props = err.proptype
686             assert props == ['disabled']
687     for boo in list_bools:
688         setattr(cfg, boo._name, False)
689         props = []
690         try:
691             cfg.z
692         except PropertiesOptionError as err:
693             props = err.proptype
694         assert props == ['disabled']
695
696
697 def test_requires_requirement_append():
698     a = BoolOption('activate_service', '', True)
699     b = IPOption('ip_address_service', '',
700                  requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
701     od = OptionDescription('service', '', [a, b])
702     c = Config(od)
703     c.read_write()
704     str(c.cfgimpl_get_settings())
705     str(c.cfgimpl_get_settings()[b])
706     raises(ValueError, 'c.cfgimpl_get_settings()[b].append("disabled")')
707     c.activate_service = False
708     # disabled is now set, test to remove disabled before store in storage
709     c.cfgimpl_get_settings()[b].append("test")
710
711
712 def test_requires_different_inverse():
713     a = BoolOption('activate_service', '', True)
714     b = IPOption('ip_address_service', '', requires=[
715         {'option': a, 'expected': True, 'action': 'disabled', 'inverse': True},
716         {'option': a, 'expected': True, 'action': 'disabled', 'inverse': False}])
717     od = OptionDescription('service', '', [a, b])
718     c = Config(od)
719     c.read_write()
720     raises(PropertiesOptionError, 'c.ip_address_service')
721     c.activate_service = False
722     raises(PropertiesOptionError, 'c.ip_address_service')
723
724
725 def test_requires_different_inverse_unicode():
726     a = BoolOption('activate_service', '', True)
727     d = StrOption('activate_other_service', '', 'val2')
728     b = IPOption('ip_address_service', '', requires=[
729         {'option': a, 'expected': True, 'action': 'disabled', 'inverse': True},
730         {'option': d, 'expected': 'val1', 'action': 'disabled', 'inverse': False}])
731     od = OptionDescription('service', '', [a, d, b])
732     c = Config(od)
733     c.read_write()
734     assert c.ip_address_service == None
735     c.activate_service = False
736     raises(PropertiesOptionError, 'c.ip_address_service')
737     c.activate_service = True
738     assert c.ip_address_service == None
739     c.activate_other_service = 'val1'
740     raises(PropertiesOptionError, 'c.ip_address_service')
741     c.activate_service = False
742     raises(PropertiesOptionError, 'c.ip_address_service')
743
744
745 def test_requires_recursive_path():
746     a = BoolOption('activate_service', '', True)
747     b = IPOption('ip_address_service', '',
748                  requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
749     od1 = OptionDescription('service', '', [a, b], requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
750     od = OptionDescription('base', '', [od1])
751     c = Config(od)
752     c.read_write()
753     raises(RequirementError, 'c.service.a')
754
755
756 def test_get_properties_with_None_path():
757     a = BoolOption('activate_service', '', True)
758     b = IPOption('ip_address_service', '',
759                  requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
760     od1 = OptionDescription('service', '', [a, b], requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
761     od = OptionDescription('base', '', [od1])
762     c = Config(od)
763     c.read_write()
764     raises(ValueError, "c.cfgimpl_get_settings()._getproperties(a)")
765
766
767 def test_set_item():
768     a = BoolOption('activate_service', '', True)
769     b = IPOption('ip_address_service', '')
770     od1 = OptionDescription('service', '', [a, b])
771     od = OptionDescription('base', '', [od1])
772     c = Config(od)
773     c.read_write()
774     raises(ValueError, 'c.cfgimpl_get_settings()[a] = ("test",)')
775
776
777 def test_optiondescription_requires():
778     a = BoolOption('activate_service', '', True)
779     b = BoolOption('ip_address_service', '', multi=True)
780     a, b
781     OptionDescription('service', '', [b], requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
782
783
784 def test_optiondescription_requires_multi():
785     a = BoolOption('activate_service', '', True)
786     b = IPOption('ip_address_service', '', multi=True)
787     a, b
788     raises(ValueError, "OptionDescription('service', '', [a], requires=[{'option': b, 'expected': False, 'action': 'disabled'}])")
789
790
791 def test_properties_conflict():
792     a = BoolOption('activate_service', '', True)
793     a
794     raises(ValueError, "IPOption('ip_address_service', '', properties=('disabled',), requires=[{'option': a, 'expected': False, 'action': 'disabled'}])")
795     raises(ValueError, "od1 = OptionDescription('service', '', [a], properties=('disabled',), requires=[{'option': a, 'expected': False, 'action': 'disabled'}])")
796
797
798 def test_master_slave_requires():
799     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
800     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True,
801                                    requires=[{'option': ip_admin_eth0, 'expected': '192.168.1.1', 'action': 'disabled'}])
802     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
803     interface1.impl_set_group_type(groups.master)
804     maconfig = OptionDescription('toto', '', [interface1])
805     cfg = Config(maconfig)
806     cfg.read_write()
807     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
808     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
809     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.2')
810     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None]
811     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['192.168.1.2']
812     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.1')
813     assert cfg.ip_admin_eth0.netmask_admin_eth0[0] is None
814     raises(PropertiesOptionError, "cfg.ip_admin_eth0.netmask_admin_eth0[1]")
815     cfg.ip_admin_eth0.ip_admin_eth0[1] = '192.168.1.2'
816     assert cfg.ip_admin_eth0.netmask_admin_eth0[1] is None
817     cfg.ip_admin_eth0.netmask_admin_eth0[1] = '255.255.255.255'
818     assert cfg.ip_admin_eth0.netmask_admin_eth0[1] == '255.255.255.255'
819     cfg.ip_admin_eth0.ip_admin_eth0[1] = '192.168.1.1'
820     raises(PropertiesOptionError, "cfg.ip_admin_eth0.netmask_admin_eth0[1]")
821
822
823 def test_master_slave_requires_no_master():
824     activate = BoolOption('activate', "Activer l'accès au réseau", True)
825     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
826     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True,
827                                    requires=[{'option': activate, 'expected': False, 'action': 'disabled'}])
828     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
829     interface1.impl_set_group_type(groups.master)
830     maconfig = OptionDescription('toto', '', [activate, interface1])
831     cfg = Config(maconfig)
832     cfg.read_write()
833     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
834     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
835     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.2')
836     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None]
837     assert cfg.ip_admin_eth0.netmask_admin_eth0[0] is None
838     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['192.168.1.2']
839     cfg.activate = False
840     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.1')
841     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['192.168.1.2', '192.168.1.1']
842     raises(PropertiesOptionError, "cfg.ip_admin_eth0.netmask_admin_eth0")
843     raises(PropertiesOptionError, "cfg.ip_admin_eth0.netmask_admin_eth0[0]")
844     raises(PropertiesOptionError, "cfg.ip_admin_eth0.netmask_admin_eth0[1]")
845     cfg.activate = True
846     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None, None]
847     cfg.ip_admin_eth0.netmask_admin_eth0 = [None, '255.255.255.255']
848     assert cfg.ip_admin_eth0.netmask_admin_eth0[1] == '255.255.255.255'
849     cfg.activate = False
850     raises(PropertiesOptionError, "cfg.ip_admin_eth0.netmask_admin_eth0")
851     raises(PropertiesOptionError, "cfg.ip_admin_eth0.netmask_admin_eth0[0]")
852     raises(PropertiesOptionError, "cfg.ip_admin_eth0.netmask_admin_eth0[1]")