|
|
- -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.
|