remove unjustified open_values parameters in ChoiceOption
[tiramisu.git] / test / test_config_api.py
1 "configuration objects global API"
2 import autopath
3 from py.test import raises
4
5 from tiramisu.config import Config
6 from tiramisu.option import IntOption, FloatOption, StrOption, ChoiceOption, \
7     BoolOption, FilenameOption, UnicodeOption, SymLinkOption, IPOption, \
8     PortOption, NetworkOption, NetmaskOption, BroadcastOption, \
9     DomainnameOption, OptionDescription
10 from tiramisu.error import PropertiesOptionError
11
12
13 def make_description():
14     gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
15     gcdummy = BoolOption('dummy', 'dummy', default=False)
16     prop = BoolOption('prop', '', properties=('disabled',))
17     prop2 = BoolOption('prop', '', properties=('hidden',))
18     objspaceoption = ChoiceOption('objspace', 'Object space',
19                                   ('std', 'thunk'), 'std')
20     booloption = BoolOption('bool', 'Test boolean option', default=True)
21     booloption2 = BoolOption('bool', 'Test boolean option', default=False)
22     intoption = IntOption('int', 'Test int option', default=0)
23     floatoption2 = FloatOption('float', 'Test float option', default=2.3)
24     floatoption = FloatOption('float', 'Test float option', default=2.3)
25     stroption = StrOption('str', 'Test string option', default="abc")
26     boolop = BoolOption('boolop', 'Test boolean option op', default=True)
27     wantref_option = BoolOption('wantref', 'Tests', default=False)
28     wantframework_option = BoolOption('wantframework', 'Test', default=False)
29     gcgroup2 = OptionDescription('gc2', '', [booloption2, prop])
30     gcgroup = OptionDescription('gc', '', [gcgroup2, gcoption, gcdummy, floatoption, prop2])
31     descr = OptionDescription('tiramisu', '', [gcgroup, booloption, objspaceoption,
32                                                wantref_option, stroption,
33                                                wantframework_option,
34                                                intoption, boolop, floatoption2])
35     return descr
36
37
38 #FIXME
39 #def test_compare_configs():
40 #    "config object comparison"
41 #    descr = make_description()
42 #    conf1 = Config(descr)
43 #    conf2 = Config(descr)
44 #    conf2.wantref = True
45 #    assert conf1 != conf2
46 #    assert hash(conf1) != hash(conf2)
47 #    #assert conf1.getkey() != conf2.getkey()
48 #    conf1.wantref = True
49 #    assert conf1 == conf2
50 #    assert hash(conf1) == hash(conf2)
51 #    #assert conf1.getkey() == conf2.getkey()
52 #    conf2.gc.dummy = True
53 #    assert conf1 != conf2
54 #    assert hash(conf1) != hash(conf2)
55 #    #assert conf1.getkey() != conf2.getkey()
56 #    conf1.gc.dummy = True
57 #    assert conf1 == conf2
58 #    assert hash(conf1) == hash(conf2)
59 #    assert not conf1 == 'conf2'
60 #    assert conf1 != 'conf2'
61 # ____________________________________________________________
62
63
64 def test_iter_config():
65     "iteration on config object"
66     s = StrOption("string", "", default="string")
67     s2 = StrOption("string2", "", default="string2")
68     descr = OptionDescription("options", "", [s, s2])
69     config = Config(descr)
70     assert [(name, value) for name, value in config] == \
71         [('string', 'string'), ('string2', 'string2')]
72
73
74 def test_iter_config_property():
75     "iteration on config object"
76     s = StrOption("string", "", default="string", properties=('disabled',))
77     s2 = StrOption("string2", "", default="string2")
78     descr = OptionDescription("options", "", [s, s2])
79     config = Config(descr)
80     config.read_only()
81     assert [(name, value) for name, value in config] == \
82         [('string2', 'string2')]
83
84
85 def test_iter_subconfig():
86     "iteration on config sub object"
87     descr = make_description()
88     conf = Config(descr)
89     for (name, value), (gname, gvalue) in \
90             zip(conf.gc, [("name", "ref"), ("dummy", False)]):
91         assert name == gname
92         assert value == gvalue
93
94
95 def test_str():
96     descr = make_description()
97     c = Config(descr)
98     c  # does not crash
99
100
101 def test_make_dict():
102     "serialization of the whole config to a dict"
103     descr = OptionDescription("opt", "", [
104         OptionDescription("s1", "", [
105             BoolOption("a", "", default=False),
106             BoolOption("b", "", default=False, properties=('hidden',))]),
107         IntOption("int", "", default=42)])
108     config = Config(descr)
109     config.read_write()
110     config.cfgimpl_get_settings().setpermissive(('hidden',))
111     d = config.make_dict()
112     assert d == {"s1.a": False, "int": 42}
113     config.int = 43
114     config.s1.a = True
115     d = config.make_dict()
116     assert d == {"s1.a": True, "int": 43}
117     d2 = config.make_dict(flatten=True)
118     assert d2 == {'a': True, 'int': 43}
119     raises(ValueError, 'd2 = config.make_dict(withvalue="3")')
120     d = config.make_dict(force_permissive=True)
121     assert d == {"s1.a": True, "s1.b": False, "int": 43}
122
123
124 def test_make_dict_with_disabled():
125     descr = OptionDescription("opt", "", [
126         OptionDescription("s1", "", [
127             BoolOption("a", "", default=False),
128             BoolOption("b", "", default=False, properties=('disabled',))]),
129         IntOption("int", "", default=42)])
130     config = Config(descr)
131     config.read_only()
132     d = config.make_dict()
133     assert d == {"s1.a": False, "int": 42}
134
135
136 def test_find_in_config():
137     "finds option in config"
138     descr = make_description()
139     conf = Config(descr)
140     conf.read_only()
141     conf.cfgimpl_get_settings().setpermissive(('hidden',))
142     assert conf.find(byname='dummy') == [conf.unwrap_from_path('gc.dummy')]
143     assert conf.find(byname='float') == [conf.unwrap_from_path('gc.float'), conf.unwrap_from_path('float')]
144     assert conf.find_first(byname='bool') == conf.unwrap_from_path('gc.gc2.bool')
145     assert conf.find_first(byname='bool', byvalue=True) == conf.unwrap_from_path('bool')
146     assert conf.find_first(byname='dummy') == conf.unwrap_from_path('gc.dummy')
147     assert conf.find_first(byname='float') == conf.unwrap_from_path('gc.float')
148     assert conf.find(bytype=ChoiceOption) == [conf.unwrap_from_path('gc.name'), conf.unwrap_from_path('objspace')]
149     assert conf.find_first(bytype=ChoiceOption) == conf.unwrap_from_path('gc.name')
150     assert conf.find(byvalue='ref') == [conf.unwrap_from_path('gc.name')]
151     assert conf.find_first(byvalue='ref') == conf.unwrap_from_path('gc.name')
152     assert conf.find(byname='prop') == [conf.unwrap_from_path('gc.prop')]
153     conf.read_write()
154     raises(AttributeError, "assert conf.find(byname='prop')")
155     assert conf.find(byname='prop', check_properties=False) == [conf.unwrap_from_path('gc.gc2.prop'), conf.unwrap_from_path('gc.prop')]
156     assert conf.find(byname='prop', force_permissive=True) == [conf.unwrap_from_path('gc.prop')]
157     assert conf.find_first(byname='prop', force_permissive=True) == conf.unwrap_from_path('gc.prop')
158     #assert conf.find_first(byname='prop') == conf.unwrap_from_path('gc.prop')
159     # combinaison of filters
160     assert conf.find(bytype=BoolOption, byname='dummy') == [conf.unwrap_from_path('gc.dummy')]
161     assert conf.find_first(bytype=BoolOption, byname='dummy') == conf.unwrap_from_path('gc.dummy')
162     assert conf.find(byvalue=False, byname='dummy') == [conf.unwrap_from_path('gc.dummy')]
163     assert conf.find_first(byvalue=False, byname='dummy') == conf.unwrap_from_path('gc.dummy')
164     #subconfig
165     assert conf.gc.find(byname='dummy') == [conf.unwrap_from_path('gc.dummy')]
166     assert conf.gc.find(byname='float') == [conf.unwrap_from_path('gc.float')]
167     assert conf.gc.find(byname='bool') == [conf.unwrap_from_path('gc.gc2.bool')]
168     assert conf.gc.find_first(byname='bool', byvalue=False) == conf.unwrap_from_path('gc.gc2.bool')
169     raises(AttributeError, "assert conf.gc.find_first(byname='bool', byvalue=True)")
170     raises(AttributeError, "conf.gc.find(byname='wantref').first()")
171     assert conf.gc.find(byname='prop', check_properties=False) == [conf.unwrap_from_path('gc.gc2.prop'), conf.unwrap_from_path('gc.prop')]
172     conf.read_only()
173     assert conf.gc.find(byname='prop') == [conf.unwrap_from_path('gc.prop')]
174     # not OptionDescription
175     raises(AttributeError, "conf.find_first(byname='gc')")
176     raises(AttributeError, "conf.gc.find_first(byname='gc2')")
177     raises(ValueError, "conf.find(byname='bool', type_='unknown')")
178
179
180 def test_find_multi():
181     b = BoolOption('bool', '', multi=True)
182     o = OptionDescription('od', '', [b])
183     conf = Config(o)
184     raises(AttributeError, "conf.find(byvalue=True)")
185     raises(AttributeError, "conf.find_first(byvalue=True)")
186     conf.bool.append(False)
187     raises(AttributeError, "conf.find(byvalue=True)")
188     raises(AttributeError, "conf.find_first(byvalue=True)")
189     conf.bool.append(False)
190     raises(AttributeError, "conf.find(byvalue=True)")
191     raises(AttributeError, "conf.find_first(byvalue=True)")
192     conf.bool.append(True)
193     assert conf.find(byvalue=True) == [b]
194     assert conf.find_first(byvalue=True) == b
195
196
197 def test_does_not_find_in_config():
198     descr = make_description()
199     conf = Config(descr)
200     raises(AttributeError, "conf.find(byname='IDontExist')")
201
202
203 def test_filename():
204     a = FilenameOption('a', '')
205     o = OptionDescription('o', '', [a])
206     c = Config(o)
207     c.a = u'/'
208     c.a = u'/tmp'
209     c.a = u'/tmp/'
210     c.a = u'/tmp/text.txt'
211     c.a = u'tmp'
212     c.a = u'tmp/'
213     c.a = u'tmp/text.txt'
214     raises(ValueError, "c.a = u'/tmp/with space.txt'")
215     raises(ValueError, "c.a = u'/tmp/with$.txt'")
216
217
218 def test_iter_all():
219     s = StrOption("string", "", default="string")
220     s2 = StrOption("string2", "", default="string2")
221     descr = OptionDescription("options", "", [s, s2])
222     config = Config(descr)
223     assert list(config.iter_all()) == [('string', 'string'), ('string2', 'string2')]
224     for i in config.iter_all():
225         #test StopIteration
226         break
227
228
229 def test_iter_all_force_permissive():
230     s = StrOption("string", "", default="string")
231     s2 = StrOption("string2", "", default="string2")
232     s3 = StrOption("string3", "", default="string3", properties=('hidden',))
233     descr = OptionDescription("options", "", [s, s2, s3])
234     config = Config(descr)
235     config.read_write()
236     config.cfgimpl_get_settings().setpermissive(('hidden',))
237     assert list(config.iter_all()) == [('string', 'string'), ('string2', 'string2')]
238     assert list(config.iter_all(force_permissive=True)) == [('string', 'string'),
239                                                             ('string2', 'string2'),
240                                                             ('string3', 'string3')]
241
242
243 def test_iter_all_prop():
244     s = StrOption("string", "", default="string", properties=('disabled',))
245     s2 = StrOption("string2", "", default="string2")
246     descr = OptionDescription("options", "", [s, s2])
247     config = Config(descr)
248     config.read_only()
249     assert list(config.iter_all()) == [('string2', 'string2')]
250
251
252 def test_impl_getpaths():
253     s = StrOption("string", "", default="string", properties=('disabled',))
254     s2 = StrOption("string2", "", default="string2")
255     s3 = StrOption("string3", "", default="string3")
256     s4 = StrOption("string4", "", default="string4", properties=('hidden',))
257     od = OptionDescription('od', '', [s3, s4])
258     descr = OptionDescription("options", "", [s, s2, od])
259     config = Config(descr)
260     assert ['string', 'string2', 'od.string3', 'od.string4'] == config.cfgimpl_get_description().impl_getpaths()
261     assert ['string', 'string2', 'od', 'od.string3', 'od.string4'] == config.cfgimpl_get_description().impl_getpaths(include_groups=True)
262     config.read_write()
263     raises(PropertiesOptionError, "config.od.string4")
264     assert ['string', 'string2', 'od.string3', 'od.string4'] == config.cfgimpl_get_description().impl_getpaths()
265     assert ['string', 'string2', 'od', 'od.string3', 'od.string4'] == config.cfgimpl_get_description().impl_getpaths(include_groups=True)
266
267
268 def test_invalid_option():
269     raises(TypeError, "ChoiceOption('a', '', [1, 2])")
270     raises(TypeError, "ChoiceOption('a', '', 1)")
271     raises(ValueError, "ChoiceOption('a', '', (1,), 3)")
272     raises(ValueError, "FloatOption('a', '', 'string')")
273     raises(ValueError, "UnicodeOption('a', '', 1)")
274     raises(ValueError, "SymLinkOption('a', 'string')")
275     raises(ValueError, "IPOption('a', '', 1)")
276     raises(ValueError, "IPOption('a', '', 'string')")
277     raises(ValueError, "PortOption('a', '', 'string')")
278     raises(ValueError, "PortOption('a', '', '11:12:13', allow_range=True)")
279     raises(ValueError, "PortOption('a', '', 11111111111111111111)")
280     raises(ValueError, "PortOption('a', '', allow_zero=True, allow_wellknown=False, allow_registred=True, allow_private=False)")
281     raises(ValueError, "PortOption('a', '', allow_zero=True, allow_wellknown=True, allow_registred=False, allow_private=True)")
282     raises(ValueError, "PortOption('a', '', allow_zero=True, allow_wellknown=False, allow_registred=False, allow_private=True)")
283     raises(ValueError, "PortOption('a', '', allow_zero=True, allow_wellknown=False, allow_registred=True, allow_private=True)")
284     raises(ValueError, "PortOption('a', '', allow_zero=False, allow_wellknown=False, allow_registred=False, allow_private=False)")
285     raises(ValueError, "NetworkOption('a', '', 'string')")
286     raises(ValueError, "NetmaskOption('a', '', 'string')")
287     raises(ValueError, "BroadcastOption('a', '', 'string')")
288     raises(ValueError, "DomainnameOption('a', '', 'string')")
289     raises(ValueError, "DomainnameOption('a', '', type_='string')")
290     raises(ValueError, "DomainnameOption('a', '', allow_ip='string')")
291     raises(ValueError, "DomainnameOption('a', '', allow_without_dot='string')")