Software /
code /
prosody
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 |
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 | 5 -- This project is MIT/X11 licensed. Please see the |
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 | 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); |