-module(lager_trace_test). -compile([{parse_transform, lager_transform}]). -ifdef(TEST). -include_lib("eunit/include/eunit.hrl"). % Our expectation is that the first log entry will appear so we won't actually % wait out ?FIRST_LOG_ENTRY_TIMEOUT. On the other hand, the second log entry is % expected never to arrive, so the test will wait out ?SECOND_LOG_ENTRY_TIMEOUT; % that's why it is shorter. -define(FIRST_LOG_ENTRY_TIMEOUT, (10 * 1000)). % 10 seconds -define(SECOND_LOG_ENTRY_TIMEOUT, 1000). % 1 second -define(FNAME, "test/test1.log"). trace_test_() -> {timeout, 10, {foreach, fun() -> file:write_file(?FNAME, ""), error_logger:tty(false), application:load(lager), application:set_env(lager, log_root, "test"), application:set_env(lager, handlers, [{lager_file_backend, [{file, "test1.log"}, {level, none}, {formatter, lager_default_formatter}, {formatter_config, [message, "\n"]} ]}]), application:set_env(lager, traces, [{{lager_file_backend, "test1.log"}, [{tag, mytag}], info}]), application:set_env(lager, error_logger_redirect, false), application:set_env(lager, async_threshold, undefined), lager:start() end, fun(_) -> file:delete(?FNAME), application:stop(lager), application:stop(goldrush), application:unset_env(lager, log_root), application:unset_env(lager, handlers), application:unset_env(lager, traces), application:unset_env(lager, error_logger_redirect), application:unset_env(lager, async_threshold), error_logger:tty(true) end, [{"Trace combined with log_root", fun() -> lager:info([{tag, mytag}], "Test message"), % Wait until we have the expected log entry in the log file. case wait_until(fun() -> count_lines(?FNAME) >= 1 end, ?FIRST_LOG_ENTRY_TIMEOUT) of ok -> ok; {error, timeout} -> throw({file_empty, file:read_file(?FNAME)}) end, % Let's wait a little to see that we don't get a duplicate log % entry. case wait_until(fun() -> count_lines(?FNAME) >= 2 end, ?SECOND_LOG_ENTRY_TIMEOUT) of ok -> throw({too_many_entries, file:read_file(?FNAME)}); {error, timeout} -> ok end end} ]}}. % Wait until Fun() returns true. wait_until(Fun, Timeout) -> wait_until(Fun, Timeout, {8, 13}). wait_until(_Fun, Timeout, {T1, _}) when T1 > Timeout -> {error, timeout}; wait_until(Fun, Timeout, {T1, T2}) -> case Fun() of true -> ok; false -> timer:sleep(T1), wait_until(Fun, Timeout, {T2, T1 + T2}) end. % Return the number of lines in a file. Return 0 for a non-existent file. count_lines(Filename) -> case file:read_file(Filename) of {ok, Content} -> Lines = binary:split(Content, <<"\n">>, [global, trim]), length(Lines); {error, _} -> 0 end. -endif.