From bedb0de46685241cedaad05165ad65e60a25da60 Mon Sep 17 00:00:00 2001
From: Peter Andersson <peppe@erlang.org>
Date: Fri, 2 Mar 2012 11:34:54 +0100
Subject: Fix problem with handling error_logger events

OTP-9941
OTP-9955
---
 lib/common_test/src/cth_log_redirect.erl |  5 ++--
 lib/test_server/src/test_server_ctrl.erl |  7 ++++-
 lib/test_server/src/test_server_h.erl    | 44 +++++++++++++++++++++-----------
 3 files changed, 38 insertions(+), 18 deletions(-)

(limited to 'lib')

diff --git a/lib/common_test/src/cth_log_redirect.erl b/lib/common_test/src/cth_log_redirect.erl
index 14663b7738..b2faa0fcb5 100644
--- a/lib/common_test/src/cth_log_redirect.erl
+++ b/lib/common_test/src/cth_log_redirect.erl
@@ -31,7 +31,7 @@
 %% Event handler Callbacks
 -export([init/1,
 	 handle_event/2, handle_call/2, handle_info/2,
-	 terminate/2]).
+	 terminate/1]).
 
 id(_Opts) ->
     ?MODULE.
@@ -101,7 +101,8 @@ handle_call({set_logfunc,NewLogFunc},_) ->
     {ok, NewLogFunc, NewLogFunc};
 handle_call(_Query, _State) -> {error, bad_query}.
 
-terminate(_Reason, _Type) ->
+terminate(_State) ->
+    error_logger:delete_report_handler(?MODULE),
     [].
 
 tag_event(Event) ->
diff --git a/lib/test_server/src/test_server_ctrl.erl b/lib/test_server/src/test_server_ctrl.erl
index 3432b3bc8e..3bea9e39ee 100644
--- a/lib/test_server/src/test_server_ctrl.erl
+++ b/lib/test_server/src/test_server_ctrl.erl
@@ -1301,7 +1301,12 @@ terminate(_Reason, State) ->
     end,
     kill_all_jobs(State#state.jobs),
     test_server_node:stop(State#state.target_info),
-    test_server_h:restore(),
+    case lists:keysearch(sasl, 1, application:which_applications()) of
+	{value,_} ->
+	    test_server_h:restore();
+	_ ->
+	    ok
+    end,
     ok.
 
 kill_all_jobs([{_Name,JobPid}|Jobs]) ->
diff --git a/lib/test_server/src/test_server_h.erl b/lib/test_server/src/test_server_h.erl
index e423863b99..6707f98109 100644
--- a/lib/test_server/src/test_server_h.erl
+++ b/lib/test_server/src/test_server_h.erl
@@ -79,10 +79,21 @@ set_group_leader() ->
 handle_event({_Type, GL, _Msg}, State) when node(GL)/=node() ->
     {ok, State};
 handle_event({Tag, _GL, {_Pid, Type, _Report}} = Event, State) ->
-    case report(Tag, Type) of
-	sasl ->
-	    tag(State#state.testcase),
-	    sasl_report_tty_h:handle_event(Event, State#state.sasl);
+    SASL = lists:keyfind(sasl, 1, application:which_applications()),
+    case report_receiver(Tag, Type) of
+	sasl when SASL /= false ->
+	    {ok,ErrLogType} = application:get_env(sasl, errlog_type),
+	    SReport = sasl_report:format_report(group_leader(), ErrLogType,
+						tag_event(Event)),
+	    if is_list(SReport) ->
+		    tag(State#state.testcase),
+		    sasl_report_tty_h:handle_event(Event,
+						   State#state.sasl);
+	       true -> %% Report is an atom if no logging is to be done
+		    ignore
+	    end;
+	sasl -> %% SASL not running
+	    ignore;
 	kernel ->
 	    tag(State#state.testcase),
 	    error_logger_tty_h:handle_event(Event, State#state.kernel);
@@ -111,19 +122,22 @@ terminate(_Reason, _State) ->
 code_change(_OldVsn, State, _Extra) ->
     {ok, State}.
 
-report(error_report, supervisor_report) -> sasl;
-report(error_report, crash_report) -> sasl;
-report(info_report, progress) -> sasl;
-report(error, _) -> kernel;
-report(error_report, _) -> kernel;
-report(warning_msg, _) -> kernel;
-report(warning_report, _) -> kernel;
-report(info, _) -> kernel;
-report(info_msg, _) -> kernel;
-report(info_report, _) -> kernel;
-report(_, _) -> none.
+report_receiver(error_report, supervisor_report) -> sasl;
+report_receiver(error_report, crash_report) -> sasl;
+report_receiver(info_report, progress) -> sasl;
+report_receiver(error, _) -> kernel;
+report_receiver(error_report, _) -> kernel;
+report_receiver(warning_msg, _) -> kernel;
+report_receiver(warning_report, _) -> kernel;
+report_receiver(info, _) -> kernel;
+report_receiver(info_msg, _) -> kernel;
+report_receiver(info_report, _) -> kernel;
+report_receiver(_, _) -> none.
 
 tag({M,F,A}) when is_atom(M), is_atom(F), is_integer(A) ->
     io:format(user, "~n=TESTCASE: ~p:~p/~p", [M,F,A]);
 tag(Testcase) ->
     io:format(user, "~n=TESTCASE: ~p", [Testcase]).
+
+tag_event(Event) ->
+    {calendar:local_time(), Event}.
-- 
cgit v1.2.3