test_util_cache: rename a variable (c is already defined) [luacheck]
[prosody.git] / tests / test_util_cache.lua
1 function new(new)
2         local c = new(5);
3
4         local function expect_kv(key, value, actual_key, actual_value)
5                 assert_equal(key, actual_key, "key incorrect");
6                 assert_equal(value, actual_value, "value incorrect");
7         end
8
9         expect_kv(nil, nil, c:head());
10         expect_kv(nil, nil, c:tail());
11
12         assert_equal(c:count(), 0);
13         
14         c:set("one", 1)
15         assert_equal(c:count(), 1);
16         expect_kv("one", 1, c:head());
17         expect_kv("one", 1, c:tail());
18
19         c:set("two", 2)
20         expect_kv("two", 2, c:head());
21         expect_kv("one", 1, c:tail());
22
23         c:set("three", 3)
24         expect_kv("three", 3, c:head());
25         expect_kv("one", 1, c:tail());
26
27         c:set("four", 4)
28         c:set("five", 5);
29         assert_equal(c:count(), 5);
30         expect_kv("five", 5, c:head());
31         expect_kv("one", 1, c:tail());
32         
33         c:set("foo", nil);
34         assert_equal(c:count(), 5);
35         expect_kv("five", 5, c:head());
36         expect_kv("one", 1, c:tail());
37         
38         assert_equal(c:get("one"), 1);
39         expect_kv("five", 5, c:head());
40         expect_kv("one", 1, c:tail());
41
42         assert_equal(c:get("two"), 2);
43         assert_equal(c:get("three"), 3);
44         assert_equal(c:get("four"), 4);
45         assert_equal(c:get("five"), 5);
46
47         assert_equal(c:get("foo"), nil);
48         assert_equal(c:get("bar"), nil);
49         
50         c:set("six", 6);
51         assert_equal(c:count(), 5);
52         expect_kv("six", 6, c:head());
53         expect_kv("two", 2, c:tail());
54         
55         assert_equal(c:get("one"), nil);
56         assert_equal(c:get("two"), 2);
57         assert_equal(c:get("three"), 3);
58         assert_equal(c:get("four"), 4);
59         assert_equal(c:get("five"), 5);
60         assert_equal(c:get("six"), 6);
61         
62         c:set("three", nil);
63         assert_equal(c:count(), 4);
64         
65         assert_equal(c:get("one"), nil);
66         assert_equal(c:get("two"), 2);
67         assert_equal(c:get("three"), nil);
68         assert_equal(c:get("four"), 4);
69         assert_equal(c:get("five"), 5);
70         assert_equal(c:get("six"), 6);
71         
72         c:set("seven", 7);
73         assert_equal(c:count(), 5);
74         
75         assert_equal(c:get("one"), nil);
76         assert_equal(c:get("two"), 2);
77         assert_equal(c:get("three"), nil);
78         assert_equal(c:get("four"), 4);
79         assert_equal(c:get("five"), 5);
80         assert_equal(c:get("six"), 6);
81         assert_equal(c:get("seven"), 7);
82         
83         c:set("eight", 8);
84         assert_equal(c:count(), 5);
85         
86         assert_equal(c:get("one"), nil);
87         assert_equal(c:get("two"), nil);
88         assert_equal(c:get("three"), nil);
89         assert_equal(c:get("four"), 4);
90         assert_equal(c:get("five"), 5);
91         assert_equal(c:get("six"), 6);
92         assert_equal(c:get("seven"), 7);
93         assert_equal(c:get("eight"), 8);
94         
95         c:set("four", 4);
96         assert_equal(c:count(), 5);
97         
98         assert_equal(c:get("one"), nil);
99         assert_equal(c:get("two"), nil);
100         assert_equal(c:get("three"), nil);
101         assert_equal(c:get("four"), 4);
102         assert_equal(c:get("five"), 5);
103         assert_equal(c:get("six"), 6);
104         assert_equal(c:get("seven"), 7);
105         assert_equal(c:get("eight"), 8);
106         
107         c:set("nine", 9);
108         assert_equal(c:count(), 5);
109         
110         assert_equal(c:get("one"), nil);
111         assert_equal(c:get("two"), nil);
112         assert_equal(c:get("three"), nil);
113         assert_equal(c:get("four"), 4);
114         assert_equal(c:get("five"), nil);
115         assert_equal(c:get("six"), 6);
116         assert_equal(c:get("seven"), 7);
117         assert_equal(c:get("eight"), 8);
118         assert_equal(c:get("nine"), 9);
119
120         local keys = { "nine", "four", "eight", "seven", "six" };
121         local values = { 9, 4, 8, 7, 6 };
122         local i = 0;    
123         for k, v in c:items() do
124                 i = i + 1;
125                 assert_equal(k, keys[i]);
126                 assert_equal(v, values[i]);
127         end
128         assert_equal(i, 5);
129         
130         c:set("four", "2+2");
131         assert_equal(c:count(), 5);
132
133         assert_equal(c:get("one"), nil);
134         assert_equal(c:get("two"), nil);
135         assert_equal(c:get("three"), nil);
136         assert_equal(c:get("four"), "2+2");
137         assert_equal(c:get("five"), nil);
138         assert_equal(c:get("six"), 6);
139         assert_equal(c:get("seven"), 7);
140         assert_equal(c:get("eight"), 8);
141         assert_equal(c:get("nine"), 9);
142
143         local keys = { "four", "nine", "eight", "seven", "six" };
144         local values = { "2+2", 9, 8, 7, 6 };
145         local i = 0;    
146         for k, v in c:items() do
147                 i = i + 1;
148                 assert_equal(k, keys[i]);
149                 assert_equal(v, values[i]);
150         end
151         assert_equal(i, 5);
152         
153         c:set("foo", nil);
154         assert_equal(c:count(), 5);
155
156         assert_equal(c:get("one"), nil);
157         assert_equal(c:get("two"), nil);
158         assert_equal(c:get("three"), nil);
159         assert_equal(c:get("four"), "2+2");
160         assert_equal(c:get("five"), nil);
161         assert_equal(c:get("six"), 6);
162         assert_equal(c:get("seven"), 7);
163         assert_equal(c:get("eight"), 8);
164         assert_equal(c:get("nine"), 9);
165
166         local keys = { "four", "nine", "eight", "seven", "six" };
167         local values = { "2+2", 9, 8, 7, 6 };
168         local i = 0;    
169         for k, v in c:items() do
170                 i = i + 1;
171                 assert_equal(k, keys[i]);
172                 assert_equal(v, values[i]);
173         end
174         assert_equal(i, 5);
175         
176         c:set("four", nil);
177         
178         assert_equal(c:get("one"), nil);
179         assert_equal(c:get("two"), nil);
180         assert_equal(c:get("three"), nil);
181         assert_equal(c:get("four"), nil);
182         assert_equal(c:get("five"), nil);
183         assert_equal(c:get("six"), 6);
184         assert_equal(c:get("seven"), 7);
185         assert_equal(c:get("eight"), 8);
186         assert_equal(c:get("nine"), 9);
187
188         local keys = { "nine", "eight", "seven", "six" };
189         local values = { 9, 8, 7, 6 };
190         local i = 0;    
191         for k, v in c:items() do
192                 i = i + 1;
193                 assert_equal(k, keys[i]);
194                 assert_equal(v, values[i]);
195         end
196         assert_equal(i, 4);
197         
198         local evicted_key, evicted_value;
199         local c2 = new(3, function (_key, _value)
200                 evicted_key, evicted_value = _key, _value;
201         end);
202         local function set(k, v, should_evict_key, should_evict_value)
203                 evicted_key, evicted_value = nil, nil;
204                 c2:set(k, v);
205                 assert_equal(evicted_key, should_evict_key);
206                 assert_equal(evicted_value, should_evict_value);
207         end
208         set("a", 1)
209         set("a", 1)
210         set("a", 1)
211         set("a", 1)
212         set("a", 1)
213
214         set("b", 2)
215         set("c", 3)
216         set("b", 2)
217         set("d", 4, "a", 1)
218         set("e", 5, "c", 3)
219         
220
221         local evicted_key, evicted_value;
222         local c3 = new(1, function (_key, _value)
223                 evicted_key, evicted_value = _key, _value;
224                 if _key == "a" then
225                         -- Sanity check for what we're evicting
226                         assert_equal(_key, "a");
227                         assert_equal(_value, 1);
228                         -- We're going to block eviction of this key/value, so set to nil...
229                         evicted_key, evicted_value = nil, nil;
230                         -- Returning false to block eviction
231                         return false
232                 end
233         end);
234         local function set(k, v, should_evict_key, should_evict_value)
235                 evicted_key, evicted_value = nil, nil;
236                 local ret = c3:set(k, v);
237                 assert_equal(evicted_key, should_evict_key);
238                 assert_equal(evicted_value, should_evict_value);
239                 return ret;
240         end
241         set("a", 1)
242         set("a", 1)
243         set("a", 1)
244         set("a", 1)
245         set("a", 1)
246
247         -- Our on_evict prevents "a" from being evicted, causing this to fail...
248         assert_equal(set("b", 2), false, "Failed to prevent eviction, or signal result");
249         
250         expect_kv("a", 1, c3:head());
251         expect_kv("a", 1, c3:tail());
252         
253         -- Check the final state is what we expect
254         assert_equal(c3:get("a"), 1);
255         assert_equal(c3:get("b"), nil);
256         assert_equal(c3:count(), 1);
257
258
259         local c4 = new(3, false);
260         
261         assert_equal(c4:set("a", 1), true);
262         assert_equal(c4:set("a", 1), true);
263         assert_equal(c4:set("a", 1), true);
264         assert_equal(c4:set("a", 1), true);
265         assert_equal(c4:set("b", 2), true);
266         assert_equal(c4:set("c", 3), true);
267         assert_equal(c4:set("d", 4), false);
268         assert_equal(c4:set("d", 4), false);
269         assert_equal(c4:set("d", 4), false);
270
271         expect_kv("c", 3, c4:head());
272         expect_kv("a", 1, c4:tail());
273
274         local c5 = new(3, function (k, v)
275                 if k == "a" then
276                         return nil;
277                 elseif k == "b" then
278                         return true;
279                 end
280                 return false;
281         end);
282         
283         assert_equal(c5:set("a", 1), true);
284         assert_equal(c5:set("a", 1), true);
285         assert_equal(c5:set("a", 1), true);
286         assert_equal(c5:set("a", 1), true);
287         assert_equal(c5:set("b", 2), true);
288         assert_equal(c5:set("c", 3), true);
289         assert_equal(c5:set("d", 4), true); -- "a" evicted (cb returned nil)
290         assert_equal(c5:set("d", 4), true); -- nop
291         assert_equal(c5:set("d", 4), true); -- nop
292         assert_equal(c5:set("e", 5), true); -- "b" evicted (cb returned true)
293         assert_equal(c5:set("f", 6), false); -- "c" won't evict (cb returned false)
294
295         expect_kv("e", 5, c5:head());
296         expect_kv("c", 3, c5:tail());
297
298 end