remove some try/except + consistency not works with submulti
[tiramisu.git] / test / test_option_consistency.py
1 from autopath import do_autopath
2 do_autopath()
3
4 from py.test import raises
5
6 from tiramisu.setting import owners, groups
7 from tiramisu.config import Config
8 from tiramisu.option import IPOption, NetworkOption, NetmaskOption, IntOption,\
9     BroadcastOption, SymLinkOption, OptionDescription, submulti
10 from tiramisu.error import ConfigError, ValueWarning, PropertiesOptionError
11 import warnings
12
13
14 def test_consistency():
15     a = IntOption('a', '')
16     b = IntOption('b', '')
17     a.impl_add_consistency('not_equal', b)
18     #consistency to itself
19     raises(ConfigError, "a.impl_add_consistency('not_equal', a)")
20
21
22 def test_consistency_not_exists():
23     a = IntOption('a', '')
24     b = IntOption('b', '')
25     a, b
26     raises(ConfigError, "a.impl_add_consistency('not_exists', b)")
27
28
29 def test_consistency_unknown_params():
30     a = IntOption('a', '')
31     b = IntOption('b', '')
32     a, b
33     raises(ValueError, "a.impl_add_consistency('not_equal', b, unknown=False)")
34
35
36 def test_consistency_warnings_only_default():
37     a = IntOption('a', '', 1)
38     b = IntOption('b', '', 1)
39     warnings.simplefilter("always", ValueWarning)
40     with warnings.catch_warnings(record=True) as w:
41         a.impl_add_consistency('not_equal', b, warnings_only=True)
42     assert w != []
43
44
45 def test_consistency_warnings_only():
46     a = IntOption('a', '')
47     b = IntOption('b', '')
48     od = OptionDescription('od', '', [a, b])
49     a.impl_add_consistency('not_equal', b, warnings_only=True)
50     c = Config(od)
51     c.a = 1
52     warnings.simplefilter("always", ValueWarning)
53     with warnings.catch_warnings(record=True) as w:
54         c.b = 1
55     assert w != []
56
57
58 def test_consistency_not_equal():
59     a = IntOption('a', '')
60     b = IntOption('b', '')
61     od = OptionDescription('od', '', [a, b])
62     a.impl_add_consistency('not_equal', b)
63     c = Config(od)
64     assert c.a is None
65     assert c.b is None
66     c.a = 1
67     del(c.a)
68     c.a = 1
69     raises(ValueError, "c.b = 1")
70     c.b = 2
71
72
73 def test_consistency_not_equal_many_opts():
74     a = IntOption('a', '')
75     b = IntOption('b', '')
76     c = IntOption('c', '')
77     d = IntOption('d', '')
78     e = IntOption('e', '')
79     f = IntOption('f', '')
80     od = OptionDescription('od', '', [a, b, c, d, e, f])
81     a.impl_add_consistency('not_equal', b, c, d, e, f)
82     c = Config(od)
83     assert c.a is None
84     assert c.b is None
85     #
86     c.a = 1
87     del(c.a)
88     #
89     c.a = 1
90     raises(ValueError, "c.b = 1")
91     #
92     c.b = 2
93     raises(ValueError, "c.f = 2")
94     raises(ValueError, "c.f = 1")
95     #
96     c.d = 3
97     raises(ValueError, "c.f = 3")
98     raises(ValueError, "c.a = 3")
99     raises(ValueError, "c.c = 3")
100     raises(ValueError, "c.e = 3")
101
102
103 def test_consistency_not_in_config_1():
104     a = IntOption('a', '')
105     b = IntOption('b', '')
106     a.impl_add_consistency('not_equal', b)
107     od1 = OptionDescription('od1', '', [a])
108     od = OptionDescription('root', '', [od1])
109     od
110     raises(ConfigError, "Config(od)")
111
112
113 def test_consistency_not_in_config_2():
114     a = IntOption('a', '')
115     b = IntOption('b', '')
116     a.impl_add_consistency('not_equal', b)
117     od1 = OptionDescription('od1', '', [a])
118     od2 = OptionDescription('od2', '', [b])
119     od = OptionDescription('root', '', [od1, od2])
120     Config(od)
121
122
123 def test_consistency_not_in_config_3():
124     a = IntOption('a', '')
125     b = IntOption('b', '')
126     a.impl_add_consistency('not_equal', b)
127     od1 = OptionDescription('od1', '', [a])
128     od2 = OptionDescription('od2', '', [b])
129     od = OptionDescription('root', '', [od1, od2])
130     od
131     #with subconfig
132     raises(ConfigError, "Config(od.od1)")
133
134
135 def test_consistency_after_config():
136     a = IntOption('a', '')
137     b = IntOption('b', '')
138     od1 = OptionDescription('od1', '', [a])
139     od2 = OptionDescription('od2', '', [b])
140     od = OptionDescription('root', '', [od1, od2])
141     Config(od)
142     raises(AttributeError, "a.impl_add_consistency('not_equal', b)")
143
144
145 def test_consistency_not_equal_symlink():
146     a = IntOption('a', '')
147     b = IntOption('b', '')
148     c = SymLinkOption('c', a)
149     od = OptionDescription('od', '', [a, b, c])
150     a.impl_add_consistency('not_equal', b)
151     c = Config(od)
152     assert set(od._cache_consistencies.keys()) == set([a, b])
153
154
155 def test_consistency_not_equal_submulti():
156     a = IntOption('a', '', multi=submulti)
157     b = IntOption('b', '', multi=submulti)
158     od = OptionDescription('a', '', [a, b])
159     od.impl_set_group_type(groups.master)
160     raises(ConfigError, 'a.impl_add_consistency("not_equal", b)')
161
162
163 def test_consistency_not_equal_default_submulti():
164     a = IntOption('a', '', [[1, 2]], multi=submulti)
165     b = IntOption('b', '', [[1]], multi=submulti)
166     od = OptionDescription('od', '', [a, b])
167     od
168     raises(ConfigError, "a.impl_add_consistency('not_equal', b)")
169
170
171 def test_consistency_not_equal_multi():
172     a = IntOption('a', '', multi=True)
173     b = IntOption('b', '', multi=True)
174     od = OptionDescription('a', '', [a, b])
175     od.impl_set_group_type(groups.master)
176     a.impl_add_consistency('not_equal', b)
177     c = Config(od)
178     assert c.a == []
179     assert c.b == []
180     c.a = [1]
181     del(c.a)
182     c.a = [1]
183     raises(ValueError, "c.b = [1]")
184     c.b = [2]
185
186
187 def test_consistency_not_equal_multi_default():
188     a = IntOption('a', '', multi=True)
189     b = IntOption('b', '', multi=True, default_multi=1)
190     od = OptionDescription('a', '', [a, b])
191     od.impl_set_group_type(groups.master)
192     a.impl_add_consistency('not_equal', b)
193     c = Config(od)
194     assert c.a == []
195     assert c.b == []
196     raises(ValueError, 'c.a = [1]')
197     c.a = [2]
198     del(c.a)
199
200
201 def test_consistency_default():
202     a = IntOption('a', '', 1)
203     b = IntOption('b', '', 1)
204     a, b
205     raises(ValueError, "a.impl_add_consistency('not_equal', b)")
206
207
208 def test_consistency_default_multi():
209     a = IntOption('a', '', [2, 1], multi=True)
210     b = IntOption('b', '', [1, 1], multi=True)
211     c = IntOption('c', '', [1, 2], multi=True)
212     b
213     raises(ValueError, "a.impl_add_consistency('not_equal', b)")
214     a.impl_add_consistency('not_equal', c)
215
216
217 def test_consistency_default_diff():
218     a = IntOption('a', '', 3)
219     b = IntOption('b', '', 1)
220     od = OptionDescription('od', '', [a, b])
221     a.impl_add_consistency('not_equal', b)
222     c = Config(od)
223     raises(ValueError, "c.a = 1")
224     c.a = 2
225     c.b = 3
226     assert c.getowner(a) is owners.user
227     raises(ValueError, "del(c.a)")
228     assert c.getowner(a) is owners.user
229
230
231 def test_consistency_ip_netmask():
232     a = IPOption('a', '')
233     b = NetmaskOption('b', '')
234     od = OptionDescription('od', '', [a, b])
235     b.impl_add_consistency('ip_netmask', a)
236     c = Config(od)
237     c.a = '192.168.1.1'
238     c.b = '255.255.255.0'
239     c.a = '192.168.1.2'
240     c.b = '255.255.255.255'
241     c.b = '255.255.255.0'
242     raises(ValueError, "c.a = '192.168.1.0'")
243     raises(ValueError, "c.a = '192.168.1.255'")
244
245
246 def test_consistency_network_netmask():
247     a = NetworkOption('a', '')
248     b = NetmaskOption('b', '')
249     od = OptionDescription('od', '', [a, b])
250     b.impl_add_consistency('network_netmask', a)
251     c = Config(od)
252     c.a = '192.168.1.1'
253     c.b = '255.255.255.255'
254     del(c.b)
255     c.a = '192.168.1.0'
256     c.b = '255.255.255.0'
257     raises(ValueError, "c.a = '192.168.1.1'")
258
259
260 def test_consistency_ip_in_network():
261     a = NetworkOption('a', '')
262     b = NetmaskOption('b', '')
263     c = IPOption('c', '')
264     d = IPOption('d', '')
265     od = OptionDescription('od', '', [a, b, c, d])
266     c.impl_add_consistency('in_network', a, b)
267     d.impl_add_consistency('in_network', a, b, warnings_only=True)
268     warnings.simplefilter("always", ValueWarning)
269     cfg = Config(od)
270     cfg.a = '192.168.1.0'
271     cfg.b = '255.255.255.0'
272     cfg.c = '192.168.1.1'
273     raises(ValueError, "cfg.c = '192.168.2.1'")
274     raises(ValueError, "cfg.c = '192.168.1.0'")
275     raises(ValueError, "cfg.c = '192.168.1.255'")
276     with warnings.catch_warnings(record=True) as w:
277         cfg.d = '192.168.2.1'
278     assert len(w) == 1
279
280
281 def test_consistency_ip_in_network_len_error():
282     a = NetworkOption('a', '')
283     b = NetmaskOption('b', '')
284     c = IPOption('c', '')
285     od = OptionDescription('od', '', [a, b, c])
286     c.impl_add_consistency('in_network', a)
287     cfg = Config(od)
288     cfg
289     raises(ConfigError, "cfg.a = '192.168.2.0'")
290
291
292 def test_consistency_ip_netmask_network_error():
293     a = IPOption('a', '')
294     b = NetworkOption('b', '')
295     c = NetmaskOption('c', '')
296     od = OptionDescription('od', '', [a, b, c])
297     c.impl_add_consistency('ip_netmask', a, b)
298     c = Config(od)
299     c.a = '192.168.1.1'
300     c.b = '192.168.1.0'
301     raises(ConfigError, "c.c = '255.255.255.0'")
302
303
304 def test_consistency_ip_netmask_error_multi():
305     a = IPOption('a', '', multi=True)
306     b = NetmaskOption('b', '')
307     OptionDescription('od', '', [a, b])
308     raises(ConfigError, "b.impl_add_consistency('ip_netmask', a)")
309
310
311 def test_consistency_ip_netmask_multi():
312     a = IPOption('a', '', multi=True)
313     b = NetmaskOption('b', '', multi=True)
314     od = OptionDescription('a', '', [a, b])
315     b.impl_add_consistency('ip_netmask', a)
316     od.impl_set_group_type(groups.master)
317     c = Config(od)
318     c.a = ['192.168.1.1']
319     c.b = ['255.255.255.0']
320     c.a = ['192.168.1.2']
321     c.b = ['255.255.255.255']
322     c.b = ['255.255.255.0']
323     raises(ValueError, "c.a = ['192.168.1.0']")
324
325
326 def test_consistency_network_netmask_multi():
327     a = NetworkOption('a', '', multi=True)
328     b = NetmaskOption('b', '', multi=True)
329     od = OptionDescription('a', '', [a, b])
330     od.impl_set_group_type(groups.master)
331     b.impl_add_consistency('network_netmask', a)
332     c = Config(od)
333     c.a = ['192.168.1.1']
334     c.b = ['255.255.255.255']
335     del(c.b)
336     c.a = ['192.168.1.0']
337     c.b = ['255.255.255.0']
338     raises(ValueError, "c.a = ['192.168.1.1']")
339
340
341 def test_consistency_network_netmask_multi_slave_default():
342     a = NetworkOption('a', '', multi=True, properties=('mandatory',))
343     b = NetmaskOption('b', '', default_multi=u'255.255.255.0', multi=True, properties=('mandatory',))
344     od = OptionDescription('a', '', [a, b])
345     od.impl_set_group_type(groups.master)
346     b.impl_add_consistency('network_netmask', a)
347     c = Config(od)
348     c.read_write()
349     c.cfgimpl_get_settings().remove('cache')
350     assert c.a == []
351     assert c.b == []
352     c.a.append(u'192.168.1.0')
353     c.read_only()
354     assert c.a == [u'192.168.1.0']
355     assert c.b == [u'255.255.255.0']
356     c.read_write()
357     raises(ValueError, "c.a[0] = u'192.168.1.2'")
358     raises(ValueError, "c.a.append(u'192.168.1.1')")
359     raises(ValueError, "c.a = [u'192.168.1.0', u'192.168.1.1']")
360     c.a.append()
361     c.b = [u'255.255.255.0', u'255.255.255.255']
362     c.a = [u'192.168.1.0', u'192.168.1.1']
363
364
365 def return_netmask(*args, **kwargs):
366     return u'255.255.255.0'
367
368
369 def return_netmask2(master):
370     if master is not None:
371         if master.endswith('2.1'):
372             return u'255.255.255.0'
373         if not master.endswith('.0'):
374             return u'255.255.255.255'
375     return u'255.255.255.0'
376
377
378 def test_consistency_network_netmask_multi_slave_callback():
379     a = NetworkOption('a', '', multi=True, properties=('mandatory',))
380     b = NetmaskOption('b', '', callback=return_netmask, multi=True, properties=('mandatory',))
381     od = OptionDescription('a', '', [a, b])
382     od.impl_set_group_type(groups.master)
383     b.impl_add_consistency('network_netmask', a)
384     c = Config(od)
385     c.read_write()
386     c.cfgimpl_get_settings().remove('cache')
387     assert c.a == []
388     assert c.b == []
389     c.a.append(u'192.168.1.0')
390     c.read_only()
391     assert c.a == [u'192.168.1.0']
392     assert c.b == [u'255.255.255.0']
393     c.read_write()
394     raises(ValueError, "c.a[0] = u'192.168.1.2'")
395     raises(ValueError, "c.a.append(u'192.168.1.1')")
396     raises(ValueError, "c.a = [u'192.168.1.0', u'192.168.1.1']")
397     c.a.append()
398     c.b = [u'255.255.255.0', u'255.255.255.255']
399     c.a = [u'192.168.1.0', u'192.168.1.1']
400
401
402 def test_consistency_network_netmask_multi_slave_callback_value():
403     a = NetworkOption('a', '', multi=True, properties=('mandatory',))
404     b = NetmaskOption('b', '', callback=return_netmask2, callback_params={'': ((a, False),)}, multi=True, properties=('mandatory',))
405     od = OptionDescription('a', '', [a, b])
406     od.impl_set_group_type(groups.master)
407     b.impl_add_consistency('network_netmask', a)
408     c = Config(od)
409     c.read_write()
410     c.cfgimpl_get_settings().remove('cache')
411     assert c.a == []
412     assert c.b == []
413     c.a.append(u'192.168.1.0')
414     assert c.a == [u'192.168.1.0']
415     assert c.b == [u'255.255.255.0']
416     raises(ValueError, "c.a[0] = u'192.168.2.1'")
417     assert c.a == [u'192.168.1.0']
418     assert c.b == [u'255.255.255.0']
419     raises(ValueError, "c.a = [u'192.168.2.1']")
420     assert c.a == [u'192.168.1.0']
421     assert c.b == [u'255.255.255.0']
422     c.a.append(u'192.168.1.1')
423     c.a = [u'192.168.1.0', u'192.168.1.1']
424     c.b = [u'255.255.255.0', u'255.255.255.255']
425
426
427 def test_consistency_ip_netmask_multi_master():
428     a = IPOption('a', '', multi=True)
429     b = NetmaskOption('b', '', multi=True)
430     od = OptionDescription('a', '', [a, b])
431     od.impl_set_group_type(groups.master)
432     b.impl_add_consistency('ip_netmask', a)
433     c = Config(od)
434     c.a = ['192.168.1.1']
435     c.b = ['255.255.255.0']
436     c.a = ['192.168.1.2']
437     c.b = ['255.255.255.255']
438     c.b = ['255.255.255.0']
439     raises(ValueError, "c.a = ['192.168.1.0']")
440     c.a = ['192.168.1.128']
441     raises(ValueError, "c.b = ['255.255.255.128']")
442     c.a = ['192.168.1.2', '192.168.1.3']
443
444
445 def test_consistency_network_netmask_multi_master():
446     a = NetworkOption('a', '', multi=True)
447     b = NetmaskOption('b', '', multi=True)
448     od = OptionDescription('a', '', [a, b])
449     od.impl_set_group_type(groups.master)
450     b.impl_add_consistency('network_netmask', a)
451     c = Config(od)
452     c.a = ['192.168.1.1']
453     c.b = ['255.255.255.255']
454     del(c.b)
455     c.a = ['192.168.1.0']
456     c.b = ['255.255.255.0']
457     raises(ValueError, "c.a = ['192.168.1.1']")
458
459
460 def test_consistency_broadcast():
461     a = NetworkOption('a', '', multi=True)
462     b = NetmaskOption('b', '', multi=True)
463     c = BroadcastOption('c', '', multi=True)
464     od = OptionDescription('a', '', [a, b, c])
465     od.impl_set_group_type(groups.master)
466     b.impl_add_consistency('network_netmask', a)
467     c.impl_add_consistency('broadcast', a, b)
468     c = Config(od)
469     #first, test network_netmask
470     c.a = ['192.168.1.128']
471     raises(ValueError, "c.b = ['255.255.255.0']")
472     #
473     c.a = ['192.168.1.0']
474     c.b = ['255.255.255.0']
475     c.c = ['192.168.1.255']
476     raises(ValueError, "c.a = ['192.168.1.1']")
477     #
478     c.a = ['192.168.1.0', '192.168.2.128']
479     c.b = ['255.255.255.0', '255.255.255.128']
480     c.c = ['192.168.1.255', '192.168.2.255']
481     raises(ValueError, "c.c[1] = '192.168.2.128'")
482     c.c[1] = '192.168.2.255'
483
484
485 def test_consistency_broadcast_error():
486     a = NetworkOption('a', '', multi=True)
487     b = NetmaskOption('b', '', multi=True)
488     c = BroadcastOption('c', '', multi=True)
489     od = OptionDescription('a', '', [a, b, c])
490     od.impl_set_group_type(groups.master)
491     b.impl_add_consistency('network_netmask', a)
492     c.impl_add_consistency('broadcast', a)
493     c = Config(od)
494     raises(ConfigError, "c.a = ['192.168.1.0']")
495
496
497 def test_consistency_broadcast_default_1():
498     a = NetworkOption('a', '', '192.168.1.0')
499     b = NetmaskOption('b', '', '255.255.255.128')
500     c = BroadcastOption('c', '', '192.168.2.127')
501     od = OptionDescription('a', '', [a, b, c])
502     od
503     raises(ValueError, "c.impl_add_consistency('broadcast', a, b)")
504
505
506 def test_consistency_broadcast_default_2():
507     a = NetworkOption('a', '', '192.168.1.0')
508     b = NetmaskOption('b', '', '255.255.255.128')
509     d = BroadcastOption('d', '', '192.168.1.127')
510     od2 = OptionDescription('a', '', [a, b, d])
511     od2
512     d.impl_add_consistency('broadcast', a, b)
513
514
515 def test_consistency_not_all():
516     #_cache_consistencies is not None by not options has consistencies
517     a = NetworkOption('a', '', multi=True)
518     b = NetmaskOption('b', '', multi=True)
519     c = BroadcastOption('c', '', multi=True)
520     od = OptionDescription('a', '', [a, b, c])
521     od.impl_set_group_type(groups.master)
522     b.impl_add_consistency('network_netmask', a)
523     c = Config(od)
524     c.a = ['192.168.1.0']
525     c.b = ['255.255.255.0']
526     c.c = ['192.168.1.255']
527
528
529 def test_consistency_permissive():
530     a = IntOption('a', '', 1)
531     b = IntOption('b', '', 2, properties=('hidden',))
532     od = OptionDescription('od', '', [a, b])
533     a.impl_add_consistency('not_equal', b)
534     c = Config(od)
535     c.cfgimpl_get_settings().setpermissive(('hidden',))
536     c.read_write()
537     c.a = 1
538
539
540 def test_consistency_disabled():
541     a = IntOption('a', '')
542     b = IntOption('b', '', properties=('disabled',))
543     od = OptionDescription('od', '', [a, b])
544     a.impl_add_consistency('not_equal', b)
545     c = Config(od)
546     c.read_write()
547     raises(PropertiesOptionError, "c.a = 1")
548
549
550 def test_consistency_disabled_transitive():
551     a = IntOption('a', '')
552     b = IntOption('b', '', properties=('disabled',))
553     od = OptionDescription('od', '', [a, b])
554     a.impl_add_consistency('not_equal', b, transitive=False)
555     c = Config(od)
556     c.read_write()
557     c.a = 1
558
559
560 def test_consistency_disabled_transitive_2():
561     a = IPOption('a', '')
562     b = IPOption('b', '')
563     c = NetworkOption('c', '', default='192.168.1.0')
564     d = NetmaskOption('d', '', default='255.255.255.0', properties=('disabled',))
565     od = OptionDescription('od', '', [a, b, c, d])
566     a.impl_add_consistency('not_equal', b)
567     a.impl_add_consistency('in_network', c, d, transitive=False)
568     c = Config(od)
569     c.read_write()
570     c.a = '192.168.1.1'
571     raises(ValueError, "c.b = '192.168.1.1'")
572     c.a = '192.168.2.1'
573     #
574     c.a = '192.168.1.1'
575     c.cfgimpl_get_settings().remove('disabled')
576     raises(ValueError, "c.a = '192.168.2.1'")
577
578
579 def return_val(*args, **kwargs):
580     return '192.168.1.1'
581
582
583 def test_consistency_with_callback():
584     a = NetworkOption('a', '', default='192.168.1.0')
585     b = NetmaskOption('b', '', default='255.255.255.0')
586     c = IPOption('c', '', callback=return_val, callback_params={'': ((a, False),)})
587     od = OptionDescription('od', '', [a, b, c])
588     c.impl_add_consistency('in_network', a, b)
589     cfg = Config(od)
590     cfg.c