選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

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