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