main.lua

changeset 109
f7609d1a5bdf
parent 108
cd58c64c67c0
child 110
d58403c8615e
equal deleted inserted replaced
108:cd58c64c67c0 109:f7609d1a5bdf
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());
124 end 124 end
125 verse.set_error_handler(error_handler); 125 verse.set_error_handler(error_handler);
126 return verse; 126 return verse;
127 end 127 end
128 128
129 function main(log_data, script_name) 129 local function main(log_data, script_name)
130 130
131 local ok, err = true; 131 local ok, err = true;
132 132
133 local script = initialize_script(parse_script(read_script(script_name))); 133 local script = initialize_script(parse_script(read_script(script_name)));
134 134
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 });

mercurial