tests: Add initial tests for util.async
authorMatthew Wild <mwild1@gmail.com>
Sun, 22 May 2016 19:06:51 +0000 (20:06 +0100)
committerMatthew Wild <mwild1@gmail.com>
Sun, 22 May 2016 19:06:51 +0000 (20:06 +0100)
tests/test.lua
tests/test_util_async.lua [new file with mode: 0644]

index 9ab2cad87d80c827025b0831c0d9e3c6efa36f97..bb15250d0a5f1a0d667b51bf2fc614af1cb36182 100644 (file)
@@ -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 (file)
index 0000000..a0c16b8
--- /dev/null
@@ -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