Merge 0.10->trunk
[prosody.git] / tests / test_util_cache.lua
1
2 function new(new)
3         local c = new(5);
4
5         assert_equal(c:count(), 0);
6         
7         c:set("one", 1)
8         assert_equal(c:count(), 1);
9         c:set("two", 2)
10         c:set("three", 3)
11         c:set("four", 4)
12         c:set("five", 5);
13         assert_equal(c:count(), 5);
14         
15         c:set("foo", nil);
16         assert_equal(c:count(), 5);
17         
18         assert_equal(c:get("one"), 1);
19         assert_equal(c:get("two"), 2);
20         assert_equal(c:get("three"), 3);
21         assert_equal(c:get("four"), 4);
22         assert_equal(c:get("five"), 5);
23
24         assert_equal(c:get("foo"), nil);
25         assert_equal(c:get("bar"), nil);
26         
27         c:set("six", 6);
28         assert_equal(c:count(), 5);
29         
30         assert_equal(c:get("one"), nil);
31         assert_equal(c:get("two"), 2);
32         assert_equal(c:get("three"), 3);
33         assert_equal(c:get("four"), 4);
34         assert_equal(c:get("five"), 5);
35         assert_equal(c:get("six"), 6);
36         
37         c:set("three", nil);
38         assert_equal(c:count(), 4);
39         
40         assert_equal(c:get("one"), nil);
41         assert_equal(c:get("two"), 2);
42         assert_equal(c:get("three"), nil);
43         assert_equal(c:get("four"), 4);
44         assert_equal(c:get("five"), 5);
45         assert_equal(c:get("six"), 6);
46         
47         c:set("seven", 7);
48         assert_equal(c:count(), 5);
49         
50         assert_equal(c:get("one"), nil);
51         assert_equal(c:get("two"), 2);
52         assert_equal(c:get("three"), nil);
53         assert_equal(c:get("four"), 4);
54         assert_equal(c:get("five"), 5);
55         assert_equal(c:get("six"), 6);
56         assert_equal(c:get("seven"), 7);
57         
58         c:set("eight", 8);
59         assert_equal(c:count(), 5);
60         
61         assert_equal(c:get("one"), nil);
62         assert_equal(c:get("two"), nil);
63         assert_equal(c:get("three"), nil);
64         assert_equal(c:get("four"), 4);
65         assert_equal(c:get("five"), 5);
66         assert_equal(c:get("six"), 6);
67         assert_equal(c:get("seven"), 7);
68         assert_equal(c:get("eight"), 8);
69         
70         c:set("four", 4);
71         assert_equal(c:count(), 5);
72         
73         assert_equal(c:get("one"), nil);
74         assert_equal(c:get("two"), nil);
75         assert_equal(c:get("three"), nil);
76         assert_equal(c:get("four"), 4);
77         assert_equal(c:get("five"), 5);
78         assert_equal(c:get("six"), 6);
79         assert_equal(c:get("seven"), 7);
80         assert_equal(c:get("eight"), 8);
81         
82         c:set("nine", 9);
83         assert_equal(c:count(), 5);
84         
85         assert_equal(c:get("one"), nil);
86         assert_equal(c:get("two"), nil);
87         assert_equal(c:get("three"), nil);
88         assert_equal(c:get("four"), 4);
89         assert_equal(c:get("five"), nil);
90         assert_equal(c:get("six"), 6);
91         assert_equal(c:get("seven"), 7);
92         assert_equal(c:get("eight"), 8);
93         assert_equal(c:get("nine"), 9);
94
95         local keys = { "nine", "four", "eight", "seven", "six" };
96         local values = { 9, 4, 8, 7, 6 };
97         local i = 0;    
98         for k, v in c:items() do
99                 i = i + 1;
100                 assert_equal(k, keys[i]);
101                 assert_equal(v, values[i]);
102         end
103         assert_equal(i, 5);
104         
105         c:set("four", "2+2");
106         assert_equal(c:count(), 5);
107
108         assert_equal(c:get("one"), nil);
109         assert_equal(c:get("two"), nil);
110         assert_equal(c:get("three"), nil);
111         assert_equal(c:get("four"), "2+2");
112         assert_equal(c:get("five"), nil);
113         assert_equal(c:get("six"), 6);
114         assert_equal(c:get("seven"), 7);
115         assert_equal(c:get("eight"), 8);
116         assert_equal(c:get("nine"), 9);
117
118         local keys = { "four", "nine", "eight", "seven", "six" };
119         local values = { "2+2", 9, 8, 7, 6 };
120         local i = 0;    
121         for k, v in c:items() do
122                 i = i + 1;
123                 assert_equal(k, keys[i]);
124                 assert_equal(v, values[i]);
125         end
126         assert_equal(i, 5);
127         
128         c:set("foo", nil);
129         assert_equal(c:count(), 5);
130
131         assert_equal(c:get("one"), nil);
132         assert_equal(c:get("two"), nil);
133         assert_equal(c:get("three"), nil);
134         assert_equal(c:get("four"), "2+2");
135         assert_equal(c:get("five"), nil);
136         assert_equal(c:get("six"), 6);
137         assert_equal(c:get("seven"), 7);
138         assert_equal(c:get("eight"), 8);
139         assert_equal(c:get("nine"), 9);
140
141         local keys = { "four", "nine", "eight", "seven", "six" };
142         local values = { "2+2", 9, 8, 7, 6 };
143         local i = 0;    
144         for k, v in c:items() do
145                 i = i + 1;
146                 assert_equal(k, keys[i]);
147                 assert_equal(v, values[i]);
148         end
149         assert_equal(i, 5);
150         
151         c:set("four", nil);
152         
153         assert_equal(c:get("one"), nil);
154         assert_equal(c:get("two"), nil);
155         assert_equal(c:get("three"), nil);
156         assert_equal(c:get("four"), nil);
157         assert_equal(c:get("five"), nil);
158         assert_equal(c:get("six"), 6);
159         assert_equal(c:get("seven"), 7);
160         assert_equal(c:get("eight"), 8);
161         assert_equal(c:get("nine"), 9);
162
163         local keys = { "nine", "eight", "seven", "six" };
164         local values = { 9, 8, 7, 6 };
165         local i = 0;    
166         for k, v in c:items() do
167                 i = i + 1;
168                 assert_equal(k, keys[i]);
169                 assert_equal(v, values[i]);
170         end
171         assert_equal(i, 4);
172         
173         local evicted_key, evicted_value;
174         local c = new(3, function (_key, _value)
175                 evicted_key, evicted_value = _key, _value;
176         end);
177         local function set(k, v, should_evict_key, should_evict_value)
178                 evicted_key, evicted_value = nil, nil;
179                 c:set(k, v);
180                 assert_equal(evicted_key, should_evict_key);
181                 assert_equal(evicted_value, should_evict_value);
182         end
183         set("a", 1)
184         set("a", 1)
185         set("a", 1)
186         set("a", 1)
187         set("a", 1)
188
189         set("b", 2)
190         set("c", 3)
191         set("b", 2)
192         set("d", 4, "a", 1)
193         set("e", 5, "c", 3)
194         
195
196         local evicted_key, evicted_value;
197         local c3 = new(1, function (_key, _value, c3)
198                 evicted_key, evicted_value = _key, _value;
199                 if _key == "a" then
200                         -- Put it back in...
201                         -- Check that the newest key/value was set before on_evict was called
202                         assert_equal(c3:get("b"), 2);
203                         -- Sanity check for what we're evicting
204                         assert_equal(_key, "a");
205                         assert_equal(_value, 1);
206                         -- Re-insert the evicted key (causes this evict function to run again with "b",2)
207                         c3:set(_key, _value)
208                         assert_equal(c3:get(_key), _value)
209                 end
210         end);
211         local function set(k, v, should_evict_key, should_evict_value)
212                 evicted_key, evicted_value = nil, nil;
213                 c3:set(k, v);
214                 assert_equal(evicted_key, should_evict_key);
215                 assert_equal(evicted_value, should_evict_value);
216         end
217         set("a", 1)
218         set("a", 1)
219         set("a", 1)
220         set("a", 1)
221         set("a", 1)
222
223         -- The evict handler re-inserts "a"->1, so "b" gets evicted:
224         set("b", 2, "b", 2)
225         -- Check the final state is what we expect
226         assert_equal(c3:get("a"), 1);
227         assert_equal(c3:get("b"), nil);
228         assert_equal(c3:count(), 1);
229 end