Merge branch 'master' into orm
[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_1():
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
76
77 def test_consistency_not_in_config_2():
78     a = IntOption('a', '')
79     b = IntOption('b', '')
80     a.impl_add_consistency('not_equal', b)
81     od1 = OptionDescription('od1', '', [a])
82     od2 = OptionDescription('od2', '', [b])
83     od = OptionDescription('root', '', [od1, od2])
84     Config(od)
85
86
87 def test_consistency_not_in_config_3():
88     a = IntOption('a', '')
89     b = IntOption('b', '')
90     a.impl_add_consistency('not_equal', b)
91     od1 = OptionDescription('od1', '', [a])
92     od2 = OptionDescription('od2', '', [b])
93     od = OptionDescription('root', '', [od1, od2])
94     #with subconfig
95     raises(ConfigError, "Config(od.od1)")
96
97
98 def test_consistency_after_config():
99     a = IntOption('a', '')
100     b = IntOption('b', '')
101     od1 = OptionDescription('od1', '', [a])
102     od2 = OptionDescription('od2', '', [b])
103     od = OptionDescription('root', '', [od1, od2])
104     Config(od)
105     raises(AttributeError, "a.impl_add_consistency('not_equal', b)")
106
107
108 def test_consistency_not_equal_symlink():
109     a = IntOption('a', '')
110     b = IntOption('b', '')
111     c = SymLinkOption('c', a)
112     od = OptionDescription('od', '', [a, b, c])
113     a.impl_add_consistency('not_equal', b)
114     c = Config(od)
115     assert set(od._cache_consistencies.keys()) == set([a, b])
116
117
118 def test_consistency_not_equal_multi():
119     a = IntOption('a', '', multi=True)
120     b = IntOption('b', '', multi=True)
121     od = OptionDescription('od', '', [a, b])
122     a.impl_add_consistency('not_equal', b)
123     c = Config(od)
124     assert c.a == []
125     assert c.b == []
126     c.a = [1]
127     del(c.a)
128     c.a = [1]
129     raises(ValueError, "c.b = [1]")
130     c.b = [2]
131
132
133 def test_consistency_default():
134     a = IntOption('a', '', 1)
135     b = IntOption('b', '', 1)
136     raises(ValueError, "a.impl_add_consistency('not_equal', b)")
137
138
139 def test_consistency_default_multi():
140     a = IntOption('a', '', [2, 1], multi=True)
141     b = IntOption('b', '', [1, 1], multi=True)
142     c = IntOption('c', '', [1, 2], multi=True)
143     raises(ValueError, "a.impl_add_consistency('not_equal', b)")
144     a.impl_add_consistency('not_equal', c)
145
146
147 def test_consistency_default_diff():
148     a = IntOption('a', '', 3)
149     b = IntOption('b', '', 1)
150     od = OptionDescription('od', '', [a, b])
151     a.impl_add_consistency('not_equal', b)
152     c = Config(od)
153     raises(ValueError, "c.a = 1")
154     c.a = 2
155     c.b = 3
156     assert c.getowner(a) is owners.user
157     raises(ValueError, "del(c.a)")
158     assert c.getowner(a) is owners.user
159
160
161 def test_consistency_ip_netmask():
162     a = IPOption('a', '')
163     b = NetmaskOption('b', '')
164     od = OptionDescription('od', '', [a, b])
165     b.impl_add_consistency('ip_netmask', a)
166     c = Config(od)
167     c.a = '192.168.1.1'
168     c.b = '255.255.255.0'
169     c.a = '192.168.1.2'
170     c.b = '255.255.255.255'
171     c.b = '255.255.255.0'
172     raises(ValueError, "c.a = '192.168.1.0'")
173
174
175 def test_consistency_network_netmask():
176     a = NetworkOption('a', '')
177     b = NetmaskOption('b', '')
178     od = OptionDescription('od', '', [a, b])
179     b.impl_add_consistency('network_netmask', a)
180     c = Config(od)
181     c.a = '192.168.1.1'
182     c.b = '255.255.255.255'
183     del(c.b)
184     c.a = '192.168.1.0'
185     c.b = '255.255.255.0'
186     raises(ValueError, "c.a = '192.168.1.1'")
187
188
189 def test_consistency_ip_netmask_network_error():
190     a = IPOption('a', '')
191     b = NetworkOption('b', '')
192     c = NetmaskOption('c', '')
193     od = OptionDescription('od', '', [a, b, c])
194     c.impl_add_consistency('ip_netmask', a, b)
195     c = Config(od)
196     c.a = '192.168.1.1'
197     c.b = '192.168.1.0'
198     raises(ConfigError, "c.c = '255.255.255.0'")
199
200
201 def test_consistency_ip_netmask_error_multi():
202     a = IPOption('a', '', multi=True)
203     b = NetmaskOption('b', '')
204     od = OptionDescription('od', '', [a, b])
205     raises(ConfigError, "b.impl_add_consistency('ip_netmask', a)")
206
207
208 def test_consistency_ip_netmask_multi():
209     a = IPOption('a', '', multi=True)
210     b = NetmaskOption('b', '', multi=True)
211     od = OptionDescription('od', '', [a, b])
212     b.impl_add_consistency('ip_netmask', a)
213     c = Config(od)
214     c.a = ['192.168.1.1']
215     c.b = ['255.255.255.0']
216     c.a = ['192.168.1.2']
217     c.b = ['255.255.255.255']
218     c.b = ['255.255.255.0']
219     raises(ValueError, "c.a = ['192.168.1.0']")
220
221
222 def test_consistency_network_netmask_multi():
223     a = NetworkOption('a', '', multi=True)
224     b = NetmaskOption('b', '', multi=True)
225     od = OptionDescription('od', '', [a, b])
226     b.impl_add_consistency('network_netmask', a)
227     c = Config(od)
228     c.a = ['192.168.1.1']
229     c.b = ['255.255.255.255']
230     del(c.b)
231     c.a = ['192.168.1.0']
232     c.b = ['255.255.255.0']
233     raises(ValueError, "c.a = ['192.168.1.1']")
234
235
236 def test_consistency_ip_netmask_multi_master():
237     a = IPOption('a', '', multi=True)
238     b = NetmaskOption('b', '', multi=True)
239     od = OptionDescription('a', '', [a, b])
240     od.impl_set_group_type(groups.master)
241     b.impl_add_consistency('ip_netmask', a)
242     c = Config(od)
243     c.a = ['192.168.1.1']
244     c.b = ['255.255.255.0']
245     c.a = ['192.168.1.2']
246     c.b = ['255.255.255.255']
247     c.b = ['255.255.255.0']
248     raises(ValueError, "c.a = ['192.168.1.0']")
249     c.a = ['192.168.1.128']
250     raises(ValueError, "c.b = ['255.255.255.128']")
251     c.a = ['192.168.1.2', '192.168.1.3']
252
253
254 def test_consistency_network_netmask_multi_master():
255     a = NetworkOption('a', '', multi=True)
256     b = NetmaskOption('b', '', multi=True)
257     od = OptionDescription('a', '', [a, b])
258     od.impl_set_group_type(groups.master)
259     b.impl_add_consistency('network_netmask', a)
260     c = Config(od)
261     c.a = ['192.168.1.1']
262     c.b = ['255.255.255.255']
263     del(c.b)
264     c.a = ['192.168.1.0']
265     c.b = ['255.255.255.0']
266     raises(ValueError, "c.a = ['192.168.1.1']")
267
268
269 def test_consistency_broadcast():
270     a = NetworkOption('a', '', multi=True)
271     b = NetmaskOption('b', '', multi=True)
272     c = BroadcastOption('c', '', multi=True)
273     od = OptionDescription('a', '', [a, b, c])
274     od.impl_set_group_type(groups.master)
275     b.impl_add_consistency('network_netmask', a)
276     c.impl_add_consistency('broadcast', a, b)
277     c = Config(od)
278     #first, test network_netmask
279     c.a = ['192.168.1.128']
280     raises(ValueError, "c.b = ['255.255.255.0']")
281     #
282     c.a = ['192.168.1.0']
283     c.b = ['255.255.255.0']
284     c.c = ['192.168.1.255']
285     raises(ValueError, "c.a = ['192.168.1.1']")
286     #
287     c.a = ['192.168.1.0', '192.168.2.128']
288     c.b = ['255.255.255.0', '255.255.255.128']
289     c.c = ['192.168.1.255', '192.168.2.255']
290     raises(ValueError, "c.c[1] = '192.168.2.128'")
291     c.c[1] = '192.168.2.255'
292
293
294 def test_consistency_broadcast_error():
295     a = NetworkOption('a', '', multi=True)
296     b = NetmaskOption('b', '', multi=True)
297     c = BroadcastOption('c', '', multi=True)
298     od = OptionDescription('a', '', [a, b, c])
299     od.impl_set_group_type(groups.master)
300     b.impl_add_consistency('network_netmask', a)
301     c.impl_add_consistency('broadcast', a)
302     c = Config(od)
303     c.a = ['192.168.1.0']
304     c.b = ['255.255.255.0']
305     raises(ConfigError, "c.c = ['192.168.1.255']")
306
307
308 def test_consistency_broadcast_default_1():
309     a = NetworkOption('a', '', '192.168.1.0')
310     b = NetmaskOption('b', '', '255.255.255.128')
311     c = BroadcastOption('c', '', '192.168.2.127')
312     d = BroadcastOption('d', '', '192.168.1.127')
313     od = OptionDescription('a', '', [a, b, c])
314     raises(ValueError, "c.impl_add_consistency('broadcast', a, b)")
315
316
317 def test_consistency_broadcast_default_2():
318     a = NetworkOption('a', '', '192.168.1.0')
319     b = NetmaskOption('b', '', '255.255.255.128')
320     c = BroadcastOption('c', '', '192.168.2.127')
321     d = BroadcastOption('d', '', '192.168.1.127')
322     od2 = OptionDescription('a', '', [a, b, d])
323     d.impl_add_consistency('broadcast', a, b)
324
325
326 def test_consistency_not_all():
327     #_cache_consistencies is not None by not options has consistencies
328     a = NetworkOption('a', '', multi=True)
329     b = NetmaskOption('b', '', multi=True)
330     c = BroadcastOption('c', '', multi=True)
331     od = OptionDescription('a', '', [a, b, c])
332     od.impl_set_group_type(groups.master)
333     b.impl_add_consistency('network_netmask', a)
334     c = Config(od)
335     c.a = ['192.168.1.0']
336     c.b = ['255.255.255.0']
337     c.c = ['192.168.1.255']
338
339
340 def test_consistency_permissive():
341     a = IntOption('a', '', 1)
342     b = IntOption('b', '', 2, properties=('hidden',))
343     od = OptionDescription('od', '', [a, b])
344     a.impl_add_consistency('not_equal', b)
345     c = Config(od)
346     c.cfgimpl_get_settings().setpermissive(('hidden',))
347     c.read_write()
348     c.a = 1