summaryrefslogtreecommitdiff
path: root/spec/install_spec.lua
diff options
context:
space:
mode:
authorMike Vink <mike@pionative.com>2025-02-03 21:29:42 +0100
committerMike Vink <mike@pionative.com>2025-02-03 21:29:42 +0100
commit5155816b7b925dec5d5feb1568b1d7ceb00938b9 (patch)
treedeca28ea15e79f6f804c3d90d2ba757881638af5 /spec/install_spec.lua
fetch tarballHEADmaster
Diffstat (limited to 'spec/install_spec.lua')
-rw-r--r--spec/install_spec.lua235
1 files changed, 235 insertions, 0 deletions
diff --git a/spec/install_spec.lua b/spec/install_spec.lua
new file mode 100644
index 0000000..e6b1ad0
--- /dev/null
+++ b/spec/install_spec.lua
@@ -0,0 +1,235 @@
+local test_env = require("spec.util.test_env")
+local lfs = require("lfs")
+local run = test_env.run
+local testing_paths = test_env.testing_paths
+local env_variables = test_env.env_variables
+local write_file = test_env.write_file
+local git_repo = require("spec.util.git_repo")
+local V = test_env.V
+
+local extra_rocks = {
+ "/cprint-${CPRINT}.src.rock",
+ "/lpeg-${LPEG}.src.rock",
+ "/luassert-1.7.0-1.src.rock",
+ "/luasocket-${LUASOCKET}.src.rock",
+ "/lxsh-${LXSH}.src.rock",
+ "/luafilesystem-${LUAFILESYSTEM}.src.rock",
+ "/luafilesystem-${LUAFILESYSTEM_OLD}.src.rock",
+ "spec/fixtures/a_repo/has_build_dep-1.0-1.all.rock",
+ "spec/fixtures/a_repo/a_build_dep-1.0-1.all.rock",
+ "spec/fixtures/a_repo/a_rock-1.0-1.src.rock",
+}
+
+describe("luarocks install #integration", function()
+
+ before_each(function()
+ test_env.setup_specs(extra_rocks)
+ end)
+
+ describe("basic tests", function()
+ pending("fails with local flag as root #unix", function()
+ if test_env.TYPE_TEST_ENV ~= "full" then
+ assert.is_false(run.luarocks_bool("install --local luasocket ", { USER = "root" } ))
+ end
+ end)
+
+ pending("fails with no downloader", function()
+ if test_env.TYPE_TEST_ENV ~= "full" then
+ local output = assert(run.luarocks("install https://example.com/rock-1.0.src.rock", { LUAROCKS_CONFIG = testing_paths.testrun_dir .. "/testing_config_no_downloader.lua" } ))
+ assert.match("no downloader tool", output)
+
+ -- can do http but not https
+ assert(run.luarocks("install luasocket"))
+ output = assert(run.luarocks("install https://example.com/rock-1.0.src.rock", { LUAROCKS_CONFIG = testing_paths.testrun_dir .. "/testing_config_no_downloader.lua" } ))
+ assert.match("no downloader tool", output)
+ end
+ end)
+
+ it("only-deps of lxsh show there is no lxsh", function()
+ assert.is_true(run.luarocks_bool("install lxsh ${LXSH} --only-deps"))
+ assert.is_false(run.luarocks_bool("show lxsh"))
+ end)
+
+ it("installs a package with a dependency", function()
+ assert.is_true(run.luarocks_bool("install has_build_dep"))
+ assert.is_true(run.luarocks_bool("show a_rock"))
+ end)
+ end)
+
+ describe("#namespaces", function()
+ it("installs a namespaced package from the command-line", function()
+ assert(run.luarocks_bool("install 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("installs a namespaced package given an URL and any string in --namespace", function()
+ -- This is not a "valid" namespace (as per luarocks.org rules)
+ -- but we're not doing any format checking in the luarocks codebase
+ -- so this keeps our options open.
+ assert(run.luarocks_bool("install --namespace=x.y@z file://" .. testing_paths.fixtures_dir .. "/a_rock-1.0-1.src.rock" ))
+ assert.truthy(run.luarocks_bool("show a_rock 1.0"))
+ local fd = assert(io.open(testing_paths.testing_sys_rocks .. "/a_rock/1.0-1/rock_namespace", "r"))
+ finally(function() fd:close() end)
+ assert.same("x.y@z", fd:read("*l"))
+ end)
+
+ it("installs a package with a namespaced dependency", function()
+ assert(run.luarocks_bool("install 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"))
+ assert(lfs.attributes(testing_paths.testing_sys_rocks .. "/a_rock/2.0-1/rock_namespace"))
+ end)
+
+ it("installs a package reusing a namespaced dependency", function()
+ assert(run.luarocks_bool("install 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("install has_namespaced_dep --server=" .. testing_paths.fixtures_dir .. "/a_repo" )
+ assert.has.no.match("Missing dependencies", output)
+ end)
+
+ it("installs a package considering namespace of locally installed package", function()
+ assert(run.luarocks_bool("install 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("install 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()
+ it('skipping dependency checks', function()
+ assert.is_true(run.luarocks_bool("install has_build_dep --nodeps"))
+ assert.is_true(run.luarocks_bool("show has_build_dep"))
+ assert.is.falsy(lfs.attributes(testing_paths.testing_sys_rocks .. "/a_rock"))
+ assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/has_build_dep"))
+ end)
+
+ it('handle relative path in --tree #632', function()
+ local relative_path = "./temp_dir_"..math.random(100000)
+ if test_env.TEST_TARGET_OS == "windows" then
+ relative_path = relative_path:gsub("/", "\\")
+ end
+ test_env.remove_dir(relative_path)
+ assert.is.falsy(lfs.attributes(relative_path))
+ assert.is_true(run.luarocks_bool("install luafilesystem --tree="..relative_path))
+ assert.is.truthy(lfs.attributes(relative_path))
+ test_env.remove_dir(relative_path)
+ assert.is.falsy(lfs.attributes(relative_path))
+ end)
+
+ it("only-deps of luasocket packed rock", function()
+ assert.is_true(run.luarocks_bool("build --pack-binary-rock luasocket ${LUASOCKET}"))
+ local output = run.luarocks("install --only-deps " .. "luasocket-${LUASOCKET}." .. test_env.platform .. ".rock")
+ assert.match(V"Successfully installed dependencies for luasocket ${LUASOCKET}", output, 1, true)
+ assert.is_true(os.remove("luasocket-${LUASOCKET}." .. test_env.platform .. ".rock"))
+ end)
+
+ it("reinstall", function()
+ assert.is_true(run.luarocks_bool("build --pack-binary-rock luasocket ${LUASOCKET}"))
+ assert.is_true(run.luarocks_bool("install " .. "luasocket-${LUASOCKET}." .. test_env.platform .. ".rock"))
+ assert.is_true(run.luarocks_bool("install --deps-mode=none " .. "luasocket-${LUASOCKET}." .. test_env.platform .. ".rock"))
+ assert.is_true(os.remove("luasocket-${LUASOCKET}." .. test_env.platform .. ".rock"))
+ end)
+
+ it("binary rock of cprint", function()
+ assert.is_true(run.luarocks_bool("build --pack-binary-rock cprint"))
+ assert.is_true(run.luarocks_bool("install cprint-${CPRINT}." .. test_env.platform .. ".rock"))
+ assert.is_true(os.remove("cprint-${CPRINT}." .. test_env.platform .. ".rock"))
+ end)
+
+ it("accepts --no-manifest flag", function()
+ assert.is_true(run.luarocks_bool("install lxsh ${LXSH}"))
+ assert.is.truthy(lfs.attributes(testing_paths.testing_sys_rocks .. "/manifest"))
+ assert.is.truthy(os.remove(testing_paths.testing_sys_rocks .. "/manifest"))
+
+ assert.is_true(run.luarocks_bool("install --no-manifest lxsh ${LXSH}"))
+ assert.is.falsy(lfs.attributes(testing_paths.testing_sys_rocks .. "/manifest"))
+ end)
+ end)
+
+ describe("#build_dependencies", function()
+ it("install does not install a build dependency", function()
+ assert(run.luarocks_bool("install has_build_dep"))
+ assert(run.luarocks_bool("show has_build_dep 1.0"))
+ assert.falsy(run.luarocks_bool("show a_build_dep 1.0"))
+ end)
+ end)
+
+ it("respects luarocks.lock in package #pinning", 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 >= 0.8"
+ }
+ build = {
+ type = "builtin",
+ modules = {
+ test = "test.lua"
+ }
+ }
+ ]])
+ write_file("test.lua", "return {}")
+ write_file("luarocks.lock", [[
+ return {
+ dependencies = {
+ ["a_rock"] = "1.0-1",
+ }
+ }
+ ]])
+
+ assert.is_true(run.luarocks_bool("make --pack-binary-rock --server=" .. testing_paths.fixtures_dir .. "/a_repo test-1.0-1.rockspec"))
+ assert.is_true(os.remove("luarocks.lock"))
+
+ assert.is.truthy(lfs.attributes("./test-1.0-1.all.rock"))
+
+ assert.is.falsy(lfs.attributes("./lua_modules/lib/luarocks/rocks-" .. test_env.lua_version .. "/test/1.0-1/test-1.0-1.rockspec"))
+ assert.is.falsy(lfs.attributes("./lua_modules/lib/luarocks/rocks-" .. test_env.lua_version .. "/a_rock/1.0-1/a_rock-1.0-1.rockspec"))
+
+ print(run.luarocks("install ./test-1.0-1.all.rock --tree=lua_modules --server=" .. testing_paths.fixtures_dir .. "/a_repo"))
+
+ assert.is.truthy(lfs.attributes("./lua_modules/lib/luarocks/rocks-" .. test_env.lua_version .. "/test/1.0-1/test-1.0-1.rockspec"))
+ assert.is.truthy(lfs.attributes("./lua_modules/lib/luarocks/rocks-" .. test_env.lua_version .. "/test/1.0-1/luarocks.lock"))
+ assert.is.truthy(lfs.attributes("./lua_modules/lib/luarocks/rocks-" .. test_env.lua_version .. "/a_rock/1.0-1/a_rock-1.0-1.rockspec"))
+ assert.is.falsy(lfs.attributes("./lua_modules/lib/luarocks/rocks-" .. test_env.lua_version .. "/a_rock/2.0-1"))
+ end, finally)
+ end)
+
+ describe("#unix install runs 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("install --branch unknown-branch ./my_branch-1.0-1.rockspec"))
+ assert.is_true(run.luarocks_bool("install --branch test-branch ./my_branch-1.0-1.rockspec"))
+ end)
+ end)
+
+end)