mirror of https://github.com/rspamd/rspamd.git
Rapid spam filtering system
https://rspamd.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.4 KiB
46 lines
1.4 KiB
--[[
|
|
-- This should be the very first file executed during a test
|
|
-- otherwise coverage will be partly missed
|
|
--]]
|
|
local logger = require "rspamd_logger"
|
|
local mempool = require "rspamd_mempool"
|
|
local loaded, luacov = pcall(require, 'luacov.runner')
|
|
if not loaded then
|
|
logger.errx('luacov is not loaded, will not collect coverage')
|
|
return
|
|
end
|
|
|
|
luacov.init()
|
|
|
|
local pool = mempool.create()
|
|
-- we don't need the pool, we need userdata to put __gc() on it
|
|
-- __gc() is not called for tables, that't why there is such trick
|
|
-- so, we are free to clean memory, let's do this :)
|
|
pool:destroy()
|
|
|
|
local woker_name
|
|
|
|
rspamd_config:add_on_load(function(cfg, ev_base, worker)
|
|
woker_name = worker:get_name()
|
|
local stats_path = rspamd_paths["DBDIR"] .. '/' .. woker_name .. '.luacov.stats.out'
|
|
local config = luacov.load_config()
|
|
config.statsfile = stats_path
|
|
end)
|
|
|
|
-- use global variable to prevent the object from being GC'ed too early
|
|
__GLOBAL_COVERAGE_WATCHDOG = {pool = pool}
|
|
|
|
local mt = {
|
|
__gc = function()
|
|
--[[
|
|
-- We could've used finish_script but in that case some coverage would be missed:
|
|
-- pool destructors are executed after finish_scripts (when Lua state is terminated and that's
|
|
-- how we can collect coverage of cove executed there
|
|
--]]
|
|
if woker_name then
|
|
luacov.shutdown()
|
|
end
|
|
end
|
|
}
|
|
|
|
debug.setmetatable(__GLOBAL_COVERAGE_WATCHDOG.pool, mt)
|