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