diff options
author | Matthew Wild <mwild1@gmail.com> | 2021-11-29 14:14:30 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2021-11-29 14:14:30 +0000 |
commit | d46c43fbeb5e2fcc1d3cccf348ebb92f60f4bc2d (patch) | |
tree | fd0045f0a108f19889e8d87dfbf579fe5bd8bd48 /spec/util_async_spec.lua | |
parent | cfef2c6ef6609d3d917edb144123295f64187545 (diff) | |
download | prosody-d46c43fbeb5e2fcc1d3cccf348ebb92f60f4bc2d.tar.gz prosody-d46c43fbeb5e2fcc1d3cccf348ebb92f60f4bc2d.zip |
util.async: Add next-tick configuration
Running woken runners in the next iteration of the event loop prevents
unexpected recursion, unexpected tracebacks, and is generally more
predictable.
The pattern is borrowed from util.promise, where we're now doing the same.
Diffstat (limited to 'spec/util_async_spec.lua')
-rw-r--r-- | spec/util_async_spec.lua | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/spec/util_async_spec.lua b/spec/util_async_spec.lua index 435a844c..77afd1fc 100644 --- a/spec/util_async_spec.lua +++ b/spec/util_async_spec.lua @@ -669,4 +669,50 @@ describe("util.async", function() assert.spy(r.watchers.ready).was.called(); end); end); + + describe("#set_nexttick()", function () + after_each(function () + -- Restore to default + async.set_nexttick(nil); + end); + it("should work", function () + local queue = {}; + local nexttick = spy.new(function (f) + assert.is_function(f); + table.insert(queue, f); + end); + async.set_nexttick(nexttick); + + local processed_item; + local wait, done; + local r = new(function (item) + wait, done = async.waiter(); + wait(); + processed_item = item; + end); + r:run("test"); + + -- Nothing happened, because the runner is waiting + assert.is_nil(processed_item); + assert.equal(r.state, "waiting"); + assert.spy(nexttick).was_called(0); + assert.spy(r.watchers.waiting).was.called(); + assert.spy(r.watchers.ready).was_not.called(); + + -- Mark the runner as ready, it should be scheduled for + -- the next tick + done(); + + assert.spy(nexttick).was_called(1); + assert.spy(nexttick).was_called_with(match.is_function()); + assert.equal(1, #queue); + + -- Pretend it's the next tick - call the pending function + queue[1](); + + assert.equal(processed_item, "test"); + assert.equal(r.state, "ready"); + assert.spy(r.watchers.ready).was.called(); + end); + end); end); |