86 lines
2.3 KiB
Lua
86 lines
2.3 KiB
Lua
local busted_runner
|
|
do
|
|
-- avoid warning during test runs caused by
|
|
-- https://github.com/openresty/lua-nginx-module/blob/2524330e59f0a385a9c77d4d1b957476dce7cb33/src/ngx_http_lua_util.c#L810
|
|
|
|
local traceback = require "debug".traceback
|
|
|
|
setmetatable(_G, { __newindex = function(table, key, value) rawset(table, key, value) end })
|
|
busted_runner = require "busted.runner"
|
|
|
|
-- if there's more constants need to be whitelisted for test runs, add here.
|
|
local GLOBALS_ALLOWED_IN_TEST = {
|
|
helpers = true,
|
|
require_without_cache = true,
|
|
reset_ngx = true,
|
|
}
|
|
local newindex = function(table, key, value)
|
|
rawset(table, key, value)
|
|
|
|
local phase = ngx.get_phase()
|
|
if phase == "init_worker" or phase == "init" then
|
|
return
|
|
end
|
|
|
|
-- we check only timer phase because resty-cli runs everything in timer phase
|
|
if phase == "timer" and GLOBALS_ALLOWED_IN_TEST[key] then
|
|
return
|
|
end
|
|
|
|
local message = "writing a global lua variable " .. key ..
|
|
" which may lead to race conditions between concurrent requests, so prefer the use of 'local' variables " .. traceback('', 2)
|
|
-- it's important to do print here because ngx.log is mocked below
|
|
print(message)
|
|
end
|
|
setmetatable(_G, { __newindex = newindex })
|
|
end
|
|
|
|
_G.helpers = require("test.helpers")
|
|
|
|
local ffi = require("ffi")
|
|
local lua_ingress = require("lua_ingress")
|
|
|
|
-- without this we get errors such as "attempt to redefine XXX"
|
|
local old_cdef = ffi.cdef
|
|
local exists = {}
|
|
ffi.cdef = function(def)
|
|
if exists[def] then
|
|
return
|
|
end
|
|
exists[def] = true
|
|
return old_cdef(def)
|
|
end
|
|
|
|
local old_udp = ngx.socket.udp
|
|
ngx.socket.udp = function(...)
|
|
local socket = old_udp(...)
|
|
socket.send = function(...)
|
|
error("ngx.socket.udp:send please mock this to use in tests")
|
|
end
|
|
return socket
|
|
end
|
|
|
|
local old_tcp = ngx.socket.tcp
|
|
ngx.socket.tcp = function(...)
|
|
local socket = old_tcp(...)
|
|
socket.send = function(...)
|
|
error("ngx.socket.tcp:send please mock this to use in tests")
|
|
end
|
|
return socket
|
|
end
|
|
|
|
ngx.log = function(...) end
|
|
ngx.print = function(...) end
|
|
local original_ngx = ngx
|
|
_G.reset_ngx = function()
|
|
ngx = original_ngx
|
|
end
|
|
|
|
_G.require_without_cache = function(module)
|
|
package.loaded[module] = nil
|
|
return require(module)
|
|
end
|
|
|
|
lua_ingress.init_worker()
|
|
|
|
busted_runner({ standalone = false })
|