eedffb6a763a72f6360fe078bbdd338318503a29
[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 StrOption, OptionDescription
9 from tiramisu.setting import groups
10 from tiramisu.error import ValueWarning
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     return ValueError('test error')
21
22
23 def return_false(value, param=None):
24     if value == 'val' and param in [None, 'yes']:
25         return 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         return ValueError('test error')
35
36
37 def test_validator():
38     opt1 = StrOption('opt1', '', validator=return_true, default='val')
39     raises(ValueError, "StrOption('opt2', '', validator=return_false, default='val')")
40     opt2 = StrOption('opt2', '', validator=return_false)
41     root = OptionDescription('root', '', [opt1, opt2])
42     cfg = Config(root)
43     assert cfg.opt1 == 'val'
44     raises(ValueError, "cfg.opt2 = 'val'")
45
46
47 def test_validator_params():
48     opt1 = StrOption('opt1', '', validator=return_true, validator_params={'': ('yes',)}, default='val')
49     raises(ValueError, "StrOption('opt2', '', validator=return_false, validator_params={'': ('yes',)}, default='val')")
50     opt2 = StrOption('opt2', '', validator=return_false, validator_params={'': ('yes',)})
51     root = OptionDescription('root', '', [opt1, opt2])
52     cfg = Config(root)
53     assert cfg.opt1 == 'val'
54     raises(ValueError, "cfg.opt2 = 'val'")
55
56
57 def test_validator_params_key():
58     opt1 = StrOption('opt1', '', validator=return_true, validator_params={'param': ('yes',)}, default='val')
59     raises(TypeError, "StrOption('opt2', '', validator=return_true, validator_params={'param_unknown': ('yes',)}, default='val')")
60     root = OptionDescription('root', '', [opt1])
61     cfg = Config(root)
62     assert cfg.opt1 == 'val'
63
64
65 def test_validator_params_option():
66     opt0 = StrOption('opt0', '', default='yes')
67     opt1 = StrOption('opt1', '', validator=return_true, validator_params={'': ((opt0, False),)}, default='val')
68     r = OptionDescription('root', '', [opt0, opt1])
69     cfg = Config(r)
70     cfg.opt1
71     cfg.opt0 = 'val'
72     raises(ValueError, "cfg.opt1")
73
74
75 def test_validator_multi():
76     opt1 = StrOption('opt1', '', validator=return_if_val, multi=True)
77     root = OptionDescription('root', '', [opt1])
78     cfg = Config(root)
79     assert cfg.opt1 == []
80     cfg.opt1.append('val')
81     assert cfg.opt1 == ['val']
82     raises(ValueError, "cfg.opt1.append('val1')")
83     raises(ValueError, "cfg.opt1 = ['val', 'val1']")
84
85
86 def test_validator_warning():
87     opt1 = StrOption('opt1', '', validator=return_true, default='val', warnings_only=True)
88     opt2 = StrOption('opt2', '', validator=return_false, warnings_only=True)
89     opt3 = StrOption('opt3', '', validator=return_if_val, multi=True, warnings_only=True)
90     root = OptionDescription('root', '', [opt1, opt2, opt3])
91     cfg = Config(root)
92     assert cfg.opt1 == 'val'
93     warnings.simplefilter("always", ValueWarning)
94     with warnings.catch_warnings(record=True) as w:
95         cfg.opt1 = 'val'
96     assert w == []
97     #
98     with warnings.catch_warnings(record=True) as w:
99         cfg.opt2 = 'val'
100     assert len(w) == 1
101     assert w[0].message.opt == opt2
102     assert str(w[0].message) == msg_err.format('val', opt2._display_name, 'opt2', 'test error')
103     #
104     with warnings.catch_warnings(record=True) as w:
105         cfg.opt3.append('val')
106     assert w == []
107     #
108     with warnings.catch_warnings(record=True) as w:
109         cfg.opt3.append('val1')
110     assert len(w) == 1
111     assert w[0].message.opt == opt3
112     assert str(w[0].message) == msg_err.format('val1', opt3._display_name, 'opt3', 'test error')
113     raises(ValueError, "cfg.opt2 = 1")
114     #
115     with warnings.catch_warnings(record=True) as w:
116         cfg.opt2 = 'val'
117         cfg.opt3.append('val')
118     assert len(w) == 2
119     assert w[0].message.opt == opt2
120     assert str(w[0].message) == msg_err.format('val', opt2._display_name, 'opt2', 'test error')
121     assert w[1].message.opt == opt3
122     assert str(w[0].message) == msg_err.format('val', opt2._display_name, 'opt2', 'test error')
123
124
125 def test_validator_warning_disabled():
126     opt1 = StrOption('opt1', '', validator=return_true, default='val', warnings_only=True)
127     opt2 = StrOption('opt2', '', validator=return_false, warnings_only=True)
128     opt3 = StrOption('opt3', '', validator=return_if_val, multi=True, warnings_only=True)
129     root = OptionDescription('root', '', [opt1, opt2, opt3])
130     cfg = Config(root)
131     cfg.cfgimpl_get_settings().remove('warnings')
132     assert cfg.opt1 == 'val'
133     warnings.simplefilter("always", ValueWarning)
134     with warnings.catch_warnings(record=True) as w:
135         cfg.opt1 = 'val'
136     assert w == []
137     #
138     with warnings.catch_warnings(record=True) as w:
139         cfg.opt2 = 'val'
140     assert w == []
141     #
142     with warnings.catch_warnings(record=True) as w:
143         cfg.opt3.append('val')
144     assert w == []
145     #
146     with warnings.catch_warnings(record=True) as w:
147         cfg.opt3.append('val1')
148     assert w == []
149     raises(ValueError, "cfg.opt2 = 1")
150     #
151     with warnings.catch_warnings(record=True) as w:
152         cfg.opt2 = 'val'
153         cfg.opt3.append('val')
154     assert w == []
155
156
157 def test_validator_warning_master_slave():
158     display_name_ip = "ip reseau autorise"
159     display_name_netmask = "masque du sous-reseau"
160     ip_admin_eth0 = StrOption('ip_admin_eth0', display_name_ip, multi=True, validator=return_false, warnings_only=True)
161     netmask_admin_eth0 = StrOption('netmask_admin_eth0', display_name_netmask, multi=True, validator=return_if_val, warnings_only=True)
162     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
163     interface1.impl_set_group_type(groups.master)
164     assert interface1.impl_get_group_type() == groups.master
165     root = OptionDescription('root', '', [interface1])
166     cfg = Config(root)
167     warnings.simplefilter("always", ValueWarning)
168     with warnings.catch_warnings(record=True) as w:
169         cfg.ip_admin_eth0.ip_admin_eth0.append(None)
170     assert w == []
171     #
172     with warnings.catch_warnings(record=True) as w:
173         cfg.ip_admin_eth0.netmask_admin_eth0 = ['val1']
174     assert len(w) == 1
175     assert w[0].message.opt == netmask_admin_eth0
176     assert str(w[0].message) == msg_err.format('val1', netmask_admin_eth0._display_name, display_name_netmask, 'test error')
177     #
178     with warnings.catch_warnings(record=True) as w:
179         cfg.ip_admin_eth0.ip_admin_eth0 = ['val']
180     assert len(w) == 1
181     assert w[0].message.opt == ip_admin_eth0
182     assert str(w[0].message) == msg_err.format('val', ip_admin_eth0._display_name, display_name_ip, 'test error')
183     #
184     with warnings.catch_warnings(record=True) as w:
185         cfg.ip_admin_eth0.ip_admin_eth0 = ['val', 'val1', 'val1']
186     assert len(w) == 1
187     assert w[0].message.opt == ip_admin_eth0
188     assert str(w[0].message) == msg_err.format('val', ip_admin_eth0._display_name, display_name_ip, 'test error')
189     #
190     with warnings.catch_warnings(record=True) as w:
191         cfg.ip_admin_eth0.ip_admin_eth0 = ['val1', 'val', 'val1']
192     assert len(w) == 1
193     assert w[0].message.opt == ip_admin_eth0
194     assert str(w[0].message) == msg_err.format('val', ip_admin_eth0._display_name, display_name_ip, 'test error')
195     #
196     warnings.resetwarnings()
197     with warnings.catch_warnings(record=True) as w:
198         cfg.ip_admin_eth0.ip_admin_eth0 = ['val1', 'val1', 'val']
199     assert len(w) == 1
200     assert w[0].message.opt == ip_admin_eth0
201     assert str(w[0].message) == msg_err.format('val', ip_admin_eth0._display_name, display_name_ip, 'test error')