aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/test.lua1
-rw-r--r--tests/test_util_async.lua148
2 files changed, 149 insertions, 0 deletions
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