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