104 lines
3.3 KiB
Lua
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,
|
|
}
|