dc08c828f5650e27ae781ce3f2f47626cd5c3421
[tiramisu.git] / test / test_option_validator.py
1 import autopath
2 import warnings
3 from py.test import raises
4
5 from tiramisu.config import Config
6 from tiramisu.option import StrOption, OptionDescription
7 from tiramisu.setting import groups
8 from tiramisu.error import ValueWarning
9 from tiramisu.i18n import _
10
11
12 def return_true(value, param=None):
13     if value == 'val' and param in [None, 'yes']:
14         return True
15
16
17 def return_false(value, param=None):
18     if value == 'val' and param in [None, 'yes']:
19         raise ValueError('error')
20
21
22 def return_val(value, param=None):
23     return 'val'
24
25
26 def return_if_val(value):
27     if value != 'val':
28         raise ValueError('error')
29
30
31 def test_validator():
32     opt1 = StrOption('opt1', '', validator=return_true, default='val')
33     raises(ValueError, "StrOption('opt2', '', validator=return_false, default='val')")
34     opt2 = StrOption('opt2', '', validator=return_false)
35     root = OptionDescription('root', '', [opt1, opt2])
36     cfg = Config(root)
37     assert cfg.opt1 == 'val'
38     raises(ValueError, "cfg.opt2 = 'val'")
39
40
41 def test_validator_params():
42     opt1 = StrOption('opt1', '', validator=return_true, validator_params={'': ('yes',)}, default='val')
43     raises(ValueError, "StrOption('opt2', '', validator=return_false, validator_params={'': ('yes',)}, default='val')")
44     opt2 = StrOption('opt2', '', validator=return_false, validator_params={'': ('yes',)})
45     root = OptionDescription('root', '', [opt1, opt2])
46     cfg = Config(root)
47     assert cfg.opt1 == 'val'
48     raises(ValueError, "cfg.opt2 = 'val'")
49
50
51 def test_validator_params_key():
52     opt1 = StrOption('opt1', '', validator=return_true, validator_params={'param': ('yes',)}, default='val')
53     raises(TypeError, "StrOption('opt2', '', validator=return_true, validator_params={'param_unknown': ('yes',)}, default='val')")
54     root = OptionDescription('root', '', [opt1])
55     cfg = Config(root)
56     assert cfg.opt1 == 'val'
57
58
59 def test_validator_params_option():
60     opt0 = StrOption('opt0', '', default='val')
61     raises(ValueError, "opt1 = StrOption('opt1', '', validator=return_true, validator_params={'': ((opt0, False),)}, default='val')")
62
63
64 def test_validator_multi():
65     opt1 = StrOption('opt1', '', validator=return_if_val, multi=True)
66     root = OptionDescription('root', '', [opt1])
67     cfg = Config(root)
68     assert cfg.opt1 == []
69     cfg.opt1.append('val')
70     assert cfg.opt1 == ['val']
71     raises(ValueError, "cfg.opt1.append('val1')")
72     raises(ValueError, "cfg.opt1 = ['val', 'val1']")
73
74
75 def test_validator_warning():
76     opt1 = StrOption('opt1', '', validator=return_true, default='val', warnings_only=True)
77     opt2 = StrOption('opt2', '', validator=return_false, warnings_only=True)
78     opt3 = StrOption('opt3', '', validator=return_if_val, multi=True, warnings_only=True)
79     root = OptionDescription('root', '', [opt1, opt2, opt3])
80     cfg = Config(root)
81     assert cfg.opt1 == 'val'
82     warnings.simplefilter("always", ValueWarning)
83     with warnings.catch_warnings(record=True) as w:
84         cfg.opt1 = 'val'
85     assert w == []
86     #
87     with warnings.catch_warnings(record=True) as w:
88         cfg.opt2 = 'val'
89     assert len(w) == 1
90     assert w[0].message.opt == opt2
91     assert str(w[0].message) == _('invalid value for option {0}: {1}').format('opt2', 'error')
92     #
93     with warnings.catch_warnings(record=True) as w:
94         cfg.opt3.append('val')
95     assert w == []
96     #
97     with warnings.catch_warnings(record=True) as w:
98         cfg.opt3.append('val1')
99     assert len(w) == 1
100     assert w[0].message.opt == opt3
101     assert str(w[0].message) == _('invalid value for option {0}: {1}').format('opt3', 'error')
102     raises(ValueError, "cfg.opt2 = 1")
103     #
104     with warnings.catch_warnings(record=True) as w:
105         cfg.opt2 = 'val'
106         cfg.opt3.append('val')
107     assert len(w) == 2
108     assert w[0].message.opt == opt2
109     assert str(w[0].message) == _('invalid value for option {0}: {1}').format('opt2', 'error')
110     assert w[1].message.opt == opt3
111     assert str(w[1].message) == _('invalid value for option {0}: {1}').format('opt3', 'error')
112
113
114 def test_validator_warning_master_slave():
115     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip reseau autorise", multi=True, validator=return_false, warnings_only=True)
116     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-reseau", multi=True, validator=return_if_val, warnings_only=True)
117     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
118     interface1.impl_set_group_type(groups.master)
119     assert interface1.impl_get_group_type() == groups.master
120     root = OptionDescription('root', '', [interface1])
121     cfg = Config(root)
122     warnings.simplefilter("always", ValueWarning)
123     with warnings.catch_warnings(record=True) as w:
124         cfg.ip_admin_eth0.ip_admin_eth0.append(None)
125     assert w == []
126     #
127     with warnings.catch_warnings(record=True) as w:
128         cfg.ip_admin_eth0.netmask_admin_eth0 = ['val1']
129     assert len(w) == 1
130     assert w[0].message.opt == netmask_admin_eth0
131     assert str(w[0].message) == _('invalid value for option {0}: {1}').format('netmask_admin_eth0', 'error')
132     #
133     with warnings.catch_warnings(record=True) as w:
134         cfg.ip_admin_eth0.ip_admin_eth0 = ['val']
135     assert len(w) == 1
136     assert w[0].message.opt == ip_admin_eth0
137     assert str(w[0].message) == _('invalid value for option {0}: {1}').format('ip_admin_eth0', 'error')
138     #
139     with warnings.catch_warnings(record=True) as w:
140         cfg.ip_admin_eth0.ip_admin_eth0 = ['val', 'val1', 'val1']
141     assert len(w) == 1
142     assert w[0].message.opt == ip_admin_eth0
143     assert str(w[0].message) == _('invalid value for option {0}: {1}').format('ip_admin_eth0', 'error')
144     #
145     with warnings.catch_warnings(record=True) as w:
146         cfg.ip_admin_eth0.ip_admin_eth0 = ['val1', 'val', 'val1']
147     assert len(w) == 1
148     assert w[0].message.opt == ip_admin_eth0
149     assert str(w[0].message) == _('invalid value for option {0}: {1}').format('ip_admin_eth0', 'error')
150     #
151     warnings.resetwarnings()
152     with warnings.catch_warnings(record=True) as w:
153         cfg.ip_admin_eth0.ip_admin_eth0 = ['val1', 'val1', 'val']
154     assert len(w) == 1
155     assert w[0].message.opt == ip_admin_eth0
156     assert str(w[0].message) == _('invalid value for option {0}: {1}').format('ip_admin_eth0', 'error')