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