24 end |
24 end |
25 end |
25 end |
26 end |
26 end |
27 end |
27 end |
28 |
28 |
29 function process_options() |
29 local function process_options() |
30 local function get_value() |
30 local function get_value() |
31 return (assert(table.remove(arg, 1), "unexpected end of command-line options")); |
31 return (assert(table.remove(arg, 1), "unexpected end of command-line options")); |
32 end |
32 end |
33 while arg[1] and arg[1]:sub(1,1) == "-" do |
33 while arg[1] and arg[1]:sub(1,1) == "-" do |
34 local opt = arg[1]; |
34 local opt = arg[1]; |
82 end |
82 end |
83 end |
83 end |
84 assert(#arg > 0, "No test script provided"); |
84 assert(#arg > 0, "No test script provided"); |
85 end |
85 end |
86 |
86 |
87 function read_script(script_name) |
87 local function read_script(script_name) |
88 io.input(script_name); |
88 io.input(script_name); |
89 return io.read("*a"); |
89 return io.read("*a"); |
90 end |
90 end |
91 |
91 |
92 function parse_script(data) |
92 local function parse_script(data) |
93 local parser = require "scansion.parser"; |
93 local parser = require "scansion.parser"; |
94 return assert(parser.parse(data)); |
94 return assert(parser.parse(data)); |
95 end |
95 end |
96 |
96 |
97 function initialize_script(script) |
97 local function initialize_script(script) |
98 local c = 0; |
98 local c = 0; |
99 for name, object in pairs(script.objects) do |
99 for name, object in pairs(script.objects) do --luacheck: ignore name |
100 local o = require("scansion.objects."..object.type); |
100 local o = require("scansion.objects."..object.type); |
101 object.handler = o; |
101 object.handler = o; |
102 object.script = script; |
102 object.script = script; |
103 apply_object_properties(object.type, object.name, object); |
103 apply_object_properties(object.type, object.name, object); |
104 if object.type == "client" and not object.stanza_timeout then |
104 if object.type == "client" and not object.stanza_timeout then |
105 object.stanza_timeout = action_timeout - 1; |
105 object.stanza_timeout = action_timeout - 1; |
106 end |
106 end |
107 o._validate(object); |
107 o._validate(object); |
108 c = c + 1; |
108 c = c + 1; |
109 end |
109 end |
110 |
110 |
111 --print("Script defines "..c.." objects, and "..#script.actions.." actions"); |
111 --print("Script defines "..c.." objects, and "..#script.actions.." actions"); |
112 return script; |
112 return script; |
113 end |
113 end |
114 |
114 |
115 function initialize_verse(errcb) |
115 local function initialize_verse(errcb) |
116 local verse = require "verse"; |
116 local verse = require "verse"; |
117 |
117 |
118 verse.set_log_handler(verse._default_log_handler, verse_log_levels); |
118 verse.set_log_handler(verse._default_log_handler, verse_log_levels); |
119 |
119 |
120 local function error_handler(err) |
120 local function error_handler(err) |
121 verse.log("error", "Error: %s", err); |
121 verse.log("error", "Error: %s", err); |
122 verse.log("error", "Traceback: %s", debug.traceback()); |
122 verse.log("error", "Traceback: %s", debug.traceback()); |
143 end |
143 end |
144 |
144 |
145 local verse = initialize_verse(function (_err) ok, err = false, _err end); |
145 local verse = initialize_verse(function (_err) ok, err = false, _err end); |
146 local async = require "scansion.async"; |
146 local async = require "scansion.async"; |
147 |
147 |
148 local runner = async.runner(function (d) |
148 local runner = async.runner(function () |
149 for i, action in ipairs(script.actions) do |
149 for i, action in ipairs(script.actions) do |
150 local object = script.objects[action.object_name]; |
150 local object = script.objects[action.object_name]; |
151 local handler = object.handler; |
151 local handler = object.handler; |
152 assert(handler[action.action], "Objects of type '"..object.type.."' do not support action '"..action.action.."'"); |
152 assert(handler[action.action], "Objects of type '"..object.type.."' do not support action '"..action.action.."'"); |
153 if not quiet then |
153 if not quiet then |
175 if i == action_number then |
175 if i == action_number then |
176 error("Timeout waiting for response from server"); |
176 error("Timeout waiting for response from server"); |
177 end |
177 end |
178 end); |
178 end); |
179 end |
179 end |
180 local ok, err = pcall(handler[action.action], object, action.extra); |
180 do |
181 if server_log_reader then |
181 --luacheck: ignore ok err |
182 log_data("server", { lines = server_log_reader() }); |
182 local ok, err = pcall(handler[action.action], object, action.extra); |
183 end |
183 if server_log_reader then |
184 if not ok then |
184 log_data("server", { lines = server_log_reader() }); |
185 log_data("error", { message = err }); |
185 end |
186 error(err); |
186 if not ok then |
|
187 log_data("error", { message = err }); |
|
188 error(err); |
|
189 end |
187 end |
190 end |
188 end |
191 end |
189 script.finished = true; |
192 script.finished = true; |
190 verse.log("info", "Completed script!"); |
193 verse.log("info", "Completed script!"); |
191 verse.quit(); |
194 verse.quit(); |
192 end, { |
195 end, { |
193 error = function (runner, _err) |
196 error = function (runner, _err) --luacheck: ignore runner |
194 verse.log("error", "Runner caught error: %s", _err); |
197 verse.log("error", "Runner caught error: %s", _err); |
195 ok, err = false, _err; |
198 ok, err = false, _err; |
196 verse.quit(); |
199 verse.quit(); |
197 end; |
200 end; |
198 }); |
201 }); |
199 |
202 |
200 runner:run(true); |
203 runner:run(true); |
201 verse.log("debug", "runner paused") |
204 verse.log("debug", "runner paused") |
202 |
205 |
203 verse.loop(); |
206 verse.loop(); |
204 |
207 |
205 if server_log_reader then |
208 if server_log_reader then |
206 log_data("server", { lines = server_log_reader() }); |
209 log_data("server", { lines = server_log_reader() }); |
207 end |
210 end |
224 result_log:write(" ", json.encode(entry), ",\n"); |
227 result_log:write(" ", json.encode(entry), ",\n"); |
225 result_log:flush(); |
228 result_log:flush(); |
226 end |
229 end |
227 end |
230 end |
228 |
231 |
229 function run_test_script(script_name) |
232 local function run_test_script(script_name) |
230 |
233 |
231 log_data("start", { metadata = test_metadata }); |
234 log_data("start", { metadata = test_metadata }); |
232 local ok, result, err = pcall(main, log_data, script_name); |
235 local ok, result, err = pcall(main, log_data, script_name); |
233 |
236 |
234 local exit_code = 0; |
237 local exit_code = 0; |
235 if not ok then |
238 if not ok then |
236 print("TEST ERROR:", result); |
239 print("TEST ERROR:", result); |
237 exit_code = 2; |
240 exit_code = 2; |
238 log_data("test-error", { error = result }); |
241 log_data("test-error", { error = result }); |