From e711632042d1538fce80d565a2add309a88efa1b Mon Sep 17 00:00:00 2001
From: Peter Andersson <peppe@erlang.org>
Date: Tue, 8 May 2012 17:47:21 +0200
Subject: Fix IO printout crash caused by hook function

---
 lib/common_test/src/ct_hooks.erl     |  4 ++--
 lib/common_test/src/ct_logs.erl      | 14 ++++++++++++--
 lib/common_test/src/cth_surefire.erl | 13 +++++++++----
 3 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/lib/common_test/src/ct_hooks.erl b/lib/common_test/src/ct_hooks.erl
index e53ef9f202..98b74665de 100644
--- a/lib/common_test/src/ct_hooks.erl
+++ b/lib/common_test/src/ct_hooks.erl
@@ -125,7 +125,7 @@ end_tc(_Mod, TC, Config, Result, _Return) ->
 on_tc_skip(How, {Suite, Case, Reason}) ->
     call(fun call_cleanup/3, {How, Reason}, [on_tc_skip, Suite, Case]).
 
-on_tc_fail(How, {Suite, Case, Reason}) ->
+on_tc_fail(_How, {Suite, Case, Reason}) ->
     call(fun call_cleanup/3, Reason, [on_tc_fail, Suite, Case]).
 
 %% -------------------------------------------------------------------------
@@ -356,7 +356,7 @@ pos(Id,[_|Rest],Num) ->
 catch_apply(M,F,A, Default) ->
     try
 	apply(M,F,A)
-    catch error:Reason ->
+    catch _:Reason ->
 	    case erlang:get_stacktrace() of
             %% Return the default if it was the CTH module which did not have the function.
 		[{M,F,A,_}|_] when Reason == undef ->
diff --git a/lib/common_test/src/ct_logs.erl b/lib/common_test/src/ct_logs.erl
index 1ccbdc3718..8359dcee98 100644
--- a/lib/common_test/src/ct_logs.erl
+++ b/lib/common_test/src/ct_logs.erl
@@ -659,13 +659,23 @@ create_io_fun(FromPid, State) ->
 
 print_to_log(sync, FromPid, TCGL, List, State) ->
     IoFun = create_io_fun(FromPid, State),
-    io:format(TCGL, "~s", [lists:foldl(IoFun, [], List)]),
+    %% in some situations (exceptions), the printout is made from the
+    %% test server IO process and there's no valid group leader to send to
+    IoProc = if FromPid /= TCGL -> TCGL;
+		true -> State#logger_state.ct_log_fd
+	     end,
+    io:format(IoProc, "~s", [lists:foldl(IoFun, [], List)]),
     State;
 
 print_to_log(async, FromPid, TCGL, List, State) ->
     IoFun = create_io_fun(FromPid, State),
+    %% in some situations (exceptions), the printout is made from the
+    %% test server IO process and there's no valid group leader to send to
+    IoProc = if FromPid /= TCGL -> TCGL;
+		true -> State#logger_state.ct_log_fd
+	     end,
     Printer = fun() ->
-		      io:format(TCGL, "~s", [lists:foldl(IoFun, [], List)])
+		      io:format(IoProc, "~s", [lists:foldl(IoFun, [], List)])
 	      end,
     case State#logger_state.async_print_jobs of
 	[] ->
diff --git a/lib/common_test/src/cth_surefire.erl b/lib/common_test/src/cth_surefire.erl
index c42f956b3a..ef7fe6c455 100644
--- a/lib/common_test/src/cth_surefire.erl
+++ b/lib/common_test/src/cth_surefire.erl
@@ -83,16 +83,21 @@ pre_init_per_testcase(_TC,Config,State) -> {Config, init_tc(State, Config)}.
 post_end_per_testcase(TC,Config,Result,State) ->
     {Result, end_tc(TC,Config, Result,State)}.
 
+on_tc_fail(_TC, _Res, State = #state{test_cases = []}) ->
+    State;
 on_tc_fail(_TC, Res, State) ->
     TCs = State#state.test_cases,
-    TC = hd(State#state.test_cases),
-    NewTC = TC#testcase{ failure =
-			     {fail,lists:flatten(io_lib:format("~p",[Res]))} },
+    TC = hd(TCs),
+    NewTC = TC#testcase{
+	      failure =
+		  {fail,lists:flatten(io_lib:format("~p",[Res]))} },
     State#state{ test_cases = [NewTC | tl(TCs)]}.
 
+on_tc_skip(_Tc, _Res, State = #state{test_cases = []}) ->
+    State;
 on_tc_skip(_Tc, Res, State) ->
     TCs = State#state.test_cases,
-    TC = hd(State#state.test_cases),
+    TC = hd(TCs),
     NewTC = TC#testcase{
 	      failure =
 		  {skipped,lists:flatten(io_lib:format("~p",[Res]))} },
-- 
cgit v1.2.3