您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

590 行
27 KiB

14 年前
14 年前
14 年前
14 年前
14 年前
14 年前
14 年前
14 年前
14 年前
14 年前
14 年前
  1. %% Copyright (c) 2011 Basho Technologies, Inc. All Rights Reserved.
  2. %%
  3. %% This file is provided to you under the Apache License,
  4. %% Version 2.0 (the "License"); you may not use this file
  5. %% except in compliance with the License. You may obtain
  6. %% a copy of the License at
  7. %%
  8. %% http://www.apache.org/licenses/LICENSE-2.0
  9. %%
  10. %% Unless required by applicable law or agreed to in writing,
  11. %% software distributed under the License is distributed on an
  12. %% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  13. %% KIND, either express or implied. See the License for the
  14. %% specific language governing permissions and limitations
  15. %% under the License.
  16. -module(lager_test_backend).
  17. -include("lager.hrl").
  18. -behaviour(gen_event).
  19. -export([init/1, handle_call/2, handle_event/2, handle_info/2, terminate/2,
  20. code_change/3]).
  21. -record(state, {level, buffer, ignored}).
  22. -compile([{parse_transform, lager_transform}]).
  23. -ifdef(TEST).
  24. -include_lib("eunit/include/eunit.hrl").
  25. -endif.
  26. init(Level) ->
  27. {ok, #state{level=lager_util:level_to_num(Level), buffer=[], ignored=[]}}.
  28. handle_call(count, #state{buffer=Buffer} = State) ->
  29. {ok, length(Buffer), State};
  30. handle_call(count_ignored, #state{ignored=Ignored} = State) ->
  31. {ok, length(Ignored), State};
  32. handle_call(flush, State) ->
  33. {ok, ok, State#state{buffer=[], ignored=[]}};
  34. handle_call(pop, #state{buffer=Buffer} = State) ->
  35. case Buffer of
  36. [] ->
  37. {ok, undefined, State};
  38. [H|T] ->
  39. {ok, H, State#state{buffer=T}}
  40. end;
  41. handle_call(get_loglevel, #state{level=Level} = State) ->
  42. {ok, Level, State};
  43. handle_call({set_loglevel, Level}, State) ->
  44. {ok, ok, State#state{level=lager_util:level_to_num(Level)}};
  45. handle_call(_Request, State) ->
  46. {ok, ok, State}.
  47. handle_event({log, Level, Time, Message}, #state{level=LogLevel,
  48. buffer=Buffer} = State) when Level =< LogLevel ->
  49. {ok, State#state{buffer=Buffer ++ [{Level, Time, Message}]}};
  50. handle_event({log, _Level, _Time, _Message}, #state{ignored=Ignored} = State) ->
  51. {ok, State#state{ignored=Ignored ++ [ignored]}};
  52. handle_event(_Event, State) ->
  53. {ok, State}.
  54. handle_info(_Info, State) ->
  55. {ok, State}.
  56. terminate(_Reason, _State) ->
  57. ok.
  58. code_change(_OldVsn, State, _Extra) ->
  59. {ok, State}.
  60. -ifdef(TEST).
  61. pop() ->
  62. gen_event:call(lager_event, ?MODULE, pop).
  63. count() ->
  64. gen_event:call(lager_event, ?MODULE, count).
  65. count_ignored() ->
  66. gen_event:call(lager_event, ?MODULE, count_ignored).
  67. not_running_test() ->
  68. ?assertEqual({error, lager_not_running}, lager:log(info, wtf, "not running")).
  69. lager_test_() ->
  70. {foreach,
  71. fun setup/0,
  72. fun cleanup/1,
  73. [
  74. {"observe that there is nothing up my sleeve",
  75. fun() ->
  76. ?assertEqual(undefined, pop()),
  77. ?assertEqual(0, count())
  78. end
  79. },
  80. {"logging works",
  81. fun() ->
  82. lager:warning("test message"),
  83. ?assertEqual(1, count()),
  84. {Level, _Time, Message} = pop(),
  85. ?assertMatch(Level, lager_util:level_to_num(warning)),
  86. [LevelStr, _LocStr, MsgStr] = re:split(Message, " ", [{return, list}, {parts, 3}]),
  87. ?assertEqual("[warning]", LevelStr),
  88. ?assertEqual("test message", MsgStr),
  89. ok
  90. end
  91. },
  92. {"logging with arguments works",
  93. fun() ->
  94. lager:warning("test message ~p", [self()]),
  95. ?assertEqual(1, count()),
  96. {Level, _Time, Message} = pop(),
  97. ?assertMatch(Level, lager_util:level_to_num(warning)),
  98. [LevelStr, _LocStr, MsgStr] = re:split(Message, " ", [{return, list}, {parts, 3}]),
  99. ?assertEqual("[warning]", LevelStr),
  100. ?assertEqual(lists:flatten(io_lib:format("test message ~p", [self()])), MsgStr),
  101. ok
  102. end
  103. },
  104. {"logging works from inside a begin/end block",
  105. fun() ->
  106. ?assertEqual(0, count()),
  107. begin
  108. lager:warning("test message 2")
  109. end,
  110. ?assertEqual(1, count()),
  111. ok
  112. end
  113. },
  114. {"logging works from inside a list comprehension",
  115. fun() ->
  116. ?assertEqual(0, count()),
  117. [lager:warning("test message") || _N <- lists:seq(1, 10)],
  118. ?assertEqual(10, count()),
  119. ok
  120. end
  121. },
  122. {"logging works from a begin/end block inside a list comprehension",
  123. fun() ->
  124. ?assertEqual(0, count()),
  125. [ begin lager:warning("test message") end || _N <- lists:seq(1, 10)],
  126. ?assertEqual(10, count()),
  127. ok
  128. end
  129. },
  130. {"logging works from a nested list comprehension",
  131. fun() ->
  132. ?assertEqual(0, count()),
  133. [ [lager:warning("test message") || _N <- lists:seq(1, 10)] ||
  134. _I <- lists:seq(1, 10)],
  135. ?assertEqual(100, count()),
  136. ok
  137. end
  138. },
  139. {"log messages below the threshold are ignored",
  140. fun() ->
  141. ?assertEqual(0, count()),
  142. lager:debug("this message will be ignored"),
  143. ?assertEqual(0, count()),
  144. ?assertEqual(0, count_ignored()),
  145. lager_mochiglobal:put(loglevel, ?DEBUG),
  146. lager:debug("this message should be ignored"),
  147. ?assertEqual(0, count()),
  148. ?assertEqual(1, count_ignored()),
  149. lager:set_loglevel(?MODULE, debug),
  150. lager:debug("this message should be logged"),
  151. ?assertEqual(1, count()),
  152. ?assertEqual(1, count_ignored()),
  153. ?assertEqual(debug, lager:get_loglevel(?MODULE)),
  154. ok
  155. end
  156. }
  157. ]
  158. }.
  159. setup() ->
  160. error_logger:tty(false),
  161. application:load(lager),
  162. application:set_env(lager, handlers, [{?MODULE, info}]),
  163. application:set_env(lager, error_logger_redirect, false),
  164. application:start(lager),
  165. gen_event:call(lager_event, ?MODULE, flush).
  166. cleanup(_) ->
  167. application:stop(lager),
  168. application:unload(lager),
  169. error_logger:tty(true).
  170. crash(Type) ->
  171. spawn(fun() -> gen_server:call(crash, Type) end),
  172. timer:sleep(100).
  173. error_logger_redirect_crash_test_() ->
  174. {foreach,
  175. fun() ->
  176. error_logger:tty(false),
  177. application:load(lager),
  178. application:set_env(lager, error_logger_redirect, true),
  179. application:set_env(lager, handlers, [{?MODULE, error}]),
  180. application:start(lager),
  181. crash:start()
  182. end,
  183. fun(_) ->
  184. application:stop(lager),
  185. application:unload(lager),
  186. case whereis(crash) of
  187. undefined -> ok;
  188. Pid -> exit(Pid, kill)
  189. end,
  190. error_logger:tty(true)
  191. end,
  192. [
  193. {"again, there is nothing up my sleeve",
  194. fun() ->
  195. ?assertEqual(undefined, pop()),
  196. ?assertEqual(0, count())
  197. end
  198. },
  199. {"bad return value",
  200. fun() ->
  201. Pid = whereis(crash),
  202. crash(bad_return),
  203. {_, _, Msg} = pop(),
  204. Expected = lists:flatten(io_lib:format("[error] ~w gen_server crash terminated with reason: bad return value: bleh", [Pid])),
  205. ?assertEqual(Expected, lists:flatten(Msg))
  206. end
  207. },
  208. {"case clause",
  209. fun() ->
  210. Pid = whereis(crash),
  211. crash(case_clause),
  212. {_, _, Msg} = pop(),
  213. Expected = lists:flatten(io_lib:format("[error] ~w gen_server crash terminated with reason: no case clause matching {} in crash:handle_call/3", [Pid])),
  214. ?assertEqual(Expected, lists:flatten(Msg))
  215. end
  216. },
  217. {"function clause",
  218. fun() ->
  219. Pid = whereis(crash),
  220. crash(function_clause),
  221. {_, _, Msg} = pop(),
  222. Expected = lists:flatten(io_lib:format("[error] ~w gen_server crash terminated with reason: no function clause matching crash:function({})", [Pid])),
  223. ?assertEqual(Expected, lists:flatten(Msg))
  224. end
  225. },
  226. {"if clause",
  227. fun() ->
  228. Pid = whereis(crash),
  229. crash(if_clause),
  230. {_, _, Msg} = pop(),
  231. Expected = lists:flatten(io_lib:format("[error] ~w gen_server crash terminated with reason: no true branch found while evaluating if expression in crash:handle_call/3", [Pid])),
  232. ?assertEqual(Expected, lists:flatten(Msg))
  233. end
  234. },
  235. {"try clause",
  236. fun() ->
  237. Pid = whereis(crash),
  238. crash(try_clause),
  239. {_, _, Msg} = pop(),
  240. Expected = lists:flatten(io_lib:format("[error] ~w gen_server crash terminated with reason: no try clause matching [] in crash:handle_call/3", [Pid])),
  241. ?assertEqual(Expected, lists:flatten(Msg))
  242. end
  243. },
  244. {"undefined function",
  245. fun() ->
  246. Pid = whereis(crash),
  247. crash(undef),
  248. {_, _, Msg} = pop(),
  249. Expected = lists:flatten(io_lib:format("[error] ~w gen_server crash terminated with reason: call to undefined function crash:booger/0 from crash:handle_call/3", [Pid])),
  250. ?assertEqual(Expected, lists:flatten(Msg))
  251. end
  252. },
  253. {"bad math",
  254. fun() ->
  255. Pid = whereis(crash),
  256. crash(badarith),
  257. {_, _, Msg} = pop(),
  258. Expected = lists:flatten(io_lib:format("[error] ~w gen_server crash terminated with reason: bad arithmetic expression in crash:handle_call/3", [Pid])),
  259. ?assertEqual(Expected, lists:flatten(Msg))
  260. end
  261. },
  262. {"bad match",
  263. fun() ->
  264. Pid = whereis(crash),
  265. crash(badmatch),
  266. {_, _, Msg} = pop(),
  267. Expected = lists:flatten(io_lib:format("[error] ~w gen_server crash terminated with reason: no match of right hand value {} in crash:handle_call/3", [Pid])),
  268. ?assertEqual(Expected, lists:flatten(Msg))
  269. end
  270. },
  271. {"bad arity",
  272. fun() ->
  273. Pid = whereis(crash),
  274. crash(badarity),
  275. {_, _, Msg} = pop(),
  276. Expected = lists:flatten(io_lib:format("[error] ~w gen_server crash terminated with reason: fun called with wrong arity of 1 instead of 3 in crash:handle_call/3", [Pid])),
  277. ?assertEqual(Expected, lists:flatten(Msg))
  278. end
  279. },
  280. {"bad arg1",
  281. fun() ->
  282. Pid = whereis(crash),
  283. crash(badarg1),
  284. {_, _, Msg} = pop(),
  285. Expected = lists:flatten(io_lib:format("[error] ~w gen_server crash terminated with reason: bad argument in crash:handle_call/3", [Pid])),
  286. ?assertEqual(Expected, lists:flatten(Msg))
  287. end
  288. },
  289. {"bad arg2",
  290. fun() ->
  291. Pid = whereis(crash),
  292. crash(badarg2),
  293. {_, _, Msg} = pop(),
  294. Expected = lists:flatten(io_lib:format("[error] ~w gen_server crash terminated with reason: bad argument in call to erlang:iolist_to_binary([[102,111,111],bar]) in crash:handle_call/3", [Pid])),
  295. ?assertEqual(Expected, lists:flatten(Msg))
  296. end
  297. },
  298. {"noproc",
  299. fun() ->
  300. Pid = whereis(crash),
  301. crash(noproc),
  302. {_, _, Msg} = pop(),
  303. Expected = lists:flatten(io_lib:format("[error] ~w gen_server crash terminated with reason: no such process or port in call to gen_event:call(foo, bar, baz)", [Pid])),
  304. ?assertEqual(Expected, lists:flatten(Msg))
  305. end
  306. },
  307. {"badfun",
  308. fun() ->
  309. Pid = whereis(crash),
  310. crash(badfun),
  311. {_, _, Msg} = pop(),
  312. Expected = lists:flatten(io_lib:format("[error] ~w gen_server crash terminated with reason: bad function booger in crash:handle_call/3", [Pid])),
  313. ?assertEqual(Expected, lists:flatten(Msg))
  314. end
  315. }
  316. ]
  317. }.
  318. error_logger_redirect_test_() ->
  319. {foreach,
  320. fun() ->
  321. error_logger:tty(false),
  322. application:load(lager),
  323. application:set_env(lager, error_logger_redirect, true),
  324. application:set_env(lager, handlers, [{?MODULE, info}]),
  325. application:start(lager),
  326. timer:sleep(100),
  327. gen_event:call(lager_event, ?MODULE, flush)
  328. end,
  329. fun(_) ->
  330. application:stop(lager),
  331. application:unload(lager),
  332. error_logger:tty(true)
  333. end,
  334. [
  335. {"error reports are printed",
  336. fun() ->
  337. error_logger:error_report([{this, is}, a, {silly, format}]),
  338. timer:sleep(100),
  339. {_, _, Msg} = pop(),
  340. Expected = lists:flatten(io_lib:format("[error] ~w this: is, a, silly: format", [self()])),
  341. ?assertEqual(Expected, lists:flatten(Msg))
  342. end
  343. },
  344. {"string error reports are printed",
  345. fun() ->
  346. error_logger:error_report("this is less silly"),
  347. timer:sleep(100),
  348. {_, _, Msg} = pop(),
  349. Expected = lists:flatten(io_lib:format("[error] ~w this is less silly", [self()])),
  350. ?assertEqual(Expected, lists:flatten(Msg))
  351. end
  352. },
  353. {"error messages are printed",
  354. fun() ->
  355. error_logger:error_msg("doom, doom has come upon you all"),
  356. timer:sleep(100),
  357. {_, _, Msg} = pop(),
  358. Expected = lists:flatten(io_lib:format("[error] ~w doom, doom has come upon you all", [self()])),
  359. ?assertEqual(Expected, lists:flatten(Msg))
  360. end
  361. },
  362. {"info reports are printed",
  363. fun() ->
  364. error_logger:info_report([{this, is}, a, {silly, format}]),
  365. timer:sleep(100),
  366. {_, _, Msg} = pop(),
  367. Expected = lists:flatten(io_lib:format("[info] ~w this: is, a, silly: format", [self()])),
  368. ?assertEqual(Expected, lists:flatten(Msg))
  369. end
  370. },
  371. {"single term info reports are printed",
  372. fun() ->
  373. error_logger:info_report({foolish, bees}),
  374. timer:sleep(100),
  375. {_, _, Msg} = pop(),
  376. Expected = lists:flatten(io_lib:format("[info] ~w {foolish,bees}", [self()])),
  377. ?assertEqual(Expected, lists:flatten(Msg))
  378. end
  379. },
  380. {"single term error reports are printed",
  381. fun() ->
  382. error_logger:error_report({foolish, bees}),
  383. timer:sleep(100),
  384. {_, _, Msg} = pop(),
  385. Expected = lists:flatten(io_lib:format("[error] ~w {foolish,bees}", [self()])),
  386. ?assertEqual(Expected, lists:flatten(Msg))
  387. end
  388. },
  389. {"string info reports are printed",
  390. fun() ->
  391. error_logger:info_report("this is less silly"),
  392. timer:sleep(100),
  393. {_, _, Msg} = pop(),
  394. Expected = lists:flatten(io_lib:format("[info] ~w this is less silly", [self()])),
  395. ?assertEqual(Expected, lists:flatten(Msg))
  396. end
  397. },
  398. {"info messages are printed",
  399. fun() ->
  400. error_logger:info_msg("doom, doom has come upon you all"),
  401. timer:sleep(100),
  402. {_, _, Msg} = pop(),
  403. Expected = lists:flatten(io_lib:format("[info] ~w doom, doom has come upon you all", [self()])),
  404. ?assertEqual(Expected, lists:flatten(Msg))
  405. end
  406. },
  407. {"warning messages are printed at the correct level",
  408. fun() ->
  409. error_logger:warning_msg("doom, doom has come upon you all"),
  410. Map = error_logger:warning_map(),
  411. timer:sleep(100),
  412. {_, _, Msg} = pop(),
  413. Expected = lists:flatten(io_lib:format("[~w] ~w doom, doom has come upon you all", [Map, self()])),
  414. ?assertEqual(Expected, lists:flatten(Msg))
  415. end
  416. },
  417. {"warning reports are printed at the correct level",
  418. fun() ->
  419. error_logger:warning_report([{i, like}, pie]),
  420. Map = error_logger:warning_map(),
  421. timer:sleep(100),
  422. {_, _, Msg} = pop(),
  423. Expected = lists:flatten(io_lib:format("[~w] ~w i: like, pie", [Map, self()])),
  424. ?assertEqual(Expected, lists:flatten(Msg))
  425. end
  426. },
  427. {"single term warning reports are printed at the correct level",
  428. fun() ->
  429. error_logger:warning_report({foolish, bees}),
  430. Map = error_logger:warning_map(),
  431. timer:sleep(100),
  432. {_, _, Msg} = pop(),
  433. Expected = lists:flatten(io_lib:format("[~w] ~w {foolish,bees}", [Map, self()])),
  434. ?assertEqual(Expected, lists:flatten(Msg))
  435. end
  436. },
  437. {"application stop reports",
  438. fun() ->
  439. error_logger:info_report([{application, foo}, {exited, quittin_time}, {type, lazy}]),
  440. timer:sleep(100),
  441. {_, _, Msg} = pop(),
  442. Expected = lists:flatten(io_lib:format("[info] ~w Application foo exited with reason: quittin_time", [self()])),
  443. ?assertEqual(Expected, lists:flatten(Msg))
  444. end
  445. },
  446. {"supervisor reports",
  447. fun() ->
  448. error_logger:error_report(supervisor_report, [{errorContext, france}, {offender, [{name, mini_steve}, {mfargs, {a, b, [c]}}, {pid, bleh}]}, {reason, fired}, {supervisor, {local, steve}}]),
  449. timer:sleep(100),
  450. {_, _, Msg} = pop(),
  451. Expected = lists:flatten(io_lib:format("[error] ~w Supervisor steve had child mini_steve started with a:b(c) at bleh exit with reason fired in context france", [self()])),
  452. ?assertEqual(Expected, lists:flatten(Msg))
  453. end
  454. },
  455. {"supervisor_bridge reports",
  456. fun() ->
  457. error_logger:error_report(supervisor_report, [{errorContext, france}, {offender, [{mod, mini_steve}, {pid, bleh}]}, {reason, fired}, {supervisor, {local, steve}}]),
  458. timer:sleep(100),
  459. {_, _, Msg} = pop(),
  460. Expected = lists:flatten(io_lib:format("[error] ~w Supervisor steve had child at module mini_steve at bleh exit with reason fired in context france", [self()])),
  461. ?assertEqual(Expected, lists:flatten(Msg))
  462. end
  463. },
  464. {"application progress report",
  465. fun() ->
  466. error_logger:info_report(progress, [{application, foo}, {started_at, node()}]),
  467. timer:sleep(100),
  468. {_, _, Msg} = pop(),
  469. Expected = lists:flatten(io_lib:format("[info] ~w Application foo started on node ~w", [self(), node()])),
  470. ?assertEqual(Expected, lists:flatten(Msg))
  471. end
  472. },
  473. {"supervisor progress report",
  474. fun() ->
  475. lager:set_loglevel(?MODULE, debug),
  476. error_logger:info_report(progress, [{supervisor, {local, foo}}, {started, [{mfargs, {foo, bar, 1}}, {pid, baz}]}]),
  477. timer:sleep(100),
  478. {_, _, Msg} = pop(),
  479. Expected = lists:flatten(io_lib:format("[debug] ~w Supervisor foo started foo:bar/1 at pid baz", [self()])),
  480. ?assertEqual(Expected, lists:flatten(Msg))
  481. end
  482. },
  483. {"crash report for emfile",
  484. fun() ->
  485. error_logger:error_report(crash_report, [[{pid, self()}, {error_info, {error, {emfile, [{stack, trace, 1}]}, []}}], []]),
  486. timer:sleep(100),
  487. {_, _, Msg} = pop(),
  488. Expected = lists:flatten(io_lib:format("[error] ~w CRASH REPORT Process ~w with 0 neighbours crashed with reason: maximum number of file descriptors exhausted, check ulimit -n", [self(), self()])),
  489. ?assertEqual(Expected, lists:flatten(Msg))
  490. end
  491. },
  492. {"crash report for system process limit",
  493. fun() ->
  494. error_logger:error_report(crash_report, [[{pid, self()}, {error_info, {error, {system_limit, [{erlang, spawn, 1}]}, []}}], []]),
  495. timer:sleep(100),
  496. {_, _, Msg} = pop(),
  497. Expected = lists:flatten(io_lib:format("[error] ~w CRASH REPORT Process ~w with 0 neighbours crashed with reason: system limit: maximum number of processes exceeded", [self(), self()])),
  498. ?assertEqual(Expected, lists:flatten(Msg))
  499. end
  500. },
  501. {"crash report for system process limit2",
  502. fun() ->
  503. error_logger:error_report(crash_report, [[{pid, self()}, {error_info, {error, {system_limit, [{erlang, spawn_opt, 1}]}, []}}], []]),
  504. timer:sleep(100),
  505. {_, _, Msg} = pop(),
  506. Expected = lists:flatten(io_lib:format("[error] ~w CRASH REPORT Process ~w with 0 neighbours crashed with reason: system limit: maximum number of processes exceeded", [self(), self()])),
  507. ?assertEqual(Expected, lists:flatten(Msg))
  508. end
  509. },
  510. {"crash report for system port limit",
  511. fun() ->
  512. error_logger:error_report(crash_report, [[{pid, self()}, {error_info, {error, {system_limit, [{erlang, open_port, 1}]}, []}}], []]),
  513. timer:sleep(100),
  514. {_, _, Msg} = pop(),
  515. Expected = lists:flatten(io_lib:format("[error] ~w CRASH REPORT Process ~w with 0 neighbours crashed with reason: system limit: maximum number of ports exceeded", [self(), self()])),
  516. ?assertEqual(Expected, lists:flatten(Msg))
  517. end
  518. },
  519. {"crash report for system port limit",
  520. fun() ->
  521. error_logger:error_report(crash_report, [[{pid, self()}, {error_info, {error, {system_limit, [{erlang, list_to_atom, 1}]}, []}}], []]),
  522. timer:sleep(100),
  523. {_, _, Msg} = pop(),
  524. Expected = lists:flatten(io_lib:format("[error] ~w CRASH REPORT Process ~w with 0 neighbours crashed with reason: system limit: tried to create an atom larger than 255, or maximum atom count exceeded", [self(), self()])),
  525. ?assertEqual(Expected, lists:flatten(Msg))
  526. end
  527. },
  528. {"crash report for system ets table limit",
  529. fun() ->
  530. error_logger:error_report(crash_report, [[{pid, self()}, {error_info, {error, {system_limit,[{ets,new,[segment_offsets,[ordered_set,public]]},{mi_segment,open_write,1},{mi_buffer_converter,handle_cast,2},{gen_server,handle_msg,5},{proc_lib,init_p_do_apply,3}]}, []}}], []]),
  531. timer:sleep(100),
  532. {_, _, Msg} = pop(),
  533. Expected = lists:flatten(io_lib:format("[error] ~w CRASH REPORT Process ~w with 0 neighbours crashed with reason: system limit: maximum number of ETS tables exceeded", [self(), self()])),
  534. ?assertEqual(Expected, lists:flatten(Msg))
  535. end
  536. },
  537. {"messages should not be generated if they don't satisfy the threshold",
  538. fun() ->
  539. lager:set_loglevel(?MODULE, error),
  540. error_logger:info_report([hello, world]),
  541. timer:sleep(100),
  542. ?assertEqual(0, count()),
  543. ?assertEqual(0, count_ignored()),
  544. lager:set_loglevel(?MODULE, info),
  545. error_logger:info_report([hello, world]),
  546. timer:sleep(100),
  547. ?assertEqual(1, count()),
  548. ?assertEqual(0, count_ignored()),
  549. lager:set_loglevel(?MODULE, error),
  550. lager_mochiglobal:put(loglevel, ?DEBUG),
  551. error_logger:info_report([hello, world]),
  552. timer:sleep(100),
  553. ?assertEqual(1, count()),
  554. ?assertEqual(1, count_ignored())
  555. end
  556. }
  557. ]
  558. }.
  559. -endif.