diff options
author | Hisham Muhammad <hisham@gobolinux.org> | 2018-04-16 18:00:19 -0300 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2018-05-07 19:27:37 -0300 |
commit | fdc51baae37c3232f6051db0e58ebefca8fdfdc7 (patch) | |
tree | 296ef6fc68fabd34a6f6d88b528567226eadb321 | |
parent | 4dfd5a5501973890af7d9842b190ad01dd5f5b1e (diff) | |
download | luarocks-fdc51baae37c3232f6051db0e58ebefca8fdfdc7.tar.gz luarocks-fdc51baae37c3232f6051db0e58ebefca8fdfdc7.tar.bz2 luarocks-fdc51baae37c3232f6051db0e58ebefca8fdfdc7.zip |
test: initial implementation of `luarocks.test`
Adds:
* `luarocks test` command
* `luarocks.test` module
* TODO: support running test from `build` as well
* `luarocks.test.busted` test backend
* TODO: add test-only dependency on Busted
* `luarocks.test.command` test backend
-rwxr-xr-x | src/bin/luarocks | 1 | ||||
-rw-r--r-- | src/luarocks/cmd/test.lua | 50 | ||||
-rw-r--r-- | src/luarocks/fetch.lua | 1 | ||||
-rw-r--r-- | src/luarocks/test.lua | 62 | ||||
-rw-r--r-- | src/luarocks/test/busted.lua | 31 | ||||
-rw-r--r-- | src/luarocks/test/command.lua | 46 |
6 files changed, 191 insertions, 0 deletions
diff --git a/src/bin/luarocks b/src/bin/luarocks index 491809dd..066c72e3 100755 --- a/src/bin/luarocks +++ b/src/bin/luarocks | |||
@@ -29,6 +29,7 @@ commands = { | |||
29 | upload = "luarocks.cmd.upload", | 29 | upload = "luarocks.cmd.upload", |
30 | config = "luarocks.cmd.config", | 30 | config = "luarocks.cmd.config", |
31 | which = "luarocks.cmd.which", | 31 | which = "luarocks.cmd.which", |
32 | test = "luarocks.cmd.test", | ||
32 | } | 33 | } |
33 | 34 | ||
34 | command_line.run_command(...) | 35 | command_line.run_command(...) |
diff --git a/src/luarocks/cmd/test.lua b/src/luarocks/cmd/test.lua new file mode 100644 index 00000000..e8a05f09 --- /dev/null +++ b/src/luarocks/cmd/test.lua | |||
@@ -0,0 +1,50 @@ | |||
1 | |||
2 | --- Module implementing the LuaRocks "test" command. | ||
3 | -- Tests a rock, compiling its C parts if any. | ||
4 | local cmd_test = {} | ||
5 | |||
6 | local util = require("luarocks.util") | ||
7 | local test = require("luarocks.test") | ||
8 | |||
9 | cmd_test.help_summary = "Run the test suite in the current directory." | ||
10 | cmd_test.help_arguments = "[<rockspec>] [-- <args>]" | ||
11 | cmd_test.help = [[ | ||
12 | Run the test suite for the Lua project in the current directory. | ||
13 | If the first argument is a rockspec, it will use it to determine | ||
14 | the parameters for running tests; otherwise, it will attempt to | ||
15 | detect the rockspec. | ||
16 | |||
17 | Any additional arguments are forwarded to the test suite. | ||
18 | To make sure that any flags passed in <args> are not interpreted | ||
19 | as LuaRocks flags, use -- to separate LuaRocks arguments from | ||
20 | test suite arguments. | ||
21 | ]]..util.deps_mode_help() | ||
22 | |||
23 | --- Driver function for "build" command. | ||
24 | -- @param name string: A local or remote rockspec or rock file. | ||
25 | -- If a package name is given, forwards the request to "search" and, | ||
26 | -- if returned a result, installs the matching rock. | ||
27 | -- @param version string: When passing a package name, a version number may | ||
28 | -- also be given. | ||
29 | -- @return boolean or (nil, string, exitcode): True if build was successful; nil and an | ||
30 | -- error message otherwise. exitcode is optionally returned. | ||
31 | function cmd_test.command(flags, arg, ...) | ||
32 | assert(type(arg) == "string" or not arg) | ||
33 | |||
34 | local args = { ... } | ||
35 | |||
36 | if arg and arg:match("rockspec$") then | ||
37 | return test.run_test_suite(arg, args) | ||
38 | end | ||
39 | |||
40 | table.insert(args, 1, arg) | ||
41 | |||
42 | local rockspec, err = util.get_default_rockspec() | ||
43 | if not rockspec then | ||
44 | return nil, err | ||
45 | end | ||
46 | |||
47 | return test.run_test_suite(rockspec, args) | ||
48 | end | ||
49 | |||
50 | return cmd_test | ||
diff --git a/src/luarocks/fetch.lua b/src/luarocks/fetch.lua index ce9aaff5..08998986 100644 --- a/src/luarocks/fetch.lua +++ b/src/luarocks/fetch.lua | |||
@@ -243,6 +243,7 @@ function fetch.load_local_rockspec(filename, quick) | |||
243 | util.platform_overrides(rockspec.external_dependencies) | 243 | util.platform_overrides(rockspec.external_dependencies) |
244 | util.platform_overrides(rockspec.source) | 244 | util.platform_overrides(rockspec.source) |
245 | util.platform_overrides(rockspec.hooks) | 245 | util.platform_overrides(rockspec.hooks) |
246 | util.platform_overrides(rockspec.test) | ||
246 | 247 | ||
247 | local basename = dir.base_name(filename) | 248 | local basename = dir.base_name(filename) |
248 | if basename == "rockspec" then | 249 | if basename == "rockspec" then |
diff --git a/src/luarocks/test.lua b/src/luarocks/test.lua new file mode 100644 index 00000000..2a64a5d8 --- /dev/null +++ b/src/luarocks/test.lua | |||
@@ -0,0 +1,62 @@ | |||
1 | |||
2 | local test = {} | ||
3 | |||
4 | local fetch = require("luarocks.fetch") | ||
5 | |||
6 | local test_types = { | ||
7 | "busted", | ||
8 | "command", | ||
9 | } | ||
10 | |||
11 | local test_modules = {} | ||
12 | |||
13 | for _, test_type in ipairs(test_types) do | ||
14 | local mod = require("luarocks.test." .. test_type) | ||
15 | table.insert(test_modules, mod) | ||
16 | test_modules[test_type] = mod | ||
17 | test_modules[mod] = test_type | ||
18 | end | ||
19 | |||
20 | local function get_test_type(rockspec) | ||
21 | if rockspec.test and rockspec.test.type then | ||
22 | return rockspec.test.type | ||
23 | end | ||
24 | |||
25 | for _, test_module in ipairs(test_modules) do | ||
26 | if test_module.detect_type() then | ||
27 | return test_modules[test_module] | ||
28 | end | ||
29 | end | ||
30 | |||
31 | return nil, "could not detect test type -- no test suite for " .. rockspec.package .. "?" | ||
32 | end | ||
33 | |||
34 | -- Run test suite as configured in rockspec in the current directory. | ||
35 | function test.run_test_suite(rockspec_arg, args) | ||
36 | local rockspec | ||
37 | if type(rockspec_arg) == "string" then | ||
38 | local err, errcode | ||
39 | rockspec, err, errcode = fetch.load_rockspec(rockspec_arg) | ||
40 | if err then | ||
41 | return nil, err, errcode | ||
42 | end | ||
43 | else | ||
44 | assert(type(rockspec_arg) == "table") | ||
45 | rockspec = rockspec_arg | ||
46 | end | ||
47 | |||
48 | local test_type, err = get_test_type(rockspec) | ||
49 | if not test_type then | ||
50 | return nil, err | ||
51 | end | ||
52 | |||
53 | local mod_name = "luarocks.test." .. test_type | ||
54 | local pok, test_mod = pcall(require, mod_name) | ||
55 | if not pok then | ||
56 | return nil, "failed loading test execution module " .. mod_name | ||
57 | end | ||
58 | |||
59 | return test_mod.run_tests(rockspec.test, args) | ||
60 | end | ||
61 | |||
62 | return test | ||
diff --git a/src/luarocks/test/busted.lua b/src/luarocks/test/busted.lua new file mode 100644 index 00000000..989f283f --- /dev/null +++ b/src/luarocks/test/busted.lua | |||
@@ -0,0 +1,31 @@ | |||
1 | |||
2 | local busted = {} | ||
3 | |||
4 | local fs = require("luarocks.fs") | ||
5 | |||
6 | local unpack = table.unpack or unpack | ||
7 | |||
8 | function busted.detect_type() | ||
9 | if fs.exists(".busted") then | ||
10 | return true | ||
11 | end | ||
12 | return false | ||
13 | end | ||
14 | |||
15 | function busted.run_tests(test, args) | ||
16 | if not test then | ||
17 | test = {} | ||
18 | end | ||
19 | |||
20 | if type(test.flags) == "table" then | ||
21 | -- insert any flags given in test.flags at the front of args | ||
22 | for i = 1, #test.flags do | ||
23 | table.insert(args, i, test.flags[i]) | ||
24 | end | ||
25 | end | ||
26 | |||
27 | return fs.execute("busted", unpack(args)) | ||
28 | end | ||
29 | |||
30 | |||
31 | return busted | ||
diff --git a/src/luarocks/test/command.lua b/src/luarocks/test/command.lua new file mode 100644 index 00000000..396450db --- /dev/null +++ b/src/luarocks/test/command.lua | |||
@@ -0,0 +1,46 @@ | |||
1 | |||
2 | local command = {} | ||
3 | |||
4 | local fs = require("luarocks.fs") | ||
5 | local dir = require("luarocks.dir") | ||
6 | local cfg = require("luarocks.core.cfg") | ||
7 | |||
8 | local unpack = table.unpack or unpack | ||
9 | |||
10 | function command.detect_type() | ||
11 | if fs.exists("test.lua") then | ||
12 | return true | ||
13 | end | ||
14 | return false | ||
15 | end | ||
16 | |||
17 | function command.run_tests(test, args) | ||
18 | if not test then | ||
19 | test = { | ||
20 | script = "test.lua" | ||
21 | } | ||
22 | end | ||
23 | |||
24 | if not test.script and not test.command then | ||
25 | test.script = "test.lua" | ||
26 | end | ||
27 | |||
28 | if type(test.flags) == "table" then | ||
29 | -- insert any flags given in test.flags at the front of args | ||
30 | for i = 1, #test.flags do | ||
31 | table.insert(args, i, test.flags[i]) | ||
32 | end | ||
33 | end | ||
34 | |||
35 | if test.script then | ||
36 | if not fs.exists(test.script) then | ||
37 | return nil, "Test script " .. test.script .. " does not exist" | ||
38 | end | ||
39 | local lua = fs.Q(dir.path(cfg.variables["LUA_BINDIR"], cfg.lua_interpreter)) -- get lua interpreter configured | ||
40 | return fs.execute(lua, test.script, unpack(args)) | ||
41 | elseif test.command then | ||
42 | return fs.execute(test.command, unpack(args)) | ||
43 | end | ||
44 | end | ||
45 | |||
46 | return command | ||