Mercurial > prosody-hg
comparison tests/test_util_async.lua @ 7437:ff74188488ab
tests: Add initial tests for util.async
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sun, 22 May 2016 20:06:51 +0100 |
| parents | |
| children | 39f24de4f53f |
comparison
equal
deleted
inserted
replaced
| 7436:649b89b2c840 | 7437:ff74188488ab |
|---|---|
| 1 | |
| 2 -- Test passing nil to runner | |
| 3 -- Test runners work correctly after errors (coroutine gets recreated) | |
| 4 -- What happens if an error is thrown, but more items are in the queue? (I think runner might stall) | |
| 5 -- Test errors thrown halfway through a queue | |
| 6 -- Multiple runners | |
| 7 | |
| 8 function runner(new_runner, async) | |
| 9 local function new(func) | |
| 10 local log = {}; | |
| 11 return new_runner(func, setmetatable({}, { | |
| 12 __index = function (_, event) | |
| 13 return function (runner, err) | |
| 14 print("event", event, err) | |
| 15 table.insert(log, { event = event, err = err }); | |
| 16 end; | |
| 17 end; | |
| 18 })), log; | |
| 19 end | |
| 20 | |
| 21 -------------------- | |
| 22 local r, l = new(function (item) assert(type(item) == "number") end); | |
| 23 r:run(1); | |
| 24 r:run(2); | |
| 25 for k, v in ipairs(l) do print(k,v) end | |
| 26 | |
| 27 -------------------- | |
| 28 local wait, done; | |
| 29 | |
| 30 local r, l = new(function (item) | |
| 31 assert(type(item) == "number") | |
| 32 if item == 3 then | |
| 33 wait, done = async.waiter(); | |
| 34 wait(); | |
| 35 end | |
| 36 end); | |
| 37 | |
| 38 r:run(1); | |
| 39 assert(r.state == "ready"); | |
| 40 r:run(2); | |
| 41 assert(r.state == "ready"); | |
| 42 r:run(3); | |
| 43 assert(r.state == "waiting"); | |
| 44 done(); | |
| 45 assert(r.state == "ready"); | |
| 46 for k, v in ipairs(l) do print(k,v) end | |
| 47 | |
| 48 -------------------- | |
| 49 local wait, done; | |
| 50 local last_item = 0; | |
| 51 local r, l = new(function (item) | |
| 52 assert(type(item) == "number") | |
| 53 assert(item == last_item + 1); | |
| 54 last_item = item; | |
| 55 if item == 3 then | |
| 56 wait, done = async.waiter(); | |
| 57 wait(); | |
| 58 end | |
| 59 end); | |
| 60 | |
| 61 r:run(1); | |
| 62 assert(r.state == "ready"); | |
| 63 r:run(2); | |
| 64 assert(r.state == "ready"); | |
| 65 r:run(3); | |
| 66 assert(r.state == "waiting"); | |
| 67 r:run(4); | |
| 68 assert(r.state == "waiting"); | |
| 69 done(); | |
| 70 assert(r.state == "ready"); | |
| 71 for k, v in ipairs(l) do print(k,v) end | |
| 72 | |
| 73 -------------------- | |
| 74 local wait, done; | |
| 75 local last_item = 0; | |
| 76 local r, l = new(function (item) | |
| 77 assert(type(item) == "number") | |
| 78 assert((item == last_item + 1) or item == 3); | |
| 79 last_item = item; | |
| 80 if item == 3 then | |
| 81 wait, done = async.waiter(); | |
| 82 wait(); | |
| 83 end | |
| 84 end); | |
| 85 | |
| 86 r:run(1); | |
| 87 assert(r.state == "ready"); | |
| 88 r:run(2); | |
| 89 assert(r.state == "ready"); | |
| 90 | |
| 91 local dones = {}; | |
| 92 r:run(3); | |
| 93 assert(r.state == "waiting"); | |
| 94 r:run(3); | |
| 95 assert(r.state == "waiting"); | |
| 96 r:run(3); | |
| 97 assert(r.state == "waiting"); | |
| 98 r:run(4); | |
| 99 assert(r.state == "waiting"); | |
| 100 | |
| 101 for i = 1, 3 do | |
| 102 done(); | |
| 103 if i < 3 then | |
| 104 assert(r.state == "waiting"); | |
| 105 end | |
| 106 end | |
| 107 | |
| 108 assert(r.state == "ready"); | |
| 109 for k, v in ipairs(l) do print(k,v) end | |
| 110 | |
| 111 -------------------- | |
| 112 local wait, done; | |
| 113 local last_item = 0; | |
| 114 local r, l = new(function (item) | |
| 115 assert(type(item) == "number") | |
| 116 assert((item == last_item + 1) or item == 3); | |
| 117 last_item = item; | |
| 118 if item == 3 then | |
| 119 wait, done = async.waiter(); | |
| 120 wait(); | |
| 121 end | |
| 122 end); | |
| 123 | |
| 124 r:run(1); | |
| 125 assert(r.state == "ready"); | |
| 126 r:run(2); | |
| 127 assert(r.state == "ready"); | |
| 128 | |
| 129 local dones = {}; | |
| 130 r:run(3); | |
| 131 assert(r.state == "waiting"); | |
| 132 r:run(3); | |
| 133 assert(r.state == "waiting"); | |
| 134 | |
| 135 for i = 1, 2 do | |
| 136 done(); | |
| 137 if i < 2 then | |
| 138 assert(r.state == "waiting"); | |
| 139 end | |
| 140 end | |
| 141 | |
| 142 assert(r.state == "ready"); | |
| 143 r:run(4); | |
| 144 assert(r.state == "ready"); | |
| 145 | |
| 146 assert(r.state == "ready"); | |
| 147 for k, v in ipairs(l) do print(k,v) end | |
| 148 end |
