Merge branch 'orm' of ssh://git.labs.libre-entreprise.org/gitroot/tiramisu into orm
[tiramisu.git] / test / test_option_consistency.py
1 import autopath
2 from py.test import raises
3
4 from tiramisu.setting import owners, groups
5 from tiramisu.config import Config
6 from tiramisu.option import IPOption, NetworkOption, NetmaskOption, IntOption,\
7     BroadcastOption, SymLinkOption, OptionDescription
8 from tiramisu.error import ConfigError, ValueWarning
9 import warnings
10
11
12 def test_consistency():
13     a = IntOption('a', '')
14     b = IntOption('b', '')
15     od = OptionDescription('od', '', [a, b])
16     a.impl_add_consistency('not_equal', b)
17     #consistency to itself
18     raises(ConfigError, "a.impl_add_consistency('not_equal', a)")
19     #consistency with string
20     raises(ConfigError, "a.impl_add_consistency('not_equal', 'a')")
21
22
23 def test_consistency_warnings_only():
24     a = IntOption('a', '')
25     b = IntOption('b', '')
26     od = OptionDescription('od', '', [a, b])
27     a.impl_add_consistency('not_equal', b, warnings_only=True)
28     c = Config(od)
29     c.a = 1
30     warnings.simplefilter("always", ValueWarning)
31     with warnings.catch_warnings(record=True) as w:
32         c.b = 1
33     assert w != []
34
35
36 def test_consistency_not_equal():
37     a = IntOption('a', '')
38     b = IntOption('b', '')
39     od = OptionDescription('od', '', [a, b])
40     a.impl_add_consistency('not_equal', b)
41     c = Config(od)
42     assert c.a is None
43     assert c.b is None
44     c.a = 1
45     del(c.a)
46     c.a = 1
47     raises(ValueError, "c.b = 1")
48     c.b = 2
49
50
51 def test_consistency_not_equal_many_opts():
52     a = IntOption('a', '')
53     b = IntOption('b', '')
54     c = IntOption('c', '')
55     d = IntOption('d', '')
56     e = IntOption('e', '')
57     f = IntOption('f', '')
58     od = OptionDescription('od', '', [a, b, c, d, e, f])
59     a.impl_add_consistency('not_equal', b, c, d, e, f)
60     c = Config(od)
61     assert c.a is None
62     assert c.b is None
63     #
64     c.a = 1
65     del(c.a)
66     #
67     c.a = 1
68     raises(ValueError, "c.b = 1")
69     #
70     c.b = 2
71     raises(ValueError, "c.f = 2")
72     raises(ValueError, "c.f = 1")
73     #
74     c.d = 3
75     raises(ValueError, "c.f = 3")
76     raises(ValueError, "c.a = 3")
77     raises(ValueError, "c.c = 3")
78     raises(ValueError, "c.e = 3")
79
80
81 def test_consistency_not_in_config_1():
82     a = IntOption('a', '')
83     b = IntOption('b', '')
84     a.impl_add_consistency('not_equal', b)
85     od1 = OptionDescription('od1', '', [a])
86     od2 = OptionDescription('od2', '', [b])
87     od = OptionDescription('root', '', [od1])
88     raises(ConfigError, "Config(od)")
89
90
91 def test_consistency_not_in_config_2():
92     a = IntOption('a', '')
93     b = IntOption('b', '')
94     a.impl_add_consistency('not_equal', b)
95     od1 = OptionDescription('od1', '', [a])
96     od2 = OptionDescription('od2', '', [b])
97     od = OptionDescription('root', '', [od1, od2])
98     Config(od)
99
100
101 def test_consistency_not_in_config_3():
102     a = IntOption('a', '')
103     b = IntOption('b', '')
104     a.impl_add_consistency('not_equal', b)
105     od1 = OptionDescription('od1', '', [a])
106     od2 = OptionDescription('od2', '', [b])
107     od = OptionDescription('root', '', [od1, od2])
108     #with subconfig
109     raises(ConfigError, "Config(od.od1)")
110
111
112 def test_consistency_after_config():
113     a = IntOption('a', '')
114     b = IntOption('b', '')
115     od1 = OptionDescription('od1', '', [a])
116     od2 = OptionDescription('od2', '', [b])
117     od = OptionDescription('root', '', [od1, od2])
118     Config(od)
119     raises(AttributeError, "a.impl_add_consistency('not_equal', b)")
120
121
122 def test_consistency_not_equal_symlink():
123     a = IntOption('a', '')
124     b = IntOption('b', '')
125     c = SymLinkOption('c', a)
126     od = OptionDescription('od', '', [a, b, c])
127     a.impl_add_consistency('not_equal', b)
128     c = Config(od)
129     assert set(od._cache_consistencies.keys()) == set([a, b])
130
131
132 def test_consistency_not_equal_multi():
133     a = IntOption('a', '', multi=True)
134     b = IntOption('b', '', multi=True)
135     od = OptionDescription('od', '', [a, b])
136     a.impl_add_consistency('not_equal', b)
137     c = Config(od)
138     assert c.a == []
139     assert c.b == []
140     c.a = [1]
141     del(c.a)
142     c.a = [1]
143     raises(ValueError, "c.b = [1]")
144     c.b = [2]
145
146
147 def test_consistency_default():
148     a = IntOption('a', '', 1)
149     b = IntOption('b', '', 1)
150     raises(ValueError, "a.impl_add_consistency('not_equal', b)")
151
152
153 def test_consistency_default_multi():
154     a = IntOption('a', '', [2, 1], multi=True)
155     b = IntOption('b', '', [1, 1], multi=True)
156     c = IntOption('c', '', [1, 2], multi=True)
157     raises(ValueError, "a.impl_add_consistency('not_equal', b)")
158     a.impl_add_consistency('not_equal', c)
159
160
161 def test_consistency_default_diff():
162     a = IntOption('a', '', 3)
163     b = IntOption('b', '', 1)
164     od = OptionDescription('od', '', [a, b])
165     a.impl_add_consistency('not_equal', b)
166     c = Config(od)
167     raises(ValueError, "c.a = 1")
168     c.a = 2
169     c.b = 3
170     assert c.getowner(a) is owners.user
171     raises(ValueError, "del(c.a)")
172     assert c.getowner(a) is owners.user
173
174
175 def test_consistency_ip_netmask():
176     a = IPOption('a', '')
177     b = NetmaskOption('b', '')
178     od = OptionDescription('od', '', [a, b])
179     b.impl_add_consistency('ip_netmask', a)
180     c = Config(od)
181     c.a = '192.168.1.1'
182     c.b = '255.255.255.0'
183     c.a = '192.168.1.2'
184     c.b = '255.255.255.255'
185     c.b = '255.255.255.0'
186     raises(ValueError, "c.a = '192.168.1.0'")
187
188
189 def test_consistency_network_netmask():
190     a = NetworkOption('a', '')
191     b = NetmaskOption('b', '')
192     od = OptionDescription('od', '', [a, b])
193     b.impl_add_consistency('network_netmask', a)
194     c = Config(od)
195     c.a = '192.168.1.1'
196     c.b = '255.255.255.255'
197     del(c.b)
198     c.a = '192.168.1.0'
199     c.b = '255.255.255.0'
200     raises(ValueError, "c.a = '192.168.1.1'")
201
202
203 def test_consistency_ip_in_network():
204     a = NetworkOption('a', '')
205     b = NetmaskOption('b', '')
206     c = IPOption('c', '')
207     od = OptionDescription('od', '', [a, b, c])
208     c.impl_add_consistency('in_network', a, b)
209     cfg = Config(od)
210     cfg.a = '192.168.1.0'
211     cfg.b = '255.255.255.0'
212     cfg.c = '192.168.1.1'
213     raises(ValueError, "cfg.c = '192.168.2.1'")
214
215
216 def test_consistency_ip_in_network_len_error():
217     a = NetworkOption('a', '')
218     b = NetmaskOption('b', '')
219     c = IPOption('c', '')
220     od = OptionDescription('od', '', [a, b, c])
221     c.impl_add_consistency('in_network', a)
222     cfg = Config(od)
223     raises(ConfigError, "cfg.a = '192.168.2.0'")
224
225
226 def test_consistency_ip_netmask_network_error():
227     a = IPOption('a', '')
228     b = NetworkOption('b', '')
229     c = NetmaskOption('c', '')
230     od = OptionDescription('od', '', [a, b, c])
231     c.impl_add_consistency('ip_netmask', a, b)
232     c = Config(od)
233     c.a = '192.168.1.1'
234     c.b = '192.168.1.0'
235     raises(ConfigError, "c.c = '255.255.255.0'")
236
237
238 def test_consistency_ip_netmask_error_multi():
239     a = IPOption('a', '', multi=True)
240     b = NetmaskOption('b', '')
241     od = OptionDescription('od', '', [a, b])
242     raises(ConfigError, "b.impl_add_consistency('ip_netmask', a)")
243
244
245 def test_consistency_ip_netmask_multi():
246     a = IPOption('a', '', multi=True)
247     b = NetmaskOption('b', '', multi=True)
248     od = OptionDescription('od', '', [a, b])
249     b.impl_add_consistency('ip_netmask', a)
250     c = Config(od)
251     c.a = ['192.168.1.1']
252     c.b = ['255.255.255.0']
253     c.a = ['192.168.1.2']
254     c.b = ['255.255.255.255']
255     c.b = ['255.255.255.0']
256     raises(ValueError, "c.a = ['192.168.1.0']")
257
258
259 def test_consistency_network_netmask_multi():
260     a = NetworkOption('a', '', multi=True)
261     b = NetmaskOption('b', '', multi=True)
262     od = OptionDescription('od', '', [a, b])
263     b.impl_add_consistency('network_netmask', a)
264     c = Config(od)
265     c.a = ['192.168.1.1']
266     c.b = ['255.255.255.255']
267     del(c.b)
268     c.a = ['192.168.1.0']
269     c.b = ['255.255.255.0']
270     raises(ValueError, "c.a = ['192.168.1.1']")
271
272
273 def test_consistency_ip_netmask_multi_master():
274     a = IPOption('a', '', multi=True)
275     b = NetmaskOption('b', '', multi=True)
276     od = OptionDescription('a', '', [a, b])
277     od.impl_set_group_type(groups.master)
278     b.impl_add_consistency('ip_netmask', a)
279     c = Config(od)
280     c.a = ['192.168.1.1']
281     c.b = ['255.255.255.0']
282     c.a = ['192.168.1.2']
283     c.b = ['255.255.255.255']
284     c.b = ['255.255.255.0']
285     raises(ValueError, "c.a = ['192.168.1.0']")
286     c.a = ['192.168.1.128']
287     raises(ValueError, "c.b = ['255.255.255.128']")
288     c.a = ['192.168.1.2', '192.168.1.3']
289
290
291 def test_consistency_network_netmask_multi_master():
292     a = NetworkOption('a', '', multi=True)
293     b = NetmaskOption('b', '', multi=True)
294     od = OptionDescription('a', '', [a, b])
295     od.impl_set_group_type(groups.master)
296     b.impl_add_consistency('network_netmask', a)
297     c = Config(od)
298     c.a = ['192.168.1.1']
299     c.b = ['255.255.255.255']
300     del(c.b)
301     c.a = ['192.168.1.0']
302     c.b = ['255.255.255.0']
303     raises(ValueError, "c.a = ['192.168.1.1']")
304
305
306 def test_consistency_broadcast():
307     a = NetworkOption('a', '', multi=True)
308     b = NetmaskOption('b', '', multi=True)
309     c = BroadcastOption('c', '', multi=True)
310     od = OptionDescription('a', '', [a, b, c])
311     od.impl_set_group_type(groups.master)
312     b.impl_add_consistency('network_netmask', a)
313     c.impl_add_consistency('broadcast', a, b)
314     c = Config(od)
315     #first, test network_netmask
316     c.a = ['192.168.1.128']
317     raises(ValueError, "c.b = ['255.255.255.0']")
318     #
319     c.a = ['192.168.1.0']
320     c.b = ['255.255.255.0']
321     c.c = ['192.168.1.255']
322     raises(ValueError, "c.a = ['192.168.1.1']")
323     #
324     c.a = ['192.168.1.0', '192.168.2.128']
325     c.b = ['255.255.255.0', '255.255.255.128']
326     c.c = ['192.168.1.255', '192.168.2.255']
327     raises(ValueError, "c.c[1] = '192.168.2.128'")
328     c.c[1] = '192.168.2.255'
329
330
331 def test_consistency_broadcast_error():
332     a = NetworkOption('a', '', multi=True)
333     b = NetmaskOption('b', '', multi=True)
334     c = BroadcastOption('c', '', multi=True)
335     od = OptionDescription('a', '', [a, b, c])
336     od.impl_set_group_type(groups.master)
337     b.impl_add_consistency('network_netmask', a)
338     c.impl_add_consistency('broadcast', a)
339     c = Config(od)
340     c.a = ['192.168.1.0']
341     raises(ConfigError, "c.b = ['255.255.255.0']")
342     raises(ConfigError, "c.c = ['192.168.1.255']")
343
344
345 def test_consistency_broadcast_default_1():
346     a = NetworkOption('a', '', '192.168.1.0')
347     b = NetmaskOption('b', '', '255.255.255.128')
348     c = BroadcastOption('c', '', '192.168.2.127')
349     d = BroadcastOption('d', '', '192.168.1.127')
350     od = OptionDescription('a', '', [a, b, c])
351     raises(ValueError, "c.impl_add_consistency('broadcast', a, b)")
352
353
354 def test_consistency_broadcast_default_2():
355     a = NetworkOption('a', '', '192.168.1.0')
356     b = NetmaskOption('b', '', '255.255.255.128')
357     c = BroadcastOption('c', '', '192.168.2.127')
358     d = BroadcastOption('d', '', '192.168.1.127')
359     od2 = OptionDescription('a', '', [a, b, d])
360     d.impl_add_consistency('broadcast', a, b)
361
362
363 def test_consistency_not_all():
364     #_cache_consistencies is not None by not options has consistencies
365     a = NetworkOption('a', '', multi=True)
366     b = NetmaskOption('b', '', multi=True)
367     c = BroadcastOption('c', '', multi=True)
368     od = OptionDescription('a', '', [a, b, c])
369     od.impl_set_group_type(groups.master)
370     b.impl_add_consistency('network_netmask', a)
371     c = Config(od)
372     c.a = ['192.168.1.0']
373     c.b = ['255.255.255.0']
374     c.c = ['192.168.1.255']
375
376
377 def test_consistency_permissive():
378     a = IntOption('a', '', 1)
379     b = IntOption('b', '', 2, properties=('hidden',))
380     od = OptionDescription('od', '', [a, b])
381     a.impl_add_consistency('not_equal', b)
382     c = Config(od)
383     c.cfgimpl_get_settings().setpermissive(('hidden',))
384     c.read_write()
385     c.a = 1
386
387
388 def return_val(*args, **kwargs):
389     return '192.168.1.1'
390
391
392 def test_consistency_with_callback():
393     a = NetworkOption('a', '', default='192.168.1.0')
394     b = NetmaskOption('b', '', default='255.255.255.0')
395     c = IPOption('c', '', callback=return_val, callback_params={'': ((a, False),)})
396     od = OptionDescription('od', '', [a, b, c])
397     c.impl_add_consistency('in_network', a, b)
398     cfg = Config(od)
399     cfg.c