From 604184d80b428979f16fdfeef4b7e3ca69e470d9 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Sun, 22 May 2016 20:06:51 +0100 Subject: tests: Add initial tests for util.async --- tests/test.lua | 1 + tests/test_util_async.lua | 148 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 tests/test_util_async.lua (limited to 'tests') diff --git a/tests/test.lua b/tests/test.lua index 9ab2cad8..bb15250d 100644 --- a/tests/test.lua +++ b/tests/test.lua @@ -21,6 +21,7 @@ function run_all_tests() dotest "util.json" dotest "util.stanza" dotest "util.sasl.scram" + dotest "util.async" dotest "util.cache" dotest "util.throttle" dotest "util.uuid" diff --git a/tests/test_util_async.lua b/tests/test_util_async.lua new file mode 100644 index 00000000..a0c16b88 --- /dev/null +++ b/tests/test_util_async.lua @@ -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 -- cgit v1.2.3