Current section
Files
Jump to
Current section
Files
src/test_progress_logger.erl
%% Copyright 2020 relayr GmbH
%% @doc A wrapper to 'eunit_progress' that configures custom logger.
-module(test_progress_logger).
-behaviour(eunit_listener).
-export([
start/0,
start/1
]).
%% eunit_listener callbacks
-export([
init/1,
handle_begin/3,
handle_end/3,
handle_cancel/3,
terminate/2
]).
-define(DEFAULT_HANDLER_MODULE, logger_std_h).
-define(HANDLER_NAME, default).
-define(EUNIT_PROGRESS_OPTIONS, [colored, profile]).
%% Startup
start() ->
start(#{}).
start(Options) ->
EunitProgressOptions = maps:get(eunit_progress, Options, ?EUNIT_PROGRESS_OPTIONS),
HandlerConfig = maps:get(handler_config, Options, #{}),
HandlerModule = maps:get(module, HandlerConfig, ?DEFAULT_HANDLER_MODULE),
Level = maps:get(level, HandlerConfig, all),
UpdatedHandlerConfig = maps:merge(#{
level => Level,
formatter => {logger_formatter,
#{
%% default log format is:
%% 2020-02-04T09:36:22.115931+01:00 [info] test_module:call/3 <0.315.0> msg - call request
template => [time," [",level,"] ",mfa, " ", pid, " ",msg,"\n"],
single_line => false
}
}
}, HandlerConfig),
% update default logger configuration
ok = logger:update_primary_config(#{level => Level}),
ok = logger:remove_handler(?HANDLER_NAME),
ok = logger:add_handler(?HANDLER_NAME, HandlerModule, UpdatedHandlerConfig),
% start tracing unit test progress
eunit_listener:start(?MODULE, EunitProgressOptions).
%%------------------------------------------
%% eunit_listener callbacks
%%------------------------------------------
init(Options) ->
eunit_progress:init(Options).
handle_begin(Type = test, Data, St) ->
{Module, Function, Arity} = proplists:get_value(source, Data),
logger:info("~n~n~s BEGIN ~p:~p/~p ~s", [sep(), Module, Function, Arity, sep()]),
eunit_progress:handle_begin(Type, Data, St);
handle_begin(Type, Data, St) ->
eunit_progress:handle_begin(Type, Data, St).
handle_end(Type = test, Data, St) ->
{Module, Function, Arity} = proplists:get_value(source, Data),
logger:info("~n~s END ~p:~p/~p ~s~n", [sep(), Module, Function, Arity, sep()]),
eunit_progress:handle_end(Type, Data, St);
handle_end(Type, Data, St) ->
eunit_progress:handle_end(Type, Data, St).
handle_cancel(Type, Data, St) ->
eunit_progress:handle_cancel(Type, Data, St).
terminate(Result, St) ->
% write buffer with logs to disk file (applicable only if default handler module 'logger_std_h' is used)
ok = logger_h_common:filesync(?DEFAULT_HANDLER_MODULE, ?HANDLER_NAME),
eunit_progress:terminate(Result, St).
%%------------------------------------------
%% local functions
%%------------------------------------------
sep() ->
"================================".