diff options
Diffstat (limited to 'spec/build_spec.lua')
| -rw-r--r-- | spec/build_spec.lua | 456 |
1 files changed, 456 insertions, 0 deletions
diff --git a/spec/build_spec.lua b/spec/build_spec.lua new file mode 100644 index 0000000..034c70d --- /dev/null +++ b/spec/build_spec.lua @@ -0,0 +1,456 @@ +local test_env = require("spec.util.test_env") +local lfs = require("lfs") +local get_tmp_path = test_env.get_tmp_path +local run = test_env.run +local testing_paths = test_env.testing_paths +local write_file = test_env.write_file +local git_repo = require("spec.util.git_repo") + +local cfg, fs + +local extra_rocks = { + "/lmathx-20120430.51-1.src.rock", + "/lmathx-20120430.51-1.rockspec", + "/lmathx-20120430.52-1.src.rock", + "/lmathx-20120430.52-1.rockspec", + "/lmathx-20150505-1.src.rock", + "/lmathx-20150505-1.rockspec", + "/lpeg-1.0.0-1.src.rock", + "/luafilesystem-${LUAFILESYSTEM}.src.rock", + "/luasocket-${LUASOCKET}.src.rock", + "spec/fixtures/a_rock-1.0-1.src.rock", +} + +local c_module_source = [[ + #include <lua.h> + #include <lauxlib.h> + + int luaopen_c_module(lua_State* L) { + lua_newtable(L); + lua_pushinteger(L, 1); + lua_setfield(L, -2, "c_module"); + return 1; + } +]] + +describe("LuaRocks build #integration", function() + before_each(function() + test_env.setup_specs(extra_rocks) + cfg = require("luarocks.core.cfg") + fs = require("luarocks.fs") + cfg.init() + fs.init() + end) + + describe("building with flags", function() + it("verbose", function() + test_env.run_in_tmp(function(tmpdir) + write_file("test-1.0-1.rockspec", [[ + package = "test" + version = "1.0-1" + source = { + url = "file://]] .. tmpdir:gsub("\\", "/") .. [[/test.lua" + } + build = { + type = "builtin", + modules = { + test = "test.lua" + } + } + ]]) + write_file("test.lua", "return {}") + + assert.is_true(run.luarocks_bool("build --verbose test-1.0-1.rockspec")) + assert.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/test/1.0-1/test-1.0-1.rockspec")) + end, finally) + end) + + it("fails if the deps-mode argument is invalid", function() + assert.is_false(run.luarocks_bool("build --deps-mode=123 " .. testing_paths.fixtures_dir .. "/a_rock-1.0-1.rockspec")) + assert.falsy(lfs.attributes(testing_paths.testing_sys_rocks .. "/a_rock/1.0-1/a_rock-1.0-1.rockspec")) + end) + + it("with --only-sources", function() + assert.is_true(run.luarocks_bool("download --server=" .. testing_paths.fixtures_dir .. "/a_repo --rockspec a_rock 1.0")) + assert.is_false(run.luarocks_bool("build --only-sources=\"http://example.com\" a_rock-1.0-1.rockspec")) + assert.is.falsy(lfs.attributes(testing_paths.testing_sys_rocks .. "/a_rock/1.0-1/a_rock-1.0-1.rockspec")) + + assert.is_true(run.luarocks_bool("download --server=" .. testing_paths.fixtures_dir .. "/a_repo --source a_rock 1.0")) + assert.is_true(run.luarocks_bool("build --only-sources=\"http://example.com\" a_rock-1.0-1.src.rock")) + assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/a_rock/1.0-1/a_rock-1.0-1.rockspec")) + + assert.is_true(os.remove("a_rock-1.0-1.rockspec")) + assert.is_true(os.remove("a_rock-1.0-1.src.rock")) + end) + + it("fails if an empty tree is given", function() + assert.is_false(run.luarocks_bool("build --tree=\"\" " .. testing_paths.fixtures_dir .. "/a_rock-1.0-1.rockspec")) + assert.falsy(lfs.attributes(testing_paths.testing_sys_rocks .. "/a_rock/1.0-1/a_rock-1.0-1.rockspec")) + end) + end) + + describe("basic builds", function() + it("luacov diff version", function() + assert.is_true(run.luarocks_bool("build luacov ${LUACOV}")) + assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/luacov/${LUACOV}/luacov-${LUACOV}.rockspec")) + end) + + it("fails if the current platform is not supported", function() + test_env.run_in_tmp(function(tmpdir) + write_file("test-1.0-1.rockspec", [[ + package = "test" + version = "1.0-1" + source = { + url = "file://]] .. tmpdir:gsub("\\", "/") .. [[/test.lua" + } + supported_platforms = { + "unix", "macosx" + } + build = { + type = "builtin", + modules = { + test = "test.lua" + } + } + ]]) + write_file("test.lua", "return {}") + + if test_env.TEST_TARGET_OS == "windows" then + assert.is_false(run.luarocks_bool("build test-1.0-1.rockspec")) -- Error: This rockspec does not support windows platforms + assert.is.falsy(lfs.attributes(testing_paths.testing_sys_rocks .. "/test/1.0-1/test-1.0-1.rockspec")) + else + assert.is_true(run.luarocks_bool("build test-1.0-1.rockspec")) + assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/test/1.0-1/test-1.0-1.rockspec")) + end + end, finally) + end) + + it("with skipping dependency checks", function() + test_env.run_in_tmp(function(tmpdir) + write_file("test-1.0-1.rockspec", [[ + package = "test" + version = "1.0-1" + source = { + url = "file://]] .. tmpdir:gsub("\\", "/") .. [[/test.lua" + } + dependencies = { + "a_rock 1.0" + } + build = { + type = "builtin", + modules = { + test = "test.lua" + } + } + ]]) + write_file("test.lua", "return {}") + + assert.is_true(run.luarocks_bool("build test-1.0-1.rockspec --deps-mode=none")) + assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/test/1.0-1/test-1.0-1.rockspec")) + end, finally) + end) + + it("lmathx deps partial match", function() + if test_env.LUA_V == "5.1" or test_env.LUAJIT_V then + assert.is_true(run.luarocks_bool("build lmathx")) + assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/lmathx/20120430.51-1/lmathx-20120430.51-1.rockspec")) + elseif test_env.LUA_V == "5.2" then + assert.is_true(run.luarocks_bool("build lmathx")) + assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/lmathx/20120430.52-1/lmathx-20120430.52-1.rockspec")) + elseif test_env.LUA_V == "5.3" then + assert.is_true(run.luarocks_bool("build lmathx")) + assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/lmathx/20150505-1/lmathx-20150505-1.rockspec")) + end + end) + end) + + describe("#namespaces", function() + it("builds a namespaced package from the command-line", function() + assert(run.luarocks_bool("build a_user/a_rock --server=" .. testing_paths.fixtures_dir .. "/a_repo" )) + assert.is_false(run.luarocks_bool("show a_rock 1.0")) + assert(run.luarocks_bool("show a_rock 2.0")) + assert(lfs.attributes(testing_paths.testing_sys_rocks .. "/a_rock/2.0-1/rock_namespace")) + end) + + it("builds a package with a namespaced dependency", function() + assert(run.luarocks_bool("build has_namespaced_dep --server=" .. testing_paths.fixtures_dir .. "/a_repo" )) + assert(run.luarocks_bool("show has_namespaced_dep")) + assert.is_false(run.luarocks_bool("show a_rock 1.0")) + assert(run.luarocks_bool("show a_rock 2.0")) + end) + + it("builds a package reusing a namespaced dependency", function() + assert(run.luarocks_bool("build a_user/a_rock --server=" .. testing_paths.fixtures_dir .. "/a_repo" )) + assert(run.luarocks_bool("show a_rock 2.0")) + assert(lfs.attributes(testing_paths.testing_sys_rocks .. "/a_rock/2.0-1/rock_namespace")) + local output = run.luarocks("build has_namespaced_dep --server=" .. testing_paths.fixtures_dir .. "/a_repo" ) + assert.has.no.match("Missing dependencies", output) + end) + + it("builds a package considering namespace of locally installed package", function() + assert(run.luarocks_bool("build a_user/a_rock --server=" .. testing_paths.fixtures_dir .. "/a_repo" )) + assert(run.luarocks_bool("show a_rock 2.0")) + assert(lfs.attributes(testing_paths.testing_sys_rocks .. "/a_rock/2.0-1/rock_namespace")) + local output = run.luarocks("build has_another_namespaced_dep --server=" .. testing_paths.fixtures_dir .. "/a_repo" ) + assert.has.match("Missing dependencies", output) + print(output) + assert(run.luarocks_bool("show a_rock 3.0")) + end) + end) + + describe("more complex tests", function() + if test_env.TYPE_TEST_ENV == "full" then + it("luacheck show downloads test_config", function() + local output = run.luarocks("build luacheck", { LUAROCKS_CONFIG = testing_paths.testrun_dir .. "/testing_config_show_downloads.lua"} ) + assert.is.truthy(output:match("%.%.%.")) + end) + end + + it("only deps", function() + local rockspec = testing_paths.fixtures_dir .. "/build_only_deps-0.1-1.rockspec" + + assert.is_true(run.luarocks_bool("build " .. rockspec .. " --only-deps")) + assert.is_false(run.luarocks_bool("show build_only_deps")) + assert.is.falsy(lfs.attributes(testing_paths.testing_sys_rocks .. "/build_only_deps/0.1-1/build_only_deps-0.1-1.rockspec")) + assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/a_rock/1.0-1/a_rock-1.0-1.rockspec")) + end) + + it("only deps of a given rockspec", function() + test_env.run_in_tmp(function(tmpdir) + write_file("test-1.0-1.rockspec", [[ + package = "test" + version = "1.0-1" + source = { + url = "file://]] .. tmpdir:gsub("\\", "/") .. [[/test.lua" + } + dependencies = { + "a_rock 1.0" + } + build = { + type = "builtin", + modules = { + test = "test.lua" + } + } + ]]) + write_file("test.lua", "return {}") + + assert.is.truthy(run.luarocks_bool("build --server=" .. testing_paths.fixtures_dir .. "/a_repo test-1.0-1.rockspec --only-deps")) + assert.is.falsy(lfs.attributes(testing_paths.testing_sys_rocks .. "/test/1.0-1/test-1.0-1.rockspec")) + assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/a_rock/1.0-1/a_rock-1.0-1.rockspec")) + end, finally) + end) + + it("only deps of a given rock", function() + test_env.run_in_tmp(function(tmpdir) + write_file("test-1.0-1.rockspec", [[ + package = "test" + version = "1.0-1" + source = { + url = "file://]] .. tmpdir:gsub("\\", "/") .. [[/test.lua" + } + dependencies = { + "a_rock 1.0" + } + build = { + type = "builtin", + modules = { + test = "test.lua" + } + } + ]]) + write_file("test.lua", "return {}") + + assert.is.truthy(run.luarocks_bool("pack test-1.0-1.rockspec")) + assert.is.truthy(lfs.attributes("test-1.0-1.src.rock")) + + assert.is.truthy(run.luarocks_bool("build --server=" .. testing_paths.fixtures_dir .. "/a_repo test-1.0-1.src.rock --only-deps")) + assert.is.falsy(lfs.attributes(testing_paths.testing_sys_rocks .. "/test/1.0-1/test-1.0-1.rockspec")) + assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/a_rock/1.0-1/a_rock-1.0-1.rockspec")) + end, finally) + end) + + it("fails if given an argument with an invalid patch", function() + assert.is_false(run.luarocks_bool("build " .. testing_paths.fixtures_dir .. "/invalid_patch-0.1-1.rockspec")) + end) + end) + + describe("rockspec format 3.0 #rs3", function() + local tmpdir + local olddir + + before_each(function() + tmpdir = get_tmp_path() + olddir = lfs.currentdir() + lfs.mkdir(tmpdir) + lfs.chdir(tmpdir) + + lfs.mkdir("autodetect") + write_file("autodetect/bla.lua", "return {}", finally) + write_file("c_module.c", c_module_source, finally) + end) + + after_each(function() + if olddir then + lfs.chdir(olddir) + if tmpdir then + lfs.rmdir("autodetect") + lfs.rmdir(tmpdir) + end + end + end) + + it("defaults to build.type == 'builtin'", function() + local rockspec = "a_rock-1.0-1.rockspec" + test_env.write_file(rockspec, [[ + rockspec_format = "3.0" + package = "a_rock" + version = "1.0-1" + source = { + url = "file://]] .. testing_paths.fixtures_dir:gsub("\\", "/") .. [[/a_rock.lua" + } + description = { + summary = "An example rockspec", + } + dependencies = { + "lua >= 5.1" + } + build = { + modules = { + build = "a_rock.lua" + }, + } + ]], finally) + assert.truthy(run.luarocks_bool("build " .. rockspec)) + assert.is.truthy(run.luarocks("show a_rock")) + end) + + it("'builtin' detects lua files if build is not given", function() + local rockspec = "autodetect-1.0-1.rockspec" + test_env.write_file(rockspec, [[ + rockspec_format = "3.0" + package = "autodetect" + version = "1.0-1" + source = { + url = "file://autodetect/bla.lua" + } + description = { + summary = "An example rockspec", + } + dependencies = { + "lua >= 5.1" + } + ]], finally) + assert.truthy(run.luarocks_bool("build " .. rockspec)) + assert.match("bla.lua", run.luarocks("show autodetect")) + end) + + it("'builtin' synthesizes external_dependencies if not given but a library is given in build", function() + local rockspec = "autodetect-1.0-1.rockspec" + test_env.write_file(rockspec, [[ + rockspec_format = "3.0" + package = "autodetect" + version = "1.0-1" + source = { + url = "file://c_module.c" + } + description = { + summary = "An example rockspec", + } + dependencies = { + "lua >= 5.1" + } + build = { + modules = { + c_module = { + sources = "c_module.c", + libraries = "inexistent_library", + } + } + } + ]], finally) + assert.match("INEXISTENT_LIBRARY_DIR", run.luarocks("build " .. rockspec)) + end) + end) + + describe("#mock external dependencies", function() + lazy_setup(function() + test_env.setup_specs(nil, "mock") + test_env.mock_server_init() + end) + + lazy_teardown(function() + test_env.mock_server_done() + end) + + it("fails when missing external dependency", function() + test_env.run_in_tmp(function(tmpdir) + write_file("missing_external-0.1-1.rockspec", [[ + package = "missing_external" + version = "0.1-1" + source = { + url = "https://example.com/build.lua" + } + external_dependencies = { + INEXISTENT = { + library = "inexistentlib*", + header = "inexistentheader*.h", + } + } + dependencies = { + "lua >= 5.1" + } + build = { + type = "builtin", + modules = { + build = "build.lua" + } + } + ]]) + assert.is_false(run.luarocks_bool("build missing_external-0.1-1.rockspec INEXISTENT_INCDIR=\"/invalid/dir\"")) + end, finally) + end) + + it("builds with external dependency", function() + local rockspec = testing_paths.fixtures_dir .. "/with_external_dep-0.1-1.rockspec" + local foo_incdir = testing_paths.fixtures_dir .. "/with_external_dep" + assert.is_truthy(run.luarocks_bool("build " .. rockspec .. " FOO_INCDIR=\"" .. foo_incdir .. "\"")) + assert.is.truthy(run.luarocks("show with_external_dep")) + end) + end) + + describe("#build_dependencies", function() + it("builds with a build dependency", function() + assert(run.luarocks_bool("build has_build_dep --server=" .. testing_paths.fixtures_dir .. "/a_repo" )) + assert(run.luarocks_bool("show has_build_dep 1.0")) + assert(run.luarocks_bool("show a_build_dep 1.0")) + end) + end) + + describe("#unix build from #git", function() + local git + + lazy_setup(function() + git = git_repo.start() + end) + + lazy_teardown(function() + if git then + git:stop() + end + end) + + it("using --branch", function() + write_file("my_branch-1.0-1.rockspec", [[ + rockspec_format = "3.0" + package = "my_branch" + version = "1.0-1" + source = { + url = "git://localhost/testrock" + } + ]], finally) + assert.is_false(run.luarocks_bool("build --branch unknown-branch ./my_branch-1.0-1.rockspec")) + assert.is_true(run.luarocks_bool("build --branch test-branch ./my_branch-1.0-1.rockspec")) + end) + end) +end) |
