add _second_level_validation (second's one return only warning almost _validator...
[tiramisu.git] / test / test_option_validator.py
1 import autopath
2 from py.test import raises
3
4 from tiramisu.config import Config
5 from tiramisu.option import StrOption, OptionDescription
6 from tiramisu.setting import groups
7
8
9 def return_true(value, param=None):
10     if value == 'val' and param in [None, 'yes']:
11         return True
12
13
14 def return_false(value, param=None):
15     if value == 'val' and param in [None, 'yes']:
16         raise ValueError('error')
17
18
19 def return_val(value, param=None):
20     return 'val'
21
22
23 def return_if_val(value):
24     if value != 'val':
25         raise ValueError('error')
26
27
28 def test_validator():
29     opt1 = StrOption('opt1', '', validator=return_true, default='val')
30     raises(ValueError, "StrOption('opt2', '', validator=return_false, default='val')")
31     opt2 = StrOption('opt2', '', validator=return_false)
32     root = OptionDescription('root', '', [opt1, opt2])
33     cfg = Config(root)
34     assert cfg.opt1 == 'val'
35     raises(ValueError, "cfg.opt2 = 'val'")
36
37
38 def test_validator_params():
39     opt1 = StrOption('opt1', '', validator=return_true, validator_params={'': ('yes',)}, default='val')
40     raises(ValueError, "StrOption('opt2', '', validator=return_false, validator_params={'': ('yes',)}, default='val')")
41     opt2 = StrOption('opt2', '', validator=return_false, validator_params={'': ('yes',)})
42     root = OptionDescription('root', '', [opt1, opt2])
43     cfg = Config(root)
44     assert cfg.opt1 == 'val'
45     raises(ValueError, "cfg.opt2 = 'val'")
46
47
48 def test_validator_params_key():
49     opt1 = StrOption('opt1', '', validator=return_true, validator_params={'param': ('yes',)}, default='val')
50     raises(TypeError, "StrOption('opt2', '', validator=return_true, validator_params={'param_unknown': ('yes',)}, default='val')")
51     root = OptionDescription('root', '', [opt1])
52     cfg = Config(root)
53     assert cfg.opt1 == 'val'
54
55
56 def test_validator_params_option():
57     opt0 = StrOption('opt0', '', default='val')
58     raises(ValueError, "opt1 = StrOption('opt1', '', validator=return_true, validator_params={'': ((opt0, False),)}, default='val')")
59
60
61 def test_validator_multi():
62     opt1 = StrOption('opt1', '', validator=return_if_val, multi=True)
63     root = OptionDescription('root', '', [opt1])
64     cfg = Config(root)
65     assert cfg.opt1 == []
66     cfg.opt1.append('val')
67     assert cfg.opt1 == ['val']
68     raises(ValueError, "cfg.opt1.append('val1')")
69     raises(ValueError, "cfg.opt1 = ['val', 'val1']")
70
71
72 def test_validator_warning():
73     opt1 = StrOption('opt1', '', validator=return_true, default='val', only_warning=True)
74     opt2 = StrOption('opt2', '', validator=return_false, only_warning=True)
75     opt3 = StrOption('opt3', '', validator=return_if_val, multi=True, only_warning=True)
76     root = OptionDescription('root', '', [opt1, opt2, opt3])
77     cfg = Config(root)
78     assert cfg.opt1 == 'val'
79     cfg.opt1 = 'val'
80     assert cfg.cfgimpl_get_values().has_warning() is False
81     cfg.opt2 = 'val'
82     assert cfg.cfgimpl_get_values().has_warning() is True
83     assert cfg.cfgimpl_get_values().get_last_warning() == 'invalid value val for option opt2: error'
84     assert cfg.cfgimpl_get_values().has_warning() is False
85     cfg.opt3.append('val')
86     assert cfg.cfgimpl_get_values().has_warning() is False
87     cfg.opt3.append('val1')
88     assert cfg.cfgimpl_get_values().has_warning() is True
89     assert cfg.cfgimpl_get_values().get_last_warning() == 'invalid value val1 for option opt3: error'
90     assert cfg.cfgimpl_get_values().has_warning() is False
91     raises(ValueError, "cfg.opt2 = 1")
92
93
94 def test_validator_warning_master_slave():
95     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip reseau autorise", multi=True, validator=return_false, only_warning=True)
96     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-reseau", multi=True, validator=return_if_val, only_warning=True)
97     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
98     interface1.impl_set_group_type(groups.master)
99     assert interface1.impl_get_group_type() == groups.master
100     root = OptionDescription('root', '', [interface1])
101     cfg = Config(root)
102     cfg.ip_admin_eth0.ip_admin_eth0.append(None)
103     assert cfg.cfgimpl_get_values().has_warning() is False
104     cfg.ip_admin_eth0.netmask_admin_eth0 = ['val1']
105     assert cfg.ip_admin_eth0.netmask_admin_eth0 == ['val1']
106     assert cfg.cfgimpl_get_values().has_warning() is True
107     assert cfg.cfgimpl_get_values().get_last_warning() == 'invalid value val1 for option netmask_admin_eth0: error'
108     cfg.ip_admin_eth0.ip_admin_eth0 = ['val']
109     assert cfg.ip_admin_eth0.ip_admin_eth0 == ['val']
110     assert cfg.cfgimpl_get_values().get_last_warning() == 'invalid value val for option ip_admin_eth0: error'