12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- --[[
- -- 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)
|