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