You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 rivejä
3.3 KiB

  1. -module(cth_fail_fast).
  2. %% Callbacks
  3. -export([id/1]).
  4. -export([init/2]).
  5. -export([pre_init_per_suite/3]).
  6. -export([post_init_per_suite/4]).
  7. -export([pre_end_per_suite/3]).
  8. -export([post_end_per_suite/4]).
  9. -export([pre_init_per_group/3]).
  10. -export([post_init_per_group/4]).
  11. -export([pre_end_per_group/3]).
  12. -export([post_end_per_group/4]).
  13. -export([pre_init_per_testcase/3]).
  14. -export([post_end_per_testcase/4]).
  15. -export([on_tc_fail/3]).
  16. -export([on_tc_skip/3, on_tc_skip/4]).
  17. -export([terminate/1]).
  18. %% We work by setting an 'abort' variable on each test case that fails
  19. %% and then triggering the failure before starting the next test. This
  20. %% ensures that all other hooks have run for the same event, and
  21. %% simplifies error reporting.
  22. -record(state, {abort=false}).
  23. %% @doc Return a unique id for this CTH.
  24. id(_Opts) ->
  25. {?MODULE, make_ref()}.
  26. %% @doc Always called before any other callback function. Use this to initiate
  27. %% any common state.
  28. init(_Id, _Opts) ->
  29. {ok, #state{}}.
  30. %% @doc Called before init_per_suite is called.
  31. pre_init_per_suite(_Suite,_Config,#state{abort=true}) ->
  32. abort();
  33. pre_init_per_suite(_Suite,Config,State) ->
  34. {Config, State}.
  35. %% @doc Called after init_per_suite.
  36. post_init_per_suite(_Suite,_Config,Return,State) ->
  37. {Return, State}.
  38. %% @doc Called before end_per_suite.
  39. pre_end_per_suite(_Suite,_Config,#state{abort=true}) ->
  40. abort();
  41. pre_end_per_suite(_Suite,Config,State) ->
  42. {Config, State}.
  43. %% @doc Called after end_per_suite.
  44. post_end_per_suite(_Suite,_Config,Return,State) ->
  45. {Return, State}.
  46. %% @doc Called before each init_per_group.
  47. pre_init_per_group(_Group,_Config,#state{abort=true}) ->
  48. abort();
  49. pre_init_per_group(_Group,Config,State) ->
  50. {Config, State}.
  51. %% @doc Called after each init_per_group.
  52. post_init_per_group(_Group,_Config,Return, State) ->
  53. {Return, State}.
  54. %% @doc Called after each end_per_group.
  55. pre_end_per_group(_Group,_Config,#state{abort=true}) ->
  56. abort();
  57. pre_end_per_group(_Group,Config,State) ->
  58. {Config, State}.
  59. %% @doc Called after each end_per_group.
  60. post_end_per_group(_Group,_Config,Return, State) ->
  61. {Return, State}.
  62. %% @doc Called before each test case.
  63. pre_init_per_testcase(_TC,_Config,#state{abort=true}) ->
  64. abort();
  65. pre_init_per_testcase(_TC,Config,State) ->
  66. {Config, State}.
  67. %% @doc Called after each test case.
  68. post_end_per_testcase(_TC,_Config,ok,State) ->
  69. {ok, State};
  70. post_end_per_testcase(_TC,_Config,Error,State) ->
  71. {Error, State#state{abort=true}}.
  72. %% @doc Called after post_init_per_suite, post_end_per_suite, post_init_per_group,
  73. %% post_end_per_group and post_end_per_testcase if the suite, group or test case failed.
  74. on_tc_fail(_TC, _Reason, State) ->
  75. State.
  76. %% @doc Called when a test case is skipped by either user action
  77. %% or due to an init function failing. (>= 19.3)
  78. on_tc_skip(_Suite, _TC, {tc_auto_skip, _}, State) ->
  79. State#state{abort=true};
  80. on_tc_skip(_Suite, _TC, _Reason, State) ->
  81. State.
  82. %% @doc Called when a test case is skipped by either user action
  83. %% or due to an init function failing. (Pre-19.3)
  84. on_tc_skip(_TC, {tc_auto_skip, _}, State) ->
  85. State#state{abort=true};
  86. on_tc_skip(_TC, _Reason, State) ->
  87. State.
  88. %% @doc Called when the scope of the CTH is done
  89. terminate(#state{}) ->
  90. ok.
  91. %%% Helpers
  92. abort() ->
  93. io:format(user, "Detected test failure. Aborting~n", []),
  94. halt(1).