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

104 lines
3.3 KiB
Lua

------------------------------------------------------------------
-- Collection of utilities to help testing Kong features and plugins.
--
-- @copyright Copyright 2016-2022 Kong Inc. All rights reserved.
-- @license [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-- @module spec.helpers
local shell = require("resty.shell")
local strip = require("kong.tools.string").strip
local CONSTANTS = require("spec.internal.constants")
local conf = require("spec.internal.conf")
----------------
-- Shell helpers
-- @section Shell-helpers
--- Execute a command.
-- Modified version of `pl.utils.executeex()` so the output can directly be
-- used on an assertion.
-- @function execute
-- @param cmd command string to execute
-- @param returns (optional) boolean: if true, this function will
-- return the same values as Penlight's executeex.
-- @return if `returns` is true, returns four return values
-- (ok, code, stdout, stderr); if `returns` is false,
-- returns either (false, stderr) or (true, stderr, stdout).
local function exec(cmd, returns)
--100MB for retrieving stdout & stderr
local ok, stdout, stderr, _, code = shell.run(cmd, nil, 0, 1024*1024*100)
if returns then
return ok, code, stdout, stderr
end
if not ok then
stdout = nil -- don't return 3rd value if fail because of busted's `assert`
end
return ok, stderr, stdout
end
--- Execute a Kong command.
-- @function kong_exec
-- @param cmd Kong command to execute, eg. `start`, `stop`, etc.
-- @param env (optional) table with kong parameters to set as environment
-- variables, overriding the test config (each key will automatically be
-- prefixed with `KONG_` and be converted to uppercase)
-- @param returns (optional) boolean: if true, this function will
-- return the same values as Penlight's `executeex`.
-- @param env_vars (optional) a string prepended to the command, so
-- that arbitrary environment variables may be passed
-- @return if `returns` is true, returns four return values
-- (ok, code, stdout, stderr); if `returns` is false,
-- returns either (false, stderr) or (true, stderr, stdout).
local function kong_exec(cmd, env, returns, env_vars)
cmd = cmd or ""
env = env or {}
-- Insert the Lua path to the custom-plugin fixtures
do
local function cleanup(t)
if t then
t = strip(t)
if t:sub(-1,-1) == ";" then
t = t:sub(1, -2)
end
end
return t ~= "" and t or nil
end
local paths = {}
table.insert(paths, cleanup(CONSTANTS.CUSTOM_PLUGIN_PATH))
table.insert(paths, cleanup(CONSTANTS.CUSTOM_VAULT_PATH))
table.insert(paths, cleanup(env.lua_package_path))
table.insert(paths, cleanup(conf.lua_package_path))
env.lua_package_path = table.concat(paths, ";")
-- note; the nginx config template will add a final ";;", so no need to
-- include that here
end
if not env.plugins then
env.plugins = "bundled,dummy,cache,rewriter,error-handler-log," ..
"error-generator,error-generator-last," ..
"short-circuit"
end
-- build Kong environment variables
env_vars = env_vars or ""
for k, v in pairs(env) do
env_vars = string.format("%s KONG_%s='%s'", env_vars, k:upper(), v)
end
return exec(env_vars .. " " .. CONSTANTS.BIN_PATH .. " " .. cmd, returns)
end
return {
run = shell.run,
exec = exec,
kong_exec = kong_exec,
}