137 end |
137 end |
138 verse.set_error_handler(error_handler); |
138 verse.set_error_handler(error_handler); |
139 return verse; |
139 return verse; |
140 end |
140 end |
141 |
141 |
142 local function main(log_data, script_name) |
142 local function main(log_data, script) |
143 |
143 |
144 local ok, err = true; |
144 local ok, err = true; |
145 |
145 |
146 local script = initialize_script(parse_script(read_script(script_name))); |
146 initialize_script(script); |
147 |
|
148 log_data("script", { title = script.title, summary = script.summary, tags = script.tags, filename = script_name }); |
|
149 |
147 |
150 if server_log_reader then |
148 if server_log_reader then |
151 if skip_server_startup_log then |
149 if skip_server_startup_log then |
152 server_log_reader(); |
150 server_log_reader(); |
153 else |
151 else |
251 local function log_data(type, data) |
249 local function log_data(type, data) |
252 console_logger(type, data); |
250 console_logger(type, data); |
253 |
251 |
254 if result_log then |
252 if result_log then |
255 local entry = { type = type, data = data, time = time() }; |
253 local entry = { type = type, data = data, time = time() }; |
256 result_log:write(" ", json.encode(entry), ",\n"); |
254 result_log:write(" ", json.encode(entry), type ~= "end" and ",\n" or "\n"); |
257 result_log:flush(); |
255 result_log:flush(); |
|
256 if type == "end" then |
|
257 result_log:write("]\n"); |
|
258 result_log:close(); |
|
259 result_log = nil; |
|
260 end |
258 end |
261 end |
259 end; |
262 end; |
260 |
263 |
261 local function run_test_script(script_name) |
264 local function run_test_script(script_name) |
262 local ok, result, err = pcall(main, log_data, script_name); |
265 local script = parse_script(read_script(script_name)) |
263 |
266 log_data("script", { title = script.title, summary = script.summary, tags = script.tags, filename = script_name }); |
264 local exit_code = 0; |
267 |
|
268 local ok, result, err = pcall(main, log_data, script); |
|
269 |
|
270 local status, reason = "ok"; |
265 if not ok then |
271 if not ok then |
266 exit_code = 2; |
272 status, reason = "error", result; |
267 log_data("test-error", { error = result }); |
273 log_data("test-error", { error = result }); |
268 elseif not result then |
274 elseif not result then |
269 exit_code = 1; |
275 status, reason = "fail", err; |
270 log_data("test-failed", { error = err }); |
276 log_data("test-failed", { error = err }); |
271 elseif not quiet then |
277 elseif not quiet then |
272 log_data("test-passed"); |
278 log_data("test-passed"); |
273 end |
279 end |
274 return exit_code; |
280 return { name = script.title or script_name, status = status, reason = reason }; |
275 end |
281 end |
276 |
282 |
277 log_data("start", { metadata = test_metadata }); |
283 log_data("start", { metadata = test_metadata }); |
278 |
284 |
279 local exit_code = 0; |
285 local result_tally = { all = {} }; |
|
286 |
280 for i = 1, #arg do |
287 for i = 1, #arg do |
281 local ret = run_test_script(arg[i]); |
288 local ret = run_test_script(arg[i]); |
282 if ret > exit_code then |
289 if not result_tally[ret.status] then |
283 exit_code = ret; |
290 result_tally[ret.status] = {}; |
284 end |
291 end |
285 end |
292 table.insert(result_tally[ret.status], ret); |
286 |
293 table.insert(result_tally.all, ret); |
287 if result_log then |
294 end |
288 result_log:write([[ {"type": "end", "time": ]]..time().."}\n]\n"); |
295 |
289 result_log:close(); |
296 log_data("end", { time = time(), summary = result_tally }); |
290 end |
|
291 |
297 |
292 os.exit(exit_code); |
298 os.exit(exit_code); |