Files
2026-07-13 12:32:21 +08:00

236 lines
9.1 KiB
Lua

local helpers = require "spec.helpers"
local signals = require "kong.cmd.utils.nginx_signals"
local shell = require "resty.shell"
local ssl_fixtures = require "spec.fixtures.ssl"
local fmt = string.format
local TEST_PREFIX = "servroot_prepared_test"
describe("kong prepare", function()
lazy_setup(function()
pcall(helpers.dir.rmtree, TEST_PREFIX)
end)
after_each(function()
pcall(helpers.dir.rmtree, TEST_PREFIX)
end)
it("prepares a prefix", function()
assert(helpers.kong_exec("prepare -c " .. helpers.test_conf_path, {
prefix = TEST_PREFIX
}))
assert.truthy(helpers.path.exists(TEST_PREFIX))
local process_secrets = helpers.path.join(TEST_PREFIX, ".kong_process_secrets")
local admin_access_log_path = helpers.path.join(TEST_PREFIX, helpers.test_conf.admin_access_log)
local admin_error_log_path = helpers.path.join(TEST_PREFIX, helpers.test_conf.admin_error_log)
assert.falsy(helpers.path.exists(process_secrets))
assert.truthy(helpers.path.exists(admin_access_log_path))
assert.truthy(helpers.path.exists(admin_error_log_path))
end)
it("prepares a prefix and creates a process secrets file", function()
helpers.setenv("PG_USER", "test-user")
finally(function()
helpers.unsetenv("PG_USER")
end)
assert(helpers.kong_exec("prepare -c " .. helpers.test_conf_path, {
prefix = TEST_PREFIX,
pg_user = "{vault://env/pg-user}",
}))
assert.truthy(helpers.path.exists(TEST_PREFIX))
local process_secrets = helpers.path.join(TEST_PREFIX, ".kong_process_secrets_http")
local admin_access_log_path = helpers.path.join(TEST_PREFIX, helpers.test_conf.admin_access_log)
local admin_error_log_path = helpers.path.join(TEST_PREFIX, helpers.test_conf.admin_error_log)
assert.truthy(helpers.path.exists(process_secrets))
assert.truthy(helpers.path.exists(admin_access_log_path))
assert.truthy(helpers.path.exists(admin_error_log_path))
end)
it("prepares a prefix from CLI arg option", function()
assert(helpers.kong_exec("prepare -c " .. helpers.test_conf_path ..
" -p " .. TEST_PREFIX))
assert.truthy(helpers.path.exists(TEST_PREFIX))
local admin_access_log_path = helpers.path.join(TEST_PREFIX, helpers.test_conf.admin_access_log)
local admin_error_log_path = helpers.path.join(TEST_PREFIX, helpers.test_conf.admin_error_log)
assert.truthy(helpers.path.exists(admin_access_log_path))
assert.truthy(helpers.path.exists(admin_error_log_path))
end)
describe("errors", function()
it("on inexistent Kong conf file", function()
local ok, stderr = helpers.kong_exec "prepare --conf foobar.conf"
assert.False(ok)
assert.is_string(stderr)
assert.matches("Error: no file at: foobar.conf", stderr, nil, true)
end)
it("on invalid nginx directive", function()
local ok, stderr = helpers.kong_exec("prepare --conf spec/fixtures/invalid_nginx_directives.conf" ..
" -p " .. TEST_PREFIX)
assert.False(ok)
assert.is_string(stderr)
assert.matches("[emerg] unknown directive \"random_directive\"", stderr,
nil, true)
end)
end)
for _, strategy in helpers.each_strategy({ "postgres" }) do
describe("and start", function()
lazy_setup(function()
helpers.get_db_utils(strategy, { "routes" })
end)
after_each(function()
helpers.stop_kong(TEST_PREFIX)
end)
it("prepares a prefix and starts kong correctly [#" .. strategy .. "]", function()
helpers.setenv("PG_DATABASE", "kong")
finally(function()
helpers.unsetenv("PG_DATABASE")
end)
assert(helpers.kong_exec("prepare -c " .. helpers.test_conf_path, {
prefix = TEST_PREFIX,
database = strategy,
pg_database = "{vault://env/pg-database}",
}))
assert.truthy(helpers.path.exists(TEST_PREFIX))
local process_secrets = helpers.path.join(TEST_PREFIX, ".kong_process_secrets_http")
local admin_access_log_path = helpers.path.join(TEST_PREFIX, helpers.test_conf.admin_access_log)
local admin_error_log_path = helpers.path.join(TEST_PREFIX, helpers.test_conf.admin_error_log)
assert.truthy(helpers.path.exists(process_secrets))
assert.truthy(helpers.path.exists(admin_access_log_path))
assert.truthy(helpers.path.exists(admin_error_log_path))
local nginx_bin, err = signals.find_nginx_bin()
assert.is_nil(err)
local cmd = fmt("%s -p %s -c %s", nginx_bin, TEST_PREFIX, "nginx.conf")
local ok, _, stderr = shell.run(cmd, nil, 0)
assert.equal("", stderr)
assert.truthy(ok)
local admin_client = helpers.admin_client()
local res = admin_client:get("/routes")
assert.res_status(200, res)
admin_client:close()
end)
it("prepares a prefix and fails to start kong correctly [#" .. strategy .. "]", function()
helpers.setenv("PG_DATABASE", "kong_tests_unknown")
finally(function()
helpers.unsetenv("PG_DATABASE")
end)
assert(helpers.kong_exec("prepare -c " .. helpers.test_conf_path, {
prefix = TEST_PREFIX,
database = strategy,
pg_database = "{vault://env/pg-database}",
}))
assert.truthy(helpers.path.exists(TEST_PREFIX))
local process_secrets = helpers.path.join(TEST_PREFIX, ".kong_process_secrets_http")
local admin_access_log_path = helpers.path.join(TEST_PREFIX, helpers.test_conf.admin_access_log)
local admin_error_log_path = helpers.path.join(TEST_PREFIX, helpers.test_conf.admin_error_log)
assert.truthy(helpers.path.exists(process_secrets))
assert.truthy(helpers.path.exists(admin_access_log_path))
assert.truthy(helpers.path.exists(admin_error_log_path))
local nginx_bin, err = signals.find_nginx_bin()
assert.is_nil(err)
local cmd = fmt("%s -p %s -c %s", nginx_bin, TEST_PREFIX, "nginx.conf")
local ok, _, stderr = shell.run(cmd, nil, 0)
assert.matches("kong_tests_unknown", stderr)
assert.falsy(ok)
end)
it("prepares a prefix and starts kong with http and stream submodule correctly [#" .. strategy .. "]", function ()
helpers.setenv("CERT", ssl_fixtures.cert)
helpers.setenv("KEY", ssl_fixtures.key)
helpers.setenv("CERT_ALT", ssl_fixtures.cert_alt)
helpers.setenv("KEY_ALT", ssl_fixtures.key_alt)
helpers.setenv("LOGLEVEL", "error")
finally(function()
helpers.unsetenv("CERT")
helpers.unsetenv("CERT_ALT")
helpers.unsetenv("KEY")
helpers.unsetenv("KEY_ALT")
helpers.unsetenv("LOGLEVEL")
end)
assert(helpers.kong_exec("prepare -c " .. helpers.test_conf_path, {
prefix = TEST_PREFIX,
database = strategy,
loglevel = "{vault://env/loglevel}",
lua_ssl_trusted_certificate = "{vault://env/cert}, system",
ssl_cert_key = "{vault://env/key}, {vault://env/key_alt}",
ssl_cert = "{vault://env/cert}, {vault://env/cert_alt}",
vaults = "env",
proxy_listen = "127.0.0.1:8000",
stream_listen = "127.0.0.1:9000",
admin_listen = "127.0.0.1:8001",
}))
assert.truthy(helpers.path.exists(TEST_PREFIX))
local process_secrets_http = helpers.path.join(TEST_PREFIX, ".kong_process_secrets_http")
local process_secrets_stream = helpers.path.join(TEST_PREFIX, ".kong_process_secrets_stream")
local admin_access_log_path = helpers.path.join(TEST_PREFIX, helpers.test_conf.admin_access_log)
local admin_error_log_path = helpers.path.join(TEST_PREFIX, helpers.test_conf.admin_error_log)
assert.truthy(helpers.path.exists(process_secrets_http))
assert.truthy(helpers.path.exists(process_secrets_stream))
assert.truthy(helpers.path.exists(admin_access_log_path))
assert.truthy(helpers.path.exists(admin_error_log_path))
local nginx_bin, err = signals.find_nginx_bin()
assert.is_nil(err)
local cmd = fmt("%s -p %s -c %s", nginx_bin, TEST_PREFIX, "nginx.conf")
local ok, _, stderr = shell.run(cmd, nil, 0)
assert.equal("", stderr)
assert.truthy(ok)
local error_log_path = helpers.path.join(TEST_PREFIX, "logs/error.log")
assert.logfile(error_log_path).has.no.line("[error]", true, 0)
assert.logfile(error_log_path).has.no.line("[alert]", true, 0)
assert.logfile(error_log_path).has.no.line("[crit]", true, 0)
assert.logfile(error_log_path).has.no.line("[emerg]", true, 0)
assert
.with_timeout(5)
.ignore_exceptions(true)
.eventually(function()
local client = helpers.admin_client(nil, 8001)
local res, err = client:send({ path = "/status", method = "GET" })
if res then res:read_body() end
client:close()
if not res then
return nil, err
end
if res.status ~= 200 then
return nil, res
end
return true
end)
.is_truthy("/status API did not return 200")
end)
end)
end
end)