python 3.5 support
[tiramisu.git] / test / test_option_validator.py
1 from .autopath import do_autopath
2 do_autopath()
3
4 import warnings
5 from py.test import raises
6
7 from tiramisu.config import Config
8 from tiramisu.option import BoolOption, StrOption, OptionDescription
9 from tiramisu.setting import groups
10 from tiramisu.error import ValueWarning, ConfigError
11 from tiramisu.i18n import _
12
13
14 msg_err = _('attention, "{0}" could be an invalid {1} for "{2}", {3}')
15
16
17 def return_true(value, param=None):
18     if value == 'val' and param in [None, 'yes']:
19         return True
20     raise ValueError('test error')
21
22
23 def return_false(value, param=None):
24     if value == 'val' and param in [None, 'yes']:
25         raise ValueError('test error')
26
27
28 def return_val(value, param=None):
29     return 'val'
30
31
32 def return_if_val(value):
33     if value != 'val':
34         raise ValueError('test error')
35
36
37 def is_context(value, context):
38     context.cfgimpl_get_settings().remove('validator')
39     if not isinstance(context, Config):
40         raise ValueError('not context')
41
42
43 def value_values(value, values):
44     if not (value == 'val' and values == ['val'] or
45             value == 'val1' and values == ['val1'] or
46             value == 'val2' and values == ['val1', 'val2'] or
47             value == 'val1' and values == ['val1', None]):
48         raise ValueError('error')
49
50
51 def value_values_index(value, values, index):
52     value_values(value, values)
53     if not (index == 0 or (value == 'val2' and index == 1)):
54         raise ValueError('error 2')
55
56
57 def value_values_auto(value, values, auto=False):
58     if auto != False:
59         raise ValueError('auto should be False')
60     if not (value == 'val' and values == ['val'] or
61             value == 'val1' and values == ['val1'] or
62             value == 'val2' and values == ['val1', 'val2'] or
63             value == 'val1' and values == ['val1', None]):
64         raise ValueError('error')
65
66
67 def value_values_auto2(value, values, auto=False):
68     if auto != False:
69         raise ValueError('auto should be False')
70     if not (value == 'val1' and values == 'val' or
71             value == 'val2' and values == 'val'):
72         raise ValueError('error')
73
74
75
76 def value_values_index2(value, values, index, auto=False):
77     if auto != False:
78         raise ValueError('auto should be False')
79     if not (value == 'val1' and values == ['val1'] and index == 'val' or
80             value == 'val1' and values == ['val1', None] and index == 'val' or
81             value == 'val2' and values == ['val1', 'val2'] and index == 'val'):
82         raise ValueError('error')
83
84
85 def value_empty(value, empty, values):
86     if not value == 'val' or empty is not False and not values == ['val']:
87         raise ValueError('error')
88
89
90 def test_validator():
91     opt1 = StrOption('opt1', '', validator=return_true, default='val')
92     raises(ValueError, "StrOption('opt2', '', validator=return_false, default='val')")
93     opt2 = StrOption('opt2', '', validator=return_false)
94     root = OptionDescription('root', '', [opt1, opt2])
95     cfg = Config(root)
96     assert cfg.opt1 == 'val'
97     raises(ValueError, "cfg.opt2 = 'val'")
98     try:
99         cfg.opt2 = 'val'
100     except ValueError as err:
101         msg = _('"{0}" is an invalid {1} for "{2}", {3}').format('val', _('string'), 'opt2', 'test error')
102         assert str(err) == msg
103
104
105 def test_validator_params():
106     opt1 = StrOption('opt1', '', validator=return_true, validator_params={'': ('yes',)}, default='val')
107     raises(ValueError, "StrOption('opt2', '', validator=return_false, validator_params={'': ('yes',)}, default='val')")
108     opt2 = StrOption('opt2', '', validator=return_false, validator_params={'': ('yes',)})
109     root = OptionDescription('root', '', [opt1, opt2])
110     cfg = Config(root)
111     assert cfg.opt1 == 'val'
112     raises(ValueError, "cfg.opt2 = 'val'")
113
114
115 def test_validator_params_value_values():
116     opt1 = StrOption('opt1', '', validator=value_values, default=['val'], multi=True)
117     root = OptionDescription('root', '', [opt1])
118     cfg = Config(root)
119     assert cfg.opt1 == ['val']
120     cfg.opt1[0] = 'val1'
121     cfg.opt1.append('val2')
122
123
124 def test_validator_params_value_values_index():
125     opt1 = StrOption('opt1', '', validator=value_values_index, default=['val'], multi=True)
126     root = OptionDescription('root', '', [opt1])
127     cfg = Config(root)
128     assert cfg.opt1 == ['val']
129     cfg.opt1[0] = 'val1'
130     cfg.opt1.append('val2')
131
132
133 def test_validator_params_value_values_master():
134     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip reseau autorise", multi=True, validator=value_values)
135     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-reseau", multi=True)
136     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
137     interface1.impl_set_group_type(groups.master)
138     root = OptionDescription('root', '', [interface1])
139     cfg = Config(root)
140     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
141     cfg.ip_admin_eth0.ip_admin_eth0.append('val1')
142     cfg.ip_admin_eth0.ip_admin_eth0.append('val2')
143
144
145 def test_validator_params_value_values_index_master():
146     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip reseau autorise", multi=True, validator=value_values_index)
147     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-reseau", multi=True)
148     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
149     interface1.impl_set_group_type(groups.master)
150     root = OptionDescription('root', '', [interface1])
151     cfg = Config(root)
152     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
153     cfg.ip_admin_eth0.ip_admin_eth0.append('val1')
154     cfg.ip_admin_eth0.ip_admin_eth0.append('val2')
155
156
157 def test_validator_params_value_values_slave():
158     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip reseau autorise", multi=True)
159     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-reseau", multi=True, validator=value_values)
160     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
161     interface1.impl_set_group_type(groups.master)
162     root = OptionDescription('root', '', [interface1])
163     cfg = Config(root)
164     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
165     cfg.ip_admin_eth0.ip_admin_eth0.append('val')
166     cfg.ip_admin_eth0.netmask_admin_eth0[0] = 'val1'
167     cfg.ip_admin_eth0.ip_admin_eth0.append('val')
168     cfg.ip_admin_eth0.netmask_admin_eth0[1] = 'val2'
169
170
171 def test_validator_params_value_values_index_slave():
172     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip reseau autorise", multi=True)
173     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-reseau", multi=True, validator=value_values_index)
174     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
175     interface1.impl_set_group_type(groups.master)
176     root = OptionDescription('root', '', [interface1])
177     cfg = Config(root)
178     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
179     cfg.ip_admin_eth0.ip_admin_eth0.append('val')
180     cfg.ip_admin_eth0.netmask_admin_eth0[0] = 'val1'
181     cfg.ip_admin_eth0.ip_admin_eth0.append('val')
182     cfg.ip_admin_eth0.netmask_admin_eth0[1] = 'val2'
183
184
185 def test_validator_params_value_values_notmulti():
186     raises(ConfigError, "opt1 = StrOption('opt1', '', validator=value_values, default='val')")
187
188
189 def test_validator_params_value_values_kwargs_empty():
190     v = BoolOption('v', '', default=False)
191     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip reseau autorise", multi=True, default=["ip"])
192     netmask_admin_eth0 = StrOption('netmask_admin_eth0',
193                                    "masque du sous-reseau",
194                                    multi=True,
195                                    validator=value_empty,
196                                    validator_params={'': ((v, False),)})
197     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
198     interface1.impl_set_group_type(groups.master)
199     root = OptionDescription('root', '', [v, interface1])
200     cfg = Config(root)
201     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['ip']
202     cfg.ip_admin_eth0.netmask_admin_eth0[0] = 'val'
203     #cfg.ip_admin_eth0.ip_admin_eth0.append('val')
204     #cfg.ip_admin_eth0.netmask_admin_eth0[1] = 'val2'
205
206
207 def test_validator_params_value_values_kwargs():
208     v = BoolOption('v', '', default=False)
209     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip reseau autorise", multi=True, default=["ip"])
210     netmask_admin_eth0 = StrOption('netmask_admin_eth0',
211                                    "masque du sous-reseau",
212                                    multi=True,
213                                    validator=value_values_auto,
214                                    validator_params={'auto': ((v, False),)})
215     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
216     interface1.impl_set_group_type(groups.master)
217     root = OptionDescription('root', '', [v, interface1])
218     cfg = Config(root)
219     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['ip']
220     cfg.ip_admin_eth0.netmask_admin_eth0[0] = 'val1'
221     cfg.ip_admin_eth0.ip_admin_eth0.append('val')
222     cfg.ip_admin_eth0.netmask_admin_eth0[1] = 'val2'
223
224
225 def test_validator_params_value_values_kwargs_values():
226     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip reseau autorise", multi=True)
227     netmask_admin_eth0 = StrOption('netmask_admin_eth0',
228                                    "masque du sous-reseau",
229                                    multi=True,
230                                    validator=value_values_auto2,
231                                    validator_params={'values': ((ip_admin_eth0, False),)})
232     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
233     interface1.impl_set_group_type(groups.master)
234     root = OptionDescription('root', '', [interface1])
235     cfg = Config(root)
236     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
237     cfg.ip_admin_eth0.ip_admin_eth0.append('val')
238     cfg.ip_admin_eth0.netmask_admin_eth0[0] = 'val1'
239     cfg.ip_admin_eth0.ip_admin_eth0.append('val')
240     cfg.ip_admin_eth0.netmask_admin_eth0[1] = 'val2'
241
242
243 def test_validator_params_value_values_kwargs2():
244     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip reseau autorise", multi=True)
245     netmask_admin_eth0 = StrOption('netmask_admin_eth0',
246                                    "masque du sous-reseau",
247                                    multi=True,
248                                    validator=value_values_index2,
249                                    validator_params={'': (['val1'],), 'index': ((ip_admin_eth0, False),)})
250     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
251     interface1.impl_set_group_type(groups.master)
252     root = OptionDescription('root', '', [interface1])
253     cfg = Config(root)
254     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
255     cfg.ip_admin_eth0.ip_admin_eth0.append('val')
256     cfg.ip_admin_eth0.netmask_admin_eth0[0] = 'val1'
257     cfg.ip_admin_eth0.ip_admin_eth0.append('val')
258
259
260 def test_validator_params_value_values_kwargs_index():
261     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip reseau autorise", multi=True)
262     netmask_admin_eth0 = StrOption('netmask_admin_eth0',
263                                    "masque du sous-reseau",
264                                    multi=True,
265                                    validator=value_values_index2,
266                                    validator_params={'index': ((ip_admin_eth0, False),)})
267     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
268     interface1.impl_set_group_type(groups.master)
269     root = OptionDescription('root', '', [interface1])
270     cfg = Config(root)
271     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
272     cfg.ip_admin_eth0.ip_admin_eth0.append('val')
273     cfg.ip_admin_eth0.netmask_admin_eth0[0] = 'val1'
274     cfg.ip_admin_eth0.ip_admin_eth0.append('val')
275     cfg.ip_admin_eth0.netmask_admin_eth0[1] = 'val2'
276
277
278 def test_validator_params_context():
279     opt1 = StrOption('opt1', '', validator=is_context, validator_params={'': ((None,),)}, default='val')
280     root = OptionDescription('root', '', [opt1])
281     cfg = Config(root)
282     assert 'validator' in cfg.cfgimpl_get_settings()
283     assert cfg.opt1 == 'val'
284     assert 'validator' in cfg.cfgimpl_get_settings()
285
286
287 def test_validator_params_key():
288     opt1 = StrOption('opt1', '', validator=return_true, validator_params={'param': ('yes',)}, default='val')
289     raises(ConfigError, "StrOption('opt2', '', validator=return_true, validator_params={'param_unknown': ('yes',)}, default='val')")
290     root = OptionDescription('root', '', [opt1])
291     cfg = Config(root)
292     assert cfg.opt1 == 'val'
293
294
295 def test_validator_params_option():
296     opt0 = StrOption('opt0', '', default='yes')
297     opt1 = StrOption('opt1', '', validator=return_true, validator_params={'': ((opt0, False),)}, default='val')
298     r = OptionDescription('root', '', [opt0, opt1])
299     cfg = Config(r)
300     cfg.opt1
301     cfg.opt0 = 'val'
302     raises(ValueError, "cfg.opt1")
303
304
305 def test_validator_multi():
306     opt1 = StrOption('opt1', '', validator=return_if_val, multi=True)
307     root = OptionDescription('root', '', [opt1])
308     cfg = Config(root)
309     assert cfg.opt1 == []
310     cfg.opt1.append('val')
311     assert cfg.opt1 == ['val']
312     raises(ValueError, "cfg.opt1.append('val1')")
313     raises(ValueError, "cfg.opt1 = ['val', 'val1']")
314
315
316 def test_validator_warning():
317     opt1 = StrOption('opt1', '', validator=return_true, default='val', warnings_only=True)
318     opt2 = StrOption('opt2', '', validator=return_false, warnings_only=True)
319     opt3 = StrOption('opt3', '', validator=return_if_val, multi=True, warnings_only=True)
320     root = OptionDescription('root', '', [opt1, opt2, opt3])
321     cfg = Config(root)
322     assert cfg.opt1 == 'val'
323     warnings.simplefilter("always", ValueWarning)
324     with warnings.catch_warnings(record=True) as w:
325         cfg.opt1 = 'val'
326     assert w == []
327     #
328     with warnings.catch_warnings(record=True) as w:
329         cfg.opt2 = 'val'
330     assert len(w) == 1
331     assert w[0].message.opt == opt2
332     assert str(w[0].message) == msg_err.format('val', opt2._display_name, 'opt2', 'test error')
333     #
334     with warnings.catch_warnings(record=True) as w:
335         cfg.opt3.append('val')
336     assert w == []
337     #
338     with warnings.catch_warnings(record=True) as w:
339         cfg.opt3.append('val1')
340     assert len(w) == 1
341     assert w[0].message.opt == opt3
342     assert str(w[0].message) == msg_err.format('val1', opt3._display_name, 'opt3', 'test error')
343     raises(ValueError, "cfg.opt2 = 1")
344     #
345     with warnings.catch_warnings(record=True) as w:
346         cfg.opt2 = 'val'
347         cfg.opt3.append('val')
348     assert len(w) == 2
349     assert w[0].message.opt == opt2
350     assert str(w[0].message) == msg_err.format('val', opt2._display_name, 'opt2', 'test error')
351     assert w[1].message.opt == opt3
352     assert str(w[0].message) == msg_err.format('val', opt2._display_name, 'opt2', 'test error')
353
354
355 def test_validator_warning_disabled():
356     opt1 = StrOption('opt1', '', validator=return_true, default='val', warnings_only=True)
357     opt2 = StrOption('opt2', '', validator=return_false, warnings_only=True)
358     opt3 = StrOption('opt3', '', validator=return_if_val, multi=True, warnings_only=True)
359     root = OptionDescription('root', '', [opt1, opt2, opt3])
360     cfg = Config(root)
361     cfg.cfgimpl_get_settings().remove('warnings')
362     assert cfg.opt1 == 'val'
363     warnings.simplefilter("always", ValueWarning)
364     with warnings.catch_warnings(record=True) as w:
365         cfg.opt1 = 'val'
366     assert w == []
367     #
368     with warnings.catch_warnings(record=True) as w:
369         cfg.opt2 = 'val'
370     assert w == []
371     #
372     with warnings.catch_warnings(record=True) as w:
373         cfg.opt3.append('val')
374     assert w == []
375     #
376     with warnings.catch_warnings(record=True) as w:
377         cfg.opt3.append('val1')
378     assert w == []
379     raises(ValueError, "cfg.opt2 = 1")
380     #
381     with warnings.catch_warnings(record=True) as w:
382         cfg.opt2 = 'val'
383         cfg.opt3.append('val')
384     assert w == []
385
386
387 def test_validator_warning_master_slave():
388     display_name_ip = "ip reseau autorise"
389     display_name_netmask = "masque du sous-reseau"
390     ip_admin_eth0 = StrOption('ip_admin_eth0', display_name_ip, multi=True, validator=return_false, warnings_only=True)
391     netmask_admin_eth0 = StrOption('netmask_admin_eth0', display_name_netmask, multi=True, validator=return_if_val, warnings_only=True)
392     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
393     interface1.impl_set_group_type(groups.master)
394     assert interface1.impl_get_group_type() == groups.master
395     root = OptionDescription('root', '', [interface1])
396     cfg = Config(root)
397     warnings.simplefilter("always", ValueWarning)
398     with warnings.catch_warnings(record=True) as w:
399         cfg.ip_admin_eth0.ip_admin_eth0.append(None)
400     assert w == []
401     #
402     with warnings.catch_warnings(record=True) as w:
403         cfg.ip_admin_eth0.netmask_admin_eth0 = ['val1']
404     assert len(w) == 1
405     assert w[0].message.opt == netmask_admin_eth0
406     assert str(w[0].message) == msg_err.format('val1', netmask_admin_eth0._display_name, display_name_netmask, 'test error')
407     #
408     with warnings.catch_warnings(record=True) as w:
409         cfg.ip_admin_eth0.ip_admin_eth0 = ['val']
410     assert len(w) == 1
411     assert w[0].message.opt == ip_admin_eth0
412     assert str(w[0].message) == msg_err.format('val', ip_admin_eth0._display_name, display_name_ip, 'test error')
413     #
414     with warnings.catch_warnings(record=True) as w:
415         cfg.ip_admin_eth0.ip_admin_eth0 = ['val', 'val1', 'val1']
416     assert len(w) == 1
417     assert w[0].message.opt == ip_admin_eth0
418     assert str(w[0].message) == msg_err.format('val', ip_admin_eth0._display_name, display_name_ip, 'test error')
419     #
420     with warnings.catch_warnings(record=True) as w:
421         cfg.ip_admin_eth0.ip_admin_eth0 = ['val1', 'val', 'val1']
422     assert len(w) == 1
423     assert w[0].message.opt == ip_admin_eth0
424     assert str(w[0].message) == msg_err.format('val', ip_admin_eth0._display_name, display_name_ip, 'test error')
425     #
426     warnings.resetwarnings()
427     with warnings.catch_warnings(record=True) as w:
428         cfg.ip_admin_eth0.ip_admin_eth0 = ['val1', 'val1', 'val']
429     assert len(w) == 1
430     assert w[0].message.opt == ip_admin_eth0
431     assert str(w[0].message) == msg_err.format('val', ip_admin_eth0._display_name, display_name_ip, 'test error')
432
433
434 def test_validator_slave_param():
435     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip reseau autorise", multi=True)
436     netmask_admin_eth0 = StrOption('netmask_admin_eth0',
437                                    "masque du sous-reseau",
438                                    multi=True,
439                                    validator=return_true,
440                                    validator_params={'param': ((ip_admin_eth0, False),)})
441     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
442     interface1.impl_set_group_type(groups.master)
443     root = OptionDescription('root', '', [interface1])
444     cfg = Config(root)
445     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
446     cfg.ip_admin_eth0.ip_admin_eth0.append('yes')
447     cfg.ip_admin_eth0.netmask_admin_eth0 = ['val']
448     cfg.ip_admin_eth0.ip_admin_eth0 = ['yes', 'yes']
449     cfg.ip_admin_eth0.netmask_admin_eth0[1] = 'val'