Implemented bailing out from test script.
authorStanislaw Klekot <dozzie@jarowit.net>
Thu, 18 Jun 2015 17:32:44 +0000 (19:32 +0200)
committerStanislaw Klekot <dozzie@jarowit.net>
Thu, 18 Jun 2015 17:32:44 +0000 (19:32 +0200)
src/estap.erl
src/estap_server.erl
src/estap_test.erl

index 4141913..0b13195 100644 (file)
@@ -192,15 +192,20 @@ matches(Value, MatchSpec, Description) ->
 
 %%%---------------------------------------------------------------------------
 
-%% @doc Stop testing current suite because something terrible happened.
+%% @doc Stop testing whatsoever because something terrible happened.
 %%
-%% @TODO Implement this function.
+%%   Note that bailing out is a very severe operation. It aborts all test
+%%   cases, including the ones in other scripts that were not executed yet.
+%%   It should be only used when an error that occurred renders whole test
+%%   suite unusable before it's fixed.
 
 -spec bail_out(message()) ->
   no_return().
 
-bail_out(_Message) ->
-  'TODO'.
+bail_out(Message) ->
+  TestRun = get_test_run_or_parent(),
+  estap_server:bail_out(TestRun, Message),
+  exit('BAIL_OUT').
 
 %% @doc Set the "no plan" plan for sub-tests.
 %%   Calling this function may be safely skipped.
index ff46bbb..d46d29d 100644 (file)
@@ -9,7 +9,7 @@
 -behaviour(gen_server).
 
 %% public interface
--export([no_plan/0, plan/1, subplan/2, done/1]).
+-export([no_plan/0, plan/1, subplan/2, done/1, bail_out/2]).
 -export([get_status/1]).
 -export([info/2, warning/2]).
 -export([running/2, report_result/2, report_result_todo/3, report_skipped/2]).
@@ -155,6 +155,14 @@ report_result_todo(TestRunId, Why, {died, Reason} = _TestResult) ->
 report_skipped(TestRunId, Why) ->
   gen_server:call(TestRunId, {skipped, Why}).
 
+%% @doc Abort the test script because of fatal error.
+
+-spec bail_out(test_run_id(), string()) ->
+  ok.
+
+bail_out(TestRunId, Reason) ->
+  gen_server:call(TestRunId, {bail_out, Reason}).
+
 %% }}}
 %%----------------------------------------------------------
 %% printing messages {{{
@@ -242,6 +250,10 @@ handle_call(done = _Request, _From,
   end,
   {stop, normal, ok, State};
 
+handle_call({bail_out, Reason} = _Request, _From, State) ->
+  print("Bail out! ~s", [Reason], State),
+  {stop, normal, ok, State};
+
 handle_call({next, Desc} = _Request, _From,
             State = #state{test = Test}) ->
   NextTestNo = case Test of
index 5d84394..e10adf3 100644 (file)
@@ -40,8 +40,13 @@ run(Plan, Tests) ->
     no_plan   -> estap_server:no_plan();
     {plan, C} -> estap_server:plan(C)
   end,
-  run_tests(TestRun, Tests),
-  estap_server:done(TestRun).
+  try
+    run_tests(TestRun, Tests),
+    estap_server:done(TestRun)
+  catch
+    throw:'BAIL_OUT' ->
+      ok
+  end.
 
 %% @doc Run tests, one by one, reporting their results to tracking process.
 %%
@@ -84,6 +89,8 @@ test(TestRun, {Mod, Func} = _TestFunSpec) ->
     {result, ResultRef, TestResult} ->
       erlang:demonitor(MonRef, [flush]),
       TestResult;
+    {'DOWN', MonRef, process, Pid, 'BAIL_OUT'} ->
+      throw('BAIL_OUT');
     {'DOWN', MonRef, process, Pid, Reason} ->
       {died, Reason}
   end.