From b299052f8d69ef4fff19d83d0f75ded72d65e9e3 Mon Sep 17 00:00:00 2001
From: Lukas Larsson <lukas@erix.ericsson.se>
Date: Tue, 30 Nov 2010 18:25:36 +0100
Subject: Update ct_framework calls to allow manipulation of test results in
 end_tc without breaking backwards compatability (I hope)

---
 lib/common_test/src/ct_framework.erl      | 22 ++++++++++----------
 lib/common_test/src/ct_suite_callback.erl | 30 ++++++++++++++++-----------
 lib/test_server/src/test_server.erl       | 34 +++++++++++++++++++------------
 lib/test_server/src/test_server_ctrl.erl  |  2 +-
 4 files changed, 51 insertions(+), 37 deletions(-)

(limited to 'lib')

diff --git a/lib/common_test/src/ct_framework.erl b/lib/common_test/src/ct_framework.erl
index f7c07a5374..dbf367e4d8 100644
--- a/lib/common_test/src/ct_framework.erl
+++ b/lib/common_test/src/ct_framework.erl
@@ -484,21 +484,27 @@ end_tc(Mod,Func,TCPid,Result,Args,Return) ->
 
     case get('$test_server_framework_test') of
 	undefined ->
-	    FinalResult = ct_suite_callback:end_tc(
-			    Mod, FuncSpec, Args, Result, Return),
+	    {FinalResult,FinalNotify} =
+		case ct_suite_callback:end_tc(
+			    Mod, FuncSpec, Args, Result, Return) of
+		    '$ct_no_change' ->
+			{FinalResult = ok,Result};
+		    FinalResult ->
+			{FinalResult,FinalResult}
+		end,
 	    % send sync notification so that event handlers may print
 	    % in the log file before it gets closed
 	    ct_event:sync_notify(#event{name=tc_done,
 					node=node(),
 					data={Mod,FuncSpec,
-					      tag_scb(FinalResult)}});
+					      tag_scb(FinalNotify)}});
 	Fun ->
 	    % send sync notification so that event handlers may print
 	    % in the log file before it gets closed
 	    ct_event:sync_notify(#event{name=tc_done,
 					node=node(),
 					data={Mod,FuncSpec,tag(Result)}}),
-	    FinalResult = Fun(end_tc, ok)
+	    FinalResult = Fun(end_tc, Return)
     end,
 
     
@@ -521,13 +527,7 @@ end_tc(Mod,Func,TCPid,Result,Args,Return) ->
 	_ -> 
 	    ok
     end,
-    case FinalResult of
-	Result ->
-	    ok;
-	_Else ->
-	    FinalResult
-    end.
-	    
+    FinalResult.	    
 
 %% {error,Reason} | {skip,Reason} | {timetrap_timeout,TVal} | 
 %% {testcase_aborted,Reason} | testcase_aborted_or_killed | 
diff --git a/lib/common_test/src/ct_suite_callback.erl b/lib/common_test/src/ct_suite_callback.erl
index 06c7fc3833..4973ed685c 100644
--- a/lib/common_test/src/ct_suite_callback.erl
+++ b/lib/common_test/src/ct_suite_callback.erl
@@ -91,25 +91,25 @@ init_tc(_Mod, TC, Config) ->
 end_tc(ct_framework, _Func, _Args, Result, _Return) ->
     Result;
 
-end_tc(Mod, init_per_suite, Config, _Result, Return) when is_list(Return) ->
-    call(fun call_generic/3, Return, [post_init_per_suite, Mod, Config]);
-end_tc(Mod, init_per_suite, Config, Result, _Return) ->
-    call(fun call_generic/3, Result, [post_init_per_suite, Mod, Config]);
+end_tc(Mod, init_per_suite, Config, Result, Return) ->
+    call(fun call_generic/3, Return, [post_init_per_suite, Mod, Config],
+	 '$ct_no_change');
 
 end_tc(Mod, end_per_suite, Config, Result, _Return) ->
-    call(fun call_generic/3, Result, [post_end_per_suite, Mod, Config]);
+    call(fun call_generic/3, Result, [post_end_per_suite, Mod, Config],
+	'$ct_no_change');
 
-end_tc(_Mod, {init_per_group, GroupName, _}, Config, _Result, Return)
-  when is_list(Return) ->
-    call(fun call_generic/3, Return, [post_init_per_group, GroupName, Config]);
-end_tc(_Mod, {init_per_group, GroupName, _}, Config, Result, _Return) ->
-    call(fun call_generic/3, Result, [post_init_per_group, GroupName, Config]);
+end_tc(_Mod, {init_per_group, GroupName, _}, Config, Result, Return) ->
+    call(fun call_generic/3, Return, [post_init_per_group, GroupName, Config],
+	 '$ct_no_change');
 
 end_tc(_Mod, {end_per_group, GroupName, _}, Config, Result, _Return) ->
-    call(fun call_generic/3, Result, [post_end_per_group, GroupName, Config]);
+    call(fun call_generic/3, Result, [post_end_per_group, GroupName, Config],
+	'$ct_no_change');
 
 end_tc(_Mod, TC, Config, Result, _Return) ->
-    call(fun call_generic/3, Result, [post_end_per_testcase, TC, Config]).
+    call(fun call_generic/3, Result, [post_end_per_testcase, TC, Config],
+	'$ct_no_change').
 
 on_tc_skip(How, {_Suite, Case, Reason}) ->
     call(fun call_cleanup/3, {How, Reason}, [on_tc_skip, Case]).
@@ -146,6 +146,12 @@ call(Fun, Config, Meta) ->
     call([{CBId,Fun} || {CBId,_, _} <- CBs] ++ get_new_callbacks(Config, Fun),
 	     remove(?config_name,Config), Meta, CBs).
 
+call(Fun, Config, Meta, NoChangeRet) when is_function(Fun) ->
+    case call(Fun,Config,Meta) of
+	Config -> NoChangeRet;
+	NewReturn -> NewReturn
+    end;
+
 call([{CB, call_init, NextFun} | Rest], Config, Meta, CBs) ->
     try
 	{Config, {NewId, _, {Mod,_State}} = NewCB} = call_init(CB, Config, Meta),
diff --git a/lib/test_server/src/test_server.erl b/lib/test_server/src/test_server.erl
index daee278368..13ff02cc6c 100644
--- a/lib/test_server/src/test_server.erl
+++ b/lib/test_server/src/test_server.erl
@@ -1068,20 +1068,23 @@ run_test_case_eval(Mod, Func, Args0, Name, Ref, RunInit,
 	    {ok,Args} ->
 		run_test_case_eval1(Mod, Func, Args, Name, RunInit, TCCallback);
 	    Error = {error,_Reason} ->
-		do_end_tc_call(Mod,Func,{Error,Args0}, Error),
-		{{0,{skip,{failed,Error}}},{Mod,Func},[]};
+		NewResult = do_end_tc_call(Mod,Func,{Error,Args0},
+					   {skip,{failed,Error}}),
+		{{0,NewResult},{Mod,Func},[]};
 	    {fail,Reason} ->
 		[Conf] = Args0,
 		Conf1 = [{tc_status,{failed,Reason}} | Conf],
 		fw_error_notify(Mod, Func, Conf, Reason),
-		do_end_tc_call(Mod,Func, {{error,Reason},[Conf1]},{fail, Reason}),
-		{{0,{failed,Reason}},{Mod,Func},[]};
+		NewResult = do_end_tc_call(Mod,Func, {{error,Reason},[Conf1]},
+					   {fail, Reason}),
+		{{0,NewResult},{Mod,Func},[]};
 	    Skip = {skip,_Reason} ->
-		do_end_tc_call(Mod,Func,{Skip,Args0},Skip),
-		{{0,Skip},{Mod,Func},[]};
+		NewResult = do_end_tc_call(Mod,Func,{Skip,Args0},Skip),
+		{{0,NewResult},{Mod,Func},[]};
 	    {auto_skip,Reason} ->
-		do_end_tc_call(Mod, Func, {{skip,Reason},Args0}, {auto_skip, Reason}),
-		{{0,{skip,{fw_auto_skip,Reason}}},{Mod,Func},[]}
+		NewResult = do_end_tc_call(Mod, Func, {{skip,Reason},Args0},
+					   {skip, {fw_auto_skip,Reason}}),
+		{{0,NewResult},{Mod,Func},[]}
 	end,
     exit({Ref,Time,Value,Loc,Opts}).
 
@@ -1187,7 +1190,12 @@ do_end_tc_call(M,F,Res,Return) ->
 		{fail,FWReason} ->
 		    {failed,FWReason};
 		ok ->
-		    Return;
+		    case Return of
+			{fail,Reason} ->
+			    {failed,Reason};
+			Return ->
+			    Return
+		    end;
 		NewReturn ->
 		    NewReturn
 	    end;
@@ -1231,8 +1239,8 @@ process_return_val1([Failed={E,TCError}|_], M,F,A=[Args], Loc, _, SaveOpts)
 			     [[{tc_status,{failed,TCError}}|Args]]}, Failed) of
 	{failed,FWReason} ->
 	    {{failed,FWReason},SaveOpts};
-	_ ->
-	    {Failed,SaveOpts}
+	NewReturn ->
+	    {NewReturn,SaveOpts}
     end;
 process_return_val1([SaveCfg={save_config,_}|Opts], M,F,[Args], Loc, Final, SaveOpts) ->
     process_return_val1(Opts, M,F,[[SaveCfg|Args]], Loc, Final, SaveOpts);
@@ -1249,8 +1257,8 @@ process_return_val1([], M,F,A, _Loc, Final, SaveOpts) ->
     case do_end_tc_call(M,F,{Final,A}, Final) of
 	{failed,FWReason} ->
 	    {{failed,FWReason},SaveOpts};
-	_ ->
-	    {Final,lists:reverse(SaveOpts)}
+	NewReturn ->
+	    {NewReturn,lists:reverse(SaveOpts)}
     end.
 
 user_callback(undefined, _, _, _, Args) ->
diff --git a/lib/test_server/src/test_server_ctrl.erl b/lib/test_server/src/test_server_ctrl.erl
index 1dc5646184..977a2b1785 100644
--- a/lib/test_server/src/test_server_ctrl.erl
+++ b/lib/test_server/src/test_server_ctrl.erl
@@ -3552,7 +3552,7 @@ run_test_case1(Ref, Num, Mod, Func, Args, RunInit, Where,
 	    {_,{'EXIT',Reason}} ->
 		progress(failed, Num, Mod, Func, Loc, Reason,
 			 Time, Comment, Style);
-	    {_, {failed, Reason}} ->
+	    {_, {Fail, Reason}} when Fail =:= fail; Fail =:= failed ->
 		progress(failed, Num, Mod, Func, Loc, Reason,
 			 Time, Comment, Style);
 	    {_, {Skip, Reason}} when Skip==skip; Skip==skipped ->
-- 
cgit v1.2.3