python 3.5 support
[tiramisu.git] / test / test_cache.py
1 # coding: utf-8
2 from .autopath import do_autopath
3 do_autopath()
4
5 from tiramisu import setting, value
6 setting.expires_time = 1
7 value.expires_time = 1
8 from tiramisu.option import BoolOption, IPOption, IntOption, StrOption, OptionDescription
9 from tiramisu.config import Config
10 from tiramisu.error import ConfigError
11 from tiramisu.setting import groups
12
13
14 from time import sleep, time
15 from py.test import raises
16
17
18 def make_description():
19     u1 = IntOption('u1', '', multi=True)
20     u2 = IntOption('u2', '')
21     u3 = IntOption('u3', '', multi=True)
22     return OptionDescription('od1', '', [u1, u2, u3])
23
24
25 def test_cache_config():
26     od1 = make_description()
27     assert od1.impl_already_build_caches() is False
28     c = Config(od1)
29     assert od1.impl_already_build_caches() is True
30     c
31
32
33 def test_cache():
34     od1 = make_description()
35     c = Config(od1)
36     values = c.cfgimpl_get_values()
37     settings = c.cfgimpl_get_settings()
38     c.u1
39     assert 'u1' in values._p_.get_cached(c)
40     assert 'u1' in settings._p_.get_cached(c)
41     c.u2
42     assert 'u1' in values._p_.get_cached(c)
43     assert 'u1' in settings._p_.get_cached(c)
44     assert 'u2' in values._p_.get_cached(c)
45     assert 'u2' in settings._p_.get_cached(c)
46
47
48 def test_get_cache():
49     # force a value in cache, try if reget corrupted value
50     od1 = make_description()
51     c = Config(od1)
52     values = c.cfgimpl_get_values()
53     settings = c.cfgimpl_get_settings()
54     ntime = time() + 1
55     settings._p_.setcache('u1', set(['inject']), ntime, None)
56     assert 'inject' in settings[od1.u1]
57     values._p_.setcache('u1', 100, ntime, None)
58     assert c.u1 == [100]
59
60
61 def test_get_cache_no_expire():
62     # force a value in cache, try if reget corrupted value
63     od1 = make_description()
64     c = Config(od1)
65     values = c.cfgimpl_get_values()
66     settings = c.cfgimpl_get_settings()
67     settings._p_.setcache('u1', set(['inject2']), None, None)
68     assert 'inject2' in settings[od1.u1]
69     values._p_.setcache('u1', 200, None, None)
70     assert c.u1 == [200]
71
72
73 def test_cache_reset():
74     od1 = make_description()
75     c = Config(od1)
76     values = c.cfgimpl_get_values()
77     settings = c.cfgimpl_get_settings()
78     #when change a value
79     c.u1
80     c.u2
81     assert 'u1' in values._p_.get_cached(c)
82     assert 'u1' in settings._p_.get_cached(c)
83     assert 'u2' in values._p_.get_cached(c)
84     assert 'u2' in settings._p_.get_cached(c)
85     c.u2 = 1
86     assert 'u1' in values._p_.get_cached(c)
87     assert 'u1' in settings._p_.get_cached(c)
88     assert 'u2' not in values._p_.get_cached(c)
89     assert 'u2' not in settings._p_.get_cached(c)
90     #when remove a value
91     c.u1
92     assert 'u1' in values._p_.get_cached(c)
93     assert 'u1' in settings._p_.get_cached(c)
94     del(c.u2)
95     assert 'u1' in values._p_.get_cached(c)
96     assert 'u1' in settings._p_.get_cached(c)
97     assert 'u2' not in values._p_.get_cached(c)
98     assert 'u2' not in settings._p_.get_cached(c)
99     #when add/del property
100     c.u1
101     assert 'u1' in values._p_.get_cached(c)
102     assert 'u1' in settings._p_.get_cached(c)
103     c.cfgimpl_get_settings()[od1.u2].append('test')
104     assert 'u1' in values._p_.get_cached(c)
105     assert 'u1' in settings._p_.get_cached(c)
106     assert 'u2' not in values._p_.get_cached(c)
107     assert 'u2' not in settings._p_.get_cached(c)
108     c.u1
109     assert 'u1' in values._p_.get_cached(c)
110     assert 'u1' in settings._p_.get_cached(c)
111     c.cfgimpl_get_settings()[od1.u2].remove('test')
112     assert 'u1' in values._p_.get_cached(c)
113     assert 'u1' in settings._p_.get_cached(c)
114     assert 'u2' not in values._p_.get_cached(c)
115     assert 'u2' not in settings._p_.get_cached(c)
116     #when enable/disabled property
117     c.u1
118     assert 'u1' in values._p_.get_cached(c)
119     assert 'u1' in settings._p_.get_cached(c)
120     c.cfgimpl_get_settings().append('test')
121     assert 'u1' not in values._p_.get_cached(c)
122     assert 'u1' not in settings._p_.get_cached(c)
123     c.u1
124     assert 'u1' in values._p_.get_cached(c)
125     assert 'u1' in settings._p_.get_cached(c)
126     c.cfgimpl_get_settings().remove('test')
127     assert 'u1' not in values._p_.get_cached(c)
128     assert 'u1' not in settings._p_.get_cached(c)
129
130
131 def test_cache_reset_multi():
132     od1 = make_description()
133     c = Config(od1)
134     values = c.cfgimpl_get_values()
135     settings = c.cfgimpl_get_settings()
136     c.u1
137     c.u3
138     assert 'u1' in values._p_.get_cached(c)
139     assert 'u1' in settings._p_.get_cached(c)
140     assert 'u3' in values._p_.get_cached(c)
141     assert 'u3' in settings._p_.get_cached(c)
142     #when change a value
143     c.u3 = [1]
144     assert 'u1' in values._p_.get_cached(c)
145     assert 'u1' in settings._p_.get_cached(c)
146     assert 'u3' not in values._p_.get_cached(c)
147     assert 'u3' not in settings._p_.get_cached(c)
148     #when append value
149     c.u1
150     c.u3
151     assert 'u1' in values._p_.get_cached(c)
152     assert 'u1' in settings._p_.get_cached(c)
153     assert 'u3' in values._p_.get_cached(c)
154     assert 'u3' in settings._p_.get_cached(c)
155     c.u3.append(1)
156     assert 'u1' in values._p_.get_cached(c)
157     assert 'u1' in settings._p_.get_cached(c)
158     assert 'u3' not in values._p_.get_cached(c)
159     assert 'u3' not in settings._p_.get_cached(c)
160     #when pop value
161     c.u1
162     c.u3
163     assert 'u1' in values._p_.get_cached(c)
164     assert 'u1' in settings._p_.get_cached(c)
165     assert 'u3' in values._p_.get_cached(c)
166     assert 'u3' in settings._p_.get_cached(c)
167     c.u3.pop(1)
168     assert 'u1' in values._p_.get_cached(c)
169     assert 'u1' in settings._p_.get_cached(c)
170     assert 'u3' not in values._p_.get_cached(c)
171     assert 'u3' not in settings._p_.get_cached(c)
172     #when remove a value
173     c.u1
174     assert 'u1' in values._p_.get_cached(c)
175     assert 'u1' in settings._p_.get_cached(c)
176     del(c.u3)
177     assert 'u1' in values._p_.get_cached(c)
178     assert 'u1' in settings._p_.get_cached(c)
179     assert 'u3' not in values._p_.get_cached(c)
180     assert 'u3' not in settings._p_.get_cached(c)
181
182
183 def test_reset_cache():
184     od1 = make_description()
185     c = Config(od1)
186     values = c.cfgimpl_get_values()
187     settings = c.cfgimpl_get_settings()
188     c.u1
189     assert 'u1' in values._p_.get_cached(c)
190     assert 'u1' in settings._p_.get_cached(c)
191     c.cfgimpl_reset_cache()
192     assert 'u1' not in values._p_.get_cached(c)
193     assert 'u1' not in settings._p_.get_cached(c)
194     c.u1
195     sleep(1)
196     c.u1
197     sleep(1)
198     c.u2
199     assert 'u1' in values._p_.get_cached(c)
200     assert 'u1' in settings._p_.get_cached(c)
201     assert 'u2' in values._p_.get_cached(c)
202     assert 'u2' in settings._p_.get_cached(c)
203     c.cfgimpl_reset_cache()
204     assert 'u1' not in values._p_.get_cached(c)
205     assert 'u1' not in settings._p_.get_cached(c)
206     assert 'u2' not in values._p_.get_cached(c)
207     assert 'u2' not in settings._p_.get_cached(c)
208
209
210 def test_reset_cache_subconfig():
211     od1 = make_description()
212     od2 = OptionDescription('od2', '', [od1])
213     c = Config(od2)
214     values = c.cfgimpl_get_values()
215     c.od1.u1
216     assert 'od1.u1' in values._p_.get_cached(c)
217     c.od1.cfgimpl_reset_cache()
218     assert 'od1.u1' not in values._p_.get_cached(c)
219
220
221 def test_reset_cache_only_expired():
222     od1 = make_description()
223     c = Config(od1)
224     values = c.cfgimpl_get_values()
225     settings = c.cfgimpl_get_settings()
226     c.u1
227     assert 'u1' in values._p_.get_cached(c)
228     assert 'u1' in settings._p_.get_cached(c)
229     c.cfgimpl_reset_cache(True)
230     assert 'u1' in values._p_.get_cached(c)
231     assert 'u1' in settings._p_.get_cached(c)
232     sleep(1)
233     c.u1
234     sleep(1)
235     c.u2
236     assert 'u1' in values._p_.get_cached(c)
237     assert 'u1' in settings._p_.get_cached(c)
238     assert 'u2' in values._p_.get_cached(c)
239     assert 'u2' in settings._p_.get_cached(c)
240     c.cfgimpl_reset_cache(True)
241     assert 'u1' not in values._p_.get_cached(c)
242     assert 'u1' not in settings._p_.get_cached(c)
243     assert 'u2' in values._p_.get_cached(c)
244     assert 'u2' in settings._p_.get_cached(c)
245
246
247 def test_cache_not_expire():
248     od1 = make_description()
249     c = Config(od1)
250     values = c.cfgimpl_get_values()
251     settings = c.cfgimpl_get_settings()
252     settings.remove('expire')
253     c.u1
254     assert 'u1' in values._p_.get_cached(c)
255     assert 'u1' in settings._p_.get_cached(c)
256     c.cfgimpl_reset_cache(True)
257     assert 'u1' in values._p_.get_cached(c)
258     assert 'u1' in settings._p_.get_cached(c)
259     sleep(1)
260     c.u2
261     assert 'u1' in values._p_.get_cached(c)
262     assert 'u1' in settings._p_.get_cached(c)
263     assert 'u2' in values._p_.get_cached(c)
264     assert 'u2' in settings._p_.get_cached(c)
265     c.cfgimpl_reset_cache(True)
266     assert 'u1' in values._p_.get_cached(c)
267     assert 'u1' in settings._p_.get_cached(c)
268     assert 'u2' in values._p_.get_cached(c)
269     assert 'u2' in settings._p_.get_cached(c)
270
271
272 def test_cache_not_cache():
273     od1 = make_description()
274     c = Config(od1)
275     values = c.cfgimpl_get_values()
276     settings = c.cfgimpl_get_settings()
277     settings.remove('cache')
278     c.u1
279     assert 'u1' not in values._p_.get_cached(c)
280     assert 'u1' not in settings._p_.get_cached(c)
281
282
283 def test_reset_cache_only():
284     od1 = make_description()
285     c = Config(od1)
286     values = c.cfgimpl_get_values()
287     settings = c.cfgimpl_get_settings()
288     c.u1
289     assert 'u1' in values._p_.get_cached(c)
290     assert 'u1' in settings._p_.get_cached(c)
291     c.cfgimpl_reset_cache(only=('values',))
292     assert 'u1' not in values._p_.get_cached(c)
293     assert 'u1' in settings._p_.get_cached(c)
294     c.u1
295     assert 'u1' in values._p_.get_cached(c)
296     assert 'u1' in settings._p_.get_cached(c)
297     c.cfgimpl_reset_cache(only=('settings',))
298     assert 'u1' in values._p_.get_cached(c)
299     assert 'u1' not in settings._p_.get_cached(c)
300
301
302 def test_force_cache():
303     u1 = IntOption('u1', '', multi=True)
304     u2 = IntOption('u2', '')
305     u3 = IntOption('u3', '', multi=True)
306     u4 = IntOption('u4', '', properties=('disabled',))
307     od = OptionDescription('od1', '', [u1, u2, u3, u4])
308     c = Config(od)
309     c.cfgimpl_get_settings().remove('expire')
310
311     c.cfgimpl_get_values().force_cache()
312     assert c.cfgimpl_get_values()._p_.get_cached(c) == {'u1': {None: ([], None)},
313                                                         'u2': {None: (None, None)},
314                                                         'u3': {None: ([], None)},
315                                                         'u4': {None: (None, None)}}
316     assert c.cfgimpl_get_settings()._p_.get_cached(c) == {'u1': {None: (set(['empty']), None)},
317                                                           'u2': {None: (set([]), None)},
318                                                           'u3': {None: (set(['empty']), None)},
319                                                           'u4': {None: (set(['disabled']), None)}}
320     c.read_only()
321
322     c.cfgimpl_get_values().force_cache()
323     assert c.cfgimpl_get_values()._p_.get_cached(c) == {'u1': {None: ([], None)},
324                                                         'u2': {None: (None, None)},
325                                                         'u3': {None: ([], None)}}
326     assert c.cfgimpl_get_settings()._p_.get_cached(c) == {'u1': {None: (set(['empty']), None)},
327                                                           'u2': {None: (set([]), None)},
328                                                           'u3': {None: (set(['empty']), None)},
329                                                           'u4': {None: (set(['disabled']), None)}}
330
331     c.cfgimpl_get_settings().remove('cache')
332     raises(ConfigError, "c.cfgimpl_get_values().force_cache()")
333
334
335 def test_cache_master_slave():
336     ip_admin_eth0 = StrOption('ip_admin_eth0', "ip réseau autorisé", multi=True)
337     netmask_admin_eth0 = StrOption('netmask_admin_eth0', "masque du sous-réseau", multi=True)
338     interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
339     interface1.impl_set_group_type(groups.master)
340     maconfig = OptionDescription('toto', '', [interface1])
341     cfg = Config(maconfig)
342     cfg.read_write()
343     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {}
344     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {}
345     #
346     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.2')
347     cfg.ip_admin_eth0.ip_admin_eth0
348     cfg.ip_admin_eth0.netmask_admin_eth0
349     cache = cfg.cfgimpl_get_values()._p_.get_cached(cfg)
350     assert set(cache.keys()) == set(['ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'])
351     assert set(cache['ip_admin_eth0.ip_admin_eth0'].keys()) == set([None])
352     assert cache['ip_admin_eth0.ip_admin_eth0'][None][0] == ['192.168.1.2']
353     assert set(cache['ip_admin_eth0.netmask_admin_eth0'].keys()) == set([None, 0])
354     assert cache['ip_admin_eth0.netmask_admin_eth0'][None][0] == [None]
355     assert cache['ip_admin_eth0.netmask_admin_eth0'][0][0] is None
356     cache = cfg.cfgimpl_get_settings()._p_.get_cached(cfg)
357     assert set(cache.keys()) == set(['ip_admin_eth0', 'ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'])
358     assert set(cache['ip_admin_eth0'].keys()) == set([None])
359     assert set(cache['ip_admin_eth0.ip_admin_eth0'].keys()) == set([None])
360     assert set(cache['ip_admin_eth0.netmask_admin_eth0'].keys()) == set([None, 0])
361     #
362     cfg.ip_admin_eth0.ip_admin_eth0.append('192.168.1.1')
363     cfg.ip_admin_eth0.ip_admin_eth0
364     cfg.ip_admin_eth0.netmask_admin_eth0
365     cache = cfg.cfgimpl_get_values()._p_.get_cached(cfg)
366     assert set(cache.keys()) == set(['ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'])
367     assert set(cache['ip_admin_eth0.ip_admin_eth0'].keys()) == set([None])
368     assert cache['ip_admin_eth0.ip_admin_eth0'][None][0] == ['192.168.1.2', '192.168.1.1']
369     assert set(cache['ip_admin_eth0.netmask_admin_eth0'].keys()) == set([None, 0, 1])
370     assert cache['ip_admin_eth0.netmask_admin_eth0'][None][0] == [None, None]
371     assert cache['ip_admin_eth0.netmask_admin_eth0'][0][0] is None
372     assert cache['ip_admin_eth0.netmask_admin_eth0'][1][0] is None
373     cache = cfg.cfgimpl_get_settings()._p_.get_cached(cfg)
374     assert set(cache.keys()) == set(['ip_admin_eth0', 'ip_admin_eth0.ip_admin_eth0', 'ip_admin_eth0.netmask_admin_eth0'])
375     assert set(cache['ip_admin_eth0'].keys()) == set([None])
376     assert set(cache['ip_admin_eth0.ip_admin_eth0'].keys()) == set([None])
377     assert set(cache['ip_admin_eth0.netmask_admin_eth0'].keys()) == set([None, 0, 1])
378     #DEL, insert, ...
379
380
381 def return_value(value=None):
382     return value
383
384
385 def test_cache_callback():
386     val1 = StrOption('val1', "", 'val')
387     val2 = StrOption('val2', "", callback=return_value, callback_params={'': ((val1, False),)}, properties=('mandatory',))
388     val3 = StrOption('val3', "", callback=return_value, callback_params={'': ('yes',)})
389     val4 = StrOption('val4', "", callback=return_value, callback_params={'value': ((val1, False),)})
390     val5 = StrOption('val5', "", callback=return_value, callback_params={'value': ('yes',)}, multi=True)
391     maconfig = OptionDescription('rootconfig', '', [val1, val2, val3, val4, val5])
392     cfg = Config(maconfig)
393     cfg.cfgimpl_get_settings().remove('expire')
394     cfg.read_write()
395     cfg.cfgimpl_get_values().force_cache()
396     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)},
397                                                               'val2': {None: (set(['mandatory']), None)},
398                                                               'val3': {None: (set([]), None)},
399                                                               'val4': {None: (set([]), None)},
400                                                               'val5': {None: (set(['empty']), None)}}
401     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {'val1': {None: ('val', None)},
402                                                             'val2': {None: ('val', None)},
403                                                             'val3': {None: ('yes', None)},
404                                                             'val4': {None: ('val', None)},
405                                                             'val5': {None: (['yes'], None)}}
406     cfg.val1 = 'new'
407     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val3': {None: (set([]), None)},
408                                                               'val5': {None: (set(['empty']), None)}}
409     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {'val3': {None: ('yes', None)},
410                                                             'val5': {None: (['yes'], None)}}
411     cfg.cfgimpl_get_values().force_cache()
412     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)},
413                                                               'val2': {None: (set(['mandatory']), None)},
414                                                               'val3': {None: (set([]), None)},
415                                                               'val4': {None: (set([]), None)},
416                                                               'val5': {None: (set(['empty']), None)}}
417     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {'val1': {None: ('new', None)},
418                                                             'val2': {None: ('new', None)},
419                                                             'val3': {None: ('yes', None)},
420                                                             'val4': {None: ('new', None)},
421                                                             'val5': {None: (['yes'], None)}}
422     cfg.val3 = 'new2'
423     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)},
424                                                               'val2': {None: (set(['mandatory']), None)},
425                                                               'val4': {None: (set([]), None)},
426                                                               'val5': {None: (set(['empty']), None)}}
427     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {'val1': {None: ('new', None)},
428                                                             'val2': {None: ('new', None)},
429                                                             'val4': {None: ('new', None)},
430                                                             'val5': {None: (['yes'], None)}}
431     cfg.cfgimpl_get_values().force_cache()
432     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)},
433                                                               'val2': {None: (set(['mandatory']), None)},
434                                                               'val3': {None: (set([]), None)},
435                                                               'val4': {None: (set([]), None)},
436                                                               'val5': {None: (set(['empty']), None)}}
437     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {'val1': {None: ('new', None)},
438                                                             'val2': {None: ('new', None)},
439                                                             'val3': {None: ('new2', None)},
440                                                             'val4': {None: ('new', None)},
441                                                             'val5': {None: (['yes'], None)}}
442     cfg.val4 = 'new3'
443     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)},
444                                                               'val2': {None: (set(['mandatory']), None)},
445                                                               'val3': {None: (set([]), None)},
446                                                               'val5': {None: (set(['empty']), None)}}
447     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {'val1': {None: ('new', None)},
448                                                             'val2': {None: ('new', None)},
449                                                             'val3': {None: ('new2', None)},
450                                                             'val5': {None: (['yes'], None)}}
451     cfg.cfgimpl_get_values().force_cache()
452     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)},
453                                                               'val2': {None: (set(['mandatory']), None)},
454                                                               'val3': {None: (set([]), None)},
455                                                               'val4': {None: (set([]), None)},
456                                                               'val5': {None: (set(['empty']), None)}}
457     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {'val1': {None: ('new', None)},
458                                                             'val2': {None: ('new', None)},
459                                                             'val3': {None: ('new2', None)},
460                                                             'val4': {None: ('new3', None)},
461                                                             'val5': {None: (['yes'], None)}}
462     cfg.val5.append('new4')
463     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)},
464                                                               'val2': {None: (set(['mandatory']), None)},
465                                                               'val3': {None: (set([]), None)},
466                                                               'val4': {None: (set([]), None)}}
467     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {'val1': {None: ('new', None)},
468                                                             'val2': {None: ('new', None)},
469                                                             'val3': {None: ('new2', None)},
470                                                             'val4': {None: ('new3', None)}}
471     cfg.cfgimpl_get_values().force_cache()
472     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)},
473                                                               'val2': {None: (set(['mandatory']), None)},
474                                                               'val3': {None: (set([]), None)},
475                                                               'val4': {None: (set([]), None)},
476                                                               'val5': {None: (set(['empty']), None)}}
477     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {'val1': {None: ('new', None)},
478                                                             'val2': {None: ('new', None)},
479                                                             'val3': {None: ('new2', None)},
480                                                             'val4': {None: ('new3', None)},
481                                                             'val5': {None: (['yes', 'new4'], None)}}
482
483
484 def test_cache_master_and_slaves_master():
485     val1 = StrOption('val1', "", multi=True)
486     val2 = StrOption('val2', "", multi=True)
487     interface1 = OptionDescription('val1', '', [val1, val2])
488     interface1.impl_set_group_type(groups.master)
489     maconfig = OptionDescription('rootconfig', '', [interface1])
490     cfg = Config(maconfig)
491     cfg.cfgimpl_get_settings().remove('expire')
492     cfg.read_write()
493     cfg.cfgimpl_get_values().force_cache()
494     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)},
495                                                               'val1.val1': {None: (set(['empty']), None)},
496                                                               'val1.val2': {None: (set([]), None)}}
497     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {'val1.val1': {None: ([], None)}, 'val1.val2': {None: ([], None)}}
498     cfg.val1.val1.append()
499     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)}}
500     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {}
501     cfg.cfgimpl_get_values().force_cache()
502     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)},
503                                                               'val1.val1': {None: (set(['empty']), None)},
504                                                               'val1.val2': {None: (set([]), None), 0: (set([]), None)}}
505     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {'val1.val1': {None: ([None], None)},
506                                                             'val1.val2': {None: ([None], None), 0: (None, None)}}
507     cfg.val1.val1.append()
508     cfg.cfgimpl_get_values().force_cache()
509     cfg.val1.val2[1] = 'oui'
510     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)},
511                                                               'val1.val1': {None: (set(['empty']), None)}}
512     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {'val1.val1': {None: ([None, None], None)}}
513     cfg.cfgimpl_get_values().force_cache()
514     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)},
515                                                               'val1.val1': {None: (set(['empty']), None)},
516                                                               'val1.val2': {None: (set([]), None), 0: (set([]), None), 1: (set([]), None)}}
517     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {'val1.val1': {None: ([None, None], None)},
518                                                             'val1.val2': {None: ([None, 'oui'], None), 0: (None, None), 1: ('oui', None)}}
519
520
521 def test_cache_master_callback():
522     val1 = StrOption('val1', "", multi=True)
523     val2 = StrOption('val2', "", multi=True, callback=return_value, callback_params={'value': ((val1, False),)})
524     interface1 = OptionDescription('val1', '', [val1, val2])
525     interface1.impl_set_group_type(groups.master)
526     maconfig = OptionDescription('rootconfig', '', [interface1])
527     cfg = Config(maconfig)
528     cfg.cfgimpl_get_settings().remove('expire')
529     cfg.read_write()
530     cfg.cfgimpl_get_values().force_cache()
531     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)},
532                                                               'val1.val1': {None: (set(['empty']), None)},
533                                                               'val1.val2': {None: (set([]), None)}}
534     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {'val1.val1': {None: ([], None)}, 'val1.val2': {None: ([], None)}}
535     cfg.val1.val1.append()
536     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)}}
537     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {}
538     cfg.cfgimpl_get_values().force_cache()
539     assert cfg.cfgimpl_get_settings()._p_.get_cached(cfg) == {'val1': {None: (set([]), None)},
540                                                               'val1.val1': {None: (set(['empty']), None)},
541                                                               'val1.val2': {None: (set([]), None), 0: (set([]), None)}}
542     assert cfg.cfgimpl_get_values()._p_.get_cached(cfg) == {'val1.val1': {None: ([None], None)},
543                                                             'val1.val2': {None: ([None], None), 0: (None, None)}}
544
545
546 def test_cache_requires():
547     a = BoolOption('activate_service', '', True)
548     b = IPOption('ip_address_service', '',
549                  requires=[{'option': a, 'expected': False, 'action': 'disabled'}])
550     od = OptionDescription('service', '', [a, b])
551     c = Config(od)
552     c.cfgimpl_get_settings().remove('expire')
553     c.read_write()
554     assert c.cfgimpl_get_settings()._p_.get_cached(c) == {}
555     assert c.cfgimpl_get_values()._p_.get_cached(c) == {}
556     assert c.ip_address_service == None
557     assert c.cfgimpl_get_settings()._p_.get_cached(c) == {'activate_service': {None: (set([]), None)},
558                                                           'ip_address_service': {None: (set([]), None)}}
559
560     assert c.cfgimpl_get_values()._p_.get_cached(c) == {'ip_address_service': {None: (None, None)}}
561     c.cfgimpl_get_values().force_cache()
562     assert c.cfgimpl_get_settings()._p_.get_cached(c) == {'activate_service': {None: (set([]), None)},
563                                                           'ip_address_service': {None: (set([]), None)}}
564
565     assert c.cfgimpl_get_values()._p_.get_cached(c) == {'ip_address_service': {None: (None, None)},
566                                                         'activate_service': {None: (True, None)}}
567     c.ip_address_service = '1.1.1.1'
568     assert c.cfgimpl_get_settings()._p_.get_cached(c) == {'activate_service': {None: (set([]), None)}}
569
570     assert c.cfgimpl_get_values()._p_.get_cached(c) == {'activate_service': {None: (True, None)}}
571     c.cfgimpl_get_values().force_cache()
572     assert c.cfgimpl_get_settings()._p_.get_cached(c) == {'activate_service': {None: (set([]), None)},
573                                                           'ip_address_service': {None: (set([]), None)}}
574
575     assert c.cfgimpl_get_values()._p_.get_cached(c) == {'ip_address_service': {None: ('1.1.1.1', None)},
576                                                         'activate_service': {None: (True, None)}}
577     c.activate_service = False
578     assert c.cfgimpl_get_settings()._p_.get_cached(c) == {}
579
580     assert c.cfgimpl_get_values()._p_.get_cached(c) == {}
581     c.cfgimpl_get_values().force_cache()
582     assert c.cfgimpl_get_settings()._p_.get_cached(c) == {'activate_service': {None: (set([]), None)},
583                                                           'ip_address_service': {None: (set(['disabled']), None)}}
584
585     assert c.cfgimpl_get_values()._p_.get_cached(c) == {'activate_service': {None: (False, None)}}