2c13c1ee59d37539d2c8fe19e6d66ebee7012d95
[tiramisu.git] / test / test_mandatory.py
1 # coding: utf-8
2 from autopath import do_autopath
3 do_autopath()
4 from time import sleep
5
6 from py.test import raises
7 from tiramisu.config import Config
8 from tiramisu.option import StrOption, UnicodeOption, OptionDescription
9 from tiramisu.error import PropertiesOptionError
10 from tiramisu.setting import groups
11
12
13 def make_description():
14     stroption = StrOption('str', 'Test string option', default="abc",
15                           properties=('mandatory', ))
16     stroption1 = StrOption('str1', 'Test string option',
17                            properties=('mandatory', ))
18     stroption2 = UnicodeOption('unicode2', 'Test string option',
19                                properties=('mandatory', ))
20     stroption3 = StrOption('str3', 'Test string option', multi=True,
21                            properties=('mandatory', ))
22     stroption4 = StrOption('str4', 'Test string option', multi=True,
23                            properties=('mandatory', ), allow_empty_list=True)
24     descr = OptionDescription('tiram', '', [stroption, stroption1, stroption2, stroption3, stroption4])
25     return descr
26
27
28 def test_mandatory_ro():
29     descr = make_description()
30     config = Config(descr)
31     config.read_only()
32     prop = []
33     try:
34         config.str1
35     except PropertiesOptionError as err:
36         prop = err.proptype
37     assert 'mandatory' in prop
38     config.read_write()
39     config.str1 = 'yes'
40     config.read_only()
41     assert config.str1 == 'yes'
42
43
44 def test_mandatory_rw():
45     descr = make_description()
46     config = Config(descr)
47     config.read_write()
48     #not mandatory in rw
49     config.str1
50     config.str1 = 'yes'
51     assert config.str1 == 'yes'
52
53
54 def test_mandatory_default():
55     descr = make_description()
56     config = Config(descr)
57     config.read_only()
58     #not mandatory in rw
59     config.str
60     config.read_write()
61     config.str = 'yes'
62     config.read_only()
63     config.str
64     config.read_write()
65     config.str = None
66     config.read_only()
67     prop = []
68     try:
69         config.str
70     except PropertiesOptionError as err:
71         prop = err.proptype
72     assert 'mandatory' in prop
73
74
75 #valeur vide : None, '', u'', ...
76 def test_mandatory_none():
77     descr = make_description()
78     config = Config(descr)
79     config.str1 = None
80     assert config.getowner(config.unwrap_from_path('str1')) == 'user'
81     config.read_only()
82     prop = []
83     try:
84         config.str1
85     except PropertiesOptionError as err:
86         prop = err.proptype
87     assert 'mandatory' in prop
88
89
90 def test_mandatory_empty():
91     descr = make_description()
92     config = Config(descr)
93     config.str1 = ''
94     assert config.getowner(config.unwrap_from_path('str1')) == 'user'
95     config.read_only()
96     prop = []
97     try:
98         config.str1
99     except PropertiesOptionError as err:
100         prop = err.proptype
101     assert 'mandatory' in prop
102
103
104 def test_mandatory_multi_none():
105     descr = make_description()
106     config = Config(descr)
107     config.str3 = [None]
108     assert config.getowner(config.unwrap_from_path('str3')) == 'user'
109     config.read_only()
110     prop = []
111     try:
112         config.str3
113     except PropertiesOptionError as err:
114         prop = err.proptype
115     assert 'mandatory' in prop
116     config.read_write()
117     config.str3 = ['yes', None]
118     assert config.getowner(config.unwrap_from_path('str3')) == 'user'
119     config.read_only()
120     prop = []
121     try:
122         config.str3
123     except PropertiesOptionError as err:
124         prop = err.proptype
125     assert 'mandatory' in prop
126
127
128 def test_mandatory_multi_empty():
129     descr = make_description()
130     config = Config(descr)
131     config.str3 = []
132     assert config.getowner(config.unwrap_from_path('str3')) == 'user'
133     config.read_only()
134     prop = []
135     try:
136         config.str3
137     except PropertiesOptionError as err:
138         prop = err.proptype
139     assert 'mandatory' in prop
140     #
141     config.read_write()
142     config.str3 = ['']
143     assert config.getowner(config.unwrap_from_path('str3')) == 'user'
144     config.read_only()
145     prop = []
146     try:
147         config.str3
148     except PropertiesOptionError as err:
149         prop = err.proptype
150     assert 'mandatory' in prop
151     #
152     config.read_write()
153     config.str3 = ['yes', '']
154     assert config.getowner(config.unwrap_from_path('str3')) == 'user'
155     config.read_only()
156     prop = []
157     try:
158         config.str3
159     except PropertiesOptionError as err:
160         prop = err.proptype
161     assert 'mandatory' in prop
162
163
164 def test_mandatory_multi_empty_allow_empty_list():
165     descr = make_description()
166     config = Config(descr)
167     config.str4 = []
168     assert config.getowner(config.unwrap_from_path('str4')) == 'user'
169     config.read_only()
170     prop = []
171     config.str4
172     #
173     config.read_write()
174     config.str4 = ['']
175     assert config.getowner(config.unwrap_from_path('str4')) == 'user'
176     config.read_only()
177     prop = []
178     try:
179         config.str4
180     except PropertiesOptionError as err:
181         prop = err.proptype
182     assert 'mandatory' in prop
183     #
184     config.read_write()
185     config.str4 = ['yes', '']
186     assert config.getowner(config.unwrap_from_path('str4')) == 'user'
187     config.read_only()
188     prop = []
189     try:
190         config.str4
191     except PropertiesOptionError as err:
192         prop = err.proptype
193     assert 'mandatory' in prop
194
195
196 def test_mandatory_multi_append():
197     descr = make_description()
198     config = Config(descr)
199     config.str3 = ['yes']
200     config.read_write()
201     config.str3.append(None)
202
203
204 def test_mandatory_disabled():
205     descr = make_description()
206     config = Config(descr)
207     setting = config.cfgimpl_get_settings()
208     config.str1
209     config.read_only()
210     prop = []
211     try:
212         config.str1
213     except PropertiesOptionError as err:
214         prop = err.proptype
215     assert prop == ['mandatory']
216     setting[descr.str1].append('disabled')
217     prop = []
218     try:
219         config.str1
220     except PropertiesOptionError as err:
221         prop = err.proptype
222     assert set(prop) == set(['disabled', 'mandatory'])
223
224
225 def test_mandatory_unicode():
226     descr = make_description()
227     config = Config(descr)
228     config.unicode2
229     config.read_only()
230     prop = []
231     try:
232         config.unicode2
233     except PropertiesOptionError as err:
234         prop = err.proptype
235     assert prop == ['mandatory']
236     config.read_write()
237     config.unicode2 = u''
238     config.read_only()
239     prop = []
240     try:
241         config.unicode2
242     except PropertiesOptionError as err:
243         prop = err.proptype
244     assert prop == ['mandatory']
245
246
247 def test_mandatory_warnings_ro():
248     descr = make_description()
249     config = Config(descr)
250     config.str = ''
251     config.read_only()
252     proc = []
253     try:
254         config.str
255     except PropertiesOptionError as err:
256         proc = err.proptype
257     assert proc == ['mandatory']
258     assert config.cfgimpl_get_values().mandatory_warnings() == ['str', 'str1', 'unicode2', 'str3']
259     config.read_write()
260     config.str = 'a'
261     config.read_only()
262     assert config.cfgimpl_get_values().mandatory_warnings() == ['str1', 'unicode2', 'str3']
263     assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3']
264     sleep(.1)
265
266
267 def test_mandatory_warnings_rw():
268     descr = make_description()
269     config = Config(descr)
270     config.str = ''
271     config.read_write()
272     config.str
273     assert config.cfgimpl_get_values().mandatory_warnings() == ['str', 'str1', 'unicode2', 'str3']
274     config.str = 'a'
275     assert config.cfgimpl_get_values().mandatory_warnings() == ['str1', 'unicode2', 'str3']
276     assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3']
277     sleep(.1)
278
279
280 def test_mandatory_warnings_disabled():
281     descr = make_description()
282     config = Config(descr)
283     config.str = ''
284     setting = config.cfgimpl_get_settings()
285     config.read_write()
286     config.str
287     assert config.cfgimpl_get_values().mandatory_warnings() == ['str', 'str1', 'unicode2', 'str3']
288     setting[descr.str].append('disabled')
289     assert config.cfgimpl_get_values().mandatory_warnings() == ['str1', 'unicode2', 'str3']
290     assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3']
291     sleep(.1)
292
293
294 def test_mandatory_warnings_hidden():
295     descr = make_description()
296     config = Config(descr)
297     config.str = ''
298     setting = config.cfgimpl_get_settings()
299     config.read_write()
300     config.cfgimpl_get_settings().setpermissive(('hidden',))
301     config.str
302     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
303     setting[descr.str].append('hidden')
304     assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
305     assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str', 'str1', 'unicode2', 'str3']
306
307
308 def test_mandatory_warnings_frozen():
309     descr = make_description()
310     config = Config(descr)
311     config.str = ''
312     setting = config.cfgimpl_get_settings()
313     config.read_write()
314     config.str
315     assert config.cfgimpl_get_values().mandatory_warnings() == ['str', 'str1', 'unicode2', 'str3']
316     setting[descr.str].append('frozen')
317     config.read_only()
318     assert config.cfgimpl_get_values().mandatory_warnings() == ['str', 'str1', 'unicode2', 'str3']
319     sleep(.1)
320
321
322 def test_mandatory_master():
323     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True,
324                               properties=('mandatory', ))
325     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau",
326                                    multi=True)
327     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
328     interface1.impl_set_group_type(groups.master)
329     o = OptionDescription('o', '', [interface1])
330     config = Config(o)
331     config.read_only()
332     raises(PropertiesOptionError, 'config.ip_admin_eth0.ip_admin_eth0')
333     raises(PropertiesOptionError, 'config.ip_admin_eth0.netmask_admin_eth0')
334
335
336 def test_mandatory_master_empty():
337     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
338     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau",
339                                    multi=True)
340     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
341     interface1.impl_set_group_type(groups.master)
342     o = OptionDescription('o', '', [interface1])
343     config = Config(o)
344     config.read_write()
345     assert config.ip_admin_eth0.ip_admin_eth0 == []
346     assert config.ip_admin_eth0.netmask_admin_eth0 == []
347     #
348     config.ip_admin_eth0.ip_admin_eth0.append()
349     assert config.ip_admin_eth0.ip_admin_eth0 == [None]
350     assert config.ip_admin_eth0.netmask_admin_eth0 == [None]
351     config.read_only()
352     raises(PropertiesOptionError, "config.ip_admin_eth0.ip_admin_eth0")
353     raises(PropertiesOptionError, "config.ip_admin_eth0.netmask_admin_eth0")
354     config.read_write()
355     del(config.ip_admin_eth0.ip_admin_eth0)
356     del(config.ip_admin_eth0.netmask_admin_eth0)
357     assert config.ip_admin_eth0.ip_admin_eth0 == []
358     assert config.ip_admin_eth0.netmask_admin_eth0 == []
359     #
360     config.ip_admin_eth0.ip_admin_eth0.append('')
361     assert config.ip_admin_eth0.ip_admin_eth0 == ['']
362     assert config.ip_admin_eth0.netmask_admin_eth0 == [None]
363     config.read_only()
364     raises(PropertiesOptionError, "config.ip_admin_eth0.ip_admin_eth0")
365     raises(PropertiesOptionError, "config.ip_admin_eth0.netmask_admin_eth0")
366     config.read_write()
367     #
368     config.read_write()
369     config.ip_admin_eth0.ip_admin_eth0 = ['ip']
370     config.read_only()
371     assert config.ip_admin_eth0.ip_admin_eth0 == ['ip']
372     assert config.ip_admin_eth0.netmask_admin_eth0 == [None]
373
374
375 def test_mandatory_slave():
376     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
377     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau",
378                                    multi=True, properties=('mandatory', ))
379     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
380     interface1.impl_set_group_type(groups.master)
381     o = OptionDescription('o', '', [interface1])
382     config = Config(o)
383     config.read_only()
384     assert config.ip_admin_eth0.ip_admin_eth0 == []
385     assert config.ip_admin_eth0.netmask_admin_eth0 == []
386     #
387     config.read_write()
388     config.ip_admin_eth0.ip_admin_eth0.append('ip')
389     config.read_only()
390     assert config.ip_admin_eth0.ip_admin_eth0 == ['ip']
391     raises(PropertiesOptionError, 'config.ip_admin_eth0.netmask_admin_eth0')
392     #
393     config.read_write()
394     config.ip_admin_eth0.netmask_admin_eth0 = ['']
395     config.read_only()
396     assert config.ip_admin_eth0.ip_admin_eth0 == ['ip']
397     raises(PropertiesOptionError, 'config.ip_admin_eth0.netmask_admin_eth0')
398     #
399     config.read_write()
400     config.ip_admin_eth0.netmask_admin_eth0 = ['ip']
401     config.read_only()
402     assert config.ip_admin_eth0.ip_admin_eth0 == ['ip']
403     assert config.ip_admin_eth0.netmask_admin_eth0 == ['ip']