main.lua

Thu, 23 Mar 2023 12:14:53 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Thu, 23 Mar 2023 12:14:53 +0000
changeset 172
2c17151ed21b
parent 162
f888f236321f
child 173
14ed4cb241f4
permissions
-rwxr-xr-x

client: Fix timeout handling

Previously, the timeout handler would fire an error that would get caught and
logged by the timer code. However that error never reached the upper levels of
scansion, leading to the whole thing just hanging.

Now we just trigger resumption of the async runner, and throw the error from
there if we haven't received the stanza yet.

With this change, timeouts are now correctly handled and reported as failures.

54
09a754d5fcc1 main: Change shebang to LuaJIT
Kim Alvefur <zash@zash.se>
parents: 46
diff changeset
1 #!/usr/bin/env luajit
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
2
57
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
3 local json = require "cjson";
61
21871fb2db99 main: Switch to socket.gettime for higher accuracy timestamps in machine-readable logs
Matthew Wild <mwild1@gmail.com>
parents: 59
diff changeset
4 local time = require "socket".gettime;
67
a2a9dd606200 main: Add delay when reading server logs
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
5 local sleep = require "socket".sleep;
57
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
6
110
d58403c8615e main.lua: Don't log traceback for normal scansion internal errors
Matthew Wild <mwild1@gmail.com>
parents: 109
diff changeset
7 local is_scansion_error = require "scansion.error".is;
124
168cc5aad639 main: Throw scansion error on timeout, to avoid unnecessary traceback
Matthew Wild <mwild1@gmail.com>
parents: 123
diff changeset
8 local new_error = require "scansion.error".new_error;
168cc5aad639 main: Throw scansion error on timeout, to avoid unnecessary traceback
Matthew Wild <mwild1@gmail.com>
parents: 123
diff changeset
9
57
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
10 local result_log_filename = nil;
62
52a24deb0cc3 main: Support for --server-log/-s option, which reads the server's log file during a test and includes it in the JSON log
Matthew Wild <mwild1@gmail.com>
parents: 61
diff changeset
11 local server_log_reader = nil;
69
1de0ebd8832f main.lua: Support tagging metadata for test runs, and include it in JSON output
Matthew Wild <mwild1@gmail.com>
parents: 68
diff changeset
12 local test_metadata = {};
67
a2a9dd606200 main: Add delay when reading server logs
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
13 local server_log_wait_time = 0.2;
76
fecc1af937be main.lua: Add --skip-server-startup-log to discard server log output at startup
Matthew Wild <mwild1@gmail.com>
parents: 71
diff changeset
14 local skip_server_startup_log = false;
137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
15 local action_timeout = 10;
107
65791ba388b9 scansion: Add -q and -v for controlling log output
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
16 local verse_log_levels = { "warn", "error" };
65791ba388b9 scansion: Add -q and -v for controlling log output
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
17 local quiet = false;
131
2d19fdddb9ee main, console: Allow force-printing --summary even if -q is passed
Matthew Wild <mwild1@gmail.com>
parents: 129
diff changeset
18 local force_summary = false;
137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
19 local serve_mode = false;
157
b35dc87ebff0 Make --serve and --serve-port take an origin argument, in order to disallow random websites from accessing the local port
Waqas Hussain <waqas20@gmail.com>
parents: 155
diff changeset
20 local serve_origin = nil;
150
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
21 local only_tags, skip_tags;
67
a2a9dd606200 main: Add delay when reading server logs
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
22
56
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
23 local property_rules = {};
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
24
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
25 local function apply_object_properties(class, name, object)
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
26 for _, rule in ipairs(property_rules) do
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
27 if (not(rule.class) or tostring(rule.class):lower() == tostring(class):lower())
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
28 and (not(rule.name) or tostring(rule.name):lower() == tostring(name):lower()) then
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
29 for prop_key, prop_value in pairs(rule.properties) do
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
30 object[prop_key] = prop_value;
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
31 end
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
32 end
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
33 end
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
34 end
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
35
109
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
36 local function process_options()
56
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
37 local function get_value()
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
38 return (assert(table.remove(arg, 1), "unexpected end of command-line options"));
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
39 end
127
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
40
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
41 local files = {};
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
42
56
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
43 while arg[1] and arg[1]:sub(1,1) == "-" do
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
44 local opt = arg[1];
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
45 if opt == "--" then
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
46 table.remove(arg, 1);
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
47 break;
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
48 end
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
49 table.remove(arg, 1);
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
50 if opt == "--port" or opt == "-p" then
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
51 local port = assert(tonumber(get_value()), "port number must be a number");
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
52 table.insert(property_rules, { class = "client", properties = { connect_port = port } });
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
53 elseif opt == "--host" or opt == "-h" then
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
54 local host = get_value();
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
55 table.insert(property_rules, { class = "client", properties = { connect_host = host } });
57
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
56 elseif opt == "--out" or opt == "-o" then
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
57 result_log_filename = get_value();
62
52a24deb0cc3 main: Support for --server-log/-s option, which reads the server's log file during a test and includes it in the JSON log
Matthew Wild <mwild1@gmail.com>
parents: 61
diff changeset
58 elseif opt == "--server-log" or opt == "-s" then
52a24deb0cc3 main: Support for --server-log/-s option, which reads the server's log file during a test and includes it in the JSON log
Matthew Wild <mwild1@gmail.com>
parents: 61
diff changeset
59 local server_log = assert(io.open(get_value(), "r"));
52a24deb0cc3 main: Support for --server-log/-s option, which reads the server's log file during a test and includes it in the JSON log
Matthew Wild <mwild1@gmail.com>
parents: 61
diff changeset
60 function server_log_reader()
52a24deb0cc3 main: Support for --server-log/-s option, which reads the server's log file during a test and includes it in the JSON log
Matthew Wild <mwild1@gmail.com>
parents: 61
diff changeset
61 local new_lines = {};
67
a2a9dd606200 main: Add delay when reading server logs
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
62 local last_line_time = time();
a2a9dd606200 main: Add delay when reading server logs
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
63 while time() - last_line_time < server_log_wait_time do
a2a9dd606200 main: Add delay when reading server logs
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
64 sleep(0.05);
a2a9dd606200 main: Add delay when reading server logs
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
65 for line in server_log:lines() do
a2a9dd606200 main: Add delay when reading server logs
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
66 table.insert(new_lines, line);
a2a9dd606200 main: Add delay when reading server logs
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
67 last_line_time = time();
a2a9dd606200 main: Add delay when reading server logs
Matthew Wild <mwild1@gmail.com>
parents: 65
diff changeset
68 end
62
52a24deb0cc3 main: Support for --server-log/-s option, which reads the server's log file during a test and includes it in the JSON log
Matthew Wild <mwild1@gmail.com>
parents: 61
diff changeset
69 end
52a24deb0cc3 main: Support for --server-log/-s option, which reads the server's log file during a test and includes it in the JSON log
Matthew Wild <mwild1@gmail.com>
parents: 61
diff changeset
70 return new_lines;
52a24deb0cc3 main: Support for --server-log/-s option, which reads the server's log file during a test and includes it in the JSON log
Matthew Wild <mwild1@gmail.com>
parents: 61
diff changeset
71 end
76
fecc1af937be main.lua: Add --skip-server-startup-log to discard server log output at startup
Matthew Wild <mwild1@gmail.com>
parents: 71
diff changeset
72 elseif opt == "--skip-server-startup-log" then
fecc1af937be main.lua: Add --skip-server-startup-log to discard server log output at startup
Matthew Wild <mwild1@gmail.com>
parents: 71
diff changeset
73 skip_server_startup_log = true;
82
f90056b8e278 main.lua, client: Make timeouts more coherent (stanza timeout was greater than action timeout), add command-line options to change them
Matthew Wild <mwild1@gmail.com>
parents: 81
diff changeset
74 elseif opt == "--step-timeout" then
f90056b8e278 main.lua, client: Make timeouts more coherent (stanza timeout was greater than action timeout), add command-line options to change them
Matthew Wild <mwild1@gmail.com>
parents: 81
diff changeset
75 action_timeout = assert(tonumber(get_value()), "number expected for --step-timeout");
150
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
76 elseif opt == "--meta" then
69
1de0ebd8832f main.lua: Support tagging metadata for test runs, and include it in JSON output
Matthew Wild <mwild1@gmail.com>
parents: 68
diff changeset
77 local tag = get_value();
1de0ebd8832f main.lua: Support tagging metadata for test runs, and include it in JSON output
Matthew Wild <mwild1@gmail.com>
parents: 68
diff changeset
78 local key, value = tag:match("^([^=]+):(.+)$");
1de0ebd8832f main.lua: Support tagging metadata for test runs, and include it in JSON output
Matthew Wild <mwild1@gmail.com>
parents: 68
diff changeset
79 if key and value then
1de0ebd8832f main.lua: Support tagging metadata for test runs, and include it in JSON output
Matthew Wild <mwild1@gmail.com>
parents: 68
diff changeset
80 test_metadata[key] = value;
1de0ebd8832f main.lua: Support tagging metadata for test runs, and include it in JSON output
Matthew Wild <mwild1@gmail.com>
parents: 68
diff changeset
81 else
150
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
82 error("Unable to parse metadata: "..tag);
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
83 end
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
84 elseif opt == "--with-tag" then
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
85 if not only_tags then
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
86 only_tags = {};
69
1de0ebd8832f main.lua: Support tagging metadata for test runs, and include it in JSON output
Matthew Wild <mwild1@gmail.com>
parents: 68
diff changeset
87 end
150
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
88 local tag = get_value();
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
89 local key, value = tag:match("^([^=]+):(.+)$");
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
90 table.insert(only_tags, { key or tag, value });
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
91 elseif opt == "--skip-tag" then
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
92 if not skip_tags then
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
93 skip_tags = {};
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
94 end
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
95 local tag = get_value();
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
96 local key, value = tag:match("^([^=]+):(.+)$");
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
97 table.insert(skip_tags, { key or tag, value });
107
65791ba388b9 scansion: Add -q and -v for controlling log output
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
98 elseif opt == "--verbose" or opt == "-v" then
65791ba388b9 scansion: Add -q and -v for controlling log output
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
99 verse_log_levels = { "debug", "info", "warn", "error" };
65791ba388b9 scansion: Add -q and -v for controlling log output
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
100 quiet = false;
65791ba388b9 scansion: Add -q and -v for controlling log output
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
101 elseif opt == "--quiet" or opt == "-q" then
65791ba388b9 scansion: Add -q and -v for controlling log output
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
102 verse_log_levels = { "error" };
65791ba388b9 scansion: Add -q and -v for controlling log output
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
103 quiet = true;
132
e6df4368029d main: Add long form of -d: --script-dir
Matthew Wild <mwild1@gmail.com>
parents: 131
diff changeset
104 elseif opt == "--script-dir" or opt == "-d" then
127
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
105 local have_lfs, lfs = pcall(require, "lfs");
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
106 if not have_lfs then
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
107 error("The '-d' parameter requires LuaFileSystem (lfs), please make sure this library is available");
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
108 end
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
109 local path = assert(get_value(), "path expected for '-d'"):gsub("/*$", "");
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
110 for f in lfs.dir(path) do
144
f7e8b865873f main: Only process .scs files in directories
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
111 if f:sub(1,1) ~= "." and f:sub(-4) == ".scs" then
127
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
112 table.insert(files, path.."/"..f);
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
113 end
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
114 end
131
2d19fdddb9ee main, console: Allow force-printing --summary even if -q is passed
Matthew Wild <mwild1@gmail.com>
parents: 129
diff changeset
115 elseif opt == "--summary" then
2d19fdddb9ee main, console: Allow force-printing --summary even if -q is passed
Matthew Wild <mwild1@gmail.com>
parents: 129
diff changeset
116 force_summary = true;
137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
117 elseif opt == "--serve" then
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
118 serve_mode = 8007;
157
b35dc87ebff0 Make --serve and --serve-port take an origin argument, in order to disallow random websites from accessing the local port
Waqas Hussain <waqas20@gmail.com>
parents: 155
diff changeset
119 serve_origin = assert(get_value(), "origin expected for '--serve'");
137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
120 elseif opt == "--serve-port" then
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
121 serve_mode = assert(tonumber(get_value()), "expected port number");
157
b35dc87ebff0 Make --serve and --serve-port take an origin argument, in order to disallow random websites from accessing the local port
Waqas Hussain <waqas20@gmail.com>
parents: 155
diff changeset
122 serve_origin = assert(get_value(), "origin expected for '--serve-port'");
58
8fa0a464c727 main.lua: Error on unknown command-line options
Matthew Wild <mwild1@gmail.com>
parents: 57
diff changeset
123 else
8fa0a464c727 main.lua: Error on unknown command-line options
Matthew Wild <mwild1@gmail.com>
parents: 57
diff changeset
124 error("Unhandled command-line option: "..opt);
56
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
125 end
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
126 end
127
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
127 for _, file in ipairs(arg) do
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
128 table.insert(files, file);
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
129 end
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
130 return files;
56
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
131 end
0
2e31b584f8d9 It is better to write and run incomplete tests than not to run complete tests. -- Martin Fowler
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132
109
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
133 local function read_script(script_name)
108
cd58c64c67c0 scansion: Add support for passing multiple scripts on the command-line
Matthew Wild <mwild1@gmail.com>
parents: 107
diff changeset
134 io.input(script_name);
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
135 return io.read("*a");
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
136 end
0
2e31b584f8d9 It is better to write and run incomplete tests than not to run complete tests. -- Martin Fowler
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137
109
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
138 local function parse_script(data)
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
139 local parser = require "scansion.parser";
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
140 return assert(parser.parse(data));
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
141 end
0
2e31b584f8d9 It is better to write and run incomplete tests than not to run complete tests. -- Martin Fowler
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142
162
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
143 local function initialize_script(script, context)
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
144 local c = 0;
109
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
145 for name, object in pairs(script.objects) do --luacheck: ignore name
162
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
146 context.line = object.defined_line
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
147 local o = require("scansion.objects."..object.type);
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
148 object.handler = o;
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
149 object.script = script;
56
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
150 apply_object_properties(object.type, object.name, object);
82
f90056b8e278 main.lua, client: Make timeouts more coherent (stanza timeout was greater than action timeout), add command-line options to change them
Matthew Wild <mwild1@gmail.com>
parents: 81
diff changeset
151 if object.type == "client" and not object.stanza_timeout then
f90056b8e278 main.lua, client: Make timeouts more coherent (stanza timeout was greater than action timeout), add command-line options to change them
Matthew Wild <mwild1@gmail.com>
parents: 81
diff changeset
152 object.stanza_timeout = action_timeout - 1;
f90056b8e278 main.lua, client: Make timeouts more coherent (stanza timeout was greater than action timeout), add command-line options to change them
Matthew Wild <mwild1@gmail.com>
parents: 81
diff changeset
153 end
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
154 o._validate(object);
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
155 c = c + 1;
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
156 end
123
96b81f84809a main: Factor out script uninitialization into a function for consistency
Matthew Wild <mwild1@gmail.com>
parents: 117
diff changeset
157 end
109
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
158
123
96b81f84809a main: Factor out script uninitialization into a function for consistency
Matthew Wild <mwild1@gmail.com>
parents: 117
diff changeset
159 local function uninitialize_script(script)
134
ce945ba7a754 main: Don't let action timeout fire after a script already finished
Matthew Wild <mwild1@gmail.com>
parents: 132
diff changeset
160 script.finished = true;
149
b2e397594cbd main: Add more luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
161 for name, obj in pairs(script.objects) do --luacheck: ignore name
123
96b81f84809a main: Factor out script uninitialization into a function for consistency
Matthew Wild <mwild1@gmail.com>
parents: 117
diff changeset
162 if obj.handler._finish then
96b81f84809a main: Factor out script uninitialization into a function for consistency
Matthew Wild <mwild1@gmail.com>
parents: 117
diff changeset
163 obj.handler._finish(obj);
96b81f84809a main: Factor out script uninitialization into a function for consistency
Matthew Wild <mwild1@gmail.com>
parents: 117
diff changeset
164 end
96b81f84809a main: Factor out script uninitialization into a function for consistency
Matthew Wild <mwild1@gmail.com>
parents: 117
diff changeset
165 end
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
166 end
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
167
109
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
168 local function initialize_verse(errcb)
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
169 local verse = require "verse";
109
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
170
107
65791ba388b9 scansion: Add -q and -v for controlling log output
Matthew Wild <mwild1@gmail.com>
parents: 89
diff changeset
171 verse.set_log_handler(verse._default_log_handler, verse_log_levels);
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
172
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
173 local function error_handler(err)
110
d58403c8615e main.lua: Don't log traceback for normal scansion internal errors
Matthew Wild <mwild1@gmail.com>
parents: 109
diff changeset
174 -- Only log actual errors. Those reported by Scansion will be handled gracefully higher up.
d58403c8615e main.lua: Don't log traceback for normal scansion internal errors
Matthew Wild <mwild1@gmail.com>
parents: 109
diff changeset
175 if not is_scansion_error(err) then
d58403c8615e main.lua: Don't log traceback for normal scansion internal errors
Matthew Wild <mwild1@gmail.com>
parents: 109
diff changeset
176 verse.log("error", "Error: %s", err);
d58403c8615e main.lua: Don't log traceback for normal scansion internal errors
Matthew Wild <mwild1@gmail.com>
parents: 109
diff changeset
177 verse.log("error", "Traceback: %s", debug.traceback());
d58403c8615e main.lua: Don't log traceback for normal scansion internal errors
Matthew Wild <mwild1@gmail.com>
parents: 109
diff changeset
178 end
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
179 errcb(err);
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
180 end
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
181 verse.set_error_handler(error_handler);
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
182 return verse;
0
2e31b584f8d9 It is better to write and run incomplete tests than not to run complete tests. -- Martin Fowler
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183 end
2e31b584f8d9 It is better to write and run incomplete tests than not to run complete tests. -- Martin Fowler
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184
162
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
185 local function main(log_data, script, context)
56
5eda634ea15b main.lua: Command-line processing, and a way to set connect_host/connect_port from the command-line
Matthew Wild <mwild1@gmail.com>
parents: 55
diff changeset
186
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
187 local ok, err = true;
0
2e31b584f8d9 It is better to write and run incomplete tests than not to run complete tests. -- Martin Fowler
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
188
162
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
189 initialize_script(script, context);
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
190
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
191 context.line = nil;
71
f7dbb46b5770 main.lua: Log script title and summary
Matthew Wild <mwild1@gmail.com>
parents: 69
diff changeset
192
62
52a24deb0cc3 main: Support for --server-log/-s option, which reads the server's log file during a test and includes it in the JSON log
Matthew Wild <mwild1@gmail.com>
parents: 61
diff changeset
193 if server_log_reader then
76
fecc1af937be main.lua: Add --skip-server-startup-log to discard server log output at startup
Matthew Wild <mwild1@gmail.com>
parents: 71
diff changeset
194 if skip_server_startup_log then
fecc1af937be main.lua: Add --skip-server-startup-log to discard server log output at startup
Matthew Wild <mwild1@gmail.com>
parents: 71
diff changeset
195 server_log_reader();
fecc1af937be main.lua: Add --skip-server-startup-log to discard server log output at startup
Matthew Wild <mwild1@gmail.com>
parents: 71
diff changeset
196 else
fecc1af937be main.lua: Add --skip-server-startup-log to discard server log output at startup
Matthew Wild <mwild1@gmail.com>
parents: 71
diff changeset
197 log_data("server", { lines = server_log_reader() });
fecc1af937be main.lua: Add --skip-server-startup-log to discard server log output at startup
Matthew Wild <mwild1@gmail.com>
parents: 71
diff changeset
198 end
62
52a24deb0cc3 main: Support for --server-log/-s option, which reads the server's log file during a test and includes it in the JSON log
Matthew Wild <mwild1@gmail.com>
parents: 61
diff changeset
199 end
52a24deb0cc3 main: Support for --server-log/-s option, which reads the server's log file during a test and includes it in the JSON log
Matthew Wild <mwild1@gmail.com>
parents: 61
diff changeset
200
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
201 local verse = initialize_verse(function (_err) ok, err = false, _err end);
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
202 local async = require "scansion.async";
7
ecac723bb6e1 main: Run actions in async runner
Matthew Wild <mwild1@gmail.com>
parents: 3
diff changeset
203
109
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
204 local runner = async.runner(function ()
80
6676218cc481 main.lua: Add per-action timeout
Matthew Wild <mwild1@gmail.com>
parents: 78
diff changeset
205 for i, action in ipairs(script.actions) do
162
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
206 context.line = action.line_start;
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
207
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
208 local object = script.objects[action.object_name];
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
209 local handler = object.handler;
162
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
210
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
211 log_data("action", {
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
212 action = action.action;
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
213 object = object.name;
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
214 object_type = object.type;
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
215 extra = action.extra;
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
216 annotation = action.annotation;
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
217 line_start = action.line_start;
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
218 line_end = action.line_end;
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
219 });
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
220
161
fadae5511044 main: Make undefined actions throw a proper scansion error
Matthew Wild <mwild1@gmail.com>
parents: 160
diff changeset
221 if not handler[action.action] then
fadae5511044 main: Make undefined actions throw a proper scansion error
Matthew Wild <mwild1@gmail.com>
parents: 160
diff changeset
222 local e = new_error("unsupported-action", {
fadae5511044 main: Make undefined actions throw a proper scansion error
Matthew Wild <mwild1@gmail.com>
parents: 160
diff changeset
223 text = "Objects of type '"..object.type.."' do not support action '"..action.action.."'";
fadae5511044 main: Make undefined actions throw a proper scansion error
Matthew Wild <mwild1@gmail.com>
parents: 160
diff changeset
224 });
fadae5511044 main: Make undefined actions throw a proper scansion error
Matthew Wild <mwild1@gmail.com>
parents: 160
diff changeset
225 error(e);
fadae5511044 main: Make undefined actions throw a proper scansion error
Matthew Wild <mwild1@gmail.com>
parents: 160
diff changeset
226 end
68
cd63f764d1bf main.lua: Restructure server log reading
Matthew Wild <mwild1@gmail.com>
parents: 67
diff changeset
227 if server_log_reader then
cd63f764d1bf main.lua: Restructure server log reading
Matthew Wild <mwild1@gmail.com>
parents: 67
diff changeset
228 log_data("server", { lines = server_log_reader() });
cd63f764d1bf main.lua: Restructure server log reading
Matthew Wild <mwild1@gmail.com>
parents: 67
diff changeset
229 end
131
2d19fdddb9ee main, console: Allow force-printing --summary even if -q is passed
Matthew Wild <mwild1@gmail.com>
parents: 129
diff changeset
230
80
6676218cc481 main.lua: Add per-action timeout
Matthew Wild <mwild1@gmail.com>
parents: 78
diff changeset
231 if action_timeout and action_timeout > 0 then
6676218cc481 main.lua: Add per-action timeout
Matthew Wild <mwild1@gmail.com>
parents: 78
diff changeset
232 local action_number = i;
6676218cc481 main.lua: Add per-action timeout
Matthew Wild <mwild1@gmail.com>
parents: 78
diff changeset
233 verse.add_task(action_timeout, function ()
134
ce945ba7a754 main: Don't let action timeout fire after a script already finished
Matthew Wild <mwild1@gmail.com>
parents: 132
diff changeset
234 if i == action_number and not script.finished then
124
168cc5aad639 main: Throw scansion error on timeout, to avoid unnecessary traceback
Matthew Wild <mwild1@gmail.com>
parents: 123
diff changeset
235 local e = new_error("action-timeout", { text = "Timeout waiting for response" });
168cc5aad639 main: Throw scansion error on timeout, to avoid unnecessary traceback
Matthew Wild <mwild1@gmail.com>
parents: 123
diff changeset
236 error(e);
80
6676218cc481 main.lua: Add per-action timeout
Matthew Wild <mwild1@gmail.com>
parents: 78
diff changeset
237 end
6676218cc481 main.lua: Add per-action timeout
Matthew Wild <mwild1@gmail.com>
parents: 78
diff changeset
238 end);
6676218cc481 main.lua: Add per-action timeout
Matthew Wild <mwild1@gmail.com>
parents: 78
diff changeset
239 end
109
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
240 do
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
241 --luacheck: ignore ok err
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
242 local ok, err = pcall(handler[action.action], object, action.extra);
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
243 if server_log_reader then
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
244 log_data("server", { lines = server_log_reader() });
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
245 end
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
246 if not ok then
162
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
247 log_data("error", { message = err, line = context.line });
109
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
248 error(err);
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
249 end
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
250 end
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
251 end
162
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
252 context.line = nil;
89
f353cd50c075 main.lua: Add flag for when script has finished
Matthew Wild <mwild1@gmail.com>
parents: 82
diff changeset
253 script.finished = true;
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
254 verse.log("info", "Completed script!");
30
3c2489e79074 main: Remove 5s delay on quitting (was a hack for debug purposes)
Matthew Wild <mwild1@gmail.com>
parents: 21
diff changeset
255 verse.quit();
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
256 end, {
109
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
257 error = function (runner, _err) --luacheck: ignore runner
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
258 verse.log("error", "Runner caught error: %s", _err);
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
259 ok, err = false, _err;
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
260 verse.quit();
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
261 end;
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
262 });
109
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
263
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
264 runner:run(true);
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
265 verse.log("debug", "runner paused")
109
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
266
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
267 verse.loop();
81
0ee626030acb main.lua: Read any remaining server logs after script completes (error or otherwise)
Matthew Wild <mwild1@gmail.com>
parents: 80
diff changeset
268
0ee626030acb main.lua: Read any remaining server logs after script completes (error or otherwise)
Matthew Wild <mwild1@gmail.com>
parents: 80
diff changeset
269 if server_log_reader then
0ee626030acb main.lua: Read any remaining server logs after script completes (error or otherwise)
Matthew Wild <mwild1@gmail.com>
parents: 80
diff changeset
270 log_data("server", { lines = server_log_reader() });
0ee626030acb main.lua: Read any remaining server logs after script completes (error or otherwise)
Matthew Wild <mwild1@gmail.com>
parents: 80
diff changeset
271 end
0ee626030acb main.lua: Read any remaining server logs after script completes (error or otherwise)
Matthew Wild <mwild1@gmail.com>
parents: 80
diff changeset
272
123
96b81f84809a main: Factor out script uninitialization into a function for consistency
Matthew Wild <mwild1@gmail.com>
parents: 117
diff changeset
273 uninitialize_script(script);
117
fd4025e54f4d main: Add _finish handler so objects can clean up
Matthew Wild <mwild1@gmail.com>
parents: 115
diff changeset
274
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
275 return ok, err;
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
276 end
7
ecac723bb6e1 main: Run actions in async runner
Matthew Wild <mwild1@gmail.com>
parents: 3
diff changeset
277
57
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
278 -- Process command-line options
127
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
279 local files = process_options();
57
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
280
131
2d19fdddb9ee main, console: Allow force-printing --summary even if -q is passed
Matthew Wild <mwild1@gmail.com>
parents: 129
diff changeset
281 local console_handlers = require "scansion.console".new({
2d19fdddb9ee main, console: Allow force-printing --summary even if -q is passed
Matthew Wild <mwild1@gmail.com>
parents: 129
diff changeset
282 summary = not(quiet) or force_summary;
2d19fdddb9ee main, console: Allow force-printing --summary even if -q is passed
Matthew Wild <mwild1@gmail.com>
parents: 129
diff changeset
283 quiet = quiet;
2d19fdddb9ee main, console: Allow force-printing --summary even if -q is passed
Matthew Wild <mwild1@gmail.com>
parents: 129
diff changeset
284 });
2d19fdddb9ee main, console: Allow force-printing --summary even if -q is passed
Matthew Wild <mwild1@gmail.com>
parents: 129
diff changeset
285
115
0f8d0906af6e Revamp console output to be driven by log_data()
Matthew Wild <mwild1@gmail.com>
parents: 114
diff changeset
286 local function console_logger(event, data)
131
2d19fdddb9ee main, console: Allow force-printing --summary even if -q is passed
Matthew Wild <mwild1@gmail.com>
parents: 129
diff changeset
287 local h = console_handlers[event];
2d19fdddb9ee main, console: Allow force-printing --summary even if -q is passed
Matthew Wild <mwild1@gmail.com>
parents: 129
diff changeset
288 if h then
2d19fdddb9ee main, console: Allow force-printing --summary even if -q is passed
Matthew Wild <mwild1@gmail.com>
parents: 129
diff changeset
289 io.write(h(data), "\n");
115
0f8d0906af6e Revamp console output to be driven by log_data()
Matthew Wild <mwild1@gmail.com>
parents: 114
diff changeset
290 end
0f8d0906af6e Revamp console output to be driven by log_data()
Matthew Wild <mwild1@gmail.com>
parents: 114
diff changeset
291 end
0f8d0906af6e Revamp console output to be driven by log_data()
Matthew Wild <mwild1@gmail.com>
parents: 114
diff changeset
292
3
3cc860a893d2 main: verse.loop()
Matthew Wild <mwild1@gmail.com>
parents: 0
diff changeset
293
57
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
294 local result_log;
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
295 if result_log_filename then
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
296 result_log = assert(io.open(result_log_filename, "w+"));
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
297 result_log:write("[\n");
115
0f8d0906af6e Revamp console output to be driven by log_data()
Matthew Wild <mwild1@gmail.com>
parents: 114
diff changeset
298 end
0f8d0906af6e Revamp console output to be driven by log_data()
Matthew Wild <mwild1@gmail.com>
parents: 114
diff changeset
299
0f8d0906af6e Revamp console output to be driven by log_data()
Matthew Wild <mwild1@gmail.com>
parents: 114
diff changeset
300 local function log_data(type, data)
0f8d0906af6e Revamp console output to be driven by log_data()
Matthew Wild <mwild1@gmail.com>
parents: 114
diff changeset
301 console_logger(type, data);
0f8d0906af6e Revamp console output to be driven by log_data()
Matthew Wild <mwild1@gmail.com>
parents: 114
diff changeset
302
0f8d0906af6e Revamp console output to be driven by log_data()
Matthew Wild <mwild1@gmail.com>
parents: 114
diff changeset
303 if result_log then
61
21871fb2db99 main: Switch to socket.gettime for higher accuracy timestamps in machine-readable logs
Matthew Wild <mwild1@gmail.com>
parents: 59
diff changeset
304 local entry = { type = type, data = data, time = time() };
125
dfff8dfe8861 main: Refactor to support a more advanced summary at the end of a test run
Matthew Wild <mwild1@gmail.com>
parents: 124
diff changeset
305 result_log:write(" ", json.encode(entry), type ~= "end" and ",\n" or "\n");
57
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
306 result_log:flush();
125
dfff8dfe8861 main: Refactor to support a more advanced summary at the end of a test run
Matthew Wild <mwild1@gmail.com>
parents: 124
diff changeset
307 if type == "end" then
dfff8dfe8861 main: Refactor to support a more advanced summary at the end of a test run
Matthew Wild <mwild1@gmail.com>
parents: 124
diff changeset
308 result_log:write("]\n");
dfff8dfe8861 main: Refactor to support a more advanced summary at the end of a test run
Matthew Wild <mwild1@gmail.com>
parents: 124
diff changeset
309 result_log:close();
dfff8dfe8861 main: Refactor to support a more advanced summary at the end of a test run
Matthew Wild <mwild1@gmail.com>
parents: 124
diff changeset
310 result_log = nil;
dfff8dfe8861 main: Refactor to support a more advanced summary at the end of a test run
Matthew Wild <mwild1@gmail.com>
parents: 124
diff changeset
311 end
57
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
312 end
115
0f8d0906af6e Revamp console output to be driven by log_data()
Matthew Wild <mwild1@gmail.com>
parents: 114
diff changeset
313 end;
57
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
314
155
84aa28dda508 main: Pass logging function to run_test_script
Matthew Wild <mwild1@gmail.com>
parents: 154
diff changeset
315 local function run_test_script(script_name, script_text, log_data)
136
2df38fd36b2b main: Modify run_test_script() to take the actual script data
Matthew Wild <mwild1@gmail.com>
parents: 135
diff changeset
316 local script = parse_script(script_text)
146
885fa9f5929d main, scansion.console: Refactor (changes event data format) so that test results include test name
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
317 local script_data = { title = script.title, summary = script.summary, tags = script.tags, filename = script_name };
150
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
318
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
319 local tags = script.tags or {};
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
320 if skip_tags then
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
321 for _, skip in ipairs(skip_tags) do
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
322 local k, v = skip[1], skip[2];
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
323 if tags[k] and (not(v) or tags[k] == v) then
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
324 return { name = script.title or script.name, status = "skipped", reason = "skipping tag "..k };
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
325 end
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
326 end
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
327 end
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
328 if only_tags then
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
329 for _, only in ipairs(only_tags) do
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
330 local k, v = only[1], only[2];
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
331 if not tags[k] or (v and tags[k] ~= v) then
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
332 return { name = script.title or script.name, status = "skipped", reason = "not tagged "..k };
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
333 end
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
334 end
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
335 end
cf2b2fcd0bc1 main: Add support for including/excluding tests based on tag
Matthew Wild <mwild1@gmail.com>
parents: 149
diff changeset
336
146
885fa9f5929d main, scansion.console: Refactor (changes event data format) so that test results include test name
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
337 log_data("script", script_data);
109
f7609d1a5bdf main.lua: Some fixes for [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 108
diff changeset
338
162
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
339 local context = { line = nil };
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
340 local ok, result, err = pcall(main, log_data, script, context);
125
dfff8dfe8861 main: Refactor to support a more advanced summary at the end of a test run
Matthew Wild <mwild1@gmail.com>
parents: 124
diff changeset
341
146
885fa9f5929d main, scansion.console: Refactor (changes event data format) so that test results include test name
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
342 local event, status, reason;
108
cd58c64c67c0 scansion: Add support for passing multiple scripts on the command-line
Matthew Wild <mwild1@gmail.com>
parents: 107
diff changeset
343 if not ok then
146
885fa9f5929d main, scansion.console: Refactor (changes event data format) so that test results include test name
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
344 event, status, reason = "test-error", "error", result;
108
cd58c64c67c0 scansion: Add support for passing multiple scripts on the command-line
Matthew Wild <mwild1@gmail.com>
parents: 107
diff changeset
345 elseif not result then
146
885fa9f5929d main, scansion.console: Refactor (changes event data format) so that test results include test name
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
346 event, status, reason = "test-failed", "fail", err;
131
2d19fdddb9ee main, console: Allow force-printing --summary even if -q is passed
Matthew Wild <mwild1@gmail.com>
parents: 129
diff changeset
347 else
146
885fa9f5929d main, scansion.console: Refactor (changes event data format) so that test results include test name
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
348 event, status, reason = "test-passed", "ok", nil;
108
cd58c64c67c0 scansion: Add support for passing multiple scripts on the command-line
Matthew Wild <mwild1@gmail.com>
parents: 107
diff changeset
349 end
146
885fa9f5929d main, scansion.console: Refactor (changes event data format) so that test results include test name
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
350
162
f888f236321f Make current line number available in all error events
Waqas Hussain <waqas20@gmail.com>
parents: 161
diff changeset
351 local result_data = { name = script.title or script_name, status = status, reason = reason, line = context.line };
146
885fa9f5929d main, scansion.console: Refactor (changes event data format) so that test results include test name
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
352
885fa9f5929d main, scansion.console: Refactor (changes event data format) so that test results include test name
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
353 log_data(event, result_data);
885fa9f5929d main, scansion.console: Refactor (changes event data format) so that test results include test name
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
354
885fa9f5929d main, scansion.console: Refactor (changes event data format) so that test results include test name
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
355 return result_data;
108
cd58c64c67c0 scansion: Add support for passing multiple scripts on the command-line
Matthew Wild <mwild1@gmail.com>
parents: 107
diff changeset
356 end
57
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
357
137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
358
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
359 if serve_mode then
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
360 local have_serve, serve = pcall(require, "scansion.serve");
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
361
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
362 if not have_serve then
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
363 error("This version of scansion was not built with --with-server");
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
364 end
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
365
149
b2e397594cbd main: Add more luacheck annotations
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
366 initialize_verse(function (e) --luacheck: ignore e
137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
367 -- This function handles scansion errors,
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
368 -- but they shouldn't reach here anyway
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
369 end);
157
b35dc87ebff0 Make --serve and --serve-port take an origin argument, in order to disallow random websites from accessing the local port
Waqas Hussain <waqas20@gmail.com>
parents: 155
diff changeset
370 serve.run({ port = serve_mode, origin = serve_origin }, run_test_script);
137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
371 os.exit(0);
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
372 end
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
373
114
48aab6c9e9d3 main: Move 'start' event to correct place (signals start of test run, not individual tests)
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
374 log_data("start", { metadata = test_metadata });
48aab6c9e9d3 main: Move 'start' event to correct place (signals start of test run, not individual tests)
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
375
125
dfff8dfe8861 main: Refactor to support a more advanced summary at the end of a test run
Matthew Wild <mwild1@gmail.com>
parents: 124
diff changeset
376 local result_tally = { all = {} };
dfff8dfe8861 main: Refactor to support a more advanced summary at the end of a test run
Matthew Wild <mwild1@gmail.com>
parents: 124
diff changeset
377
135
0c1887ee2059 main: Move check for whether any files have been provided
Matthew Wild <mwild1@gmail.com>
parents: 134
diff changeset
378 assert(#files > 0, "No test script provided");
127
df5aa6a12561 main: Add support for passing one or more script directories with '-d'
Matthew Wild <mwild1@gmail.com>
parents: 125
diff changeset
379 for i = 1, #files do
136
2df38fd36b2b main: Modify run_test_script() to take the actual script data
Matthew Wild <mwild1@gmail.com>
parents: 135
diff changeset
380 local script_text = read_script(files[i]);
155
84aa28dda508 main: Pass logging function to run_test_script
Matthew Wild <mwild1@gmail.com>
parents: 154
diff changeset
381 local ret = run_test_script(files[i], script_text, log_data);
125
dfff8dfe8861 main: Refactor to support a more advanced summary at the end of a test run
Matthew Wild <mwild1@gmail.com>
parents: 124
diff changeset
382 if not result_tally[ret.status] then
dfff8dfe8861 main: Refactor to support a more advanced summary at the end of a test run
Matthew Wild <mwild1@gmail.com>
parents: 124
diff changeset
383 result_tally[ret.status] = {};
108
cd58c64c67c0 scansion: Add support for passing multiple scripts on the command-line
Matthew Wild <mwild1@gmail.com>
parents: 107
diff changeset
384 end
125
dfff8dfe8861 main: Refactor to support a more advanced summary at the end of a test run
Matthew Wild <mwild1@gmail.com>
parents: 124
diff changeset
385 table.insert(result_tally[ret.status], ret);
dfff8dfe8861 main: Refactor to support a more advanced summary at the end of a test run
Matthew Wild <mwild1@gmail.com>
parents: 124
diff changeset
386 table.insert(result_tally.all, ret);
21
8ac80da35408 main: Refactor into functions
Matthew Wild <mwild1@gmail.com>
parents: 14
diff changeset
387 end
57
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
388
125
dfff8dfe8861 main: Refactor to support a more advanced summary at the end of a test run
Matthew Wild <mwild1@gmail.com>
parents: 124
diff changeset
389 log_data("end", { time = time(), summary = result_tally });
57
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
390
137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
391
129
ff11f32d2499 main: Fix to restore correct exit code
Matthew Wild <mwild1@gmail.com>
parents: 128
diff changeset
392 local exit_code = 0;
ff11f32d2499 main: Fix to restore correct exit code
Matthew Wild <mwild1@gmail.com>
parents: 128
diff changeset
393 if result_tally.error then
ff11f32d2499 main: Fix to restore correct exit code
Matthew Wild <mwild1@gmail.com>
parents: 128
diff changeset
394 exit_code = 2;
ff11f32d2499 main: Fix to restore correct exit code
Matthew Wild <mwild1@gmail.com>
parents: 128
diff changeset
395 elseif result_tally.fail then
ff11f32d2499 main: Fix to restore correct exit code
Matthew Wild <mwild1@gmail.com>
parents: 128
diff changeset
396 exit_code = 1;
ff11f32d2499 main: Fix to restore correct exit code
Matthew Wild <mwild1@gmail.com>
parents: 128
diff changeset
397 end
ff11f32d2499 main: Fix to restore correct exit code
Matthew Wild <mwild1@gmail.com>
parents: 128
diff changeset
398
57
6407a0157518 main.lua: Add support for JSON log output to a file, for a machine-readable transcript of the test results
Matthew Wild <mwild1@gmail.com>
parents: 56
diff changeset
399 os.exit(exit_code);
137
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
400
091212cef52a main, scansion.serve: Add mode that serves /run API for executing scripts
Matthew Wild <mwild1@gmail.com>
parents: 136
diff changeset
401

mercurial