ecdc2dc02ef2edbdc99e59e71c8328caf445b018
[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 c = 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                 c: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, c3)
223                 evicted_key, evicted_value = _key, _value;
224                 if _key == "a" then
225                         -- Put it back in...
226                         -- Check that the newest key/value was set before on_evict was called
227                         assert_equal(c3:get("b"), 2);
228                         -- Sanity check for what we're evicting
229                         assert_equal(_key, "a");
230                         assert_equal(_value, 1);
231                         -- Re-insert the evicted key (causes this evict function to run again with "b",2)
232                         c3:set(_key, _value)
233                         assert_equal(c3:get(_key), _value)
234                 end
235         end);
236         local function set(k, v, should_evict_key, should_evict_value)
237                 evicted_key, evicted_value = nil, nil;
238                 c3:set(k, v);
239                 assert_equal(evicted_key, should_evict_key);
240                 assert_equal(evicted_value, should_evict_value);
241         end
242         set("a", 1)
243         set("a", 1)
244         set("a", 1)
245         set("a", 1)
246         set("a", 1)
247
248         -- The evict handler re-inserts "a"->1, so "b" gets evicted:
249         set("b", 2, "b", 2)
250         -- Check the final state is what we expect
251         assert_equal(c3:get("a"), 1);
252         assert_equal(c3:get("b"), nil);
253         assert_equal(c3:count(), 1);
254 end