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