Software /
code /
prosody
Comparison
spec/util_async_spec.lua @ 8633:8ec18a002c30
util.async: tests: more code re-use
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Mon, 19 Mar 2018 16:40:40 +0000 |
parent | 8632:02b841ed03d1 |
child | 8648:ca710a71d730 |
comparison
equal
deleted
inserted
replaced
8632:02b841ed03d1 | 8633:8ec18a002c30 |
---|---|
28 end | 28 end |
29 | 29 |
30 local function new(func) | 30 local function new(func) |
31 local event_log = {}; | 31 local event_log = {}; |
32 local spy_func = spy.new(func); | 32 local spy_func = spy.new(func); |
33 return async.runner(spy_func, mock_watchers(event_log)), event_log, spy_func; | 33 return async.runner(spy_func, mock_watchers(event_log)), spy_func, event_log; |
34 end | 34 end |
35 describe("#runner", function() | 35 describe("#runner", function() |
36 it("should work", function() | 36 it("should work", function() |
37 local r, l = new(function (item) assert(type(item) == "number") end); | 37 local r = new(function (item) assert(type(item) == "number") end); |
38 r:run(1); | 38 r:run(1); |
39 r:run(2); | 39 r:run(2); |
40 end); | 40 end); |
41 | 41 |
42 it("should be ready after creation", function () | 42 it("should be ready after creation", function () |
43 local r = async.runner(function () end); | 43 local r = new(function () end); |
44 assert.equal(r.state, "ready"); | 44 assert.equal(r.state, "ready"); |
45 end); | 45 end); |
46 | 46 |
47 it("should do nothing if the queue is empty", function () | 47 it("should do nothing if the queue is empty", function () |
48 local did_run; | 48 local did_run; |
49 local r = async.runner(function () did_run = true end); | 49 local r = new(function () did_run = true end); |
50 r:run(); | 50 r:run(); |
51 assert.equal(r.state, "ready"); | 51 assert.equal(r.state, "ready"); |
52 assert.is_nil(did_run); | 52 assert.is_nil(did_run); |
53 r:run("hello"); | 53 r:run("hello"); |
54 assert.is_true(did_run); | 54 assert.is_true(did_run); |
55 end); | 55 end); |
56 | 56 |
57 it("should support queuing work items without running", function () | 57 it("should support queuing work items without running", function () |
58 local did_run; | 58 local did_run; |
59 local r = async.runner(function () did_run = true end); | 59 local r = new(function () did_run = true end); |
60 r:enqueue("hello"); | 60 r:enqueue("hello"); |
61 assert.equal(r.state, "ready"); | 61 assert.equal(r.state, "ready"); |
62 assert.is_nil(did_run); | 62 assert.is_nil(did_run); |
63 r:run(); | 63 r:run(); |
64 assert.is_true(did_run); | 64 assert.is_true(did_run); |
65 end); | 65 end); |
66 | 66 |
67 it("should support queuing multiple work items", function () | 67 it("should support queuing multiple work items", function () |
68 local last_item; | 68 local last_item; |
69 local s = spy(function (item) last_item = item; end); | 69 local r, s = new(function (item) last_item = item; end); |
70 local r = async.runner(s); | |
71 r:enqueue("hello"); | 70 r:enqueue("hello"); |
72 r:enqueue("there"); | 71 r:enqueue("there"); |
73 r:enqueue("world"); | 72 r:enqueue("world"); |
74 assert.equal(r.state, "ready"); | 73 assert.equal(r.state, "ready"); |
75 r:run(); | 74 r:run(); |
78 assert.equal(last_item, "world"); | 77 assert.equal(last_item, "world"); |
79 end); | 78 end); |
80 | 79 |
81 it("should support all simple data types", function () | 80 it("should support all simple data types", function () |
82 local last_item; | 81 local last_item; |
83 local s = spy(function (item) last_item = item; end); | 82 local r, s = new(function (item) last_item = item; end); |
84 local r = async.runner(s); | |
85 local values = { {}, 123, "hello", true, false }; | 83 local values = { {}, 123, "hello", true, false }; |
86 for i = 1, #values do | 84 for i = 1, #values do |
87 r:enqueue(values[i]); | 85 r:enqueue(values[i]); |
88 end | 86 end |
89 assert.equal(r.state, "ready"); | 87 assert.equal(r.state, "ready"); |
197 end); | 195 end); |
198 end | 196 end |
199 | 197 |
200 it("should continue to process work items", function () | 198 it("should continue to process work items", function () |
201 local last_item; | 199 local last_item; |
202 local runner_func = spy.new(function (item) | 200 local runner, runner_func = new(function (item) |
203 if item == "error" then | 201 if item == "error" then |
204 error("test error"); | 202 error("test error"); |
205 end | 203 end |
206 last_item = item; | 204 last_item = item; |
207 end); | 205 end); |
208 local runner = async.runner(runner_func, mock{ | |
209 ready = function () end; | |
210 waiting = function () end; | |
211 error = function () end; | |
212 }); | |
213 runner:enqueue("one"); | 206 runner:enqueue("one"); |
214 runner:enqueue("error"); | 207 runner:enqueue("error"); |
215 runner:enqueue("two"); | 208 runner:enqueue("two"); |
216 runner:run(); | 209 runner:run(); |
217 assert.equal(runner.state, "ready"); | 210 assert.equal(runner.state, "ready"); |
222 assert.equal(last_item, "two"); | 215 assert.equal(last_item, "two"); |
223 end); | 216 end); |
224 | 217 |
225 it("should continue to process work items during resume", function () | 218 it("should continue to process work items during resume", function () |
226 local wait, done, last_item; | 219 local wait, done, last_item; |
227 local runner_func = spy.new(function (item) | 220 local runner, runner_func = new(function (item) |
228 if item == "wait-error" then | 221 if item == "wait-error" then |
229 wait, done = async.waiter(); | 222 wait, done = async.waiter(); |
230 wait(); | 223 wait(); |
231 error("test error"); | 224 error("test error"); |
232 end | 225 end |
233 last_item = item; | 226 last_item = item; |
234 end); | 227 end); |
235 local runner = async.runner(runner_func, mock{ | |
236 ready = function () end; | |
237 waiting = function () end; | |
238 error = function () end; | |
239 }); | |
240 runner:enqueue("one"); | 228 runner:enqueue("one"); |
241 runner:enqueue("wait-error"); | 229 runner:enqueue("wait-error"); |
242 runner:enqueue("two"); | 230 runner:enqueue("two"); |
243 runner:run(); | 231 runner:run(); |
244 done(); | 232 done(); |
258 end); | 246 end); |
259 end); | 247 end); |
260 it("should work", function () | 248 it("should work", function () |
261 local wait, done; | 249 local wait, done; |
262 | 250 |
263 local r, l = new(function (item) | 251 local r = new(function (item) |
264 assert(type(item) == "number") | 252 assert(type(item) == "number") |
265 if item == 3 then | 253 if item == 3 then |
266 wait, done = async.waiter(); | 254 wait, done = async.waiter(); |
267 wait(); | 255 wait(); |
268 end | 256 end |
281 | 269 |
282 it("should work", function () | 270 it("should work", function () |
283 -------------------- | 271 -------------------- |
284 local wait, done; | 272 local wait, done; |
285 local last_item = 0; | 273 local last_item = 0; |
286 local r, l = new(function (item) | 274 local r = new(function (item) |
287 assert(type(item) == "number") | 275 assert(type(item) == "number") |
288 assert(item == last_item + 1); | 276 assert(item == last_item + 1); |
289 last_item = item; | 277 last_item = item; |
290 if item == 3 then | 278 if item == 3 then |
291 wait, done = async.waiter(); | 279 wait, done = async.waiter(); |
307 end); | 295 end); |
308 it("should work", function () | 296 it("should work", function () |
309 -------------------- | 297 -------------------- |
310 local wait, done; | 298 local wait, done; |
311 local last_item = 0; | 299 local last_item = 0; |
312 local r, l = new(function (item) | 300 local r = new(function (item) |
313 assert(type(item) == "number") | 301 assert(type(item) == "number") |
314 assert((item == last_item + 1) or item == 3); | 302 assert((item == last_item + 1) or item == 3); |
315 last_item = item; | 303 last_item = item; |
316 if item == 3 then | 304 if item == 3 then |
317 wait, done = async.waiter(); | 305 wait, done = async.waiter(); |
345 end); | 333 end); |
346 it("should work", function () | 334 it("should work", function () |
347 -------------------- | 335 -------------------- |
348 local wait, done; | 336 local wait, done; |
349 local last_item = 0; | 337 local last_item = 0; |
350 local r, l = new(function (item) | 338 local r = new(function (item) |
351 assert(type(item) == "number") | 339 assert(type(item) == "number") |
352 assert((item == last_item + 1) or item == 3); | 340 assert((item == last_item + 1) or item == 3); |
353 last_item = item; | 341 last_item = item; |
354 if item == 3 then | 342 if item == 3 then |
355 wait, done = async.waiter(); | 343 wait, done = async.waiter(); |
384 it("should work with multiple runners in parallel", function () | 372 it("should work with multiple runners in parallel", function () |
385 -- Now with multiple runners | 373 -- Now with multiple runners |
386 -------------------- | 374 -------------------- |
387 local wait1, done1; | 375 local wait1, done1; |
388 local last_item1 = 0; | 376 local last_item1 = 0; |
389 local r1, l1 = new(function (item) | 377 local r1 = new(function (item) |
390 assert(type(item) == "number") | 378 assert(type(item) == "number") |
391 assert((item == last_item1 + 1) or item == 3); | 379 assert((item == last_item1 + 1) or item == 3); |
392 last_item1 = item; | 380 last_item1 = item; |
393 if item == 3 then | 381 if item == 3 then |
394 wait1, done1 = async.waiter(); | 382 wait1, done1 = async.waiter(); |
396 end | 384 end |
397 end, "r1"); | 385 end, "r1"); |
398 | 386 |
399 local wait2, done2; | 387 local wait2, done2; |
400 local last_item2 = 0; | 388 local last_item2 = 0; |
401 local r2, l2 = new(function (item) | 389 local r2 = new(function (item) |
402 assert(type(item) == "number") | 390 assert(type(item) == "number") |
403 assert((item == last_item2 + 1) or item == 3); | 391 assert((item == last_item2 + 1) or item == 3); |
404 last_item2 = item; | 392 last_item2 = item; |
405 if item == 3 then | 393 if item == 3 then |
406 wait2, done2 = async.waiter(); | 394 wait2, done2 = async.waiter(); |
456 end); | 444 end); |
457 it("should work work with multiple runners in parallel", function () | 445 it("should work work with multiple runners in parallel", function () |
458 -------------------- | 446 -------------------- |
459 local wait1, done1; | 447 local wait1, done1; |
460 local last_item1 = 0; | 448 local last_item1 = 0; |
461 local r1, l1 = new(function (item) | 449 local r1 = new(function (item) |
462 print("r1 processing ", item); | 450 print("r1 processing ", item); |
463 assert(type(item) == "number") | 451 assert(type(item) == "number") |
464 assert((item == last_item1 + 1) or item == 3); | 452 assert((item == last_item1 + 1) or item == 3); |
465 last_item1 = item; | 453 last_item1 = item; |
466 if item == 3 then | 454 if item == 3 then |
469 end | 457 end |
470 end, "r1"); | 458 end, "r1"); |
471 | 459 |
472 local wait2, done2; | 460 local wait2, done2; |
473 local last_item2 = 0; | 461 local last_item2 = 0; |
474 local r2, l2 = new(function (item) | 462 local r2 = new(function (item) |
475 print("r2 processing ", item); | 463 print("r2 processing ", item); |
476 assert.is_number(item); | 464 assert.is_number(item); |
477 assert((item == last_item2 + 1) or item == 3); | 465 assert((item == last_item2 + 1) or item == 3); |
478 last_item2 = item; | 466 last_item2 = item; |
479 if item == 3 then | 467 if item == 3 then |
537 end); | 525 end); |
538 | 526 |
539 it("should support multiple done() calls", function () | 527 it("should support multiple done() calls", function () |
540 local processed_item; | 528 local processed_item; |
541 local wait, done; | 529 local wait, done; |
542 local r, _, rf = new(function (item) | 530 local r, rf = new(function (item) |
543 wait, done = async.waiter(4); | 531 wait, done = async.waiter(4); |
544 wait(); | 532 wait(); |
545 processed_item = item; | 533 processed_item = item; |
546 end); | 534 end); |
547 r:run("test"); | 535 r:run("test"); |
557 end); | 545 end); |
558 | 546 |
559 it("should not allow done() to be called more than specified", function () | 547 it("should not allow done() to be called more than specified", function () |
560 local processed_item; | 548 local processed_item; |
561 local wait, done; | 549 local wait, done; |
562 local r, _, rf = new(function (item) | 550 local r, rf = new(function (item) |
563 wait, done = async.waiter(4); | 551 wait, done = async.waiter(4); |
564 wait(); | 552 wait(); |
565 processed_item = item; | 553 processed_item = item; |
566 end); | 554 end); |
567 r:run("test"); | 555 r:run("test"); |
574 assert.spy(r.watchers.error).was_not.called(); | 562 assert.spy(r.watchers.error).was_not.called(); |
575 end); | 563 end); |
576 | 564 |
577 it("should allow done() to be called before wait()", function () | 565 it("should allow done() to be called before wait()", function () |
578 local processed_item; | 566 local processed_item; |
579 local r, _, rf = new(function (item) | 567 local r, rf = new(function (item) |
580 local wait, done = async.waiter(); | 568 local wait, done = async.waiter(); |
581 done(); | 569 done(); |
582 wait(); | 570 wait(); |
583 processed_item = item; | 571 processed_item = item; |
584 end); | 572 end); |