Software /
code /
prosody
File
tests/test_util_async.lua @ 7857:db48b1697234
Merge 0.10->trunk
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 23 Jan 2017 19:34:14 +0100 |
parent | 7437:ff74188488ab |
child | 8209:39f24de4f53f |
line wrap: on
line source
-- 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