Software /
code /
prosody
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 |
parent | 7437:ff74188488ab |
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 |