diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test.lua | 1 | ||||
-rw-r--r-- | tests/test_util_async.lua | 148 | ||||
-rw-r--r-- | tests/test_util_xml.lua | 1 |
3 files changed, 150 insertions, 0 deletions
diff --git a/tests/test.lua b/tests/test.lua index 78eb0134..d6aa3b31 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 diff --git a/tests/test_util_xml.lua b/tests/test_util_xml.lua index ba44da19..56d3f7b9 100644 --- a/tests/test_util_xml.lua +++ b/tests/test_util_xml.lua @@ -9,4 +9,5 @@ function parse(parse) ]] local stanza = parse(x); assert_equal(stanza.tags[2].attr.xmlns, "b"); + assert_equal(stanza.tags[2].namespaces["a"], "b"); end |