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     #FIXME a cause du read_only
106     #raises(AttributeError, "a.impl_add_consistency('not_equal', b)")
107
108
109 def test_consistency_not_equal_symlink():
110     a = IntOption('a', '')
111     b = IntOption('b', '')
112     c = SymLinkOption('c', a)
113     od = OptionDescription('od', '', [a, b, c])
114     a.impl_add_consistency('not_equal', b)
115     c = Config(od)
116     assert set(od._cache_consistencies.keys()) == set([a, b])
117
118
119 def test_consistency_not_equal_multi():
120     a = IntOption('a', '', multi=True)
121     b = IntOption('b', '', multi=True)
122     od = OptionDescription('od', '', [a, b])
123     a.impl_add_consistency('not_equal', b)
124     c = Config(od)
125     assert c.a == []
126     assert c.b == []
127     c.a = [1]
128     del(c.a)
129     c.a = [1]
130     raises(ValueError, "c.b = [1]")
131     c.b = [2]
132
133
134 def test_consistency_default():
135     a = IntOption('a', '', 1)
136     b = IntOption('b', '', 1)
137     raises(ValueError, "a.impl_add_consistency('not_equal', b)")
138
139
140 def test_consistency_default_multi():
141     a = IntOption('a', '', [2, 1], multi=True)
142     b = IntOption('b', '', [1, 1], multi=True)
143     c = IntOption('c', '', [1, 2], multi=True)
144     raises(ValueError, "a.impl_add_consistency('not_equal', b)")
145     a.impl_add_consistency('not_equal', c)
146
147
148 def test_consistency_default_diff():
149     a = IntOption('a', '', 3)
150     b = IntOption('b', '', 1)
151     od = OptionDescription('od', '', [a, b])
152     a.impl_add_consistency('not_equal', b)
153     c = Config(od)
154     raises(ValueError, "c.a = 1")
155     c.a = 2
156     c.b = 3
157     assert c.getowner(a) is owners.user
158     raises(ValueError, "del(c.a)")
159     assert c.getowner(a) is owners.user
160
161
162 def test_consistency_ip_netmask():
163     a = IPOption('a', '')
164     b = NetmaskOption('b', '')
165     od = OptionDescription('od', '', [a, b])
166     b.impl_add_consistency('ip_netmask', a)
167     c = Config(od)
168     c.a = '192.168.1.1'
169     c.b = '255.255.255.0'
170     c.a = '192.168.1.2'
171     c.b = '255.255.255.255'
172     c.b = '255.255.255.0'
173     raises(ValueError, "c.a = '192.168.1.0'")
174
175
176 def test_consistency_network_netmask():
177     a = NetworkOption('a', '')
178     b = NetmaskOption('b', '')
179     od = OptionDescription('od', '', [a, b])
180     b.impl_add_consistency('network_netmask', a)
181     c = Config(od)
182     c.a = '192.168.1.1'
183     c.b = '255.255.255.255'
184     del(c.b)
185     c.a = '192.168.1.0'
186     c.b = '255.255.255.0'
187     raises(ValueError, "c.a = '192.168.1.1'")
188
189
190 def test_consistency_ip_netmask_error_multi():
191     a = IPOption('a', '', multi=True)
192     b = NetmaskOption('b', '')
193     od = OptionDescription('od', '', [a, b])
194     raises(ConfigError, "b.impl_add_consistency('ip_netmask', a)")
195
196
197 def test_consistency_ip_netmask_multi():
198     a = IPOption('a', '', multi=True)
199     b = NetmaskOption('b', '', multi=True)
200     od = OptionDescription('od', '', [a, b])
201     b.impl_add_consistency('ip_netmask', a)
202     c = Config(od)
203     c.a = ['192.168.1.1']
204     c.b = ['255.255.255.0']
205     c.a = ['192.168.1.2']
206     c.b = ['255.255.255.255']
207     c.b = ['255.255.255.0']
208     raises(ValueError, "c.a = ['192.168.1.0']")
209
210
211 def test_consistency_network_netmask_multi():
212     a = NetworkOption('a', '', multi=True)
213     b = NetmaskOption('b', '', multi=True)
214     od = OptionDescription('od', '', [a, b])
215     b.impl_add_consistency('network_netmask', a)
216     c = Config(od)
217     c.a = ['192.168.1.1']
218     c.b = ['255.255.255.255']
219     del(c.b)
220     c.a = ['192.168.1.0']
221     c.b = ['255.255.255.0']
222     raises(ValueError, "c.a = ['192.168.1.1']")
223
224
225 def test_consistency_ip_netmask_multi_master():
226     a = IPOption('a', '', multi=True)
227     b = NetmaskOption('b', '', multi=True)
228     od = OptionDescription('a', '', [a, b])
229     od.impl_set_group_type(groups.master)
230     b.impl_add_consistency('ip_netmask', a)
231     c = Config(od)
232     c.a = ['192.168.1.1']
233     c.b = ['255.255.255.0']
234     c.a = ['192.168.1.2']
235     c.b = ['255.255.255.255']
236     c.b = ['255.255.255.0']
237     raises(ValueError, "c.a = ['192.168.1.0']")
238     c.a = ['192.168.1.2', '192.168.1.3']
239
240
241 def test_consistency_network_netmask_multi_master():
242     a = NetworkOption('a', '', multi=True)
243     b = NetmaskOption('b', '', multi=True)
244     od = OptionDescription('a', '', [a, b])
245     od.impl_set_group_type(groups.master)
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_broadcast():
257     a = NetworkOption('a', '', multi=True)
258     b = NetmaskOption('b', '', multi=True)
259     c = BroadcastOption('c', '', multi=True)
260     od = OptionDescription('a', '', [a, b, c])
261     od.impl_set_group_type(groups.master)
262     b.impl_add_consistency('network_netmask', a)
263     c.impl_add_consistency('broadcast', a, b)
264     c = Config(od)
265     #first, test network_netmask
266     c.a = ['192.168.1.128']
267     raises(ValueError, "c.b = ['255.255.255.0']")
268     #
269     c.a = ['192.168.1.0']
270     c.b = ['255.255.255.0']
271     c.c = ['192.168.1.255']
272     raises(ValueError, "c.a = ['192.168.1.1']")
273     #
274     c.a = ['192.168.1.0', '192.168.2.128']
275     c.b = ['255.255.255.0', '255.255.255.128']
276     c.c = ['192.168.1.255', '192.168.2.255']
277     raises(ValueError, "c.c[1] = '192.168.2.128'")
278     c.c[1] = '192.168.2.255'
279
280
281 def test_consistency_broadcast_default_1():
282     a = NetworkOption('a', '', '192.168.1.0')
283     b = NetmaskOption('b', '', '255.255.255.128')
284     c = BroadcastOption('c', '', '192.168.2.127')
285     d = BroadcastOption('d', '', '192.168.1.127')
286     od = OptionDescription('a', '', [a, b, c])
287     raises(ValueError, "c.impl_add_consistency('broadcast', a, b)")
288
289
290 def test_consistency_broadcast_default_2():
291     a = NetworkOption('a', '', '192.168.1.0')
292     b = NetmaskOption('b', '', '255.255.255.128')
293     c = BroadcastOption('c', '', '192.168.2.127')
294     d = BroadcastOption('d', '', '192.168.1.127')
295     od2 = OptionDescription('a', '', [a, b, d])
296     d.impl_add_consistency('broadcast', a, b)
297
298
299 def test_consistency_not_all():
300     #_cache_consistencies is not None by not options has consistencies
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 = Config(od)
308     c.a = ['192.168.1.0']
309     c.b = ['255.255.255.0']
310     c.c = ['192.168.1.255']