diff options
author | Hisham Muhammad <hisham@gobolinux.org> | 2024-02-21 22:30:40 -0300 |
---|---|---|
committer | Hisham Muhammad <hisham@gobolinux.org> | 2024-02-23 04:33:35 -0300 |
commit | 79bd1739d8ca004ddd0b2fa5e24da4a6f4b776fa (patch) | |
tree | b8ead4801340bd958fccbcb97c35cc7d463f2435 | |
parent | a75d447e10bb7842cdbed0bb494697ddd88fd455 (diff) | |
download | luarocks-79bd1739d8ca004ddd0b2fa5e24da4a6f4b776fa.tar.gz luarocks-79bd1739d8ca004ddd0b2fa5e24da4a6f4b776fa.tar.bz2 luarocks-79bd1739d8ca004ddd0b2fa5e24da4a6f4b776fa.zip |
tests: introduce quick tests
-rw-r--r-- | .github/workflows/test.yml | 4 | ||||
-rw-r--r-- | appveyor.yml | 14 | ||||
-rw-r--r-- | spec/build_spec.lua | 40 | ||||
-rw-r--r-- | spec/config_spec.lua | 16 | ||||
-rw-r--r-- | spec/list_spec.lua | 5 | ||||
-rw-r--r-- | spec/quick/build.q | 122 | ||||
-rw-r--r-- | spec/quick/config.q | 17 | ||||
-rw-r--r-- | spec/quick/install.q | 124 | ||||
-rw-r--r-- | spec/quick/list.q | 10 | ||||
-rw-r--r-- | spec/quick_spec.lua | 20 | ||||
-rw-r--r-- | spec/rockspecs_spec.lua | 2 | ||||
-rw-r--r-- | spec/util/quick.lua | 384 | ||||
-rw-r--r-- | spec/util/test_env.lua | 16 |
13 files changed, 706 insertions, 68 deletions
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 603a5613..07803faf 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml | |||
@@ -54,8 +54,8 @@ jobs: | |||
54 | - name: Integration Test | 54 | - name: Integration Test |
55 | run: | | 55 | run: | |
56 | eval $(luarocks path) | 56 | eval $(luarocks path) |
57 | busted -o htest --exclude-tags=ssh,gpg,git,unit --verbose -Xhelper "lua_dir=$(luarocks config variables.LUA_DIR),ci" | 57 | busted -o htest --exclude-tags=ssh,gpg,git,unit,quick --verbose -Xhelper "lua_dir=$(luarocks config variables.LUA_DIR),ci" |
58 | busted -o htest --exclude-tags=ssh,gpg,git,unit --verbose -Xhelper "lua_dir=$(luarocks config variables.LUA_DIR),ci,env=full" | 58 | busted -o htest --exclude-tags=ssh,gpg,git,unit,quick --verbose -Xhelper "lua_dir=$(luarocks config variables.LUA_DIR),ci,env=full" |
59 | 59 | ||
60 | - name: Coverage | 60 | - name: Coverage |
61 | run: | | 61 | run: | |
diff --git a/appveyor.yml b/appveyor.yml index b084cff5..0d350d8a 100644 --- a/appveyor.yml +++ b/appveyor.yml | |||
@@ -9,17 +9,23 @@ environment: | |||
9 | LUAROCKS_VER: 3.0.0 | 9 | LUAROCKS_VER: 3.0.0 |
10 | 10 | ||
11 | matrix: | 11 | matrix: |
12 | # quick tests | ||
13 | - LUAV: "2.1" | ||
14 | LUAT: "luajit" | ||
15 | COMPILER: "vs" | ||
16 | FILES: "" | ||
17 | EXCLUDE: "integration,unit" | ||
12 | # Lua 5.4 tests | 18 | # Lua 5.4 tests |
13 | - LUAV: "5.4" | 19 | - LUAV: "5.4" |
14 | LUAT: "lua" | 20 | LUAT: "lua" |
15 | COMPILER: "vs" | 21 | COMPILER: "vs" |
16 | FILES: "" | 22 | FILES: "" |
17 | EXCLUDE: "integration" | 23 | EXCLUDE: "integration,quick" |
18 | - LUAV: "5.4" | 24 | - LUAV: "5.4" |
19 | LUAT: "lua" | 25 | LUAT: "lua" |
20 | COMPILER: "vs" | 26 | COMPILER: "vs" |
21 | FILES: "" | 27 | FILES: "" |
22 | EXCLUDE: "unit" | 28 | EXCLUDE: "unit,quick" |
23 | - LUAV: "5.4" | 29 | - LUAV: "5.4" |
24 | LUAT: "lua" | 30 | LUAT: "lua" |
25 | COMPILER: "mingw" | 31 | COMPILER: "mingw" |
@@ -30,12 +36,12 @@ environment: | |||
30 | LUAT: "luajit" | 36 | LUAT: "luajit" |
31 | COMPILER: "vs" | 37 | COMPILER: "vs" |
32 | FILES: "" | 38 | FILES: "" |
33 | EXCLUDE: "integration" | 39 | EXCLUDE: "integration,quick" |
34 | - LUAV: "2.1" | 40 | - LUAV: "2.1" |
35 | LUAT: "luajit" | 41 | LUAT: "luajit" |
36 | COMPILER: "vs" | 42 | COMPILER: "vs" |
37 | FILES: "" | 43 | FILES: "" |
38 | EXCLUDE: "unit" | 44 | EXCLUDE: "unit,quick" |
39 | - LUAV: "2.1" | 45 | - LUAV: "2.1" |
40 | LUAT: "luajit" | 46 | LUAT: "luajit" |
41 | COMPILER: "mingw" | 47 | COMPILER: "mingw" |
diff --git a/spec/build_spec.lua b/spec/build_spec.lua index 3b33a1aa..5e78aa4f 100644 --- a/spec/build_spec.lua +++ b/spec/build_spec.lua | |||
@@ -49,45 +49,7 @@ describe("LuaRocks build #integration", function() | |||
49 | test_env.setup_specs(extra_rocks) | 49 | test_env.setup_specs(extra_rocks) |
50 | end) | 50 | end) |
51 | 51 | ||
52 | describe("basic testing set", function() | ||
53 | it("invalid", function() | ||
54 | assert.is_false(run.luarocks_bool("build invalid")) | ||
55 | end) | ||
56 | |||
57 | it("with no arguments behaves as luarocks make", function() | ||
58 | test_env.run_in_tmp(function(tmpdir) | ||
59 | write_file("c_module-1.0-1.rockspec", [[ | ||
60 | package = "c_module" | ||
61 | version = "1.0-1" | ||
62 | source = { | ||
63 | url = "http://example.com/c_module" | ||
64 | } | ||
65 | build = { | ||
66 | type = "builtin", | ||
67 | modules = { | ||
68 | c_module = { "c_module.c" } | ||
69 | } | ||
70 | } | ||
71 | ]], finally) | ||
72 | write_file("c_module.c", c_module_source, finally) | ||
73 | |||
74 | assert.is_true(run.luarocks_bool("build")) | ||
75 | assert.truthy(lfs.attributes(tmpdir .. "/c_module." .. test_env.lib_extension)) | ||
76 | end, finally) | ||
77 | end) | ||
78 | end) | ||
79 | |||
80 | describe("building with flags", function() | 52 | describe("building with flags", function() |
81 | it("fails if it doesn't have the permissions to access the specified tree #unix", function() | ||
82 | assert.is_false(run.luarocks_bool("build --tree=/usr " .. testing_paths.fixtures_dir .. "/a_rock-1.0.1-rockspec")) | ||
83 | assert.falsy(lfs.attributes(testing_paths.testing_sys_rocks .. "/a_rock/1.0-1/a_rock-1.0-1.rockspec")) | ||
84 | end) | ||
85 | |||
86 | it("fails if it doesn't have the permissions to access the specified tree's parent #unix", function() | ||
87 | assert.is_false(run.luarocks_bool("build --tree=/usr/invalid " .. testing_paths.fixtures_dir .. "/a_rock-1.0-1.rockspec")) | ||
88 | assert.falsy(lfs.attributes(testing_paths.testing_sys_rocks .. "/a_rock/1.0-1/a_rock-1.0-1.rockspec")) | ||
89 | end) | ||
90 | |||
91 | it("verbose", function() | 53 | it("verbose", function() |
92 | test_env.run_in_tmp(function(tmpdir) | 54 | test_env.run_in_tmp(function(tmpdir) |
93 | write_file("test-1.0-1.rockspec", [[ | 55 | write_file("test-1.0-1.rockspec", [[ |
@@ -429,7 +391,7 @@ describe("LuaRocks build #integration", function() | |||
429 | package = "a_rock" | 391 | package = "a_rock" |
430 | version = "1.0-1" | 392 | version = "1.0-1" |
431 | source = { | 393 | source = { |
432 | url = "file://]] .. testing_paths.fixtures_dir .. [[/a_rock.lua" | 394 | url = "file://]] .. testing_paths.fixtures_dir:gsub("\\", "/") .. [[/a_rock.lua" |
433 | } | 395 | } |
434 | description = { | 396 | description = { |
435 | summary = "An example rockspec", | 397 | summary = "An example rockspec", |
diff --git a/spec/config_spec.lua b/spec/config_spec.lua index 98fcb24c..9615f050 100644 --- a/spec/config_spec.lua +++ b/spec/config_spec.lua | |||
@@ -115,22 +115,6 @@ describe("LuaRocks config tests #integration", function() | |||
115 | assert.is_false(run.luarocks_bool("config --system-config")) | 115 | assert.is_false(run.luarocks_bool("config --system-config")) |
116 | end) | 116 | end) |
117 | 117 | ||
118 | it("outputs the path of the system config", function() | ||
119 | lfs.mkdir(testing_paths.testing_lrprefix) | ||
120 | lfs.mkdir(testing_paths.testing_lrprefix .. "/etc/") | ||
121 | lfs.mkdir(scdir) | ||
122 | |||
123 | local sysconfig = io.open(configfile, "w+") | ||
124 | sysconfig:write(" ") | ||
125 | sysconfig:close() | ||
126 | finally(function() | ||
127 | os.remove(configfile) | ||
128 | end) | ||
129 | |||
130 | local output = run.luarocks("config --system-config") | ||
131 | assert.are.same(configfile, output) | ||
132 | end) | ||
133 | |||
134 | it("fails if system config is invalid", function() | 118 | it("fails if system config is invalid", function() |
135 | lfs.mkdir(testing_paths.testing_lrprefix) | 119 | lfs.mkdir(testing_paths.testing_lrprefix) |
136 | lfs.mkdir(testing_paths.testing_lrprefix .. "/etc/") | 120 | lfs.mkdir(testing_paths.testing_lrprefix .. "/etc/") |
diff --git a/spec/list_spec.lua b/spec/list_spec.lua index 54c63bea..4c7fc776 100644 --- a/spec/list_spec.lua +++ b/spec/list_spec.lua | |||
@@ -38,9 +38,4 @@ describe("luarocks list #integration", function() | |||
38 | assert.is.truthy(output:find("say")) | 38 | assert.is.truthy(output:find("say")) |
39 | assert.matches("1.0-1 < ", output, 1, true) | 39 | assert.matches("1.0-1 < ", output, 1, true) |
40 | end) | 40 | end) |
41 | |||
42 | it("invalid tree", function() | ||
43 | local output = run.luarocks("--tree=/some/invalid/tree list") | ||
44 | assert(output:find("Rocks installed for Lua "..test_env.lua_version.." in /some/invalid/tree", 1, true)) | ||
45 | end) | ||
46 | end) | 41 | end) |
diff --git a/spec/quick/build.q b/spec/quick/build.q new file mode 100644 index 00000000..c6ca433c --- /dev/null +++ b/spec/quick/build.q | |||
@@ -0,0 +1,122 @@ | |||
1 | TEST: luarocks build: fails when given invalid argument | ||
2 | RUN: luarocks build aoesuthaoeusahtoeustnaou --only-server=localhost | ||
3 | EXIT: 1 | ||
4 | STDERR: | ||
5 | -------------------------------------------------------------------------------- | ||
6 | Could not find a result named aoesuthaoeusahtoeustnaou | ||
7 | -------------------------------------------------------------------------------- | ||
8 | |||
9 | |||
10 | |||
11 | ================================================================================ | ||
12 | TEST: luarocks build: with no arguments behaves as luarocks make | ||
13 | |||
14 | FILE: c_module-1.0-1.rockspec | ||
15 | -------------------------------------------------------------------------------- | ||
16 | package = "c_module" | ||
17 | version = "1.0-1" | ||
18 | source = { | ||
19 | url = "http://example.com/c_module" | ||
20 | } | ||
21 | build = { | ||
22 | type = "builtin", | ||
23 | modules = { | ||
24 | c_module = { "c_module.c" } | ||
25 | } | ||
26 | } | ||
27 | -------------------------------------------------------------------------------- | ||
28 | FILE: c_module.c | ||
29 | -------------------------------------------------------------------------------- | ||
30 | #include <lua.h> | ||
31 | #include <lauxlib.h> | ||
32 | |||
33 | int luaopen_c_module(lua_State* L) { | ||
34 | lua_newtable(L); | ||
35 | lua_pushinteger(L, 1); | ||
36 | lua_setfield(L, -2, "c_module"); | ||
37 | return 1; | ||
38 | } | ||
39 | -------------------------------------------------------------------------------- | ||
40 | RUN: luarocks build | ||
41 | EXISTS: c_module.%{lib_extension} | ||
42 | |||
43 | |||
44 | |||
45 | ================================================================================ | ||
46 | TEST: luarocks build: defaults to builtin type | ||
47 | |||
48 | FILE: a_rock-1.0-1.rockspec | ||
49 | -------------------------------------------------------------------------------- | ||
50 | rockspec_format = "3.0" | ||
51 | package = "a_rock" | ||
52 | version = "1.0-1" | ||
53 | source = { | ||
54 | url = "file://%{url(%{fixtures_dir})}/a_rock.lua" | ||
55 | } | ||
56 | description = { | ||
57 | summary = "An example rockspec", | ||
58 | } | ||
59 | dependencies = { | ||
60 | "lua >= 5.1" | ||
61 | } | ||
62 | build = { | ||
63 | modules = { | ||
64 | build = "a_rock.lua" | ||
65 | }, | ||
66 | } | ||
67 | -------------------------------------------------------------------------------- | ||
68 | RUN: luarocks build a_rock-1.0-1.rockspec | ||
69 | RUN: luarocks show a_rock | ||
70 | STDOUT: | ||
71 | -------------------------------------------------------------------------------- | ||
72 | a_rock 1.0 | ||
73 | -------------------------------------------------------------------------------- | ||
74 | |||
75 | |||
76 | ================================================================================ | ||
77 | TEST: luarocks build: fails if no permissions to access the specified tree #unix | ||
78 | |||
79 | RUN: luarocks build --tree=/usr ./a_rock-1.0.1-rockspec | ||
80 | EXIT: 4 | ||
81 | STDERR: | ||
82 | -------------------------------------------------------------------------------- | ||
83 | requires exclusive access | ||
84 | use --force-lock | ||
85 | -------------------------------------------------------------------------------- | ||
86 | |||
87 | NOT_EXISTS: %{testing_sys_rocks}/a_rock/1.0-1/a_rock-1.0-1.rockspec | ||
88 | |||
89 | RUN: luarocks build --tree=/usr ./a_rock-1.0.1-rockspec --force-lock | ||
90 | EXIT: 4 | ||
91 | STDERR: | ||
92 | -------------------------------------------------------------------------------- | ||
93 | requires exclusive access | ||
94 | failed to force the lock | ||
95 | -------------------------------------------------------------------------------- | ||
96 | |||
97 | NOT_EXISTS: %{testing_sys_rocks}/a_rock/1.0-1/a_rock-1.0-1.rockspec | ||
98 | |||
99 | |||
100 | |||
101 | ================================================================================ | ||
102 | TEST: luarocks build: fails if no permissions to access the parent #unix | ||
103 | |||
104 | RUN: luarocks build --tree=/usr/invalid ./a_rock-1.0.1-rockspec | ||
105 | EXIT: 4 | ||
106 | STDERR: | ||
107 | -------------------------------------------------------------------------------- | ||
108 | requires exclusive access | ||
109 | use --force-lock | ||
110 | -------------------------------------------------------------------------------- | ||
111 | |||
112 | NOT_EXISTS: %{testing_sys_rocks}/a_rock/1.0-1/a_rock-1.0-1.rockspec | ||
113 | |||
114 | RUN: luarocks build --tree=/usr/invalid ./a_rock-1.0.1-rockspec --force-lock | ||
115 | EXIT: 4 | ||
116 | STDERR: | ||
117 | -------------------------------------------------------------------------------- | ||
118 | requires exclusive access | ||
119 | failed to force the lock | ||
120 | -------------------------------------------------------------------------------- | ||
121 | |||
122 | NOT_EXISTS: %{testing_sys_rocks}/a_rock/1.0-1/a_rock-1.0-1.rockspec | ||
diff --git a/spec/quick/config.q b/spec/quick/config.q new file mode 100644 index 00000000..ec338f98 --- /dev/null +++ b/spec/quick/config.q | |||
@@ -0,0 +1,17 @@ | |||
1 | ================================================================================ | ||
2 | TEST: luarocks config --system-config shows the path of the system config | ||
3 | |||
4 | MKDIR: %{testing_lrprefix}/etc/luarocks | ||
5 | |||
6 | FILE: %{testing_lrprefix}/etc/luarocks/config-%{LUA_VERSION}.lua | ||
7 | -------------------------------------------------------------------------------- | ||
8 | |||
9 | -------------------------------------------------------------------------------- | ||
10 | |||
11 | RUN: luarocks config --system-config | ||
12 | |||
13 | STDOUT: | ||
14 | -------------------------------------------------------------------------------- | ||
15 | %{testing_lrprefix}/etc/luarocks/config-%{LUA_VERSION}.lua | ||
16 | -------------------------------------------------------------------------------- | ||
17 | #TODO: ^^^ %{path()} | ||
diff --git a/spec/quick/install.q b/spec/quick/install.q new file mode 100644 index 00000000..2bccf2f1 --- /dev/null +++ b/spec/quick/install.q | |||
@@ -0,0 +1,124 @@ | |||
1 | =============================================================================== | ||
2 | TEST: luarocks install: handle versioned modules when installing another version with --keep #268 | ||
3 | |||
4 | FILE: myrock-1.0-1.rockspec | ||
5 | -------------------------------------------------------------------------------- | ||
6 | rockspec_format = "3.0" | ||
7 | package = "myrock" | ||
8 | version = "1.0-1" | ||
9 | source = { | ||
10 | url = "file://%{url(tmpdir)}/rock.lua" | ||
11 | } | ||
12 | build = { | ||
13 | modules = { rock = "rock.lua" } | ||
14 | } | ||
15 | -------------------------------------------------------------------------------- | ||
16 | |||
17 | FILE: myrock-2.0-1.rockspec | ||
18 | -------------------------------------------------------------------------------- | ||
19 | rockspec_format = "3.0" | ||
20 | package = "myrock" | ||
21 | version = "2.0-1" | ||
22 | source = { | ||
23 | url = "file://%{url(tmpdir)}/rock.lua" | ||
24 | } | ||
25 | build = { | ||
26 | modules = { rock = "rock.lua" } | ||
27 | } | ||
28 | -------------------------------------------------------------------------------- | ||
29 | |||
30 | FILE: rock.lua | ||
31 | -------------------------------------------------------------------------------- | ||
32 | return "hello" | ||
33 | -------------------------------------------------------------------------------- | ||
34 | |||
35 | RUN: luarocks build myrock-1.0-1.rockspec | ||
36 | RUN: luarocks pack myrock | ||
37 | RUN: luarocks remove myrock | ||
38 | |||
39 | RUN: luarocks build myrock-2.0-1.rockspec | ||
40 | RUN: luarocks pack myrock | ||
41 | RUN: luarocks remove myrock | ||
42 | |||
43 | RUN: luarocks install ./myrock-2.0-1.all.rock | ||
44 | |||
45 | EXISTS: %{testing_sys_tree}/share/lua/%{LUA_VERSION}/rock.lua | ||
46 | |||
47 | RUN: luarocks install ./myrock-1.0-1.all.rock --keep | ||
48 | |||
49 | EXISTS: %{testing_sys_tree}/share/lua/%{LUA_VERSION}/rock.lua | ||
50 | EXISTS: %{testing_sys_tree}/share/lua/%{LUA_VERSION}/myrock_1_0_1-rock.lua | ||
51 | |||
52 | RUN: luarocks install ./myrock-2.0-1.all.rock | ||
53 | |||
54 | EXISTS: %{testing_sys_tree}/share/lua/%{LUA_VERSION}/rock.lua | ||
55 | NOT_EXISTS: %{testing_sys_tree}/share/lua/%{LUA_VERSION}/myrock_1_0_1-rock.lua | ||
56 | |||
57 | |||
58 | |||
59 | =============================================================================== | ||
60 | TEST: luarocks install: handle versioned libraries when installing another version with --keep #268 | ||
61 | |||
62 | FILE: myrock-1.0-1.rockspec | ||
63 | -------------------------------------------------------------------------------- | ||
64 | rockspec_format = "3.0" | ||
65 | package = "myrock" | ||
66 | version = "1.0-1" | ||
67 | source = { | ||
68 | url = "file://%{url(tmpdir)}/c_module.c" | ||
69 | } | ||
70 | build = { | ||
71 | modules = { | ||
72 | c_module = { "c_module.c" } | ||
73 | } | ||
74 | } | ||
75 | -------------------------------------------------------------------------------- | ||
76 | |||
77 | FILE: myrock-2.0-1.rockspec | ||
78 | -------------------------------------------------------------------------------- | ||
79 | rockspec_format = "3.0" | ||
80 | package = "myrock" | ||
81 | version = "2.0-1" | ||
82 | source = { | ||
83 | url = "file://%{url(tmpdir)}/c_module.c" | ||
84 | } | ||
85 | build = { | ||
86 | modules = { | ||
87 | c_module = { "c_module.c" } | ||
88 | } | ||
89 | } | ||
90 | -------------------------------------------------------------------------------- | ||
91 | FILE: c_module.c | ||
92 | -------------------------------------------------------------------------------- | ||
93 | #include <lua.h> | ||
94 | #include <lauxlib.h> | ||
95 | |||
96 | int luaopen_c_module(lua_State* L) { | ||
97 | lua_newtable(L); | ||
98 | lua_pushinteger(L, 1); | ||
99 | lua_setfield(L, -2, "c_module"); | ||
100 | return 1; | ||
101 | } | ||
102 | -------------------------------------------------------------------------------- | ||
103 | |||
104 | RUN: luarocks build myrock-1.0-1.rockspec | ||
105 | RUN: luarocks pack myrock | ||
106 | RUN: luarocks remove myrock | ||
107 | |||
108 | RUN: luarocks build myrock-2.0-1.rockspec | ||
109 | RUN: luarocks pack myrock | ||
110 | RUN: luarocks remove myrock | ||
111 | |||
112 | RUN: luarocks install ./myrock-2.0-1.%{platform}.rock | ||
113 | |||
114 | EXISTS: %{testing_sys_tree}/lib/lua/%{LUA_VERSION}/c_module.%{lib_extension} | ||
115 | |||
116 | RUN: luarocks install ./myrock-1.0-1.%{platform}.rock --keep | ||
117 | |||
118 | EXISTS: %{testing_sys_tree}/lib/lua/%{LUA_VERSION}/c_module.%{lib_extension} | ||
119 | EXISTS: %{testing_sys_tree}/lib/lua/%{LUA_VERSION}/myrock_1_0_1-c_module.%{lib_extension} | ||
120 | |||
121 | RUN: luarocks install ./myrock-2.0-1.%{platform}.rock | ||
122 | |||
123 | EXISTS: %{testing_sys_tree}/lib/lua/%{LUA_VERSION}/c_module.%{lib_extension} | ||
124 | NOT_EXISTS: %{testing_sys_tree}/lib/lua/%{LUA_VERSION}/myrock_1_0_1-c_module.%{lib_extension} | ||
diff --git a/spec/quick/list.q b/spec/quick/list.q new file mode 100644 index 00000000..7cbdee43 --- /dev/null +++ b/spec/quick/list.q | |||
@@ -0,0 +1,10 @@ | |||
1 | ================================================================================ | ||
2 | TEST: luarocks list: invalid tree | ||
3 | |||
4 | RUN: luarocks --tree=%{path(/some/invalid/tree)} list | ||
5 | |||
6 | STDOUT: | ||
7 | -------------------------------------------------------------------------------- | ||
8 | Rocks installed for Lua %{lua_version} in /some/invalid/tree | ||
9 | -------------------------------------------------------------------------------- | ||
10 | #TODO: ^^^ %{path()} | ||
diff --git a/spec/quick_spec.lua b/spec/quick_spec.lua new file mode 100644 index 00000000..8b8206cf --- /dev/null +++ b/spec/quick_spec.lua | |||
@@ -0,0 +1,20 @@ | |||
1 | local lfs = require("lfs") | ||
2 | local test_env = require("spec.util.test_env") | ||
3 | local quick = require("spec.util.quick") | ||
4 | |||
5 | describe("quick tests: #quick", function() | ||
6 | before_each(function() | ||
7 | test_env.setup_specs() | ||
8 | end) | ||
9 | |||
10 | local spec_quick = test_env.testing_paths.spec_dir .. "/quick" | ||
11 | for f in lfs.dir(spec_quick) do | ||
12 | if f:match("%.q$") then | ||
13 | local tests = quick.compile(spec_quick .. "/" .. f, getfenv and getfenv() or _ENV) | ||
14 | for _, t in ipairs(tests) do | ||
15 | it(t.name, t.fn) | ||
16 | end | ||
17 | end | ||
18 | end | ||
19 | end) | ||
20 | |||
diff --git a/spec/rockspecs_spec.lua b/spec/rockspecs_spec.lua index 76b33f65..5b0573fe 100644 --- a/spec/rockspecs_spec.lua +++ b/spec/rockspecs_spec.lua | |||
@@ -4,7 +4,7 @@ local cfg = require("luarocks.core.cfg") | |||
4 | local test_env = require("spec.util.test_env") | 4 | local test_env = require("spec.util.test_env") |
5 | local lfs = require("lfs") | 5 | local lfs = require("lfs") |
6 | 6 | ||
7 | describe("luarocks.rockspecs", function() | 7 | describe("luarocks.rockspecs #unit", function() |
8 | 8 | ||
9 | setup(function() | 9 | setup(function() |
10 | cfg.init() | 10 | cfg.init() |
diff --git a/spec/util/quick.lua b/spec/util/quick.lua new file mode 100644 index 00000000..c8bfb61a --- /dev/null +++ b/spec/util/quick.lua | |||
@@ -0,0 +1,384 @@ | |||
1 | local quick = {} | ||
2 | |||
3 | local dir_sep = package.config:sub(1, 1) | ||
4 | |||
5 | local cfg, dir, fs, versions | ||
6 | local initialized = false | ||
7 | |||
8 | local function initialize() | ||
9 | if initialized then | ||
10 | return | ||
11 | end | ||
12 | initialized = true | ||
13 | |||
14 | cfg = require("luarocks.core.cfg") | ||
15 | dir = require("luarocks.dir") | ||
16 | fs = require("luarocks.fs") | ||
17 | versions = require("spec.util.versions") | ||
18 | cfg.init() | ||
19 | fs.init() | ||
20 | end | ||
21 | |||
22 | local function native_slash(pathname) | ||
23 | return (pathname:gsub("[/\\]", dir_sep)) | ||
24 | end | ||
25 | |||
26 | local function parse_cmd(line) | ||
27 | local cmd, arg = line:match("^%s*([A-Z_]+):%s*(.*)%s*$") | ||
28 | return cmd, arg | ||
29 | end | ||
30 | |||
31 | local function is_blank(line) | ||
32 | return not not line:match("^%s*$") | ||
33 | end | ||
34 | |||
35 | local function is_hr(line) | ||
36 | return not not line:match("^%-%-%-%-%-") | ||
37 | end | ||
38 | |||
39 | local function parse(filename) | ||
40 | local fd = assert(io.open(filename, "r")) | ||
41 | local input = assert(fd:read("*a")) | ||
42 | fd:close() | ||
43 | |||
44 | initialize() | ||
45 | |||
46 | local tests = {} | ||
47 | |||
48 | local cur_line = 0 | ||
49 | local cur_test | ||
50 | local cur_op | ||
51 | local cur_block | ||
52 | local cur_block_name | ||
53 | local stack = { "start" } | ||
54 | |||
55 | local function start_test(arg) | ||
56 | cur_test = { | ||
57 | name = arg, | ||
58 | ops = {}, | ||
59 | } | ||
60 | cur_op = nil | ||
61 | table.insert(tests, cur_test) | ||
62 | table.insert(stack, "test") | ||
63 | end | ||
64 | |||
65 | local function fail(msg) | ||
66 | io.stderr:write("Error reading " .. filename .. ":" .. cur_line .. ": " .. msg .. "\n") | ||
67 | os.exit(1) | ||
68 | end | ||
69 | |||
70 | local function bool_arg(cmd, cur_block, field, arg) | ||
71 | if arg ~= "true" and arg ~= "false" then | ||
72 | fail(cmd .. " argument must be 'true' or 'false'") | ||
73 | end | ||
74 | cur_block[field] = (arg == "true") | ||
75 | end | ||
76 | |||
77 | local test_env = require("spec.util.test_env") | ||
78 | local function expand_vars(line) | ||
79 | if not line then | ||
80 | return nil | ||
81 | end | ||
82 | return (line:gsub("%%%b{}", function(var) | ||
83 | var = var:sub(3, -2) | ||
84 | local fn, fnarg = var:match("^%s*([a-z_]+)%s*%(%s*([^)]+)%s*%)%s*$") | ||
85 | |||
86 | local value | ||
87 | if var == "tmpdir" then | ||
88 | value = "%{tmpdir}" | ||
89 | elseif var == "url(tmpdir)" then | ||
90 | value = "%{url(tmpdir)}" | ||
91 | elseif fn == "url" then | ||
92 | value = expand_vars(fnarg) | ||
93 | value = value:gsub("\\", "/") | ||
94 | elseif fn == "path" then | ||
95 | value = expand_vars(fnarg) | ||
96 | value = value:gsub("[/\\]", dir_sep) | ||
97 | elseif fn == "version" then | ||
98 | value = versions[fnarg:lower()] or "" | ||
99 | elseif fn == "version_" then | ||
100 | value = (versions[fnarg:lower()] or ""):gsub("[%.%-]", "_") | ||
101 | else | ||
102 | value = test_env.testing_paths[var] | ||
103 | or test_env.env_variables[var] | ||
104 | or test_env[var] | ||
105 | or "" | ||
106 | end | ||
107 | |||
108 | return value | ||
109 | end)) | ||
110 | end | ||
111 | |||
112 | for line in input:gmatch("[^\n]*") do | ||
113 | cur_line = cur_line + 1 | ||
114 | |||
115 | local state = stack[#stack] | ||
116 | if state == "start" then | ||
117 | local cmd, arg = parse_cmd(line) | ||
118 | if cmd == "TEST" then | ||
119 | start_test(arg) | ||
120 | elseif cmd then | ||
121 | fail("expected TEST, got " .. cmd) | ||
122 | elseif is_blank(line) then | ||
123 | -- skip blank lines and arbitrary text, | ||
124 | -- which is interpreted as a comment | ||
125 | end | ||
126 | elseif state == "test" then | ||
127 | local cmd, arg = parse_cmd(line) | ||
128 | arg = expand_vars(arg) | ||
129 | if cmd == "FILE" then | ||
130 | cur_op = { | ||
131 | op = "FILE", | ||
132 | name = arg, | ||
133 | data = {}, | ||
134 | } | ||
135 | table.insert(cur_test.ops, cur_op) | ||
136 | cur_block = cur_op | ||
137 | cur_block_name = "FILE" | ||
138 | table.insert(stack, "block start") | ||
139 | elseif cmd == "RUN" then | ||
140 | local program, args = arg:match("([^ ]+)%s*(.*)$") | ||
141 | if not program then | ||
142 | fail("expected a program argument in RUN") | ||
143 | end | ||
144 | |||
145 | cur_op = { | ||
146 | op = "RUN", | ||
147 | exit = 0, | ||
148 | exit_line = cur_line, | ||
149 | line = cur_line, | ||
150 | program = program, | ||
151 | args = args, | ||
152 | } | ||
153 | table.insert(cur_test.ops, cur_op) | ||
154 | elseif cmd == "EXISTS" then | ||
155 | cur_op = { | ||
156 | op = "EXISTS", | ||
157 | file = dir.normalize(arg), | ||
158 | } | ||
159 | table.insert(cur_test.ops, cur_op) | ||
160 | elseif cmd == "NOT_EXISTS" then | ||
161 | cur_op = { | ||
162 | op = "NOT_EXISTS", | ||
163 | file = dir.normalize(arg), | ||
164 | } | ||
165 | table.insert(cur_test.ops, cur_op) | ||
166 | elseif cmd == "MKDIR" then | ||
167 | cur_op = { | ||
168 | op = "MKDIR", | ||
169 | file = dir.normalize(arg), | ||
170 | line = cur_line, | ||
171 | } | ||
172 | table.insert(cur_test.ops, cur_op) | ||
173 | elseif cmd == "EXIT" then | ||
174 | if not cur_op or cur_op.op ~= "RUN" then | ||
175 | fail("EXIT must be given in the context of a RUN") | ||
176 | end | ||
177 | |||
178 | local code = tonumber(arg) | ||
179 | if not code and not (code >= 0 and code <= 128) then | ||
180 | fail("EXIT code must be a number in the range 0-128, got " .. arg) | ||
181 | end | ||
182 | |||
183 | cur_op.exit = code | ||
184 | cur_op.exit_line = cur_line | ||
185 | elseif cmd == "STDERR" then | ||
186 | if not cur_op or cur_op.op ~= "RUN" then | ||
187 | fail("STDERR must be given in the context of a RUN") | ||
188 | end | ||
189 | if cur_op.stderr then | ||
190 | fail("STDERR was already declared") | ||
191 | end | ||
192 | |||
193 | cur_op.stderr = { | ||
194 | data = {} | ||
195 | } | ||
196 | cur_block = cur_op.stderr | ||
197 | cur_block_name = "STDERR" | ||
198 | table.insert(stack, "block start") | ||
199 | elseif cmd == "STDOUT" then | ||
200 | if not cur_op or cur_op.op ~= "RUN" then | ||
201 | fail("STDOUT must be given in the context of a RUN") | ||
202 | end | ||
203 | if cur_op.stdout then | ||
204 | fail("STDOUT was already declared") | ||
205 | end | ||
206 | |||
207 | cur_op.stdout = { | ||
208 | data = {} | ||
209 | } | ||
210 | cur_block = cur_op.stdout | ||
211 | cur_block_name = "STDOUT" | ||
212 | table.insert(stack, "block start") | ||
213 | elseif cmd == "TEST" then | ||
214 | table.remove(stack) | ||
215 | start_test(arg) | ||
216 | elseif cmd then | ||
217 | fail("expected a command, got " .. cmd) | ||
218 | else | ||
219 | -- skip blank lines and arbitrary text, | ||
220 | -- which is interpreted as a comment | ||
221 | end | ||
222 | elseif state == "block start" then | ||
223 | local cmd, arg = parse_cmd(line) | ||
224 | if is_blank(line) then | ||
225 | -- skip | ||
226 | elseif is_hr(line) then | ||
227 | stack[#stack] = "block data" | ||
228 | cur_block.start = cur_line | ||
229 | elseif cmd == "PLAIN" then | ||
230 | bool_arg("PLAIN", cur_block, "plain", arg) | ||
231 | else | ||
232 | fail("expected '-----' to start " .. cur_block_name .. " block") | ||
233 | end | ||
234 | elseif state == "block data" then | ||
235 | if is_hr(line) then | ||
236 | cur_block = nil | ||
237 | table.remove(stack) | ||
238 | else | ||
239 | if not cur_block.plain then | ||
240 | line = expand_vars(line) | ||
241 | end | ||
242 | table.insert(cur_block.data, line) | ||
243 | end | ||
244 | end | ||
245 | end | ||
246 | |||
247 | return tests | ||
248 | end | ||
249 | |||
250 | function quick.compile(filename, env) | ||
251 | local tests = parse(filename) | ||
252 | |||
253 | -- local dev_null = (package.config:sub(1, 1) == "/") | ||
254 | -- and "/dev/null" | ||
255 | -- or "NUL" | ||
256 | |||
257 | local cmd_helpers = { | ||
258 | ["luarocks"] = "luarocks_cmd", | ||
259 | ["luarocks-admin"] = "luarocks_admin_cmd", | ||
260 | } | ||
261 | |||
262 | for tn, t in ipairs(tests) do | ||
263 | local code = {} | ||
264 | local function write(...) | ||
265 | table.insert(code, table.concat({...})) | ||
266 | end | ||
267 | |||
268 | write([=[ local test_env = require("spec.util.test_env") ]=]) | ||
269 | write([=[ local lfs = require("lfs") ]=]) | ||
270 | write([=[ local fs = require("lfs") ]=]) | ||
271 | write([=[ local dir_sep = package.config:sub(1, 1) ]=]) | ||
272 | write([=[ local luarocks_cmd = test_env.execute_helper(test_env.Q(test_env.testing_paths.lua) .. " " .. test_env.testing_paths.src_dir .. "/bin/luarocks", false, test_env.env_variables):sub(1, -5) ]=]) | ||
273 | write([=[ local luarocks_admin_cmd = test_env.execute_helper(test_env.Q(test_env.testing_paths.lua) .. " " .. test_env.testing_paths.src_dir .. "/bin/luarocks-admin", false, test_env.env_variables):sub(1, -5) ]=]) | ||
274 | |||
275 | write(([=[ local function error_message(line, msg, input) ]=])) | ||
276 | write(([=[ local out = {"\n\n", %q, ":", line, ": ", msg} ]=]):format(filename)) | ||
277 | write(([=[ if input then ]=])) | ||
278 | write(([=[ if input:match("\n") then ]=])) | ||
279 | write(([=[ table.insert(out, "\n") ]=])) | ||
280 | write(([=[ table.insert(out, ("-"):rep(40)) ]=])) | ||
281 | write(([=[ table.insert(out, "\n") ]=])) | ||
282 | write(([=[ table.insert(out, input) ]=])) | ||
283 | write(([=[ table.insert(out, ("-"):rep(40)) ]=])) | ||
284 | write(([=[ table.insert(out, "\n") ]=])) | ||
285 | write(([=[ else ]=])) | ||
286 | write(([=[ table.insert(out, ": ") ]=])) | ||
287 | write(([=[ table.insert(out, input) ]=])) | ||
288 | write(([=[ end ]=])) | ||
289 | write(([=[ end ]=])) | ||
290 | write(([=[ return table.concat(out) ]=])) | ||
291 | write(([=[ end ]=])) | ||
292 | |||
293 | write([=[ return function() ]=]) | ||
294 | write([=[ test_env.run_in_tmp(function(tmpdir) ]=]) | ||
295 | write([=[ local function handle_tmpdir(s) ]=]) | ||
296 | write([=[ return (s:gsub("%%{url%(tmpdir%)}", (tmpdir:gsub("\\", "/"))) ]=]) | ||
297 | write([=[ :gsub("%%{tmpdir}", (tmpdir:gsub("[\\/]", dir_sep)))) ]=]) | ||
298 | write([=[ end ]=]) | ||
299 | for _, op in ipairs(t.ops) do | ||
300 | if op.op == "FILE" then | ||
301 | write([=[ test_env.write_file(handle_tmpdir("]=], op.name, [=["), handle_tmpdir([=====[ ]=]) | ||
302 | for _, line in ipairs(op.data) do | ||
303 | write(line) | ||
304 | end | ||
305 | write([=[ ]=====]), finally) ]=]) | ||
306 | elseif op.op == "EXISTS" then | ||
307 | write(([=[ assert.truthy(lfs.attributes(%q)) ]=]):format(op.file)) | ||
308 | elseif op.op == "NOT_EXISTS" then | ||
309 | write(([=[ assert.falsy(lfs.attributes(%q)) ]=]):format(op.file)) | ||
310 | elseif op.op == "MKDIR" then | ||
311 | local bits = {} | ||
312 | op.file = native_slash(op.file) | ||
313 | if op.file:sub(1, 1) == dir_sep then bits[1] = "" end | ||
314 | write([=[ local ok, err ]=]) | ||
315 | for p in op.file:gmatch("[^" .. dir_sep .. "]+") do | ||
316 | table.insert(bits, p) | ||
317 | local d = table.concat(bits, dir_sep) | ||
318 | write(([=[ ok, err = lfs.mkdir(%q) ]=]):format(d, d)) | ||
319 | end | ||
320 | write(([=[ assert.truthy((lfs.attributes(%q) or {}).mode == "directory", error_message(%d, "MKDIR failed: " .. %q .. " - " .. (err or "") )) ]=]):format(op.file, op.line, op.file)) | ||
321 | elseif op.op == "RUN" then | ||
322 | local cmd_helper = cmd_helpers[op.program] or op.program | ||
323 | local redirs = " 1>stdout.txt 2>stderr.txt " | ||
324 | write(([=[ local ok, _, code = os.execute(%s .. " " .. %q .. %q) ]=]):format(cmd_helper, op.args, redirs)) | ||
325 | write([=[ if type(ok) == "number" then code = (ok >= 256 and ok / 256 or ok) end ]=]) | ||
326 | |||
327 | write([=[ local fd_stderr = assert(io.open("stderr.txt", "r")) ]=]) | ||
328 | write([=[ local stderr_data = fd_stderr:read("*a") ]=]) | ||
329 | write([=[ fd_stderr:close() ]=]) | ||
330 | |||
331 | write([=[ if stderr_data:match("please report") then ]=]) | ||
332 | write(([=[ assert(false, error_message(%d, "RUN crashed: ", stderr_data)) ]=]):format(op.line)) | ||
333 | write([=[ end ]=]) | ||
334 | |||
335 | if op.stdout then | ||
336 | write([=[ local fd_stdout = assert(io.open("stdout.txt", "r")) ]=]) | ||
337 | write([=[ local stdout_data = fd_stdout:read("*a") ]=]) | ||
338 | write([=[ fd_stdout:close() ]=]) | ||
339 | |||
340 | write([=[ do ]=]) | ||
341 | write([=[ local block_at = 1 ]=]) | ||
342 | write([=[ local s, e, line ]=]) | ||
343 | for i, line in ipairs(op.stdout.data) do | ||
344 | write(([=[ line = %q ]=]):format(line)) | ||
345 | write(([=[ s, e = string.find(stdout_data, line, block_at, true) ]=])) | ||
346 | write(([=[ assert(s, error_message(%d, "STDOUT did not match: " .. line, stdout_data)) ]=]):format(op.stdout.start + i)) | ||
347 | write(([=[ block_at = e + 1 ]=]):format(i)) | ||
348 | end | ||
349 | write([=[ end ]=]) | ||
350 | end | ||
351 | |||
352 | if op.stderr then | ||
353 | write([=[ do ]=]) | ||
354 | write([=[ local block_at = 1 ]=]) | ||
355 | write([=[ local s, e, line ]=]) | ||
356 | for i, line in ipairs(op.stderr.data) do | ||
357 | write(([=[ line = %q ]=]):format(line)) | ||
358 | write(([=[ s, e = string.find(stderr_data, line, block_at, true) ]=])) | ||
359 | write(([=[ assert(s, error_message(%d, "STDERR did not match: " .. line, stderr_data)) ]=]):format(op.stderr.start + i)) | ||
360 | write(([=[ block_at = e + 1 ]=]):format(i)) | ||
361 | end | ||
362 | write([=[ end ]=]) | ||
363 | end | ||
364 | |||
365 | if op.exit then | ||
366 | write(([=[ assert.same(%d, code, error_message(%d, "EXIT did not match: " .. %d, stderr_data)) ]=]):format(op.exit, op.exit_line, op.exit)) | ||
367 | end | ||
368 | end | ||
369 | end | ||
370 | write([=[ end) ]=]) | ||
371 | write([=[ end ]=]) | ||
372 | |||
373 | local program = table.concat(code, "\n") | ||
374 | local chunk = assert(load(program, "@" .. filename .. ": test " .. tn, "t", env or _ENV)) | ||
375 | if env and setfenv then | ||
376 | setfenv(chunk, env) | ||
377 | end | ||
378 | t.fn = chunk() | ||
379 | end | ||
380 | |||
381 | return tests | ||
382 | end | ||
383 | |||
384 | return quick | ||
diff --git a/spec/util/test_env.lua b/spec/util/test_env.lua index f9f83b8c..dcda6311 100644 --- a/spec/util/test_env.lua +++ b/spec/util/test_env.lua | |||
@@ -715,6 +715,7 @@ local function create_paths(luaversion_full) | |||
715 | testing_paths.util_dir = base_dir .. "/spec/util" | 715 | testing_paths.util_dir = base_dir .. "/spec/util" |
716 | testing_paths.testrun_dir = base_dir .. "/testrun" | 716 | testing_paths.testrun_dir = base_dir .. "/testrun" |
717 | testing_paths.src_dir = base_dir .. "/src" | 717 | testing_paths.src_dir = base_dir .. "/src" |
718 | testing_paths.spec_dir = base_dir .. "/spec" | ||
718 | testing_paths.testing_lrprefix = testing_paths.testrun_dir .. "/testing_lrprefix-" .. luaversion_full | 719 | testing_paths.testing_lrprefix = testing_paths.testrun_dir .. "/testing_lrprefix-" .. luaversion_full |
719 | testing_paths.testing_tree = testing_paths.testrun_dir .. "/testing-" .. luaversion_full | 720 | testing_paths.testing_tree = testing_paths.testrun_dir .. "/testing-" .. luaversion_full |
720 | testing_paths.testing_tree_copy = testing_paths.testrun_dir .. "/testing_copy-" .. luaversion_full | 721 | testing_paths.testing_tree_copy = testing_paths.testrun_dir .. "/testing_copy-" .. luaversion_full |
@@ -753,6 +754,16 @@ function test_env.unload_luarocks() | |||
753 | end | 754 | end |
754 | end | 755 | end |
755 | 756 | ||
757 | local function get_luarocks_platform(variables) | ||
758 | local print_arch_script = "\"" .. | ||
759 | "cfg = require('luarocks.core.cfg');" .. | ||
760 | "cfg.init();" .. | ||
761 | "print(cfg.arch)" .. | ||
762 | "\"" | ||
763 | local cmd = test_env.testing_paths.lua .. " -e " .. print_arch_script | ||
764 | return execute_output(cmd, false, variables) | ||
765 | end | ||
766 | |||
756 | --- Function for initial setup of environment, variables, md5sums for spec files | 767 | --- Function for initial setup of environment, variables, md5sums for spec files |
757 | function test_env.setup_specs(extra_rocks) | 768 | function test_env.setup_specs(extra_rocks) |
758 | -- if global variable about successful creation of testing environment doesn't exist, build environment | 769 | -- if global variable about successful creation of testing environment doesn't exist, build environment |
@@ -770,11 +781,12 @@ function test_env.setup_specs(extra_rocks) | |||
770 | 781 | ||
771 | -- preload before meddling with package.path | 782 | -- preload before meddling with package.path |
772 | require("spec.util.git_repo") | 783 | require("spec.util.git_repo") |
784 | require("spec.util.quick") | ||
773 | 785 | ||
774 | package.path = test_env.env_variables.LUA_PATH | 786 | package.path = test_env.env_variables.LUA_PATH |
775 | package.cpath = test_env.env_variables.LUA_CPATH | 787 | package.cpath = test_env.env_variables.LUA_CPATH |
776 | 788 | ||
777 | test_env.platform = execute_output(test_env.testing_paths.lua .. " -e \"cfg = require('luarocks.core.cfg'); cfg.init(); print(cfg.arch)\"", false, test_env.env_variables) | 789 | test_env.platform = get_luarocks_platform(test_env.env_variables) |
778 | test_env.wrapper_extension = test_env.TEST_TARGET_OS == "windows" and ".bat" or "" | 790 | test_env.wrapper_extension = test_env.TEST_TARGET_OS == "windows" and ".bat" or "" |
779 | test_env.md5sums = create_md5sums(test_env.testing_paths) | 791 | test_env.md5sums = create_md5sums(test_env.testing_paths) |
780 | test_env.setup_done = true | 792 | test_env.setup_done = true |
@@ -1104,5 +1116,7 @@ test_env.env_variables = create_env(test_env.testing_paths) | |||
1104 | test_env.run = make_run_functions() | 1116 | test_env.run = make_run_functions() |
1105 | test_env.exists = exists | 1117 | test_env.exists = exists |
1106 | test_env.V = V | 1118 | test_env.V = V |
1119 | test_env.Q = Q | ||
1120 | test_env.platform = get_luarocks_platform(test_env.env_variables) | ||
1107 | 1121 | ||
1108 | return test_env | 1122 | return test_env |