first version with sqlalchemy option's storage
[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_not_equal():
12     a = IntOption('a', '')
13     b = IntOption('b', '')
14     od = OptionDescription('od', '', [a, b])
15     a.impl_add_consistency('not_equal', b)
16     c = Config(od)
17     assert c.a is None
18     assert c.b is None
19     c.a = 1
20     del(c.a)
21     c.a = 1
22     raises(ValueError, "c.b = 1")
23     c.b = 2
24
25
26 def test_consistency_not_equal_many_opts():
27     a = IntOption('a', '')
28     b = IntOption('b', '')
29     c = IntOption('c', '')
30     d = IntOption('d', '')
31     e = IntOption('e', '')
32     f = IntOption('f', '')
33     od = OptionDescription('od', '', [a, b, c, d, e, f])
34     a.impl_add_consistency('not_equal', b, c, d, e, f)
35     c = Config(od)
36     assert c.a is None
37     assert c.b is None
38     #
39     c.a = 1
40     del(c.a)
41     #
42     c.a = 1
43     raises(ValueError, "c.b = 1")
44     #
45     c.b = 2
46     raises(ValueError, "c.f = 2")
47     raises(ValueError, "c.f = 1")
48     #
49     c.d = 3
50     raises(ValueError, "c.f = 3")
51     raises(ValueError, "c.a = 3")
52     raises(ValueError, "c.c = 3")
53     raises(ValueError, "c.e = 3")
54
55
56 def test_consistency_not_in_config_1():
57     a = IntOption('a', '')
58     b = IntOption('b', '')
59     a.impl_add_consistency('not_equal', b)
60     od1 = OptionDescription('od1', '', [a])
61     od2 = OptionDescription('od2', '', [b])
62     od = OptionDescription('root', '', [od1])
63     raises(ConfigError, "Config(od)")
64
65
66 def test_consistency_not_in_config_2():
67     a = IntOption('a', '')
68     b = IntOption('b', '')
69     a.impl_add_consistency('not_equal', b)
70     od1 = OptionDescription('od1', '', [a])
71     od2 = OptionDescription('od2', '', [b])
72     od = OptionDescription('root', '', [od1, od2])
73     Config(od)
74
75
76 def test_consistency_not_in_config_3():
77     a = IntOption('a', '')
78     b = IntOption('b', '')
79     a.impl_add_consistency('not_equal', b)
80     od1 = OptionDescription('od1', '', [a])
81     od2 = OptionDescription('od2', '', [b])
82     od = OptionDescription('root', '', [od1, od2])
83     #with subconfig
84     raises(ConfigError, "Config(od.od1)")
85
86
87 def test_consistency_after_config():
88     a = IntOption('a', '')
89     b = IntOption('b', '')
90     od1 = OptionDescription('od1', '', [a])
91     od2 = OptionDescription('od2', '', [b])
92     od = OptionDescription('root', '', [od1, od2])
93     Config(od)
94     #FIXME a cause du read_only
95     #raises(AttributeError, "a.impl_add_consistency('not_equal', b)")
96
97
98 def test_consistency_not_equal_symlink():
99     a = IntOption('a', '')
100     b = IntOption('b', '')
101     c = SymLinkOption('c', a)
102     od = OptionDescription('od', '', [a, b, c])
103     a.impl_add_consistency('not_equal', b)
104     c = Config(od)
105     assert set(od._cache_consistencies.keys()) == set([a, b])
106
107
108 def test_consistency_not_equal_multi():
109     a = IntOption('a', '', multi=True)
110     b = IntOption('b', '', multi=True)
111     od = OptionDescription('od', '', [a, b])
112     a.impl_add_consistency('not_equal', b)
113     c = Config(od)
114     assert c.a == []
115     assert c.b == []
116     c.a = [1]
117     del(c.a)
118     c.a = [1]
119     raises(ValueError, "c.b = [1]")
120     c.b = [2]
121
122
123 def test_consistency_default():
124     a = IntOption('a', '', 1)
125     b = IntOption('b', '', 1)
126     raises(ValueError, "a.impl_add_consistency('not_equal', b)")
127
128
129 def test_consistency_default_multi():
130     a = IntOption('a', '', [2, 1], multi=True)
131     b = IntOption('b', '', [1, 1], multi=True)
132     c = IntOption('c', '', [1, 2], multi=True)
133     raises(ValueError, "a.impl_add_consistency('not_equal', b)")
134     a.impl_add_consistency('not_equal', c)
135
136
137 def test_consistency_default_diff():
138     a = IntOption('a', '', 3)
139     b = IntOption('b', '', 1)
140     od = OptionDescription('od', '', [a, b])
141     a.impl_add_consistency('not_equal', b)
142     c = Config(od)
143     raises(ValueError, "c.a = 1")
144     c.a = 2
145     c.b = 3
146     assert c.getowner(a) is owners.user
147     raises(ValueError, "del(c.a)")
148     assert c.getowner(a) is owners.user
149
150
151 def test_consistency_ip_netmask():
152     a = IPOption('a', '')
153     b = NetmaskOption('b', '')
154     od = OptionDescription('od', '', [a, b])
155     b.impl_add_consistency('ip_netmask', a)
156     c = Config(od)
157     c.a = '192.168.1.1'
158     c.b = '255.255.255.0'
159     c.a = '192.168.1.2'
160     c.b = '255.255.255.255'
161     c.b = '255.255.255.0'
162     raises(ValueError, "c.a = '192.168.1.0'")
163
164
165 def test_consistency_network_netmask():
166     a = NetworkOption('a', '')
167     b = NetmaskOption('b', '')
168     od = OptionDescription('od', '', [a, b])
169     b.impl_add_consistency('network_netmask', a)
170     c = Config(od)
171     c.a = '192.168.1.1'
172     c.b = '255.255.255.255'
173     del(c.b)
174     c.a = '192.168.1.0'
175     c.b = '255.255.255.0'
176     raises(ValueError, "c.a = '192.168.1.1'")
177
178
179 def test_consistency_ip_netmask_error_multi():
180     a = IPOption('a', '', multi=True)
181     b = NetmaskOption('b', '')
182     od = OptionDescription('od', '', [a, b])
183     raises(ConfigError, "b.impl_add_consistency('ip_netmask', a)")
184
185
186 def test_consistency_ip_netmask_multi():
187     a = IPOption('a', '', multi=True)
188     b = NetmaskOption('b', '', multi=True)
189     od = OptionDescription('od', '', [a, b])
190     b.impl_add_consistency('ip_netmask', a)
191     c = Config(od)
192     c.a = ['192.168.1.1']
193     c.b = ['255.255.255.0']
194     c.a = ['192.168.1.2']
195     c.b = ['255.255.255.255']
196     c.b = ['255.255.255.0']
197     raises(ValueError, "c.a = ['192.168.1.0']")
198
199
200 def test_consistency_network_netmask_multi():
201     a = NetworkOption('a', '', multi=True)
202     b = NetmaskOption('b', '', multi=True)
203     od = OptionDescription('od', '', [a, b])
204     b.impl_add_consistency('network_netmask', a)
205     c = Config(od)
206     c.a = ['192.168.1.1']
207     c.b = ['255.255.255.255']
208     del(c.b)
209     c.a = ['192.168.1.0']
210     c.b = ['255.255.255.0']
211     raises(ValueError, "c.a = ['192.168.1.1']")
212
213
214 def test_consistency_ip_netmask_multi_master():
215     a = IPOption('a', '', multi=True)
216     b = NetmaskOption('b', '', multi=True)
217     od = OptionDescription('a', '', [a, b])
218     od.impl_set_group_type(groups.master)
219     b.impl_add_consistency('ip_netmask', a)
220     c = Config(od)
221     c.a = ['192.168.1.1']
222     c.b = ['255.255.255.0']
223     c.a = ['192.168.1.2']
224     c.b = ['255.255.255.255']
225     c.b = ['255.255.255.0']
226     raises(ValueError, "c.a = ['192.168.1.0']")
227     c.a = ['192.168.1.2', '192.168.1.3']
228
229
230 def test_consistency_network_netmask_multi_master():
231     a = NetworkOption('a', '', multi=True)
232     b = NetmaskOption('b', '', multi=True)
233     od = OptionDescription('a', '', [a, b])
234     od.impl_set_group_type(groups.master)
235     b.impl_add_consistency('network_netmask', a)
236     c = Config(od)
237     c.a = ['192.168.1.1']
238     c.b = ['255.255.255.255']
239     del(c.b)
240     c.a = ['192.168.1.0']
241     c.b = ['255.255.255.0']
242     raises(ValueError, "c.a = ['192.168.1.1']")
243
244
245 def test_consistency_broadcast():
246     a = NetworkOption('a', '', multi=True)
247     b = NetmaskOption('b', '', multi=True)
248     c = BroadcastOption('c', '', multi=True)
249     od = OptionDescription('a', '', [a, b, c])
250     od.impl_set_group_type(groups.master)
251     b.impl_add_consistency('network_netmask', a)
252     c.impl_add_consistency('broadcast', a, b)
253     c = Config(od)
254     #first, test network_netmask
255     c.a = ['192.168.1.128']
256     raises(ValueError, "c.b = ['255.255.255.0']")
257     #
258     c.a = ['192.168.1.0']
259     c.b = ['255.255.255.0']
260     c.c = ['192.168.1.255']
261     raises(ValueError, "c.a = ['192.168.1.1']")
262     #
263     c.a = ['192.168.1.0', '192.168.2.128']
264     c.b = ['255.255.255.0', '255.255.255.128']
265     c.c = ['192.168.1.255', '192.168.2.255']
266     raises(ValueError, "c.c[1] = '192.168.2.128'")
267     c.c[1] = '192.168.2.255'
268
269
270 def test_consistency_broadcast_default_1():
271     a = NetworkOption('a', '', '192.168.1.0')
272     b = NetmaskOption('b', '', '255.255.255.128')
273     c = BroadcastOption('c', '', '192.168.2.127')
274     d = BroadcastOption('d', '', '192.168.1.127')
275     od = OptionDescription('a', '', [a, b, c])
276     raises(ValueError, "c.impl_add_consistency('broadcast', a, b)")
277
278
279 def test_consistency_broadcast_default_2():
280     a = NetworkOption('a', '', '192.168.1.0')
281     b = NetmaskOption('b', '', '255.255.255.128')
282     c = BroadcastOption('c', '', '192.168.2.127')
283     d = BroadcastOption('d', '', '192.168.1.127')
284     od2 = OptionDescription('a', '', [a, b, d])
285     d.impl_add_consistency('broadcast', a, b)
286
287
288 def test_consistency_not_all():
289     #_cache_consistencies is not None by not options has consistencies
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 = Config(od)
297     c.a = ['192.168.1.0']
298     c.b = ['255.255.255.0']
299     c.c = ['192.168.1.255']