85 lines
2.5 KiB
Lua
85 lines
2.5 KiB
Lua
-- busted-ci-helper.lua
|
|
local busted = require 'busted'
|
|
|
|
do
|
|
local shutdown_timers = require("kong.cmd.utils.timer").shutdown
|
|
assert(type(shutdown_timers) == "function")
|
|
|
|
-- shutdown lua-resty-timer-ng to allow the nginx worker to stop quickly
|
|
busted.subscribe({ 'exit' }, function()
|
|
shutdown_timers()
|
|
|
|
-- second return value must be `true`, or else all other callbacks for this
|
|
-- event will be skipped
|
|
return nil, true
|
|
end)
|
|
end
|
|
|
|
local BUSTED_EVENT_PATH = os.getenv("BUSTED_EVENT_PATH")
|
|
if BUSTED_EVENT_PATH then
|
|
-- needed before requiring 'socket.unix'
|
|
require 'socket'
|
|
|
|
local cjson = require 'cjson'
|
|
local socket_unix = require 'socket.unix'
|
|
|
|
-- Function to recursively copy a table, skipping keys associated with functions
|
|
local function copyTable(original, copied, cache, max_depth, current_depth)
|
|
copied = copied or {}
|
|
cache = cache or {}
|
|
max_depth = max_depth or 5
|
|
current_depth = current_depth or 1
|
|
|
|
if cache[original] then return cache[original] end
|
|
cache[original] = copied
|
|
|
|
for key, value in pairs(original) do
|
|
if type(value) == "table" then
|
|
if current_depth < max_depth then
|
|
copied[key] = copyTable(value, {}, cache, max_depth, current_depth + 1)
|
|
end
|
|
elseif type(value) == "userdata" then
|
|
copied[key] = tostring(value)
|
|
elseif type(value) ~= "function" then
|
|
copied[key] = value
|
|
end
|
|
end
|
|
|
|
return copied
|
|
end
|
|
|
|
local sock = assert(socket_unix())
|
|
assert(sock:connect(BUSTED_EVENT_PATH))
|
|
|
|
local events = {{ 'suite', 'reset' },
|
|
{ 'suite', 'start' },
|
|
{ 'suite', 'end' },
|
|
{ 'file', 'start' },
|
|
{ 'file', 'end' },
|
|
{ 'test', 'start' },
|
|
{ 'test', 'end' },
|
|
{ 'pending' },
|
|
{ 'failure', 'it' },
|
|
{ 'error', 'it' },
|
|
{ 'failure' },
|
|
{ 'error' }}
|
|
|
|
for _, event in ipairs(events) do
|
|
busted.subscribe(event, function (...)
|
|
local args = {}
|
|
for i, original in ipairs{...} do
|
|
if type(original) == "table" then
|
|
args[i] = copyTable(original)
|
|
elseif type(original) == "userdata" then
|
|
args[i] = tostring(original)
|
|
elseif type(original) ~= "function" then
|
|
args[i] = original
|
|
end
|
|
end
|
|
|
|
sock:send(cjson.encode({ event = event[1] .. (event[2] and ":" .. event[2] or ""), args = args }) .. "\n")
|
|
return nil, true --continue
|
|
end)
|
|
end
|
|
end
|