138 local function parse_script(data) |
138 local function parse_script(data) |
139 local parser = require "scansion.parser"; |
139 local parser = require "scansion.parser"; |
140 return assert(parser.parse(data)); |
140 return assert(parser.parse(data)); |
141 end |
141 end |
142 |
142 |
143 local function initialize_script(script) |
143 local function initialize_script(script, context) |
144 local c = 0; |
144 local c = 0; |
145 for name, object in pairs(script.objects) do --luacheck: ignore name |
145 for name, object in pairs(script.objects) do --luacheck: ignore name |
|
146 context.line = object.defined_line |
146 local o = require("scansion.objects."..object.type); |
147 local o = require("scansion.objects."..object.type); |
147 object.handler = o; |
148 object.handler = o; |
148 object.script = script; |
149 object.script = script; |
149 apply_object_properties(object.type, object.name, object); |
150 apply_object_properties(object.type, object.name, object); |
150 if object.type == "client" and not object.stanza_timeout then |
151 if object.type == "client" and not object.stanza_timeout then |
179 end |
180 end |
180 verse.set_error_handler(error_handler); |
181 verse.set_error_handler(error_handler); |
181 return verse; |
182 return verse; |
182 end |
183 end |
183 |
184 |
184 local function main(log_data, script) |
185 local function main(log_data, script, context) |
185 |
186 |
186 local ok, err = true; |
187 local ok, err = true; |
187 |
188 |
188 initialize_script(script); |
189 initialize_script(script, context); |
|
190 |
|
191 context.line = nil; |
189 |
192 |
190 if server_log_reader then |
193 if server_log_reader then |
191 if skip_server_startup_log then |
194 if skip_server_startup_log then |
192 server_log_reader(); |
195 server_log_reader(); |
193 else |
196 else |
198 local verse = initialize_verse(function (_err) ok, err = false, _err end); |
201 local verse = initialize_verse(function (_err) ok, err = false, _err end); |
199 local async = require "scansion.async"; |
202 local async = require "scansion.async"; |
200 |
203 |
201 local runner = async.runner(function () |
204 local runner = async.runner(function () |
202 for i, action in ipairs(script.actions) do |
205 for i, action in ipairs(script.actions) do |
|
206 context.line = action.line_start; |
|
207 |
203 local object = script.objects[action.object_name]; |
208 local object = script.objects[action.object_name]; |
204 local handler = object.handler; |
209 local handler = object.handler; |
205 if not handler[action.action] then |
210 |
206 local e = new_error("unsupported-action", { |
|
207 text = "Objects of type '"..object.type.."' do not support action '"..action.action.."'"; |
|
208 }); |
|
209 error(e); |
|
210 end |
|
211 if server_log_reader then |
|
212 log_data("server", { lines = server_log_reader() }); |
|
213 end |
|
214 log_data("action", { |
211 log_data("action", { |
215 action = action.action; |
212 action = action.action; |
216 object = object.name; |
213 object = object.name; |
217 object_type = object.type; |
214 object_type = object.type; |
218 extra = action.extra; |
215 extra = action.extra; |
219 annotation = action.annotation; |
216 annotation = action.annotation; |
220 line_start = action.line_start; |
217 line_start = action.line_start; |
221 line_end = action.line_end; |
218 line_end = action.line_end; |
222 }); |
219 }); |
223 |
220 |
|
221 if not handler[action.action] then |
|
222 local e = new_error("unsupported-action", { |
|
223 text = "Objects of type '"..object.type.."' do not support action '"..action.action.."'"; |
|
224 }); |
|
225 error(e); |
|
226 end |
|
227 if server_log_reader then |
|
228 log_data("server", { lines = server_log_reader() }); |
|
229 end |
|
230 |
224 if action_timeout and action_timeout > 0 then |
231 if action_timeout and action_timeout > 0 then |
225 local action_number = i; |
232 local action_number = i; |
226 verse.add_task(action_timeout, function () |
233 verse.add_task(action_timeout, function () |
227 if i == action_number and not script.finished then |
234 if i == action_number and not script.finished then |
228 local e = new_error("action-timeout", { text = "Timeout waiting for response" }); |
235 local e = new_error("action-timeout", { text = "Timeout waiting for response" }); |
235 local ok, err = pcall(handler[action.action], object, action.extra); |
242 local ok, err = pcall(handler[action.action], object, action.extra); |
236 if server_log_reader then |
243 if server_log_reader then |
237 log_data("server", { lines = server_log_reader() }); |
244 log_data("server", { lines = server_log_reader() }); |
238 end |
245 end |
239 if not ok then |
246 if not ok then |
240 log_data("error", { message = err }); |
247 log_data("error", { message = err, line = context.line }); |
241 error(err); |
248 error(err); |
242 end |
249 end |
243 end |
250 end |
244 end |
251 end |
|
252 context.line = nil; |
245 script.finished = true; |
253 script.finished = true; |
246 verse.log("info", "Completed script!"); |
254 verse.log("info", "Completed script!"); |
247 verse.quit(); |
255 verse.quit(); |
248 end, { |
256 end, { |
249 error = function (runner, _err) --luacheck: ignore runner |
257 error = function (runner, _err) --luacheck: ignore runner |
326 end |
334 end |
327 end |
335 end |
328 |
336 |
329 log_data("script", script_data); |
337 log_data("script", script_data); |
330 |
338 |
331 local ok, result, err = pcall(main, log_data, script); |
339 local context = { line = nil }; |
|
340 local ok, result, err = pcall(main, log_data, script, context); |
332 |
341 |
333 local event, status, reason; |
342 local event, status, reason; |
334 if not ok then |
343 if not ok then |
335 event, status, reason = "test-error", "error", result; |
344 event, status, reason = "test-error", "error", result; |
336 elseif not result then |
345 elseif not result then |
337 event, status, reason = "test-failed", "fail", err; |
346 event, status, reason = "test-failed", "fail", err; |
338 else |
347 else |
339 event, status, reason = "test-passed", "ok", nil; |
348 event, status, reason = "test-passed", "ok", nil; |
340 end |
349 end |
341 |
350 |
342 local result_data = { name = script.title or script_name, status = status, reason = reason }; |
351 local result_data = { name = script.title or script_name, status = status, reason = reason, line = context.line }; |
343 |
352 |
344 log_data(event, result_data); |
353 log_data(event, result_data); |
345 |
354 |
346 return result_data; |
355 return result_data; |
347 end |
356 end |