tests: Add initial tests for util.async
authorMatthew Wild <mwild1@gmail.com>
Sun, 22 May 2016 20:06:51 +0100
changeset 7440 ff74188488ab
parent 7439 649b89b2c840
child 7441 6bf4c227c8f3
tests: Add initial tests for util.async
tests/test.lua
tests/test_util_async.lua
--- a/tests/test.lua	Sun May 22 20:06:12 2016 +0100
+++ b/tests/test.lua	Sun May 22 20:06:51 2016 +0100
@@ -21,6 +21,7 @@
 	dotest "util.json"
 	dotest "util.stanza"
 	dotest "util.sasl.scram"
+	dotest "util.async"
 	dotest "util.cache"
 	dotest "util.throttle"
 	dotest "util.uuid"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test_util_async.lua	Sun May 22 20:06:51 2016 +0100
@@ -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