diff --git a/src/error_logger_lager_h.erl b/src/error_logger_lager_h.erl index a3613e2..ef4c4e9 100644 --- a/src/error_logger_lager_h.erl +++ b/src/error_logger_lager_h.erl @@ -207,6 +207,9 @@ log_event(Event, #state{sink=Sink} = State) -> [TName, _Msg, TStateName, _StateData, TReason] -> {gen_fsm, TName, TStateName, TReason}; [TName, _Msg, {TStateName, _StateData}, _ExitType, TReason, _FsmType, Stacktrace] -> + {gen_statem, TName, TStateName, {TReason, Stacktrace}}; + [TName, _Msg, [{TStateName, _StateData}], _ExitType, TReason, _FsmType, Stacktrace] -> + %% sometimes gen_statem wraps its statename/data in a list for some reason??? {gen_statem, TName, TStateName, {TReason, Stacktrace}} end, {Md, Formatted} = format_reason_md(Reason), diff --git a/test/crash_statem.erl b/test/crash_statem.erl index a6216d8..7184a18 100644 --- a/test/crash_statem.erl +++ b/test/crash_statem.erl @@ -6,6 +6,8 @@ -export([ start/0, crash/0, + stop/1, + timeout/0, handle_event/4 ]). @@ -17,6 +19,12 @@ start() -> crash() -> gen_statem:call(?MODULE, boom). +stop(Reason) -> + gen_statem:call(?MODULE, {stop, Reason}). + +timeout() -> + gen_statem:call(?MODULE, timeout). + %% Mandatory callback functions terminate(_Reason, _State, _Data) -> ok. code_change(_Vsn, State, Data, _Extra) -> {ok,State,Data}. @@ -26,12 +34,17 @@ init([]) -> "8.0" -> {callback_mode(),state1,undefined}; _ -> {ok, state1, undefined} end. + callback_mode() -> handle_event_function. %%% state callback(s) -handle_event({call, _From}, state1, _Arg, Data) -> - {next_state, state1, Data}. +handle_event(state_timeout, timeout, state1, _) -> + {stop, timeout}; +handle_event({call, _From}, timeout, _Arg, Data) -> + {keep_state_and_data, [{state_timeout, 0, timeout}]}; +handle_event({call, _From}, {stop, Reason}, state1, Data) -> + {stop, Reason}. -else. -export([start/0, crash/0]). diff --git a/test/lager_test_backend.erl b/test/lager_test_backend.erl index fe79aee..6aafc48 100644 --- a/test/lager_test_backend.erl +++ b/test/lager_test_backend.erl @@ -996,14 +996,14 @@ kill_crasher(RegName) -> Pid -> exit(Pid, kill) end. -spawn_fsm_crash(Module) -> - spawn(fun() -> Module:crash() end), +spawn_fsm_crash(Module, Function, Args) -> + spawn(fun() -> erlang:apply(Module, Function, Args) end), timer:sleep(100), _ = gen_event:which_handlers(error_logger), ok. crash_fsm_test_() -> - TestBody = fun(Name, FsmModule, Expected) -> + TestBody = fun(Name, FsmModule, FSMFunc, FSMArgs, Expected) -> fun(Sink) -> {Name, fun() -> @@ -1011,7 +1011,7 @@ crash_fsm_test_() -> {true, true} -> ok; _ -> Pid = whereis(FsmModule), - spawn_fsm_crash(FsmModule), + spawn_fsm_crash(FsmModule, FSMFunc, FSMArgs), {Level, _, Msg, Metadata} = pop(Sink), test_body(Expected, lists:flatten(Msg)), ?assertEqual(Pid, proplists:get_value(pid, Metadata)), @@ -1031,8 +1031,10 @@ crash_fsm_test_() -> } end, - TestBody("gen_fsm crash", crash_fsm, "gen_fsm crash_fsm in state state1 terminated with reason: call to undefined function crash_fsm:state1/3 from gen_fsm:handle_msg/"), - TestBody("gen_statem crash", crash_statem, "gen_statem crash_statem in state state1 terminated with reason: no function clause matching crash_statem:handle") + TestBody("gen_fsm crash", crash_fsm, crash, [], "gen_fsm crash_fsm in state state1 terminated with reason: call to undefined function crash_fsm:state1/3 from gen_fsm:handle_msg/"), + TestBody("gen_statem crash", crash_statem, crash, [], "gen_statem crash_statem in state state1 terminated with reason: no function clause matching crash_statem:handle"), + TestBody("gen_statem stop", crash_statem, stop, [explode], "gen_statem crash_statem in state state1 terminated with reason: explode"), + TestBody("gen_statem timeout", crash_statem, timeout, [], "gen_statem crash_statem in state state1 terminated with reason: timeout") ], {"FSM crash output tests", [