better performance in find_firsts
[tiramisu.git] / test / test_cache.py
1 # coding: utf-8
2 import autopath
3 from tiramisu import setting
4 setting.expires_time = 1
5 from tiramisu.option import IntOption, OptionDescription
6 from tiramisu.config import Config
7 from tiramisu.error import ConfigError
8
9
10 from time import sleep, time
11 from py.test import raises
12
13
14 def make_description():
15     u1 = IntOption('u1', '', multi=True)
16     u2 = IntOption('u2', '')
17     u3 = IntOption('u3', '', multi=True)
18     return OptionDescription('od1', '', [u1, u2, u3])
19
20
21 def test_cache_config():
22     od1 = make_description()
23     assert od1.impl_already_build_caches() == False
24     c = Config(od1)
25     assert od1.impl_already_build_caches() == True
26
27
28 def test_cache():
29     od1 = make_description()
30     c = Config(od1)
31     values = c.cfgimpl_get_values()
32     settings = c.cfgimpl_get_settings()
33     c.u1
34     assert 'u1' in values._p_.get_cached(c)
35     assert 'u1' in settings._p_.get_cached(c)
36     c.u2
37     assert 'u1' in values._p_.get_cached(c)
38     assert 'u1' in settings._p_.get_cached(c)
39     assert 'u2' in values._p_.get_cached(c)
40     assert 'u2' in settings._p_.get_cached(c)
41
42
43 def test_get_cache():
44     # force a value in cache, try if reget corrupted value
45     od1 = make_description()
46     c = Config(od1)
47     values = c.cfgimpl_get_values()
48     settings = c.cfgimpl_get_settings()
49     ntime = time() + 1
50     settings._p_.setcache('u1', set(['inject']), ntime)
51     assert 'inject' in settings[od1.u1]
52     values._p_.setcache('u1', 100, ntime)
53     assert c.u1 == [100]
54
55
56 def test_get_cache_no_expire():
57     # force a value in cache, try if reget corrupted value
58     od1 = make_description()
59     c = Config(od1)
60     values = c.cfgimpl_get_values()
61     settings = c.cfgimpl_get_settings()
62     settings._p_.setcache('u1', set(['inject2']), None)
63     assert 'inject2' in settings[od1.u1]
64     values._p_.setcache('u1', 200, None)
65     assert c.u1 == [200]
66
67
68 def test_cache_reset():
69     od1 = make_description()
70     c = Config(od1)
71     values = c.cfgimpl_get_values()
72     settings = c.cfgimpl_get_settings()
73     #when change a value
74     c.u1
75     assert 'u1' in values._p_.get_cached(c)
76     assert 'u1' in settings._p_.get_cached(c)
77     c.u2 = 1
78     assert 'u1' not in values._p_.get_cached(c)
79     assert 'u1' not in settings._p_.get_cached(c)
80     #when remove a value
81     c.u1
82     assert 'u1' in values._p_.get_cached(c)
83     assert 'u1' in settings._p_.get_cached(c)
84     del(c.u2)
85     assert 'u1' not in values._p_.get_cached(c)
86     assert 'u1' not in settings._p_.get_cached(c)
87     #when add/del property
88     c.u1
89     assert 'u1' in values._p_.get_cached(c)
90     assert 'u1' in settings._p_.get_cached(c)
91     c.cfgimpl_get_settings()[od1.u2].append('test')
92     assert 'u1' not in values._p_.get_cached(c)
93     assert 'u1' not in settings._p_.get_cached(c)
94     c.u1
95     assert 'u1' in values._p_.get_cached(c)
96     assert 'u1' in settings._p_.get_cached(c)
97     c.cfgimpl_get_settings()[od1.u2].remove('test')
98     assert 'u1' not in values._p_.get_cached(c)
99     assert 'u1' not in settings._p_.get_cached(c)
100     #when enable/disabled property
101     c.u1
102     assert 'u1' in values._p_.get_cached(c)
103     assert 'u1' in settings._p_.get_cached(c)
104     c.cfgimpl_get_settings().append('test')
105     assert 'u1' not in values._p_.get_cached(c)
106     assert 'u1' not in settings._p_.get_cached(c)
107     c.u1
108     assert 'u1' in values._p_.get_cached(c)
109     assert 'u1' in settings._p_.get_cached(c)
110     c.cfgimpl_get_settings().remove('test')
111     assert 'u1' not in values._p_.get_cached(c)
112     assert 'u1' not in settings._p_.get_cached(c)
113
114
115 def test_cache_reset_multi():
116     od1 = make_description()
117     c = Config(od1)
118     values = c.cfgimpl_get_values()
119     settings = c.cfgimpl_get_settings()
120     #when change a value
121     c.u1
122     assert 'u1' in values._p_.get_cached(c)
123     assert 'u1' in settings._p_.get_cached(c)
124     c.u3 = [1]
125     assert 'u1' not in values._p_.get_cached(c)
126     assert 'u1' not in settings._p_.get_cached(c)
127     #when append value
128     c.u1
129     assert 'u1' in values._p_.get_cached(c)
130     assert 'u1' in settings._p_.get_cached(c)
131     c.u3.append(1)
132     assert 'u1' not in values._p_.get_cached(c)
133     assert 'u1' not in settings._p_.get_cached(c)
134     #when pop value
135     c.u1
136     assert 'u1' in values._p_.get_cached(c)
137     assert 'u1' in settings._p_.get_cached(c)
138     c.u3.pop(1)
139     assert 'u1' not in values._p_.get_cached(c)
140     assert 'u1' not in settings._p_.get_cached(c)
141     #when remove a value
142     c.u1
143     assert 'u1' in values._p_.get_cached(c)
144     assert 'u1' in settings._p_.get_cached(c)
145     del(c.u3)
146     assert 'u1' not in values._p_.get_cached(c)
147     assert 'u1' not in settings._p_.get_cached(c)
148
149
150 def test_reset_cache():
151     od1 = make_description()
152     c = Config(od1)
153     values = c.cfgimpl_get_values()
154     settings = c.cfgimpl_get_settings()
155     c.u1
156     assert 'u1' in values._p_.get_cached(c)
157     assert 'u1' in settings._p_.get_cached(c)
158     c.cfgimpl_reset_cache()
159     assert 'u1' not in values._p_.get_cached(c)
160     assert 'u1' not in settings._p_.get_cached(c)
161     c.u1
162     sleep(1)
163     c.u1
164     sleep(1)
165     c.u2
166     assert 'u1' in values._p_.get_cached(c)
167     assert 'u1' in settings._p_.get_cached(c)
168     assert 'u2' in values._p_.get_cached(c)
169     assert 'u2' in settings._p_.get_cached(c)
170     c.cfgimpl_reset_cache()
171     assert 'u1' not in values._p_.get_cached(c)
172     assert 'u1' not in settings._p_.get_cached(c)
173     assert 'u2' not in values._p_.get_cached(c)
174     assert 'u2' not in settings._p_.get_cached(c)
175
176
177 def test_reset_cache_subconfig():
178     od1 = make_description()
179     od2 = OptionDescription('od2', '', [od1])
180     c = Config(od2)
181     values = c.cfgimpl_get_values()
182     c.od1.u1
183     assert 'od1.u1' in values._p_.get_cached(c)
184     c.od1.cfgimpl_reset_cache()
185     assert 'od1.u1' not in values._p_.get_cached(c)
186
187
188 def test_reset_cache_only_expired():
189     od1 = make_description()
190     c = Config(od1)
191     values = c.cfgimpl_get_values()
192     settings = c.cfgimpl_get_settings()
193     c.u1
194     assert 'u1' in values._p_.get_cached(c)
195     assert 'u1' in settings._p_.get_cached(c)
196     c.cfgimpl_reset_cache(True)
197     assert 'u1' in values._p_.get_cached(c)
198     assert 'u1' in settings._p_.get_cached(c)
199     sleep(1)
200     c.u1
201     sleep(1)
202     c.u2
203     assert 'u1' in values._p_.get_cached(c)
204     assert 'u1' in settings._p_.get_cached(c)
205     assert 'u2' in values._p_.get_cached(c)
206     assert 'u2' in settings._p_.get_cached(c)
207     c.cfgimpl_reset_cache(True)
208     assert 'u1' not in values._p_.get_cached(c)
209     assert 'u1' not in settings._p_.get_cached(c)
210     assert 'u2' in values._p_.get_cached(c)
211     assert 'u2' in settings._p_.get_cached(c)
212
213
214 def test_cache_not_expire():
215     od1 = make_description()
216     c = Config(od1)
217     values = c.cfgimpl_get_values()
218     settings = c.cfgimpl_get_settings()
219     settings.remove('expire')
220     c.u1
221     assert 'u1' in values._p_.get_cached(c)
222     assert 'u1' in settings._p_.get_cached(c)
223     c.cfgimpl_reset_cache(True)
224     assert 'u1' in values._p_.get_cached(c)
225     assert 'u1' in settings._p_.get_cached(c)
226     sleep(1)
227     c.u2
228     assert 'u1' in values._p_.get_cached(c)
229     assert 'u1' in settings._p_.get_cached(c)
230     assert 'u2' in values._p_.get_cached(c)
231     assert 'u2' in settings._p_.get_cached(c)
232     c.cfgimpl_reset_cache(True)
233     assert 'u1' in values._p_.get_cached(c)
234     assert 'u1' in settings._p_.get_cached(c)
235     assert 'u2' in values._p_.get_cached(c)
236     assert 'u2' in settings._p_.get_cached(c)
237
238
239 def test_cache_not_cache():
240     od1 = make_description()
241     c = Config(od1)
242     values = c.cfgimpl_get_values()
243     settings = c.cfgimpl_get_settings()
244     settings.remove('cache')
245     c.u1
246     assert 'u1' not in values._p_.get_cached(c)
247     assert 'u1' not in settings._p_.get_cached(c)
248
249
250 def test_reset_cache_only():
251     od1 = make_description()
252     c = Config(od1)
253     values = c.cfgimpl_get_values()
254     settings = c.cfgimpl_get_settings()
255     c.u1
256     assert 'u1' in values._p_.get_cached(c)
257     assert 'u1' in settings._p_.get_cached(c)
258     c.cfgimpl_reset_cache(only=('values',))
259     assert 'u1' not in values._p_.get_cached(c)
260     assert 'u1' in settings._p_.get_cached(c)
261     c.u1
262     assert 'u1' in values._p_.get_cached(c)
263     assert 'u1' in settings._p_.get_cached(c)
264     c.cfgimpl_reset_cache(only=('settings',))
265     assert 'u1' in values._p_.get_cached(c)
266     assert 'u1' not in settings._p_.get_cached(c)
267
268
269 def test_force_cache():
270     u1 = IntOption('u1', '', multi=True)
271     u2 = IntOption('u2', '')
272     u3 = IntOption('u3', '', multi=True)
273     u4 = IntOption('u4', '', properties=('disabled',))
274     od = OptionDescription('od1', '', [u1, u2, u3, u4])
275     c = Config(od)
276     c.cfgimpl_get_settings().remove('expire')
277
278     c.cfgimpl_get_values().force_cache()
279     assert c.cfgimpl_get_values()._p_.get_cached(c) == {'u1': ([], None), 'u3': ([], None), 'u2': (None, None), 'u4': (None, None)}
280     assert c.cfgimpl_get_settings()._p_.get_cached(c) == {'u4': (set(['disabled']), None), 'u1': (set([]), None), 'u3': (set([]), None), 'u2': (set([]), None)}
281     c.read_only()
282
283     c.cfgimpl_get_values().force_cache()
284     assert c.cfgimpl_get_values()._p_.get_cached(c) == {'u1': ([], None), 'u3': ([], None), 'u2': (None, None)}
285     assert c.cfgimpl_get_settings()._p_.get_cached(c) == {'u4': (set(['disabled']), None), 'u1': (set([]), None), 'u3': (set([]), None), 'u2': (set([]), None)}
286
287     c.cfgimpl_get_settings().remove('cache')
288     raises(ConfigError, "c.cfgimpl_get_values().force_cache()")