Annotate

tests/test.lua @ 8791:8da11142fabf

muc: Allow clients to change multiple affiliations or roles at once (#345) According to XEP-0045 sections 9.2, 9.5 and 9.8 affiliation lists and role lists should allow mass-modification. Prosody however would just use the first entry of the list and ignore the rest. This is fixed by introducing a `for` loop to `set` stanzas of the respective `muc#admin` namespace. In order for this loop to work, the error handling was changed a little. Prosody no longer returns after the first error. Instead, an error reply is sent for each malformed or otherwise wrong entry, but the loop keeps going over the other entries. This may lead to multiple error messages being sent for one client request. A notable exception from this is when the XML Schema for `muc#admin` requests is violated. In that case the loop is aborted with an error message to the client. The change is a bit bigger than that in order to have the loop only for `set` stanzas without changing the behaviour of the `get` stanzas. This is now more in line with trunk, where there are separate methods for each stanza type. References: #345
author Lennart Sauerbeck <devel@lennart.sauerbeck.org>
date Sat, 18 Mar 2017 18:47:28 +0100
parent 7507:11e8c605a591
child 7510:8a0a50e8ef2d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
1 -- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1972
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1972
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5604
diff changeset
4 --
758
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 681
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 681
diff changeset
6 -- COPYING file in the source package for more information.
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 509
diff changeset
7 --
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 509
diff changeset
8
6824
85578994d376 tests: Return status code depending on whether tests passed
Matthew Wild <mwild1@gmail.com>
parents: 6602
diff changeset
9 local tests_passed = true;
361
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
10
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
11 function run_all_tests()
4339
63304d323983 tests/test.lua, tests/test_net_http.lua: Tests for net.http's url and form encoding/decoding functions
Matthew Wild <mwild1@gmail.com>
parents: 3540
diff changeset
12 package.loaded["net.connlisteners"] = { get = function () return {} end };
361
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
13 dotest "util.jid"
569
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
14 dotest "util.multitable"
5604
6df0ec991f2e tests: Some much-needed cleanup...
Matthew Wild <mwild1@gmail.com>
parents: 4420
diff changeset
15 dotest "util.rfc6724"
6df0ec991f2e tests: Some much-needed cleanup...
Matthew Wild <mwild1@gmail.com>
parents: 4420
diff changeset
16 dotest "util.http"
361
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
17 dotest "core.stanza_router"
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
18 dotest "core.s2smanager"
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
19 dotest "core.configmanager"
5604
6df0ec991f2e tests: Some much-needed cleanup...
Matthew Wild <mwild1@gmail.com>
parents: 4420
diff changeset
20 dotest "util.ip"
7233
71ca252d9f69 Add tests for util.json
Matthew Wild <mwild1@gmail.com>
parents: 7172
diff changeset
21 dotest "util.json"
681
686b73503ce8 Add test for previous commit
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
22 dotest "util.stanza"
3406
748246005893 tests: Added tests for util.sasl.scram.Hi().
Waqas Hussain <waqas20@gmail.com>
parents: 2925
diff changeset
23 dotest "util.sasl.scram"
6946
31fb9eb9edce tests: Add tests for util.cache
Matthew Wild <mwild1@gmail.com>
parents: 6824
diff changeset
24 dotest "util.cache"
7024
8ce592e376ff tests: Add small test for util.throttle
Kim Alvefur <zash@zash.se>
parents: 6946
diff changeset
25 dotest "util.throttle"
7073
31fa6770019c tests: Add test for util.uuid (checks that the output format is correct)
Kim Alvefur <zash@zash.se>
parents: 7072
diff changeset
26 dotest "util.uuid"
7172
32b74ad54432 tests: Add minimal test for util.random that checks that it returns the number of bytes requested
Kim Alvefur <zash@zash.se>
parents: 7108
diff changeset
27 dotest "util.random"
7241
5e7797822f19 tests: Add basic tests for util.xml and util.xmppstream
Matthew Wild <mwild1@gmail.com>
parents: 7233
diff changeset
28 dotest "util.xml"
5e7797822f19 tests: Add basic tests for util.xml and util.xmppstream
Matthew Wild <mwild1@gmail.com>
parents: 7233
diff changeset
29 dotest "util.xmppstream"
7507
11e8c605a591 tests: Adapt test for util.queue to the test framework
Kim Alvefur <zash@zash.se>
parents: 7493
diff changeset
30 dotest "util.queue"
7493
f67b7509ee28 tests: Add basic test for net.http.parser
Kim Alvefur <zash@zash.se>
parents: 7241
diff changeset
31 dotest "net.http.parser"
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5604
diff changeset
32
509
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
33 dosingletest("test_sasl.lua", "latin1toutf8");
6594
fa6eb6fb4a80 tests: Add UTF-8 validity tests
Matthew Wild <mwild1@gmail.com>
parents: 4420
diff changeset
34 dosingletest("test_utf8.lua", "valid");
361
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
35 end
28
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 local verbosity = tonumber(arg[1]) or 2;
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38
808
ce39abe0259a Fixed tests/test.lua to work on Windows
Waqas Hussain <waqas20@gmail.com>
parents: 787
diff changeset
39 if os.getenv("WINDIR") then
ce39abe0259a Fixed tests/test.lua to work on Windows
Waqas Hussain <waqas20@gmail.com>
parents: 787
diff changeset
40 package.path = package.path..";..\\?.lua";
ce39abe0259a Fixed tests/test.lua to work on Windows
Waqas Hussain <waqas20@gmail.com>
parents: 787
diff changeset
41 package.cpath = package.cpath..";..\\?.dll";
ce39abe0259a Fixed tests/test.lua to work on Windows
Waqas Hussain <waqas20@gmail.com>
parents: 787
diff changeset
42 else
ce39abe0259a Fixed tests/test.lua to work on Windows
Waqas Hussain <waqas20@gmail.com>
parents: 787
diff changeset
43 package.path = package.path..";../?.lua";
ce39abe0259a Fixed tests/test.lua to work on Windows
Waqas Hussain <waqas20@gmail.com>
parents: 787
diff changeset
44 package.cpath = package.cpath..";../?.so";
ce39abe0259a Fixed tests/test.lua to work on Windows
Waqas Hussain <waqas20@gmail.com>
parents: 787
diff changeset
45 end
271
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
46
1972
26d4b99ba211 tests: More environment magic to help get stuff working in a sandbox
Matthew Wild <mwild1@gmail.com>
parents: 1963
diff changeset
47 local _realG = _G;
26d4b99ba211 tests: More environment magic to help get stuff working in a sandbox
Matthew Wild <mwild1@gmail.com>
parents: 1963
diff changeset
48
271
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
49 require "util.import"
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
50
7108
bb8a38c68191 tests: Use util.envload to load chunks (fixes #608)
Kim Alvefur <zash@zash.se>
parents: 7073
diff changeset
51 local envloadfile = require "util.envload".envloadfile;
bb8a38c68191 tests: Use util.envload to load chunks (fixes #608)
Kim Alvefur <zash@zash.se>
parents: 7073
diff changeset
52
1972
26d4b99ba211 tests: More environment magic to help get stuff working in a sandbox
Matthew Wild <mwild1@gmail.com>
parents: 1963
diff changeset
53 local env_mt = { __index = function (t,k) return rawget(_realG, k) or print("WARNING: Attempt to access nil global '"..tostring(k).."'"); end };
271
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
54 function testlib_new_env(t)
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
55 return setmetatable(t or {}, env_mt);
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
56 end
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
57
569
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
58 function assert_equal(a, b, message, level)
28
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 if not (a == b) then
569
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
60 error("\n assert_equal failed: "..tostring(a).." ~= "..tostring(b)..(message and ("\n Message: "..message) or ""), (level or 1) + 1);
28
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 elseif verbosity >= 4 then
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 print("assert_equal succeeded: "..tostring(a).." == "..tostring(b));
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 end
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 end
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65
569
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
66 function assert_table(a, message, level)
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
67 assert_equal(type(a), "table", message, (level or 1) + 1);
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
68 end
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
69 function assert_function(a, message, level)
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
70 assert_equal(type(a), "function", message, (level or 1) + 1);
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
71 end
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
72 function assert_string(a, message, level)
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
73 assert_equal(type(a), "string", message, (level or 1) + 1);
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
74 end
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
75 function assert_boolean(a, message)
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
76 assert_equal(type(a), "boolean", message);
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
77 end
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
78 function assert_is(a, message)
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
79 assert_equal(not not a, true, message);
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
80 end
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
81 function assert_is_not(a, message)
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
82 assert_equal(not not a, false, message);
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
83 end
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
84
5216efe6088b Add hostmanager, and eventmanager
Matthew Wild <mwild1@gmail.com>
parents: 519
diff changeset
85
509
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
86 function dosingletest(testname, fname)
1972
26d4b99ba211 tests: More environment magic to help get stuff working in a sandbox
Matthew Wild <mwild1@gmail.com>
parents: 1963
diff changeset
87 local tests = setmetatable({}, { __index = _realG });
509
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
88 tests.__unit = testname;
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
89 tests.__test = fname;
7108
bb8a38c68191 tests: Use util.envload to load chunks (fixes #608)
Kim Alvefur <zash@zash.se>
parents: 7073
diff changeset
90 local chunk, err = envloadfile(testname, tests);
509
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
91 if not chunk then
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
92 print("WARNING: ", "Failed to load tests for "..testname, err);
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
93 return;
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
94 end
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
95
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
96 local success, err = pcall(chunk);
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
97 if not success then
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
98 print("WARNING: ", "Failed to initialise tests for "..testname, err);
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
99 return;
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
100 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5604
diff changeset
101
509
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
102 if type(tests[fname]) ~= "function" then
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
103 error(testname.." has no test '"..fname.."'", 0);
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
104 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5604
diff changeset
105
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5604
diff changeset
106
509
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
107 local line_hook, line_info = new_line_coverage_monitor(testname);
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
108 debug.sethook(line_hook, "l")
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
109 local success, ret = pcall(tests[fname]);
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
110 debug.sethook();
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
111 if not success then
6824
85578994d376 tests: Return status code depending on whether tests passed
Matthew Wild <mwild1@gmail.com>
parents: 6602
diff changeset
112 tests_passed = false;
509
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
113 print("TEST FAILED! Unit: ["..testname.."] Function: ["..fname.."]");
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
114 print(" Location: "..ret:gsub(":%s*\n", "\n"));
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
115 line_info(fname, false, report_file);
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
116 elseif verbosity >= 2 then
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
117 print("TEST SUCCEEDED: ", testname, fname);
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
118 print(string.format("TEST COVERED %d/%d lines", line_info(fname, true, report_file)));
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
119 else
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
120 line_info(name, success, report_file);
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
121 end
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
122 end
32899c8a6fe5 Add test for latin1toutf8 (which passes)
Matthew Wild <mwild1@gmail.com>
parents: 470
diff changeset
123
28
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 function dotest(unitname)
2248
37344b18b551 tests/test.lua: Changes to environment handling of tests, and replace module() with dummy function that doesn't alter the current environment
Matthew Wild <mwild1@gmail.com>
parents: 2246
diff changeset
125 local _fakeG = setmetatable({}, {__index = _realG});
37344b18b551 tests/test.lua: Changes to environment handling of tests, and replace module() with dummy function that doesn't alter the current environment
Matthew Wild <mwild1@gmail.com>
parents: 2246
diff changeset
126 _fakeG._G = _fakeG;
37344b18b551 tests/test.lua: Changes to environment handling of tests, and replace module() with dummy function that doesn't alter the current environment
Matthew Wild <mwild1@gmail.com>
parents: 2246
diff changeset
127 local tests = setmetatable({}, { __index = _fakeG });
28
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 tests.__unit = unitname;
7108
bb8a38c68191 tests: Use util.envload to load chunks (fixes #608)
Kim Alvefur <zash@zash.se>
parents: 7073
diff changeset
129 local chunk, err = envloadfile("test_"..unitname:gsub("%.", "_")..".lua", tests);
28
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 if not chunk then
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
131 print("WARNING: ", "Failed to load tests for "..unitname, err);
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 return;
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 end
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135 local success, err = pcall(chunk);
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 if not success then
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 print("WARNING: ", "Failed to initialise tests for "..unitname, err);
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 return;
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139 end
1972
26d4b99ba211 tests: More environment magic to help get stuff working in a sandbox
Matthew Wild <mwild1@gmail.com>
parents: 1963
diff changeset
140 if tests.env then setmetatable(tests.env, { __index = _realG }); end
2248
37344b18b551 tests/test.lua: Changes to environment handling of tests, and replace module() with dummy function that doesn't alter the current environment
Matthew Wild <mwild1@gmail.com>
parents: 2246
diff changeset
141 local unit = setmetatable({}, { __index = setmetatable({ _G = tests.env or _fakeG }, { __index = tests.env or _fakeG }) });
361
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
142 local fn = "../"..unitname:gsub("%.", "/")..".lua";
7108
bb8a38c68191 tests: Use util.envload to load chunks (fixes #608)
Kim Alvefur <zash@zash.se>
parents: 7073
diff changeset
143 local chunk, err = envloadfile(fn, unit);
28
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
144 if not chunk then
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
145 print("WARNING: ", "Failed to load module: "..unitname, err);
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 return;
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5604
diff changeset
148
2248
37344b18b551 tests/test.lua: Changes to environment handling of tests, and replace module() with dummy function that doesn't alter the current environment
Matthew Wild <mwild1@gmail.com>
parents: 2246
diff changeset
149 local oldmodule, old_M = _fakeG.module, _fakeG._M;
7051
ecfa474ff570 tests/test.lua: Fix fake module() function to prevent _M from being _G (test.lua's environment), which caused modules to break the sandbox when they set _M.*
Matthew Wild <mwild1@gmail.com>
parents: 6594
diff changeset
150 _fakeG.module = function ()
ecfa474ff570 tests/test.lua: Fix fake module() function to prevent _M from being _G (test.lua's environment), which caused modules to break the sandbox when they set _M.*
Matthew Wild <mwild1@gmail.com>
parents: 6594
diff changeset
151 setmetatable(unit, nil);
ecfa474ff570 tests/test.lua: Fix fake module() function to prevent _M from being _G (test.lua's environment), which caused modules to break the sandbox when they set _M.*
Matthew Wild <mwild1@gmail.com>
parents: 6594
diff changeset
152 unit._M = unit;
ecfa474ff570 tests/test.lua: Fix fake module() function to prevent _M from being _G (test.lua's environment), which caused modules to break the sandbox when they set _M.*
Matthew Wild <mwild1@gmail.com>
parents: 6594
diff changeset
153 end
7072
3121054e665f tests: Correct mistake from latst merge, use the same variable name in all 3 places where it matters
Kim Alvefur <zash@zash.se>
parents: 7062
diff changeset
154 local success, ret = pcall(chunk);
2248
37344b18b551 tests/test.lua: Changes to environment handling of tests, and replace module() with dummy function that doesn't alter the current environment
Matthew Wild <mwild1@gmail.com>
parents: 2246
diff changeset
155 _fakeG.module, _fakeG._M = oldmodule, old_M;
28
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156 if not success then
7072
3121054e665f tests: Correct mistake from latst merge, use the same variable name in all 3 places where it matters
Kim Alvefur <zash@zash.se>
parents: 7062
diff changeset
157 print("WARNING: ", "Failed to initialise module: "..unitname, ret);
28
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 return;
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5604
diff changeset
160
5604
6df0ec991f2e tests: Some much-needed cleanup...
Matthew Wild <mwild1@gmail.com>
parents: 4420
diff changeset
161 if type(ret) == "table" then
6df0ec991f2e tests: Some much-needed cleanup...
Matthew Wild <mwild1@gmail.com>
parents: 4420
diff changeset
162 for k,v in pairs(ret) do
6df0ec991f2e tests: Some much-needed cleanup...
Matthew Wild <mwild1@gmail.com>
parents: 4420
diff changeset
163 unit[k] = v;
6df0ec991f2e tests: Some much-needed cleanup...
Matthew Wild <mwild1@gmail.com>
parents: 4420
diff changeset
164 end
6df0ec991f2e tests: Some much-needed cleanup...
Matthew Wild <mwild1@gmail.com>
parents: 4420
diff changeset
165 end
6df0ec991f2e tests: Some much-needed cleanup...
Matthew Wild <mwild1@gmail.com>
parents: 4420
diff changeset
166
28
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167 for name, f in pairs(unit) do
361
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
168 local test = rawget(tests, name);
28
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 if type(f) ~= "function" then
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170 if verbosity >= 3 then
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171 print("INFO: ", "Skipping "..unitname.."."..name.." because it is not a function");
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172 end
361
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
173 elseif type(test) ~= "function" then
28
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174 if verbosity >= 1 then
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 print("WARNING: ", unitname.."."..name.." has no test!");
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 end
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177 else
2246
eb047fe305aa tests/test.lua: Print the current test being run if verbosity sufficient
Matthew Wild <mwild1@gmail.com>
parents: 1972
diff changeset
178 if verbosity >= 4 then
eb047fe305aa tests/test.lua: Print the current test being run if verbosity sufficient
Matthew Wild <mwild1@gmail.com>
parents: 1972
diff changeset
179 print("INFO: ", "Testing "..unitname.."."..name);
eb047fe305aa tests/test.lua: Print the current test being run if verbosity sufficient
Matthew Wild <mwild1@gmail.com>
parents: 1972
diff changeset
180 end
361
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
181 local line_hook, line_info = new_line_coverage_monitor(fn);
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
182 debug.sethook(line_hook, "l")
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
183 local success, ret = pcall(test, f, unit);
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
184 debug.sethook();
28
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185 if not success then
6824
85578994d376 tests: Return status code depending on whether tests passed
Matthew Wild <mwild1@gmail.com>
parents: 6602
diff changeset
186 tests_passed = false;
271
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
187 print("TEST FAILED! Unit: ["..unitname.."] Function: ["..name.."]");
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
188 print(" Location: "..ret:gsub(":%s*\n", "\n"));
370
9ade55e059ea Update test.lua with a work-in-progress
Matthew Wild <mwild1@gmail.com>
parents: 361
diff changeset
189 line_info(name, false, report_file);
28
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
190 elseif verbosity >= 2 then
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
191 print("TEST SUCCEEDED: ", unitname, name);
370
9ade55e059ea Update test.lua with a work-in-progress
Matthew Wild <mwild1@gmail.com>
parents: 361
diff changeset
192 print(string.format("TEST COVERED %d/%d lines", line_info(name, true, report_file)));
361
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
193 else
370
9ade55e059ea Update test.lua with a work-in-progress
Matthew Wild <mwild1@gmail.com>
parents: 361
diff changeset
194 line_info(name, success, report_file);
28
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
195 end
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 end
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197 end
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
198 end
4a238233f278 Adding initial unit testing scripts
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
199
271
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
200 function runtest(f, msg)
301
fcb7e63630ae Warn when subtest function does not exist
Matthew Wild <mwild1@gmail.com>
parents: 271
diff changeset
201 if not f then print("SUBTEST NOT FOUND: "..(msg or "(no description)")); return; end
271
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
202 local success, ret = pcall(f);
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
203 if success and verbosity >= 2 then
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
204 print("SUBTEST PASSED: "..(msg or "(no description)"));
787
c4a4d5604549 Small fix to change verbosity level of subtests
Matthew Wild <mwild1@gmail.com>
parents: 760
diff changeset
205 elseif (not success) and verbosity >= 0 then
6824
85578994d376 tests: Return status code depending on whether tests passed
Matthew Wild <mwild1@gmail.com>
parents: 6602
diff changeset
206 tests_passed = false;
271
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
207 print("SUBTEST FAILED: "..(msg or "(no description)"));
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
208 error(ret, 0);
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
209 end
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
210 end
396edd2f9d2e Some fixes for our test runner
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
211
361
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
212 function new_line_coverage_monitor(file)
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
213 local lines_hit, funcs_hit = {}, {};
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
214 local total_lines, covered_lines = 0, 0;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5604
diff changeset
215
361
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
216 for line in io.lines(file) do
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
217 total_lines = total_lines + 1;
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
218 end
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5604
diff changeset
219
361
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
220 return function (event, line) -- Line hook
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
221 if not lines_hit[line] then
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
222 local info = debug.getinfo(2, "fSL")
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
223 if not info.source:find(file) then return; end
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
224 if not funcs_hit[info.func] and info.activelines then
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
225 funcs_hit[info.func] = true;
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
226 for line in pairs(info.activelines) do
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
227 lines_hit[line] = false; -- Marks it as hittable, but not hit yet
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
228 end
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
229 end
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
230 if lines_hit[line] == false then
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
231 --print("New line hit: "..line.." in "..debug.getinfo(2, "S").source);
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
232 lines_hit[line] = true;
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
233 covered_lines = covered_lines + 1;
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
234 end
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
235 end
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
236 end,
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
237 function (test_name, success) -- Get info
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
238 local fn = file:gsub("^%W*", "");
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
239 local total_active_lines = 0;
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
240 local coverage_file = io.open("reports/coverage_"..fn:gsub("%W+", "_")..".report", "a+");
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
241 for line, active in pairs(lines_hit) do
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
242 if active ~= nil then total_active_lines = total_active_lines + 1; end
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
243 if coverage_file then
3540
bc139431830b Monster whitespace commit (beware the whitespace monster).
Waqas Hussain <waqas20@gmail.com>
parents: 3406
diff changeset
244 if active == false then coverage_file:write(fn, "|", line, "|", name or "", "|miss\n");
361
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
245 else coverage_file:write(fn, "|", line, "|", name or "", "|", tostring(success), "\n"); end
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
246 end
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
247 end
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
248 if coverage_file then coverage_file:close(); end
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
249 return covered_lines, total_active_lines, lines_hit;
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
250 end
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
251 end
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
252
a2d83b04d769 Update unit testing to output coverage reports
Matthew Wild <mwild1@gmail.com>
parents: 337
diff changeset
253 run_all_tests()
6824
85578994d376 tests: Return status code depending on whether tests passed
Matthew Wild <mwild1@gmail.com>
parents: 6602
diff changeset
254
85578994d376 tests: Return status code depending on whether tests passed
Matthew Wild <mwild1@gmail.com>
parents: 6602
diff changeset
255 os.exit(tests_passed and 0 or 1);