Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

82 строки
3.0 KiB

  1. -module(lager_manager_killer_test).
  2. -author("Sungjin Park <jinni.park@gmail.com>").
  3. -compile([{parse_transform, lager_transform}]).
  4. -ifdef(TEST).
  5. -include_lib("eunit/include/eunit.hrl").
  6. overload_test_() ->
  7. {timeout, 60,
  8. fun() ->
  9. application:stop(lager),
  10. application:load(lager),
  11. Delay = 1000, % sleep 1 sec on every log
  12. KillerHWM = 10, % kill the manager if there are more than 10 pending logs
  13. KillerReinstallAfter = 1000, % reinstall killer after 1 sec
  14. application:set_env(lager, handlers, [{lager_slow_backend, [{delay, Delay}]}]),
  15. application:set_env(lager, async_threshold, undefined),
  16. application:set_env(lager, error_logger_redirect, true),
  17. application:set_env(lager, killer_hwm, KillerHWM),
  18. application:set_env(lager, killer_reinstall_after, KillerReinstallAfter),
  19. ensure_started(lager),
  20. lager_config:set(async, true),
  21. Manager = whereis(lager_event),
  22. erlang:trace(all, true, [procs]),
  23. [lager:info("~p'th message", [N]) || N <- lists:seq(1,KillerHWM+2)],
  24. Margin = 100,
  25. ok = confirm_manager_exit(Manager, Delay+Margin),
  26. ok = confirm_sink_reregister(Margin),
  27. erlang:trace(all, false, [procs]),
  28. wait_until(fun() ->
  29. case proplists:get_value(lager_manager_killer, gen_event:which_handlers(lager_event)) of
  30. [] -> false;
  31. _ -> true
  32. end
  33. end, Margin, 15),
  34. wait_until(fun() ->
  35. case gen_event:call(lager_event, lager_manager_killer, get_settings) of
  36. [KillerHWM, KillerReinstallAfter] -> true;
  37. _Other -> false
  38. end
  39. end, Margin, 15),
  40. application:stop(lager)
  41. end}.
  42. ensure_started(App) ->
  43. case application:start(App) of
  44. ok ->
  45. ok;
  46. {error, {not_started, Dep}} ->
  47. ensure_started(Dep),
  48. ensure_started(App)
  49. end.
  50. confirm_manager_exit(Manager, Delay) ->
  51. receive
  52. {trace, Manager, exit, killed} ->
  53. ?debugFmt("Manager ~p killed", [Manager]);
  54. Other ->
  55. ?debugFmt("OTHER MSG: ~p", [Other]),
  56. confirm_manager_exit(Manager, Delay)
  57. after Delay ->
  58. ?assert(false)
  59. end.
  60. confirm_sink_reregister(Delay) ->
  61. receive
  62. {trace, _Pid, register, lager_event} ->
  63. ?assertNot(lists:member(lager_manager_killer, gen_event:which_handlers(lager_event)))
  64. after Delay ->
  65. ?assert(false)
  66. end.
  67. wait_until(_Fun, _Delay, 0) ->
  68. {error, too_many_retries};
  69. wait_until(Fun, Delay, Retries) ->
  70. case Fun() of
  71. true -> ok;
  72. false -> timer:sleep(Delay), wait_until(Fun, Delay, Retries-1)
  73. end.
  74. -endif.