python 3.5 support
[tiramisu.git] / test / test_submulti.py
1 # coding: utf-8
2 from .autopath import do_autopath
3 do_autopath()
4
5 from tiramisu.setting import groups, owners
6 from tiramisu.config import Config, MetaConfig
7 from tiramisu.option import StrOption, IntOption, OptionDescription, submulti
8 from tiramisu.value import SubMulti, Multi
9 from tiramisu.error import SlaveError
10
11 from py.test import raises
12
13
14 def return_val(val=None):
15     if val is None:
16         return 'val'
17     else:
18         return val
19
20
21 def return_list(value=None):
22     return ['val', 'val']
23
24
25 def return_list2(value=None):
26     return [['val', 'val']]
27
28
29 def test_submulti():
30     multi = StrOption('multi', '', multi=submulti)
31     multi2 = StrOption('multi2', '', default_multi='yes', multi=submulti)
32     multi3 = StrOption('multi3', '', default=[['yes']], multi=submulti)
33     od = OptionDescription('od', '', [multi, multi2, multi3])
34     cfg = Config(od)
35     assert cfg.getowner(multi) == owners.default
36     assert cfg.multi == []
37     assert cfg.getowner(multi) == owners.default
38     assert cfg.getowner(multi) == owners.default
39     assert cfg.multi3 == [['yes']]
40     assert cfg.multi3[0] == ['yes']
41     assert cfg.multi3[0][0] == 'yes'
42     cfg.multi3[0]
43     assert cfg.getowner(multi) == owners.default
44
45
46 def test_append_submulti():
47     multi = StrOption('multi', '', multi=submulti)
48     multi2 = StrOption('multi2', '', default_multi='yes', multi=submulti)
49     multi3 = StrOption('multi3', '', default=[['yes']], multi=submulti)
50     od = OptionDescription('od', '', [multi, multi2, multi3])
51     cfg = Config(od)
52     owner = cfg.cfgimpl_get_settings().getowner()
53     assert cfg.multi == []
54     assert cfg.getowner(multi) == owners.default
55     cfg.multi.append()
56     assert cfg.getowner(multi) == owner
57     assert cfg.multi == [[]]
58     cfg.multi.append(['no'])
59     assert cfg.multi == [[], ['no']]
60     #
61     assert cfg.multi2 == []
62     assert cfg.getowner(multi2) == owners.default
63     cfg.multi2.append()
64     assert cfg.getowner(multi2) == owner
65     assert cfg.multi2 == [['yes']]
66     cfg.multi2.append(['no'])
67     assert cfg.multi2 == [['yes'], ['no']]
68     #
69     assert cfg.multi3 == [['yes']]
70     assert cfg.getowner(multi3) == owners.default
71     cfg.multi3.append()
72     assert cfg.getowner(multi3) == owner
73     assert cfg.multi3 == [['yes'], []]
74     cfg.multi3.append(['no'])
75     assert cfg.multi3 == [['yes'], [], ['no']]
76
77
78 def test_append_unvalide_submulti():
79     multi = StrOption('multi', '', multi=submulti)
80     multi2 = StrOption('multi2', '', default_multi='yes', multi=submulti)
81     multi3 = StrOption('multi3', '', default=[['yes']], multi=submulti)
82     od = OptionDescription('od', '', [multi, multi2, multi3])
83     cfg = Config(od)
84     assert cfg.multi == []
85     assert cfg.getowner(multi) == owners.default
86     raises(ValueError, "cfg.multi.append(1)")
87     assert cfg.multi == []
88     assert cfg.getowner(multi) == owners.default
89     #
90     assert cfg.multi2 == []
91     raises(ValueError, "cfg.multi2.append('no')")
92     assert cfg.getowner(multi) == owners.default
93     assert cfg.multi2 == []
94     #
95     assert cfg.multi3 == [['yes']]
96     assert cfg.getowner(multi3) == owners.default
97     raises(ValueError, "cfg.multi3[0].append(1)")
98     assert cfg.multi3 == [['yes']]
99     assert cfg.getowner(multi3) == owners.default
100     raises(ValueError, "cfg.multi3[0].append([])")
101     assert cfg.multi3 == [['yes']]
102     assert cfg.getowner(multi3) == owners.default
103
104
105 def test_pop_submulti():
106     multi = StrOption('multi', '', multi=submulti)
107     multi2 = StrOption('multi2', '', default_multi='yes', multi=submulti)
108     multi3 = StrOption('multi3', '', default=[['yes']], multi=submulti)
109     od = OptionDescription('od', '', [multi, multi2, multi3])
110     cfg = Config(od)
111     owner = cfg.cfgimpl_get_settings().getowner()
112     assert cfg.multi == []
113     assert cfg.getowner(multi3) == owners.default
114     cfg.multi = [['no', 'yes'], ['peharps']]
115     assert cfg.getowner(multi) == owner
116     assert cfg.multi == [['no', 'yes'], ['peharps']]
117     cfg.multi[0].pop(1)
118     assert cfg.multi == [['no'], ['peharps']]
119     cfg.multi[0].pop(0)
120     assert cfg.multi == [[], ['peharps']]
121     cfg.multi.pop(1)
122     assert cfg.multi == [[]]
123     cfg.multi.pop(0)
124     assert cfg.multi == []
125     #
126     assert cfg.multi3 == [['yes']]
127     assert cfg.getowner(multi3) == owners.default
128     cfg.multi3.pop(0)
129     assert cfg.getowner(multi) == owner
130     assert cfg.multi3 == []
131     del(cfg.multi3)
132     assert cfg.getowner(multi3) == owners.default
133     cfg.multi3[0].pop(0)
134     assert cfg.getowner(multi3) == owner
135     assert cfg.multi3 == [[]]
136
137
138 def test_sort_submulti():
139     multi = StrOption('multi', '', multi=submulti)
140     multi2 = StrOption('multi2', '', default_multi='yes', multi=submulti)
141     multi3 = StrOption('multi3', '', default=[['yes']], multi=submulti)
142     od = OptionDescription('od', '', [multi, multi2, multi3])
143     cfg = Config(od)
144     owner = cfg.cfgimpl_get_settings().getowner()
145     assert cfg.multi == []
146     assert cfg.getowner(multi) == owners.default
147     cfg.multi.sort()
148     assert cfg.getowner(multi) == owner
149     cfg.multi = [['no', 'yes'], ['peharps']]
150     cfg.multi.sort()
151     assert cfg.multi == [['no', 'yes'], ['peharps']]
152     cfg.multi.sort(reverse=True)
153     assert cfg.multi == [['peharps'], ['no', 'yes']]
154     cfg.multi[1].sort(reverse=True)
155     assert cfg.multi == [['peharps'], ['yes', 'no']]
156     cfg.multi[1].sort()
157     assert cfg.multi == [['peharps'], ['no', 'yes']]
158     #
159     assert cfg.multi3 == [['yes']]
160     assert cfg.getowner(multi3) == owners.default
161     cfg.multi3.sort()
162     assert cfg.getowner(multi) == owner
163     assert cfg.multi3 == [['yes']]
164     del(cfg.multi3)
165     assert cfg.getowner(multi3) == owners.default
166     cfg.multi3[0].sort()
167     assert cfg.getowner(multi) == owner
168     assert cfg.multi3 == [['yes']]
169
170
171 def test_reverse_submulti():
172     multi = StrOption('multi', '', multi=submulti)
173     multi2 = StrOption('multi2', '', default_multi='yes', multi=submulti)
174     multi3 = StrOption('multi3', '', default=[['yes']], multi=submulti)
175     od = OptionDescription('od', '', [multi, multi2, multi3])
176     cfg = Config(od)
177     owner = cfg.cfgimpl_get_settings().getowner()
178     assert cfg.multi == []
179     assert cfg.getowner(multi) == owners.default
180     cfg.multi.reverse()
181     assert cfg.getowner(multi) == owner
182     cfg.multi = [['no', 'yes'], ['peharps']]
183     cfg.multi.reverse()
184     assert cfg.multi == [['peharps'], ['no', 'yes']]
185     cfg.multi[1].reverse()
186     assert cfg.multi == [['peharps'], ['yes', 'no']]
187     #
188     assert cfg.multi3 == [['yes']]
189     assert cfg.getowner(multi3) == owners.default
190     cfg.multi3.reverse()
191     assert cfg.getowner(multi) == owner
192     assert cfg.multi3 == [['yes']]
193     del(cfg.multi3)
194     assert cfg.getowner(multi3) == owners.default
195     cfg.multi3[0].reverse()
196     assert cfg.getowner(multi) == owner
197     assert cfg.multi3 == [['yes']]
198
199
200 def test_insert_submulti():
201     multi = StrOption('multi', '', multi=submulti)
202     multi2 = StrOption('multi2', '', default_multi='yes', multi=submulti)
203     multi3 = StrOption('multi3', '', default=[['yes']], multi=submulti)
204     od = OptionDescription('od', '', [multi, multi2, multi3])
205     cfg = Config(od)
206     owner = cfg.cfgimpl_get_settings().getowner()
207     assert cfg.multi == []
208     assert cfg.getowner(multi) == owners.default
209     cfg.multi.insert(0, ['no'])
210     assert cfg.getowner(multi) == owner
211     assert cfg.multi == [['no']]
212     assert isinstance(cfg.multi, Multi)
213     assert isinstance(cfg.multi[0], SubMulti)
214     #
215     assert cfg.multi3 == [['yes']]
216     assert cfg.getowner(multi3) == owners.default
217     cfg.multi3.insert(1, [])
218     assert cfg.getowner(multi3) == owner
219     assert cfg.multi3 == [['yes'], []]
220     cfg.multi3.insert(0, ['no'])
221     assert cfg.multi3 == [['no'], ['yes'], []]
222     del(cfg.multi3)
223     assert cfg.getowner(multi3) == owners.default
224     cfg.multi3[0].insert(0, 'no')
225     assert cfg.getowner(multi3) == owner
226     assert cfg.multi3 == [['no', 'yes']]
227
228
229 def test_insert_unvalide_submulti():
230     multi = StrOption('multi', '', multi=submulti)
231     multi2 = StrOption('multi2', '', default_multi='yes', multi=submulti)
232     multi3 = StrOption('multi3', '', default=[['yes']], multi=submulti)
233     od = OptionDescription('od', '', [multi, multi2, multi3])
234     cfg = Config(od)
235     assert cfg.multi == []
236     assert cfg.getowner(multi) == owners.default
237     raises(ValueError, "cfg.multi.insert(0, 1)")
238     assert cfg.multi == []
239     assert cfg.getowner(multi) == owners.default
240     #
241     assert cfg.multi3 == [['yes']]
242     assert cfg.getowner(multi3) == owners.default
243     raises(ValueError, "cfg.multi3[0].insert(0, 1)")
244     assert cfg.multi3 == [['yes']]
245     assert cfg.getowner(multi3) == owners.default
246
247
248 def test_extend_submulti():
249     multi = StrOption('multi', '', multi=submulti)
250     multi2 = StrOption('multi2', '', default_multi='yes', multi=submulti)
251     multi3 = StrOption('multi3', '', default=[['yes']], multi=submulti)
252     od = OptionDescription('od', '', [multi, multi2, multi3])
253     cfg = Config(od)
254     owner = cfg.cfgimpl_get_settings().getowner()
255     assert cfg.multi == []
256     assert cfg.getowner(multi) == owners.default
257     cfg.multi.extend([['no']])
258     assert cfg.getowner(multi) == owner
259     assert cfg.multi == [['no']]
260     assert isinstance(cfg.multi, Multi)
261     assert isinstance(cfg.multi[0], SubMulti)
262     #
263     assert cfg.multi3 == [['yes']]
264     assert cfg.getowner(multi3) == owners.default
265     cfg.multi3.extend([[]])
266     assert cfg.getowner(multi3) == owner
267     assert cfg.multi3 == [['yes'], []]
268     cfg.multi3.extend([['no']])
269     assert cfg.multi3 == [['yes'], [], ['no']]
270     del(cfg.multi3)
271     assert cfg.getowner(multi3) == owners.default
272     cfg.multi3[0].extend(['no'])
273     assert cfg.getowner(multi3) == owner
274     assert cfg.multi3 == [['yes', 'no']]
275
276
277 def test_extend_unvalide_submulti():
278     multi = StrOption('multi', '', multi=submulti)
279     multi2 = StrOption('multi2', '', default_multi='yes', multi=submulti)
280     multi3 = StrOption('multi3', '', default=[['yes']], multi=submulti)
281     od = OptionDescription('od', '', [multi, multi2, multi3])
282     cfg = Config(od)
283     assert cfg.multi == []
284     assert cfg.getowner(multi) == owners.default
285     raises(ValueError, "cfg.multi.extend([[1]])")
286     assert cfg.multi == []
287     assert cfg.getowner(multi) == owners.default
288     #
289     assert cfg.multi3 == [['yes']]
290     assert cfg.getowner(multi3) == owners.default
291     raises(ValueError, "cfg.multi3[0].extend([1])")
292     assert cfg.multi3 == [['yes']]
293     assert cfg.getowner(multi3) == owners.default
294
295
296 def test_callback_submulti_str():
297     multi = StrOption('multi', '', multi=submulti, callback=return_val)
298     od = OptionDescription('od', '', [multi])
299     cfg = Config(od)
300     cfg.read_write()
301     owner = cfg.cfgimpl_get_settings().getowner()
302     assert cfg.getowner(multi) == owners.default
303     assert cfg.multi == [['val']]
304     cfg.multi.append()
305     assert cfg.getowner(multi) == owner
306     assert cfg.multi == [['val'], ['val']]
307     del(cfg.multi)
308     assert cfg.getowner(multi) == owners.default
309     cfg.multi[0].append()
310     assert cfg.getowner(multi) == owner
311     assert cfg.multi == [['val', 'val']]
312
313
314 def test_callback_submulti_list():
315     multi = StrOption('multi', '', multi=submulti, callback=return_list)
316     od = OptionDescription('od', '', [multi])
317     cfg = Config(od)
318     cfg.read_write()
319     owner = cfg.cfgimpl_get_settings().getowner()
320     assert cfg.multi == [['val', 'val']]
321     assert cfg.getowner(multi) == owners.default
322     cfg.multi.append()
323     assert cfg.getowner(multi) == owner
324     assert cfg.multi == [['val', 'val'], ['val', 'val']]
325     cfg.multi.append()
326     assert cfg.multi == [['val', 'val'], ['val', 'val'], ['val', 'val']]
327     del(cfg.multi)
328     assert cfg.getowner(multi) == owners.default
329     cfg.multi[0].append()
330     assert cfg.getowner(multi) == owner
331     assert cfg.multi == [['val', 'val', None]]
332
333
334 def test_callback_submulti_list_list():
335     multi = StrOption('multi', '', multi=submulti, callback=return_list2)
336     od = OptionDescription('od', '', [multi])
337     cfg = Config(od)
338     cfg.read_write()
339     owner = cfg.cfgimpl_get_settings().getowner()
340     assert cfg.multi == [['val', 'val']]
341     assert cfg.getowner(multi) == owners.default
342     cfg.multi.append()
343     assert cfg.getowner(multi) == owner
344     assert cfg.multi == [['val', 'val'], []]
345     del(cfg.multi)
346     assert cfg.getowner(multi) == owners.default
347     cfg.multi[0].append()
348     assert cfg.getowner(multi) == owner
349     assert cfg.multi == [['val', 'val', None]]
350     del(cfg.multi)
351     cfg.multi.append()
352
353
354 #FIXME multi sur une master
355
356
357 def test_groups_with_master_submulti():
358     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
359     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=submulti)
360     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
361     interface1.impl_set_group_type(groups.master)
362     assert interface1.impl_get_group_type() == groups.master
363
364
365 def test_groups_with_master_in_config_submulti():
366     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
367     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=submulti)
368     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
369     interface1.impl_set_group_type(groups.master)
370     Config(interface1)
371     assert interface1.impl_get_group_type() == groups.master
372
373
374 def test_values_with_master_and_slaves_submulti():
375     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
376     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=submulti)
377     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
378     interface1.impl_set_group_type(groups.master)
379     maconfig = OptionDescription('toto', '', [interface1])
380     cfg = Config(maconfig)
381     cfg.read_write()
382     owner = cfg.cfgimpl_get_settings().getowner()
383     assert interface1.impl_get_group_type() == groups.master
384     assert cfg.getowner(ip_admin_eth0) == owners.default
385     assert cfg.getowner(netmask_admin_eth0) == owners.default
386     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
387     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
388     assert cfg.ip_admin_eth0.ip_admin_eth0 == ["192.168.230.145"]
389     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [[]]
390     assert cfg.getowner(ip_admin_eth0) == owner
391     assert cfg.getowner(netmask_admin_eth0) == owners.default
392     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145", "192.168.230.147"]
393     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [[], []]
394     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.append(None)')
395     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.pop(0)')
396     cfg.ip_admin_eth0.netmask_admin_eth0[0].append('255.255.255.0')
397     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [['255.255.255.0'], []]
398     cfg.ip_admin_eth0.netmask_admin_eth0[0].pop(0)
399     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [[], []]
400     raises(ValueError, 'cfg.ip_admin_eth0.netmask_admin_eth0 = ["255.255.255.0", "255.255.255.0"]')
401
402
403 def test_reset_values_with_master_and_slaves_submulti():
404     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
405     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=submulti)
406     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
407     interface1.impl_set_group_type(groups.master)
408     maconfig = OptionDescription('toto', '', [interface1])
409     cfg = Config(maconfig)
410     cfg.read_write()
411     owner = cfg.cfgimpl_get_settings().getowner()
412     assert interface1.impl_get_group_type() == groups.master
413     assert cfg.getowner(ip_admin_eth0) == owners.default
414     assert cfg.getowner(netmask_admin_eth0) == owners.default
415     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
416     assert cfg.getowner(ip_admin_eth0) == owner
417     assert cfg.getowner(netmask_admin_eth0) == owners.default
418     del(cfg.ip_admin_eth0.ip_admin_eth0)
419     assert cfg.getowner(ip_admin_eth0) == owners.default
420     assert cfg.getowner(netmask_admin_eth0) == owners.default
421     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
422     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
423     #
424     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
425     cfg.ip_admin_eth0.netmask_admin_eth0[0].append('255.255.255.0')
426     assert cfg.getowner(ip_admin_eth0) == owner
427     assert cfg.getowner(netmask_admin_eth0, 0) == owner
428     del(cfg.ip_admin_eth0.ip_admin_eth0)
429     assert cfg.getowner(ip_admin_eth0) == owners.default
430 #    assert cfg.getowner(netmask_admin_eth0) == owners.default
431     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
432     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
433
434
435 def test_values_with_master_and_slaves_slave_submulti():
436     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
437     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=submulti)
438     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
439     interface1.impl_set_group_type(groups.master)
440     maconfig = OptionDescription('toto', '', [interface1])
441     cfg = Config(maconfig)
442     cfg.read_write()
443     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
444     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = [['255.255.255.0']]")
445     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
446     cfg.ip_admin_eth0.netmask_admin_eth0 = [['255.255.255.0']]
447     cfg.ip_admin_eth0.netmask_admin_eth0[0] = ['255.255.255.0']
448     cfg.ip_admin_eth0.netmask_admin_eth0[0][0] = '255.255.255.0'
449     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = [['255.255.255.0'], ['255.255.255.0']]")
450     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = []")
451     del(cfg.ip_admin_eth0.netmask_admin_eth0)
452     cfg.ip_admin_eth0.netmask_admin_eth0 = [['255.255.255.0']]
453     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
454     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [['255.255.255.0'], []]
455     cfg.ip_admin_eth0.netmask_admin_eth0 = [['255.255.255.0'], ['255.255.255.0']]
456     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.pop(1)')
457
458
459 def test_values_with_master_and_slaves_master_submulti():
460     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
461     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=submulti)
462     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
463     interface1.impl_set_group_type(groups.master)
464     maconfig = OptionDescription('toto', '', [interface1])
465     cfg = Config(maconfig)
466     cfg.read_write()
467     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
468     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145"]
469     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145", "192.168.230.145"]
470     cfg.ip_admin_eth0.netmask_admin_eth0 = [['255.255.255.0'], ['255.255.255.0']]
471     raises(SlaveError, 'cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145"]')
472     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [['255.255.255.0'], ['255.255.255.0']]
473     cfg.ip_admin_eth0.ip_admin_eth0.pop(1)
474     assert cfg.ip_admin_eth0.ip_admin_eth0 == ["192.168.230.145"]
475     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [['255.255.255.0']]
476     del(cfg.ip_admin_eth0.ip_admin_eth0)
477     assert cfg.ip_admin_eth0.ip_admin_eth0 == []
478     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
479
480
481 def test_values_with_master_and_slaves_master_error_submulti():
482     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
483     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=submulti)
484     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
485     interface1.impl_set_group_type(groups.master)
486     maconfig = OptionDescription('toto', '', [interface1])
487     cfg = Config(maconfig)
488     cfg.read_write()
489     cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.230.145", "192.168.230.145"]
490     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = [['255.255.255.0']]")
491     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = [['255.255.255.0'], ['255.255.255.0'], ['255.255.255.0']]")
492     cfg.ip_admin_eth0.netmask_admin_eth0 = [['255.255.255.0'], ['255.255.255.0']]
493     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = [['255.255.255.0']]")
494     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0 = [['255.255.255.0'], ['255.255.255.0'], ['255.255.255.0']]")
495
496
497 def test_values_with_master_owner_submulti():
498     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
499     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=submulti)
500     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
501     interface1.impl_set_group_type(groups.master)
502     maconfig = OptionDescription('toto', '', [interface1])
503     cfg = Config(maconfig)
504     cfg.read_write()
505     owner = cfg.cfgimpl_get_settings().getowner()
506     assert cfg.getowner(ip_admin_eth0) == owners.default
507     assert cfg.getowner(netmask_admin_eth0) == owners.default
508     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
509     assert cfg.getowner(ip_admin_eth0) == owner
510     assert cfg.getowner(netmask_admin_eth0) == owners.default
511     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
512     assert cfg.getowner(ip_admin_eth0) == owner
513     assert cfg.getowner(netmask_admin_eth0) == owners.default
514
515
516 def test_values_with_master_disabled_submulti():
517     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
518     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=submulti)
519     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
520     interface1.impl_set_group_type(groups.master)
521     maconfig = OptionDescription('toto', '', [interface1])
522     cfg = Config(maconfig)
523     cfg.read_write()
524     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
525     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
526     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
527     cfg.ip_admin_eth0.netmask_admin_eth0 = [["192.168.230.145"]]
528     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
529     del(cfg.ip_admin_eth0.netmask_admin_eth0)
530     cfg.cfgimpl_get_settings()[netmask_admin_eth0].append('disabled')
531     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
532     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
533
534     #delete with value in disabled var
535     cfg.cfgimpl_get_settings()[netmask_admin_eth0].remove('disabled')
536     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
537     cfg.ip_admin_eth0.netmask_admin_eth0 = [["192.168.230.145"]]
538     cfg.cfgimpl_get_settings()[netmask_admin_eth0].append('disabled')
539     cfg.ip_admin_eth0.ip_admin_eth0.pop(0)
540
541     #append with value in disabled var
542     cfg.cfgimpl_get_settings()[netmask_admin_eth0].remove('disabled')
543     cfg.ip_admin_eth0.ip_admin_eth0.append("192.168.230.145")
544     cfg.ip_admin_eth0.netmask_admin_eth0 = [["192.168.230.145"]]
545     cfg.cfgimpl_get_settings()[netmask_admin_eth0].append('disabled')
546     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.230.43')
547
548
549 def test_multi_insert_master_submulti():
550     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
551     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=submulti)
552     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
553     interface1.impl_set_group_type(groups.master)
554     maconfig = OptionDescription('toto', '', [interface1])
555     cfg = Config(maconfig)
556     cfg.read_write()
557     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.insert(0, 'nok')")
558     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.insert(0, 'nok')")
559     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.1')
560     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0[0].insert(0, 'nok')")
561
562
563 def test_multi_sort_master_submulti():
564     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
565     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=submulti)
566     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
567     interface1.impl_set_group_type(groups.master)
568     maconfig = OptionDescription('toto', '', [interface1])
569     cfg = Config(maconfig)
570     cfg.read_write()
571     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.sort()")
572     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.sort()")
573     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.1')
574     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0[0].sort()")
575
576
577 def test_multi_reverse_master_submulti():
578     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
579     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=submulti)
580     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
581     interface1.impl_set_group_type(groups.master)
582     maconfig = OptionDescription('toto', '', [interface1])
583     cfg = Config(maconfig)
584     cfg.read_write()
585     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.reverse()")
586     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.reverse()")
587     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.1')
588     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0[0].reverse()")
589
590
591 def test_multi_extend_master_submulti():
592     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
593     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=submulti)
594     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
595     interface1.impl_set_group_type(groups.master)
596     maconfig = OptionDescription('toto', '', [interface1])
597     cfg = Config(maconfig)
598     cfg.read_write()
599     raises(SlaveError, "cfg.ip_admin_eth0.ip_admin_eth0.extend(['ok'])")
600     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0.extend(['ok'])")
601     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.1')
602     raises(SlaveError, "cfg.ip_admin_eth0.netmask_admin_eth0[0].extend(['ok'])")
603
604
605 def test_slave_submulti():
606     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
607     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=submulti)
608     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
609     interface1.impl_set_group_type(groups.master)
610     maconfig = OptionDescription('toto', '', [interface1])
611     cfg = Config(maconfig)
612     cfg.read_write()
613     assert cfg.ip_admin_eth0.ip_admin_eth0.__class__.__name__ == 'Multi'
614     assert cfg.ip_admin_eth0.netmask_admin_eth0.__class__.__name__ == 'Multi'
615     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.1')
616     assert cfg.ip_admin_eth0.ip_admin_eth0.__class__.__name__ == 'Multi'
617     assert cfg.ip_admin_eth0.netmask_admin_eth0.__class__.__name__ == 'Multi'
618     assert cfg.ip_admin_eth0.ip_admin_eth0[0].__class__.__name__ == 'str'
619     assert cfg.ip_admin_eth0.netmask_admin_eth0[0].__class__.__name__ == 'SubMulti'
620
621
622 def test__master_is_submulti():
623     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=submulti)
624     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
625     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
626     interface1.impl_set_group_type(groups.master)
627     maconfig = OptionDescription('toto', '', [interface1])
628     cfg = Config(maconfig)
629     cfg.read_write()
630     owner = cfg.cfgimpl_get_settings().getowner()
631     assert interface1.impl_get_group_type() == groups.master
632     assert cfg.getowner(ip_admin_eth0) == owners.default
633     assert cfg.getowner(netmask_admin_eth0) == owners.default
634     assert cfg.ip_admin_eth0.netmask_admin_eth0 == []
635     cfg.ip_admin_eth0.ip_admin_eth0.append(["192.168.230.145"])
636     assert cfg.ip_admin_eth0.ip_admin_eth0 == [["192.168.230.145"]]
637     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None]
638     assert cfg.getowner(ip_admin_eth0) == owner
639     assert cfg.getowner(netmask_admin_eth0) == owners.default
640     cfg.ip_admin_eth0.ip_admin_eth0 = [["192.168.230.145"], ["192.168.230.147"]]
641     assert cfg.ip_admin_eth0.netmask_admin_eth0 == [None, None]
642     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.append(None)')
643     raises(SlaveError, 'cfg.ip_admin_eth0.netmask_admin_eth0.pop(0)')
644     cfg.ip_admin_eth0.ip_admin_eth0[0].append('192.168.1.1')
645     assert cfg.ip_admin_eth0.ip_admin_eth0 == [["192.168.230.145", '192.168.1.1'], ["192.168.230.147"]]
646     cfg.ip_admin_eth0.ip_admin_eth0[0].pop(0)
647     assert cfg.ip_admin_eth0.ip_admin_eth0 == [["192.168.1.1"], ["192.168.230.147"]]
648     raises(ValueError, 'cfg.ip_admin_eth0.ip_admin_eth0 = ["192.168.1.1", "192.168.1.1"]')
649
650
651 def test_callback_submulti():
652     multi = StrOption('multi', '', multi=submulti)
653     multi2 = StrOption('multi2', '', multi=submulti, callback=return_val, callback_params={'': ((multi, False),)})
654     od = OptionDescription('multi', '', [multi, multi2])
655     cfg = Config(od)
656     cfg.read_write()
657     owner = cfg.cfgimpl_get_settings().getowner()
658     assert cfg.getowner(multi) == owners.default
659     assert cfg.multi == []
660     assert cfg.multi2 == []
661     cfg.multi.append(['val'])
662     assert cfg.getowner(multi) == owner
663     assert cfg.getowner(multi2) == owners.default
664     assert cfg.multi == [['val']]
665     assert cfg.multi2 == [['val']]
666
667
668 def test_submulti_unique():
669     i = IntOption('int', '', multi=submulti, unique=True)
670     o = OptionDescription('od', '', [i])
671     c = Config(o)
672     assert c.int == []
673     c.int = [[0]]
674     assert c.int == [[0]]
675     raises(ValueError, "c.int = [[0, 0]]")
676     c.int = [[0], [0]]
677     raises(ValueError, "c.int[0] = [1, 0, 2, 3, 4, 5, 6, 0, 7]")
678     raises(ValueError, "c.int[0].append(0)")
679     raises(ValueError, "c.int[0].extend([1, 2, 1, 3])")
680     raises(ValueError, "c.int[0].extend([1, 2, 0, 3])")
681     c.int[0].extend([4, 5, 6])
682
683
684 def test_multi_submulti_meta():
685     multi = StrOption('multi', '', multi=submulti)
686     od = OptionDescription('od', '', [multi])
687     conf1 = Config(od, name='conf1')
688     conf1.read_write()
689     conf2 = Config(od, name='conf2')
690     conf2.read_write()
691     meta = MetaConfig([conf1, conf2])
692     meta.read_write()
693     meta.multi = [['val']]
694     assert meta.multi == [['val']]
695     multi = conf1.multi[0]
696     multi.append()
697     assert conf1.multi == [['val', None]]
698     assert meta.multi == [['val']]