Software /
code /
prosody
Changeset
7437:ff74188488ab
tests: Add initial tests for util.async
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Sun, 22 May 2016 20:06:51 +0100 |
parents | 7436:649b89b2c840 |
children | 7438:6bf4c227c8f3 |
files | tests/test.lua tests/test_util_async.lua |
diffstat | 2 files changed, 149 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/tests/test.lua Sun May 22 20:06:12 2016 +0100 +++ b/tests/test.lua Sun May 22 20:06:51 2016 +0100 @@ -21,6 +21,7 @@ dotest "util.json" dotest "util.stanza" dotest "util.sasl.scram" + dotest "util.async" dotest "util.cache" dotest "util.throttle" dotest "util.uuid"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test_util_async.lua Sun May 22 20:06:51 2016 +0100 @@ -0,0 +1,148 @@ + +-- Test passing nil to runner +-- Test runners work correctly after errors (coroutine gets recreated) +-- What happens if an error is thrown, but more items are in the queue? (I think runner might stall) +-- Test errors thrown halfway through a queue +-- Multiple runners + +function runner(new_runner, async) + local function new(func) + local log = {}; + return new_runner(func, setmetatable({}, { + __index = function (_, event) + return function (runner, err) + print("event", event, err) + table.insert(log, { event = event, err = err }); + end; + end; + })), log; + end + + -------------------- + local r, l = new(function (item) assert(type(item) == "number") end); + r:run(1); + r:run(2); + for k, v in ipairs(l) do print(k,v) end + + -------------------- + local wait, done; + + local r, l = new(function (item) + assert(type(item) == "number") + if item == 3 then + wait, done = async.waiter(); + wait(); + end + end); + + r:run(1); + assert(r.state == "ready"); + r:run(2); + assert(r.state == "ready"); + r:run(3); + assert(r.state == "waiting"); + done(); + assert(r.state == "ready"); + for k, v in ipairs(l) do print(k,v) end + + -------------------- + local wait, done; + local last_item = 0; + local r, l = new(function (item) + assert(type(item) == "number") + assert(item == last_item + 1); + last_item = item; + if item == 3 then + wait, done = async.waiter(); + wait(); + end + end); + + r:run(1); + assert(r.state == "ready"); + r:run(2); + assert(r.state == "ready"); + r:run(3); + assert(r.state == "waiting"); + r:run(4); + assert(r.state == "waiting"); + done(); + assert(r.state == "ready"); + for k, v in ipairs(l) do print(k,v) end + + -------------------- + local wait, done; + local last_item = 0; + local r, l = new(function (item) + assert(type(item) == "number") + assert((item == last_item + 1) or item == 3); + last_item = item; + if item == 3 then + wait, done = async.waiter(); + wait(); + end + end); + + r:run(1); + assert(r.state == "ready"); + r:run(2); + assert(r.state == "ready"); + + local dones = {}; + r:run(3); + assert(r.state == "waiting"); + r:run(3); + assert(r.state == "waiting"); + r:run(3); + assert(r.state == "waiting"); + r:run(4); + assert(r.state == "waiting"); + + for i = 1, 3 do + done(); + if i < 3 then + assert(r.state == "waiting"); + end + end + + assert(r.state == "ready"); + for k, v in ipairs(l) do print(k,v) end + + -------------------- + local wait, done; + local last_item = 0; + local r, l = new(function (item) + assert(type(item) == "number") + assert((item == last_item + 1) or item == 3); + last_item = item; + if item == 3 then + wait, done = async.waiter(); + wait(); + end + end); + + r:run(1); + assert(r.state == "ready"); + r:run(2); + assert(r.state == "ready"); + + local dones = {}; + r:run(3); + assert(r.state == "waiting"); + r:run(3); + assert(r.state == "waiting"); + + for i = 1, 2 do + done(); + if i < 2 then + assert(r.state == "waiting"); + end + end + + assert(r.state == "ready"); + r:run(4); + assert(r.state == "ready"); + + assert(r.state == "ready"); + for k, v in ipairs(l) do print(k,v) end +end