Software / code / prosody
Comparison
spec/util_async_spec.lua @ 8632:02b841ed03d1
util.async: tests: luacheck-clean, fixes some actual issues
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Mon, 19 Mar 2018 16:31:53 +0000 |
| parent | 8631:1daabc077393 |
| child | 8633:8ec18a002c30 |
comparison
equal
deleted
inserted
replaced
| 8631:1daabc077393 | 8632:02b841ed03d1 |
|---|---|
| 20 waiting = generic_logging_watcher("waiting"); | 20 waiting = generic_logging_watcher("waiting"); |
| 21 error = generic_logging_watcher("error"); | 21 error = generic_logging_watcher("error"); |
| 22 }, { | 22 }, { |
| 23 __index = function (_, event) | 23 __index = function (_, event) |
| 24 -- Unexpected watcher called | 24 -- Unexpected watcher called |
| 25 assert(false); | 25 assert(false, "unexpected watcher called: "..event); |
| 26 end; | 26 end; |
| 27 }) | 27 }) |
| 28 end | 28 end |
| 29 | 29 |
| 30 local function new(func, name) | 30 local function new(func) |
| 31 local event_log = {}; | 31 local event_log = {}; |
| 32 local spy_func = spy.new(func); | 32 local spy_func = spy.new(func); |
| 33 return async.runner(spy_func, mock_watchers(event_log)), event_log, spy_func; | 33 return async.runner(spy_func, mock_watchers(event_log)), event_log, spy_func; |
| 34 end | 34 end |
| 35 describe("#runner", function() | 35 describe("#runner", function() |
| 38 r:run(1); | 38 r:run(1); |
| 39 r:run(2); | 39 r:run(2); |
| 40 end); | 40 end); |
| 41 | 41 |
| 42 it("should be ready after creation", function () | 42 it("should be ready after creation", function () |
| 43 local r = async.runner(function (item) end); | 43 local r = async.runner(function () end); |
| 44 assert.equal(r.state, "ready"); | 44 assert.equal(r.state, "ready"); |
| 45 end); | 45 end); |
| 46 | 46 |
| 47 it("should do nothing if the queue is empty", function () | 47 it("should do nothing if the queue is empty", function () |
| 48 local did_run; | 48 local did_run; |
| 49 local r = async.runner(function (item) did_run = true end); | 49 local r = async.runner(function () did_run = true end); |
| 50 r:run(); | 50 r:run(); |
| 51 assert.equal(r.state, "ready"); | 51 assert.equal(r.state, "ready"); |
| 52 assert.is_nil(did_run); | 52 assert.is_nil(did_run); |
| 53 r:run("hello"); | 53 r:run("hello"); |
| 54 assert.is_true(did_run); | 54 assert.is_true(did_run); |
| 55 end); | 55 end); |
| 56 | 56 |
| 57 it("should support queuing work items without running", function () | 57 it("should support queuing work items without running", function () |
| 58 local did_run; | 58 local did_run; |
| 59 local r = async.runner(function (item) did_run = true end); | 59 local r = async.runner(function () did_run = true end); |
| 60 r:enqueue("hello"); | 60 r:enqueue("hello"); |
| 61 assert.equal(r.state, "ready"); | 61 assert.equal(r.state, "ready"); |
| 62 assert.is_nil(did_run); | 62 assert.is_nil(did_run); |
| 63 r:run(); | 63 r:run(); |
| 64 assert.is_true(did_run); | 64 assert.is_true(did_run); |
| 139 end); | 139 end); |
| 140 assert.equal(r.state, "ready"); | 140 assert.equal(r.state, "ready"); |
| 141 assert.equal(last_processed_item, "hello"); | 141 assert.equal(last_processed_item, "hello"); |
| 142 end); | 142 end); |
| 143 | 143 |
| 144 | 144 do |
| 145 local last_processed_item, last_error; | 145 local last_processed_item, last_error; |
| 146 local r; | 146 local r; |
| 147 local wait, done; | 147 local wait, done; |
| 148 r = async.runner(function (item) | 148 r = async.runner(function (item) |
| 149 if item == "error" then | 149 if item == "error" then |
| 150 error({ e = "test error" }); | 150 error({ e = "test error" }); |
| 151 elseif item == "wait" then | 151 elseif item == "wait" then |
| 152 wait, done = async.waiter(); | 152 wait, done = async.waiter(); |
| 153 wait(); | 153 wait(); |
| 154 error({ e = "post wait error" }); | 154 error({ e = "post wait error" }); |
| 155 end | 155 end |
| 156 last_processed_item = item; | 156 last_processed_item = item; |
| 157 end, mock({ | 157 end, mock({ |
| 158 ready = function () end; | 158 ready = function () end; |
| 159 waiting = function () end; | 159 waiting = function () end; |
| 160 error = function (runner, err) | 160 error = function (runner, err) |
| 161 assert.equal(r, runner); | 161 assert.equal(r, runner); |
| 162 last_error = err; | 162 last_error = err; |
| 163 end; | 163 end; |
| 164 })); | 164 })); |
| 165 | 165 |
| 166 randomize(false); | 166 randomize(false); --luacheck: ignore 113/randomize |
| 167 | 167 |
| 168 it("should not be fatal to the runner", function () | 168 it("should not be fatal to the runner", function () |
| 169 r:run("world"); | 169 r:run("world"); |
| 170 assert.equal(r.state, "ready"); | 170 assert.equal(r.state, "ready"); |
| 171 assert.spy(r.watchers.ready).was_not.called(); | 171 assert.spy(r.watchers.ready).was_not.called(); |
| 172 assert.equal(last_processed_item, "world"); | 172 assert.equal(last_processed_item, "world"); |
| 173 end); | 173 end); |
| 174 it("should work despite a #waiter", function () | 174 it("should work despite a #waiter", function () |
| 175 -- This test covers an important case where a runner | 175 -- This test covers an important case where a runner |
| 176 -- throws an error while being executed outside of the | 176 -- throws an error while being executed outside of the |
| 177 -- main loop. This happens when it was blocked ('waiting'), | 177 -- main loop. This happens when it was blocked ('waiting'), |
| 178 -- and then released (via a call to done()). | 178 -- and then released (via a call to done()). |
| 179 last_error = nil; | 179 last_error = nil; |
| 180 r:run("wait"); | 180 r:run("wait"); |
| 181 assert.equal(r.state, "waiting"); | 181 assert.equal(r.state, "waiting"); |
| 182 assert.spy(r.watchers.waiting).was.called(1); | 182 assert.spy(r.watchers.waiting).was.called(1); |
| 183 done(); | 183 done(); |
| 184 -- At this point an error happens (state goes error->ready) | 184 -- At this point an error happens (state goes error->ready) |
| 185 assert.equal(r.state, "ready"); | 185 assert.equal(r.state, "ready"); |
| 186 assert.spy(r.watchers.error).was.called(1); | 186 assert.spy(r.watchers.error).was.called(1); |
| 187 assert.spy(r.watchers.ready).was.called(1); | 187 assert.spy(r.watchers.ready).was.called(1); |
| 188 assert.is_table(last_error); | 188 assert.is_table(last_error); |
| 189 assert.equal(last_error.e, "post wait error"); | 189 assert.equal(last_error.e, "post wait error"); |
| 190 last_error = nil; | 190 last_error = nil; |
| 191 r:run("hello again"); | 191 r:run("hello again"); |
| 192 assert.spy(r.watchers.ready).was.called(1); | 192 assert.spy(r.watchers.ready).was.called(1); |
| 193 assert.spy(r.watchers.waiting).was.called(1); | 193 assert.spy(r.watchers.waiting).was.called(1); |
| 194 assert.spy(r.watchers.error).was.called(1); | 194 assert.spy(r.watchers.error).was.called(1); |
| 195 assert.equal(r.state, "ready"); | 195 assert.equal(r.state, "ready"); |
| 196 assert.equal(last_processed_item, "hello again"); | 196 assert.equal(last_processed_item, "hello again"); |
| 197 end); | 197 end); |
| 198 end | |
| 198 | 199 |
| 199 it("should continue to process work items", function () | 200 it("should continue to process work items", function () |
| 200 local wait, done, last_item; | 201 local last_item; |
| 201 local runner_func = spy.new(function (item) | 202 local runner_func = spy.new(function (item) |
| 202 if item == "error" then | 203 if item == "error" then |
| 203 error("test error"); | 204 error("test error"); |
| 204 end | 205 end |
| 205 last_item = item; | 206 last_item = item; |
| 211 }); | 212 }); |
| 212 runner:enqueue("one"); | 213 runner:enqueue("one"); |
| 213 runner:enqueue("error"); | 214 runner:enqueue("error"); |
| 214 runner:enqueue("two"); | 215 runner:enqueue("two"); |
| 215 runner:run(); | 216 runner:run(); |
| 216 assert.equal(r.state, "ready"); | 217 assert.equal(runner.state, "ready"); |
| 217 assert.spy(runner_func).was.called(3); | 218 assert.spy(runner_func).was.called(3); |
| 218 assert.spy(runner.watchers.error).was.called(1); | 219 assert.spy(runner.watchers.error).was.called(1); |
| 219 assert.spy(runner.watchers.ready).was.called(0); | 220 assert.spy(runner.watchers.ready).was.called(0); |
| 220 assert.spy(runner.watchers.waiting).was.called(0); | 221 assert.spy(runner.watchers.waiting).was.called(0); |
| 221 assert.equal(last_item, "two"); | 222 assert.equal(last_item, "two"); |
| 239 runner:enqueue("one"); | 240 runner:enqueue("one"); |
| 240 runner:enqueue("wait-error"); | 241 runner:enqueue("wait-error"); |
| 241 runner:enqueue("two"); | 242 runner:enqueue("two"); |
| 242 runner:run(); | 243 runner:run(); |
| 243 done(); | 244 done(); |
| 244 assert.equal(r.state, "ready"); | 245 assert.equal(runner.state, "ready"); |
| 245 assert.spy(runner_func).was.called(3); | 246 assert.spy(runner_func).was.called(3); |
| 246 assert.spy(runner.watchers.error).was.called(1); | 247 assert.spy(runner.watchers.error).was.called(1); |
| 247 assert.spy(runner.watchers.waiting).was.called(1); | 248 assert.spy(runner.watchers.waiting).was.called(1); |
| 248 assert.spy(runner.watchers.ready).was.called(1); | 249 assert.spy(runner.watchers.ready).was.called(1); |
| 249 assert.equal(last_item, "two"); | 250 assert.equal(last_item, "two"); |
| 542 wait, done = async.waiter(4); | 543 wait, done = async.waiter(4); |
| 543 wait(); | 544 wait(); |
| 544 processed_item = item; | 545 processed_item = item; |
| 545 end); | 546 end); |
| 546 r:run("test"); | 547 r:run("test"); |
| 547 for i = 1, 3 do | 548 for _ = 1, 3 do |
| 548 done(); | 549 done(); |
| 549 assert.equal(r.state, "waiting"); | 550 assert.equal(r.state, "waiting"); |
| 550 assert.is_nil(processed_item); | 551 assert.is_nil(processed_item); |
| 551 end | 552 end |
| 552 done(); | 553 done(); |
| 562 wait, done = async.waiter(4); | 563 wait, done = async.waiter(4); |
| 563 wait(); | 564 wait(); |
| 564 processed_item = item; | 565 processed_item = item; |
| 565 end); | 566 end); |
| 566 r:run("test"); | 567 r:run("test"); |
| 567 for i = 1, 4 do | 568 for _ = 1, 4 do |
| 568 done(); | 569 done(); |
| 569 end | 570 end |
| 570 assert.has_error(done);; | 571 assert.has_error(done); |
| 571 assert.equal(r.state, "ready"); | 572 assert.equal(r.state, "ready"); |
| 572 assert.equal(processed_item, "test"); | 573 assert.equal(processed_item, "test"); |
| 573 assert.spy(r.watchers.error).was_not.called(); | 574 assert.spy(r.watchers.error).was_not.called(); |
| 574 end); | 575 end); |
| 575 | 576 |