rewrite from lager
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
5.5 KiB

4 years ago
  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. -define(TEST_SINK_NAME, '__lager_test_sink'). %% <-- used by parse transform
  7. -define(TEST_SINK_EVENT, '__lager_test_sink_lager_event'). %% <-- used by lager API calls and internals for gen_event
  8. overload_test_() ->
  9. {timeout, 60,
  10. fun() ->
  11. application:stop(lager),
  12. application:load(lager),
  13. Delay = 1000, % sleep 1 sec on every log
  14. KillerHWM = 10, % kill the manager if there are more than 10 pending logs
  15. KillerReinstallAfter = 1000, % reinstall killer after 1 sec
  16. application:set_env(lager, handlers, [{lager_slow_backend, [{delay, Delay}]}]),
  17. application:set_env(lager, async_threshold, undefined),
  18. application:set_env(lager, error_logger_redirect, true),
  19. application:set_env(lager, killer_hwm, KillerHWM),
  20. application:set_env(lager, killer_reinstall_after, KillerReinstallAfter),
  21. ensure_started(lager),
  22. lager_config:set(async, true),
  23. Manager = whereis(lager_event),
  24. erlang:trace(all, true, [procs]),
  25. [lager:info("~p'th message", [N]) || N <- lists:seq(1,KillerHWM+2)],
  26. Margin = 100,
  27. ok = confirm_manager_exit(Manager, Delay+Margin),
  28. ok = confirm_sink_reregister(lager_event, Margin),
  29. erlang:trace(all, false, [procs]),
  30. wait_until(fun() ->
  31. case proplists:get_value(lager_manager_killer, gen_event:which_handlers(lager_event)) of
  32. [] -> false;
  33. _ -> true
  34. end
  35. end, Margin, 15),
  36. wait_until(fun() ->
  37. case gen_event:call(lager_event, lager_manager_killer, get_settings) of
  38. [KillerHWM, KillerReinstallAfter] -> true;
  39. _Other -> false
  40. end
  41. end, Margin, 15),
  42. application:stop(lager)
  43. end}.
  44. overload_alternate_sink_test_() ->
  45. {timeout, 60,
  46. fun() ->
  47. application:stop(lager),
  48. application:load(lager),
  49. Delay = 1000, % sleep 1 sec on every log
  50. KillerHWM = 10, % kill the manager if there are more than 10 pending logs
  51. KillerReinstallAfter = 1000, % reinstall killer after 1 sec
  52. application:set_env(lager, handlers, []),
  53. application:set_env(lager, extra_sinks, [{?TEST_SINK_EVENT, [
  54. {handlers, [{lager_slow_backend, [{delay, Delay}]}]},
  55. {killer_hwm, KillerHWM},
  56. {killer_reinstall_after, KillerReinstallAfter},
  57. {async_threshold, undefined}
  58. ]}]),
  59. application:set_env(lager, error_logger_redirect, true),
  60. ensure_started(lager),
  61. lager_config:set({?TEST_SINK_EVENT, async}, true),
  62. Manager = whereis(?TEST_SINK_EVENT),
  63. erlang:trace(all, true, [procs]),
  64. [?TEST_SINK_NAME:info("~p'th message", [N]) || N <- lists:seq(1,KillerHWM+2)],
  65. Margin = 100,
  66. ok = confirm_manager_exit(Manager, Delay+Margin),
  67. ok = confirm_sink_reregister(?TEST_SINK_EVENT, Margin),
  68. erlang:trace(all, false, [procs]),
  69. wait_until(fun() ->
  70. case proplists:get_value(lager_manager_killer, gen_event:which_handlers(?TEST_SINK_EVENT)) of
  71. [] -> false;
  72. _ -> true
  73. end
  74. end, Margin, 15),
  75. wait_until(fun() ->
  76. case gen_event:call(?TEST_SINK_EVENT, lager_manager_killer, get_settings) of
  77. [KillerHWM, KillerReinstallAfter] -> true;
  78. _Other -> false
  79. end
  80. end, Margin, 15),
  81. application:stop(lager)
  82. end}.
  83. ensure_started(App) ->
  84. case application:start(App) of
  85. ok ->
  86. ok;
  87. {error, {not_started, Dep}} ->
  88. ensure_started(Dep),
  89. ensure_started(App)
  90. end.
  91. confirm_manager_exit(Manager, Delay) ->
  92. receive
  93. {trace, Manager, exit, killed} ->
  94. ?debugFmt("Manager ~p killed", [Manager]);
  95. Other ->
  96. ?debugFmt("OTHER MSG: ~p", [Other]),
  97. confirm_manager_exit(Manager, Delay)
  98. after Delay ->
  99. ?assert(false)
  100. end.
  101. confirm_sink_reregister(Sink, Delay) ->
  102. receive
  103. {trace, _Pid, register, Sink} ->
  104. ?assertNot(lists:member(lager_manager_killer, gen_event:which_handlers(Sink)))
  105. after Delay ->
  106. ?assert(false)
  107. end.
  108. wait_until(_Fun, _Delay, 0) ->
  109. {error, too_many_retries};
  110. wait_until(Fun, Delay, Retries) ->
  111. case Fun() of
  112. true -> ok;
  113. false -> timer:sleep(Delay), wait_until(Fun, Delay, Retries-1)
  114. end.
  115. -endif.