Mercurial > prosody-hg
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 |
| parents | |
| children | 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); |
