aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test_util_async.lua
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2016-05-22 20:06:51 +0100
committerMatthew Wild <mwild1@gmail.com>2016-05-22 20:06:51 +0100
commit3d6224e543c6018920666bc4c7a52ca1cc3ab591 (patch)
tree4acc68d1899db671fc81b16b5427fd7d5d3a8fac /tests/test_util_async.lua
parented04424e61c9c5f3cdf2203f39c057cbdad38276 (diff)
downloadprosody-3d6224e543c6018920666bc4c7a52ca1cc3ab591.tar.gz
prosody-3d6224e543c6018920666bc4c7a52ca1cc3ab591.zip
tests: Add initial tests for util.async
Diffstat (limited to 'tests/test_util_async.lua')
-rw-r--r--tests/test_util_async.lua148
1 files changed, 148 insertions, 0 deletions
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