Mercurial > prosody-hg
comparison tests/test_util_async.lua @ 8209:39f24de4f53f
tests: Add failing tests for util.async
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Tue, 12 Sep 2017 16:16:28 +0100 |
| parents | ff74188488ab |
| children |
comparison
equal
deleted
inserted
replaced
| 8208:b69b40a828fd | 8209:39f24de4f53f |
|---|---|
| 4 -- What happens if an error is thrown, but more items are in the queue? (I think runner might stall) | 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 | 5 -- Test errors thrown halfway through a queue |
| 6 -- Multiple runners | 6 -- Multiple runners |
| 7 | 7 |
| 8 function runner(new_runner, async) | 8 function runner(new_runner, async) |
| 9 local function new(func) | 9 local function new(func, name) |
| 10 local log = {}; | 10 local log = {}; |
| 11 return new_runner(func, setmetatable({}, { | 11 return new_runner(func, setmetatable({}, { |
| 12 __index = function (_, event) | 12 __index = function (_, event) |
| 13 return function (runner, err) | 13 return function (runner, err) |
| 14 print("event", event, err) | 14 print(name, "event", event, err) |
| 15 table.insert(log, { event = event, err = err }); | 15 table.insert(log, { event = event, err = err }); |
| 16 end; | 16 end; |
| 17 end; | 17 end; |
| 18 })), log; | 18 })), log; |
| 19 end | 19 end |
| 20 | 20 |
| 21 -------------------- | 21 -------------------- |
| 22 local r, l = new(function (item) assert(type(item) == "number") end); | 22 local r, l = new(function (item) assert(type(item) == "number") end); |
| 23 r:run(1); | 23 r:run(1); |
| 24 r:run(2); | 24 r:run(2); |
| 25 for k, v in ipairs(l) do print(k,v) end | 25 --for k, v in ipairs(l) do print(k,v) end |
| 26 | 26 |
| 27 -------------------- | 27 -------------------- |
| 28 local wait, done; | 28 local wait, done; |
| 29 | 29 |
| 30 local r, l = new(function (item) | 30 local r, l = new(function (item) |
| 41 assert(r.state == "ready"); | 41 assert(r.state == "ready"); |
| 42 r:run(3); | 42 r:run(3); |
| 43 assert(r.state == "waiting"); | 43 assert(r.state == "waiting"); |
| 44 done(); | 44 done(); |
| 45 assert(r.state == "ready"); | 45 assert(r.state == "ready"); |
| 46 for k, v in ipairs(l) do print(k,v) end | 46 --for k, v in ipairs(l) do print(k,v) end |
| 47 | 47 |
| 48 -------------------- | 48 -------------------- |
| 49 local wait, done; | 49 local wait, done; |
| 50 local last_item = 0; | 50 local last_item = 0; |
| 51 local r, l = new(function (item) | 51 local r, l = new(function (item) |
| 66 assert(r.state == "waiting"); | 66 assert(r.state == "waiting"); |
| 67 r:run(4); | 67 r:run(4); |
| 68 assert(r.state == "waiting"); | 68 assert(r.state == "waiting"); |
| 69 done(); | 69 done(); |
| 70 assert(r.state == "ready"); | 70 assert(r.state == "ready"); |
| 71 for k, v in ipairs(l) do print(k,v) end | 71 --for k, v in ipairs(l) do print(k,v) end |
| 72 | 72 |
| 73 -------------------- | 73 -------------------- |
| 74 local wait, done; | 74 local wait, done; |
| 75 local last_item = 0; | 75 local last_item = 0; |
| 76 local r, l = new(function (item) | 76 local r, l = new(function (item) |
| 104 assert(r.state == "waiting"); | 104 assert(r.state == "waiting"); |
| 105 end | 105 end |
| 106 end | 106 end |
| 107 | 107 |
| 108 assert(r.state == "ready"); | 108 assert(r.state == "ready"); |
| 109 for k, v in ipairs(l) do print(k,v) end | 109 --for k, v in ipairs(l) do print(k,v) end |
| 110 | 110 |
| 111 -------------------- | 111 -------------------- |
| 112 local wait, done; | 112 local wait, done; |
| 113 local last_item = 0; | 113 local last_item = 0; |
| 114 local r, l = new(function (item) | 114 local r, l = new(function (item) |
| 142 assert(r.state == "ready"); | 142 assert(r.state == "ready"); |
| 143 r:run(4); | 143 r:run(4); |
| 144 assert(r.state == "ready"); | 144 assert(r.state == "ready"); |
| 145 | 145 |
| 146 assert(r.state == "ready"); | 146 assert(r.state == "ready"); |
| 147 for k, v in ipairs(l) do print(k,v) end | 147 --for k, v in ipairs(l) do print(k,v) end |
| 148 | |
| 149 -- Now with multiple runners | |
| 150 -------------------- | |
| 151 local wait1, done1; | |
| 152 local last_item1 = 0; | |
| 153 local r1, l1 = new(function (item) | |
| 154 assert(type(item) == "number") | |
| 155 assert((item == last_item1 + 1) or item == 3); | |
| 156 last_item1 = item; | |
| 157 if item == 3 then | |
| 158 wait1, done1 = async.waiter(); | |
| 159 wait1(); | |
| 160 end | |
| 161 end, "r1"); | |
| 162 | |
| 163 local wait2, done2; | |
| 164 local last_item2 = 0; | |
| 165 local r2, l2 = new(function (item) | |
| 166 assert(type(item) == "number") | |
| 167 assert((item == last_item2 + 1) or item == 3); | |
| 168 last_item2 = item; | |
| 169 if item == 3 then | |
| 170 wait2, done2 = async.waiter(); | |
| 171 wait2(); | |
| 172 end | |
| 173 end, "r2"); | |
| 174 | |
| 175 r1:run(1); | |
| 176 assert(r1.state == "ready"); | |
| 177 r1:run(2); | |
| 178 assert(r1.state == "ready"); | |
| 179 | |
| 180 local dones = {}; | |
| 181 r1:run(3); | |
| 182 assert(r1.state == "waiting"); | |
| 183 r1:run(3); | |
| 184 assert(r1.state == "waiting"); | |
| 185 | |
| 186 r2:run(1); | |
| 187 assert(r1.state == "waiting"); | |
| 188 assert(r2.state == "ready"); | |
| 189 | |
| 190 r2:run(2); | |
| 191 assert(r1.state == "waiting"); | |
| 192 assert(r2.state == "ready"); | |
| 193 | |
| 194 r2:run(3); | |
| 195 assert(r1.state == "waiting"); | |
| 196 assert(r2.state == "waiting"); | |
| 197 done2(); | |
| 198 | |
| 199 r2:run(3); | |
| 200 assert(r1.state == "waiting"); | |
| 201 assert(r2.state == "waiting"); | |
| 202 done2(); | |
| 203 | |
| 204 r2:run(2); | |
| 205 assert(r1.state == "waiting"); | |
| 206 assert(r2.state == "ready"); | |
| 207 | |
| 208 for i = 1, 2 do | |
| 209 done1(); | |
| 210 if i < 2 then | |
| 211 assert(r1.state == "waiting"); | |
| 212 end | |
| 213 end | |
| 214 | |
| 215 assert(r1.state == "ready"); | |
| 216 r1:run(4); | |
| 217 assert(r1.state == "ready"); | |
| 218 | |
| 219 assert(r1.state == "ready"); | |
| 220 --for k, v in ipairs(l1) do print(k,v) end | |
| 221 | |
| 222 | |
| 223 -------------------- | |
| 224 local wait1, done1; | |
| 225 local last_item1 = 0; | |
| 226 local r1, l1 = new(function (item) | |
| 227 assert(type(item) == "number") | |
| 228 assert((item == last_item1 + 1) or item == 3); | |
| 229 last_item1 = item; | |
| 230 if item == 3 then | |
| 231 wait1, done1 = async.waiter(); | |
| 232 wait1(); | |
| 233 end | |
| 234 end, "r1"); | |
| 235 | |
| 236 local wait2, done2; | |
| 237 local last_item2 = 0; | |
| 238 local r2, l2 = new(function (item) | |
| 239 assert(type(item) == "number") | |
| 240 assert((item == last_item2 + 1) or item == 3); | |
| 241 last_item2 = item; | |
| 242 if item == 3 then | |
| 243 wait2, done2 = async.waiter(); | |
| 244 wait2(); | |
| 245 end | |
| 246 end, "r2"); | |
| 247 | |
| 248 r1:run(1); | |
| 249 assert(r1.state == "ready"); | |
| 250 r1:run(2); | |
| 251 assert(r1.state == "ready"); | |
| 252 | |
| 253 r1:run(5); | |
| 254 assert(r1.state == "ready"); | |
| 255 | |
| 256 local dones = {}; | |
| 257 r1:run(3); | |
| 258 assert(r1.state == "waiting"); | |
| 259 r1:run(5); -- Will error, when we get to it | |
| 260 assert(r1.state == "waiting"); | |
| 261 r1:run(3); | |
| 262 assert(r1.state == "waiting"); | |
| 263 | |
| 264 r2:run(1); | |
| 265 assert(r1.state == "waiting"); | |
| 266 assert(r2.state == "ready"); | |
| 267 | |
| 268 r2:run(2); | |
| 269 assert(r1.state == "waiting"); | |
| 270 assert(r2.state == "ready"); | |
| 271 | |
| 272 r2:run(3); | |
| 273 assert(r1.state == "waiting"); | |
| 274 assert(r2.state == "waiting"); | |
| 275 done2(); | |
| 276 | |
| 277 r2:run(3); | |
| 278 assert(r1.state == "waiting"); | |
| 279 assert(r2.state == "waiting"); | |
| 280 done2(); | |
| 281 | |
| 282 r2:run(2); | |
| 283 assert(r1.state == "waiting"); | |
| 284 assert(r2.state == "ready"); | |
| 285 | |
| 286 for i = 1, 2 do | |
| 287 done1(); | |
| 288 if i < 2 then | |
| 289 assert_equal(r1.state, "waiting"); | |
| 290 end | |
| 291 end | |
| 292 | |
| 293 assert(r1.state == "ready"); | |
| 294 r1:run(4); | |
| 295 assert(r1.state == "ready"); | |
| 296 | |
| 297 assert(r1.state == "ready"); | |
| 298 --for k, v in ipairs(l1) do print(k,v) end | |
| 299 | |
| 300 | |
| 148 end | 301 end |
