main.lua

changeset 162
f888f236321f
parent 161
fadae5511044
child 173
14ed4cb241f4
equal deleted inserted replaced
161:fadae5511044 162:f888f236321f
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

mercurial