dca3e9af3b222ee22860f33d2ae0a0ccd8a2da17
[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_warnings_only_more_option():
59     a = IntOption('a', '')
60     b = IntOption('b', '')
61     d = IntOption('d', '')
62     od = OptionDescription('od', '', [a, b, d])
63     a.impl_add_consistency('not_equal', b, d, warnings_only=True)
64     c = Config(od)
65     c.a = 1
66     warnings.simplefilter("always", ValueWarning)
67     with warnings.catch_warnings(record=True) as w:
68         c.b = 1
69     assert w != []
70     with warnings.catch_warnings(record=True) as w:
71         c.d = 1
72     assert w != []
73
74
75 def test_consistency_not_equal():
76     a = IntOption('a', '')
77     b = IntOption('b', '')
78     od = OptionDescription('od', '', [a, b])
79     a.impl_add_consistency('not_equal', b)
80     c = Config(od)
81     assert c.a is None
82     assert c.b is None
83     c.a = 1
84     del(c.a)
85     c.a = 1
86     raises(ValueError, "c.b = 1")
87     c.b = 2
88
89
90 def test_consistency_not_equal_many_opts():
91     a = IntOption('a', '')
92     b = IntOption('b', '')
93     c = IntOption('c', '')
94     d = IntOption('d', '')
95     e = IntOption('e', '')
96     f = IntOption('f', '')
97     od = OptionDescription('od', '', [a, b, c, d, e, f])
98     a.impl_add_consistency('not_equal', b, c, d, e, f)
99     c = Config(od)
100     assert c.a is None
101     assert c.b is None
102     #
103     c.a = 1
104     del(c.a)
105     #
106     c.a = 1
107     raises(ValueError, "c.b = 1")
108     #
109     c.b = 2
110     raises(ValueError, "c.f = 2")
111     raises(ValueError, "c.f = 1")
112     #
113     c.d = 3
114     raises(ValueError, "c.f = 3")
115     raises(ValueError, "c.a = 3")
116     raises(ValueError, "c.c = 3")
117     raises(ValueError, "c.e = 3")
118
119
120 def test_consistency_not_equal_many_opts_one_disabled():
121     a = IntOption('a', '')
122     b = IntOption('b', '')
123     c = IntOption('c', '')
124     d = IntOption('d', '')
125     e = IntOption('e', '')
126     f = IntOption('f', '')
127     g = IntOption('g', '', properties=('disabled',))
128     od = OptionDescription('od', '', [a, b, c, d, e, f, g])
129     a.impl_add_consistency('not_equal', b, c, d, e, f, g, transitive=False)
130     c = Config(od)
131     c.read_write()
132     assert c.a is None
133     assert c.b is None
134     #
135     c.a = 1
136     del(c.a)
137     #
138     c.a = 1
139     raises(ValueError, "c.b = 1")
140     #
141     c.b = 2
142     raises(ValueError, "c.f = 2")
143     raises(ValueError, "c.f = 1")
144     #
145     c.d = 3
146     raises(ValueError, "c.f = 3")
147     raises(ValueError, "c.a = 3")
148     raises(ValueError, "c.c = 3")
149     raises(ValueError, "c.e = 3")
150
151
152 def test_consistency_not_in_config_1():
153     a = IntOption('a', '')
154     b = IntOption('b', '')
155     a.impl_add_consistency('not_equal', b)
156     od1 = OptionDescription('od1', '', [a])
157     od = OptionDescription('root', '', [od1])
158     od
159     raises(ConfigError, "Config(od)")
160
161
162 def test_consistency_not_in_config_2():
163     a = IntOption('a', '')
164     b = IntOption('b', '')
165     a.impl_add_consistency('not_equal', b)
166     od1 = OptionDescription('od1', '', [a])
167     od2 = OptionDescription('od2', '', [b])
168     od = OptionDescription('root', '', [od1, od2])
169     Config(od)
170
171
172 def test_consistency_not_in_config_3():
173     a = IntOption('a', '')
174     b = IntOption('b', '')
175     a.impl_add_consistency('not_equal', b)
176     od1 = OptionDescription('od1', '', [a])
177     od2 = OptionDescription('od2', '', [b])
178     od = OptionDescription('root', '', [od1, od2])
179     od
180     #with subconfig
181     raises(ConfigError, "Config(od.od1)")
182
183
184 def test_consistency_after_config():
185     a = IntOption('a', '')
186     b = IntOption('b', '')
187     od1 = OptionDescription('od1', '', [a])
188     od2 = OptionDescription('od2', '', [b])
189     od = OptionDescription('root', '', [od1, od2])
190     Config(od)
191     raises(AttributeError, "a.impl_add_consistency('not_equal', b)")
192
193
194 def test_consistency_not_equal_symlink():
195     a = IntOption('a', '')
196     b = IntOption('b', '')
197     c = SymLinkOption('c', a)
198     od = OptionDescription('od', '', [a, b, c])
199     a.impl_add_consistency('not_equal', b)
200     c = Config(od)
201     assert set(od._cache_consistencies.keys()) == set([a, b])
202
203
204 def test_consistency_not_equal_submulti():
205     a = IntOption('a', '', multi=submulti)
206     b = IntOption('b', '', multi=submulti)
207     od = OptionDescription('a', '', [a, b])
208     od.impl_set_group_type(groups.master)
209     raises(ConfigError, 'a.impl_add_consistency("not_equal", b)')
210
211
212 def test_consistency_not_equal_default_submulti():
213     a = IntOption('a', '', [[1, 2]], multi=submulti)
214     b = IntOption('b', '', [[1]], multi=submulti)
215     od = OptionDescription('od', '', [a, b])
216     od
217     raises(ConfigError, "a.impl_add_consistency('not_equal', b)")
218
219
220 def test_consistency_not_equal_masterslave():
221     a = IntOption('a', '', multi=True)
222     b = IntOption('b', '', multi=True)
223     od = OptionDescription('a', '', [a, b])
224     od.impl_set_group_type(groups.master)
225     a.impl_add_consistency('not_equal', b)
226     c = Config(od)
227     assert c.a == []
228     assert c.b == []
229     c.a = [1]
230     del(c.a)
231     c.a = [1]
232     raises(ValueError, "c.b = [1]")
233     c.b = [2]
234
235
236 def test_consistency_not_equal_masterslaves_default():
237     a = IntOption('a', '', multi=True)
238     b = IntOption('b', '', multi=True, default_multi=1)
239     od = OptionDescription('a', '', [a, b])
240     od.impl_set_group_type(groups.master)
241     a.impl_add_consistency('not_equal', b)
242     c = Config(od)
243     assert c.a == []
244     assert c.b == []
245     raises(ValueError, 'c.a = [1]')
246     c.a = [2]
247     del(c.a)
248
249
250 def test_consistency_not_equal_multi():
251     a = IntOption('a', '', multi=True)
252     b = IntOption('b', '', multi=True)
253     od = OptionDescription('a', '', [a, b])
254     a.impl_add_consistency('not_equal', b)
255     c = Config(od)
256     assert c.a == []
257     assert c.b == []
258     c.a = [1]
259     del(c.a)
260     c.a = [1]
261     raises(ValueError, "c.b = [1]")
262     c.b = [2]
263     raises(ValueError, "c.b = [2, 1]")
264     raises(ValueError, "c.b.append(1)")
265     c.b.append(3)
266     raises(ValueError, "c.b.append(3)")
267     raises(ValueError, "c.a.append(3)")
268     raises(ValueError, "c.a.append(3)")
269
270
271 def test_consistency_not_equal_multi_default():
272     a = IntOption('a', '', multi=True, default=[1])
273     b = IntOption('b', '', multi=True, default=[1, 2])
274     od = OptionDescription('a', '', [a, b])
275     raises(ValueError, "a.impl_add_consistency('not_equal', b)")
276
277
278 def test_consistency_not_equal_multi_default_modif():
279     a = IntOption('a', '', multi=True)
280     b = IntOption('b', '', multi=True, default=[1, 2])
281     od = OptionDescription('a', '', [a, b])
282     a.impl_add_consistency('not_equal', b)
283     c = Config(od)
284     assert c.a == []
285     assert c.b == [1, 2]
286     raises(ValueError, 'c.a.append(1)')
287     raises(ValueError, 'c.b.append(1)')
288
289
290 def test_consistency_default():
291     a = IntOption('a', '', 1)
292     b = IntOption('b', '', 1)
293     a, b
294     raises(ValueError, "a.impl_add_consistency('not_equal', b)")
295
296
297 def test_consistency_default_multi():
298     a = IntOption('a', '', [2, 1], multi=True)
299     b = IntOption('b', '', [1, 1], multi=True)
300     c = IntOption('c', '', [1, 2], multi=True)
301     b
302     raises(ValueError, "a.impl_add_consistency('not_equal', b)")
303     a.impl_add_consistency('not_equal', c)
304
305
306 def test_consistency_default_diff():
307     a = IntOption('a', '', 3)
308     b = IntOption('b', '', 1)
309     od = OptionDescription('od', '', [a, b])
310     a.impl_add_consistency('not_equal', b)
311     c = Config(od)
312     raises(ValueError, "c.a = 1")
313     c.a = 2
314     c.b = 3
315     assert c.getowner(a) is owners.user
316     raises(ValueError, "del(c.a)")
317     assert c.getowner(a) is owners.user
318
319
320 def test_consistency_ip_netmask():
321     a = IPOption('a', '')
322     b = NetmaskOption('b', '')
323     od = OptionDescription('od', '', [a, b])
324     b.impl_add_consistency('ip_netmask', a)
325     c = Config(od)
326     c.a = '192.168.1.1'
327     c.b = '255.255.255.0'
328     c.a = '192.168.1.2'
329     c.b = '255.255.255.255'
330     c.b = '255.255.255.0'
331     raises(ValueError, "c.a = '192.168.1.0'")
332     raises(ValueError, "c.a = '192.168.1.255'")
333
334
335 def test_consistency_network_netmask():
336     a = NetworkOption('a', '')
337     b = NetmaskOption('b', '')
338     od = OptionDescription('od', '', [a, b])
339     b.impl_add_consistency('network_netmask', a)
340     c = Config(od)
341     c.a = '192.168.1.1'
342     c.b = '255.255.255.255'
343     del(c.b)
344     c.a = '192.168.1.0'
345     c.b = '255.255.255.0'
346     raises(ValueError, "c.a = '192.168.1.1'")
347
348
349 def test_consistency_ip_in_network():
350     a = NetworkOption('a', '')
351     b = NetmaskOption('b', '')
352     c = IPOption('c', '')
353     d = IPOption('d', '')
354     od = OptionDescription('od', '', [a, b, c, d])
355     c.impl_add_consistency('in_network', a, b)
356     d.impl_add_consistency('in_network', a, b, warnings_only=True)
357     warnings.simplefilter("always", ValueWarning)
358     cfg = Config(od)
359     cfg.a = '192.168.1.0'
360     cfg.b = '255.255.255.0'
361     cfg.c = '192.168.1.1'
362     raises(ValueError, "cfg.c = '192.168.2.1'")
363     raises(ValueError, "cfg.c = '192.168.1.0'")
364     raises(ValueError, "cfg.c = '192.168.1.255'")
365     with warnings.catch_warnings(record=True) as w:
366         cfg.d = '192.168.2.1'
367     assert len(w) == 1
368
369
370 def test_consistency_ip_in_network_len_error():
371     a = NetworkOption('a', '')
372     b = NetmaskOption('b', '')
373     c = IPOption('c', '')
374     od = OptionDescription('od', '', [a, b, c])
375     raises(ConfigError, "c.impl_add_consistency('in_network', a)")
376
377
378 def test_consistency_ip_netmask_network_error():
379     a = IPOption('a', '')
380     b = NetworkOption('b', '')
381     c = NetmaskOption('c', '')
382     od = OptionDescription('od', '', [a, b, c])
383     c.impl_add_consistency('ip_netmask', a, b)
384     c = Config(od)
385     c.a = '192.168.1.1'
386     c.b = '192.168.1.0'
387     raises(ConfigError, "c.c = '255.255.255.0'")
388
389
390 def test_consistency_ip_netmask_error_multi():
391     a = IPOption('a', '', multi=True)
392     b = NetmaskOption('b', '')
393     OptionDescription('od', '', [a, b])
394     raises(ConfigError, "b.impl_add_consistency('ip_netmask', a)")
395
396
397 def test_consistency_ip_netmask_multi():
398     a = IPOption('a', '', multi=True)
399     b = NetmaskOption('b', '', multi=True)
400     od = OptionDescription('a', '', [a, b])
401     b.impl_add_consistency('ip_netmask', a)
402     od.impl_set_group_type(groups.master)
403     c = Config(od)
404     c.a = ['192.168.1.1']
405     c.b = ['255.255.255.0']
406     c.a = ['192.168.1.2']
407     c.b = ['255.255.255.255']
408     c.b = ['255.255.255.0']
409     raises(ValueError, "c.a = ['192.168.1.0']")
410
411
412 def test_consistency_network_netmask_multi():
413     a = NetworkOption('a', '', multi=True)
414     b = NetmaskOption('b', '', multi=True)
415     od = OptionDescription('a', '', [a, b])
416     od.impl_set_group_type(groups.master)
417     b.impl_add_consistency('network_netmask', a)
418     c = Config(od)
419     c.a = ['192.168.1.1']
420     c.b = ['255.255.255.255']
421     del(c.b)
422     c.a = ['192.168.1.0']
423     c.b = ['255.255.255.0']
424     raises(ValueError, "c.a = ['192.168.1.1']")
425
426
427 def test_consistency_network_netmask_multi_slave_default_multi():
428     a = NetworkOption('a', '', default_multi=u'192.168.1.0', multi=True, properties=('mandatory',))
429     b = NetmaskOption('b', '', default_multi=u'255.255.255.0', multi=True, properties=('mandatory',))
430     od = OptionDescription('a', '', [a, b])
431     od.impl_set_group_type(groups.master)
432     b.impl_add_consistency('network_netmask', a)
433     c = Config(od)
434     c.read_write()
435     c.a.append()
436
437
438 def test_consistency_network_netmask_multi_slave_default():
439     a = NetworkOption('a', '', multi=True, properties=('mandatory',))
440     b = NetmaskOption('b', '', default_multi=u'255.255.255.0', multi=True, properties=('mandatory',))
441     od = OptionDescription('a', '', [a, b])
442     od.impl_set_group_type(groups.master)
443     b.impl_add_consistency('network_netmask', a)
444     c = Config(od)
445     c.read_write()
446     c.cfgimpl_get_settings().remove('cache')
447     assert c.a == []
448     assert c.b == []
449     c.a.append(u'192.168.1.0')
450     c.read_only()
451     assert c.a == [u'192.168.1.0']
452     assert c.b == [u'255.255.255.0']
453     c.read_write()
454     raises(ValueError, "c.a[0] = u'192.168.1.2'")
455     raises(ValueError, "c.a.append(u'192.168.1.1')")
456     raises(ValueError, "c.a = [u'192.168.1.0', u'192.168.1.1']")
457     c.a.append()
458     c.b = [u'255.255.255.0', u'255.255.255.255']
459     c.a = [u'192.168.1.0', u'192.168.1.1']
460
461
462 def return_netmask(*args, **kwargs):
463     return u'255.255.255.0'
464
465
466 def return_netmask2(master):
467     if master is not None:
468         if master.endswith('2.1'):
469             return u'255.255.255.0'
470         if not master.endswith('.0'):
471             return u'255.255.255.255'
472     return u'255.255.255.0'
473
474
475 def test_consistency_network_netmask_multi_slave_callback():
476     a = NetworkOption('a', '', multi=True, properties=('mandatory',))
477     b = NetmaskOption('b', '', callback=return_netmask, multi=True, properties=('mandatory',))
478     od = OptionDescription('a', '', [a, b])
479     od.impl_set_group_type(groups.master)
480     b.impl_add_consistency('network_netmask', a)
481     c = Config(od)
482     c.read_write()
483     c.cfgimpl_get_settings().remove('cache')
484     assert c.a == []
485     assert c.b == []
486     c.a.append(u'192.168.1.0')
487     c.read_only()
488     assert c.a == [u'192.168.1.0']
489     assert c.b == [u'255.255.255.0']
490     c.read_write()
491     raises(ValueError, "c.a[0] = u'192.168.1.2'")
492     raises(ValueError, "c.a.append(u'192.168.1.1')")
493     raises(ValueError, "c.a = [u'192.168.1.0', u'192.168.1.1']")
494     c.a.append()
495     c.b = [u'255.255.255.0', u'255.255.255.255']
496     c.a = [u'192.168.1.0', u'192.168.1.1']
497
498
499 def test_consistency_network_netmask_multi_slave_callback_value():
500     a = NetworkOption('a', '', multi=True, properties=('mandatory',))
501     b = NetmaskOption('b', '', callback=return_netmask2, callback_params={'': ((a, False),)}, multi=True, properties=('mandatory',))
502     od = OptionDescription('a', '', [a, b])
503     od.impl_set_group_type(groups.master)
504     b.impl_add_consistency('network_netmask', a)
505     c = Config(od)
506     c.read_write()
507     c.cfgimpl_get_settings().remove('cache')
508     assert c.a == []
509     assert c.b == []
510     c.a.append(u'192.168.1.0')
511     assert c.a == [u'192.168.1.0']
512     assert c.b == [u'255.255.255.0']
513     raises(ValueError, "c.a[0] = u'192.168.2.1'")
514     assert c.a == [u'192.168.1.0']
515     assert c.b == [u'255.255.255.0']
516     raises(ValueError, "c.a = [u'192.168.2.1']")
517     assert c.a == [u'192.168.1.0']
518     assert c.b == [u'255.255.255.0']
519     c.a.append(u'192.168.1.1')
520     c.a = [u'192.168.1.0', u'192.168.1.1']
521     c.b = [u'255.255.255.0', u'255.255.255.255']
522
523
524 def test_consistency_ip_netmask_multi_master():
525     a = IPOption('a', '', multi=True)
526     b = NetmaskOption('b', '', multi=True)
527     od = OptionDescription('a', '', [a, b])
528     od.impl_set_group_type(groups.master)
529     b.impl_add_consistency('ip_netmask', a)
530     c = Config(od)
531     c.a = ['192.168.1.1']
532     c.b = ['255.255.255.0']
533     c.a = ['192.168.1.2']
534     c.b = ['255.255.255.255']
535     c.b = ['255.255.255.0']
536     raises(ValueError, "c.a = ['192.168.1.0']")
537     c.a = ['192.168.1.128']
538     raises(ValueError, "c.b = ['255.255.255.128']")
539     c.a = ['192.168.1.2', '192.168.1.3']
540
541
542 def test_consistency_network_netmask_multi_master():
543     a = NetworkOption('a', '', multi=True)
544     b = NetmaskOption('b', '', multi=True)
545     od = OptionDescription('a', '', [a, b])
546     od.impl_set_group_type(groups.master)
547     b.impl_add_consistency('network_netmask', a)
548     c = Config(od)
549     c.a = ['192.168.1.1']
550     c.b = ['255.255.255.255']
551     del(c.b)
552     c.a = ['192.168.1.0']
553     c.b = ['255.255.255.0']
554     raises(ValueError, "c.a = ['192.168.1.1']")
555
556
557 def test_consistency_broadcast():
558     a = NetworkOption('a', '', multi=True)
559     b = NetmaskOption('b', '', multi=True)
560     c = BroadcastOption('c', '', multi=True)
561     od = OptionDescription('a', '', [a, b, c])
562     od.impl_set_group_type(groups.master)
563     b.impl_add_consistency('network_netmask', a)
564     c.impl_add_consistency('broadcast', a, b)
565     c = Config(od)
566     #first, test network_netmask
567     c.a = ['192.168.1.128']
568     raises(ValueError, "c.b = ['255.255.255.0']")
569     #
570     c.a = ['192.168.1.0']
571     c.b = ['255.255.255.0']
572     c.c = ['192.168.1.255']
573     raises(ValueError, "c.a = ['192.168.1.1']")
574     #
575     c.a = ['192.168.1.0', '192.168.2.128']
576     c.b = ['255.255.255.0', '255.255.255.128']
577     c.c = ['192.168.1.255', '192.168.2.255']
578     raises(ValueError, "c.c[1] = '192.168.2.128'")
579     c.c[1] = '192.168.2.255'
580
581
582 def test_consistency_broadcast_error():
583     a = NetworkOption('a', '', multi=True)
584     b = NetmaskOption('b', '', multi=True)
585     c = BroadcastOption('c', '', multi=True)
586     od = OptionDescription('a', '', [a, b, c])
587     od.impl_set_group_type(groups.master)
588     b.impl_add_consistency('network_netmask', a)
589     c.impl_add_consistency('broadcast', a)
590     c = Config(od)
591     raises(ConfigError, "c.a = ['192.168.1.0']")
592
593
594 def test_consistency_broadcast_warnings():
595     warnings.simplefilter("always", ValueWarning)
596     a = NetworkOption('a', '', properties=('mandatory', 'disabled'))
597     b = NetmaskOption('b', '', properties=('mandatory', 'disabled'))
598     c = NetmaskOption('c', '', properties=('mandatory', 'disabled'))
599     od = OptionDescription('a', '', [a, b, c])
600     b.impl_add_consistency('network_netmask', a, warnings_only=True)
601     c = Config(od)
602     with warnings.catch_warnings(record=True) as w:
603         c.a = '192.168.1.4'
604         c.b = '255.255.255.0'
605     assert len(w) == 1
606     c.read_write()
607     with warnings.catch_warnings(record=True) as w:
608         list(c.cfgimpl_get_values().mandatory_warnings())
609     assert len(w) == 0
610
611
612 def test_consistency_broadcast_default_1():
613     a = NetworkOption('a', '', '192.168.1.0')
614     b = NetmaskOption('b', '', '255.255.255.128')
615     c = BroadcastOption('c', '', '192.168.2.127')
616     od = OptionDescription('a', '', [a, b, c])
617     od
618     raises(ValueError, "c.impl_add_consistency('broadcast', a, b)")
619
620
621 def test_consistency_broadcast_default_2():
622     a = NetworkOption('a', '', '192.168.1.0')
623     b = NetmaskOption('b', '', '255.255.255.128')
624     d = BroadcastOption('d', '', '192.168.1.127')
625     od2 = OptionDescription('a', '', [a, b, d])
626     od2
627     d.impl_add_consistency('broadcast', a, b)
628
629
630 def test_consistency_not_all():
631     #_cache_consistencies is not None by not options has consistencies
632     a = NetworkOption('a', '', multi=True)
633     b = NetmaskOption('b', '', multi=True)
634     c = BroadcastOption('c', '', multi=True)
635     od = OptionDescription('a', '', [a, b, c])
636     od.impl_set_group_type(groups.master)
637     b.impl_add_consistency('network_netmask', a)
638     c = Config(od)
639     c.a = ['192.168.1.0']
640     c.b = ['255.255.255.0']
641     c.c = ['192.168.1.255']
642
643
644 def test_consistency_permissive():
645     a = IntOption('a', '', 1)
646     b = IntOption('b', '', 2, properties=('hidden',))
647     od = OptionDescription('od', '', [a, b])
648     a.impl_add_consistency('not_equal', b)
649     c = Config(od)
650     c.cfgimpl_get_settings().setpermissive(('hidden',))
651     c.read_write()
652     c.a = 1
653
654
655 def test_consistency_disabled():
656     a = IntOption('a', '')
657     b = IntOption('b', '', properties=('disabled',))
658     od = OptionDescription('od', '', [a, b])
659     a.impl_add_consistency('not_equal', b)
660     c = Config(od)
661     c.read_write()
662     raises(PropertiesOptionError, "c.a = 1")
663
664
665 def test_consistency_disabled_transitive():
666     a = IntOption('a', '')
667     b = IntOption('b', '', properties=('disabled',))
668     od = OptionDescription('od', '', [a, b])
669     a.impl_add_consistency('not_equal', b, transitive=False)
670     c = Config(od)
671     c.read_write()
672     c.a = 1
673
674
675 def test_consistency_disabled_transitive_2():
676     a = IPOption('a', '')
677     b = IPOption('b', '')
678     c = NetworkOption('c', '', default='192.168.1.0')
679     d = NetmaskOption('d', '', default='255.255.255.0', properties=('disabled',))
680     od = OptionDescription('od', '', [a, b, c, d])
681     a.impl_add_consistency('not_equal', b)
682     a.impl_add_consistency('in_network', c, d, transitive=False)
683     c = Config(od)
684     c.read_write()
685     c.a = '192.168.1.1'
686     raises(ValueError, "c.b = '192.168.1.1'")
687     c.a = '192.168.2.1'
688     #
689     c.a = '192.168.1.1'
690     c.cfgimpl_get_settings().remove('disabled')
691     raises(ValueError, "c.a = '192.168.2.1'")
692
693
694 def return_val(*args, **kwargs):
695     return '192.168.1.1'
696
697
698 def test_consistency_with_callback():
699     a = NetworkOption('a', '', default='192.168.1.0')
700     b = NetmaskOption('b', '', default='255.255.255.0')
701     c = IPOption('c', '', callback=return_val, callback_params={'': ((a, False),)})
702     od = OptionDescription('od', '', [a, b, c])
703     c.impl_add_consistency('in_network', a, b)
704     cfg = Config(od)
705     cfg.c
706
707
708 def test_consistency_double_warnings():
709     a = IntOption('a', '')
710     b = IntOption('b', '', 1)
711     c = IntOption('c', '', 1)
712     od = OptionDescription('od', '', [a, b, c])
713     warnings.simplefilter("always", ValueWarning)
714     a.impl_add_consistency('not_equal', b, warnings_only=True)
715     a.impl_add_consistency('not_equal', c, warnings_only=True)
716     cfg = Config(od)
717     with warnings.catch_warnings(record=True) as w:
718         cfg.a = 1
719     assert w != []
720     assert len(w) == 2
721     with warnings.catch_warnings(record=True) as w:
722         cfg.c = 2
723     assert w == []
724     with warnings.catch_warnings(record=True) as w:
725         cfg.a = 2
726     assert w != []
727     assert len(w) == 1
728     cfg.cfgimpl_get_settings().remove('warnings')
729     with warnings.catch_warnings(record=True) as w:
730         cfg.a = 1
731     assert w == []
732
733
734 def test_consistency_warnings_error():
735     a = IntOption('a', '')
736     b = IntOption('b', '', 1)
737     c = IntOption('c', '', 1)
738     od = OptionDescription('od', '', [a, b, c])
739     warnings.simplefilter("always", ValueWarning)
740     a.impl_add_consistency('not_equal', b, warnings_only=True)
741     a.impl_add_consistency('not_equal', c)
742     cfg = Config(od)
743     with warnings.catch_warnings(record=True) as w:
744         raises(ValueError, "cfg.a = 1")
745     assert w == []