Skip to content

Commit 2606bde

Browse files
committed
ct: Fix cth_surefire to work for nested skipped groups
If a group was skipped because a group above it was skipped then cth_surefire would crash when running. This commit fixes that and adds tests to make sure it works.
1 parent 7b439dd commit 2606bde

File tree

3 files changed

+42
-22
lines changed

3 files changed

+42
-22
lines changed

lib/common_test/src/cth_surefire.erl

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,14 @@ pre_init_per_group(_Suite,Group,Config,State) ->
196196
post_init_per_group(Suite,Group,Config,Result,Proxy) when is_pid(Proxy) ->
197197
{gen_server:call(Proxy,{?FUNCTION_NAME, [Suite, Group, Config, Result]}),Proxy};
198198
post_init_per_group(_Suite,_Group,Config,Result,State) ->
199-
{Result, end_tc(init_per_group,Config,Result,State)}.
199+
NewState = end_tc(init_per_group,Config,Result,State),
200+
case Result of
201+
{skip, _} ->
202+
%% on_tc_skip will be called which will re-add this group
203+
{Result, NewState#state{ curr_group = tl(NewState#state.curr_group) }};
204+
_ ->
205+
{Result, NewState}
206+
end.
200207

201208
pre_end_per_group(Suite,Group,Config,Proxy) when is_pid(Proxy) ->
202209
{gen_server:call(Proxy,{?FUNCTION_NAME, [Suite, Group, Config]}),Proxy};
@@ -253,26 +260,30 @@ get_line_from_result(_, _) ->
253260
on_tc_skip(Suite,TC,Result,Proxy) when is_pid(Proxy) ->
254261
_ = gen_server:call(Proxy,{?FUNCTION_NAME, [Suite,TC,Result]}),
255262
Proxy;
256-
on_tc_skip(Suite,{ConfigFunc,_GrName}, Res, State) ->
257-
on_tc_skip(Suite,ConfigFunc, Res, State);
263+
on_tc_skip(Suite,{init_per_group,GrName}, Res, State) ->
264+
on_tc_skip(Suite,init_per_group, Res, State#state{ curr_group = [GrName | State#state.curr_group]});
265+
on_tc_skip(Suite,{end_per_group,GrName}, Res, State) ->
266+
NewState = on_tc_skip(Suite,end_per_group, Res, State),
267+
NewState#state{ curr_group = tl(State#state.curr_group)};
268+
on_tc_skip(Suite,{ConfigFunc,GrName}, Res, State) ->
269+
if GrName =:= hd(State#state.curr_group) ->
270+
on_tc_skip(Suite,ConfigFunc, Res, State);
271+
true ->
272+
NewState = on_tc_skip(Suite,ConfigFunc, Res,
273+
State#state{ curr_group = [GrName | State#state.curr_group]}),
274+
NewState#state{ curr_group = tl(NewState#state.curr_group)}
275+
end;
258276
on_tc_skip(Suite,Tc, Res, State0) ->
259277
TcStr = atom_to_list(Tc),
278+
CurrGroup = make_group_string(State0#state.curr_group),
260279
State1 =
261280
case State0#state.test_cases of
262-
[#testcase{name=TcStr}|TCs] ->
281+
[#testcase{name=TcStr,group=CurrGroup}|TCs] ->
263282
State0#state{test_cases=TCs};
264283
_ ->
265284
State0
266285
end,
267-
State2 = end_tc(Tc,[],Res,init_tc(set_suite(Suite,State1),[])),
268-
CurrGroup = State2#state.curr_group,
269-
State =
270-
case {Tc, is_list(CurrGroup) andalso length(CurrGroup)>0}of
271-
{end_per_group, true} ->
272-
State2#state{curr_group = tl(CurrGroup)};
273-
_ ->
274-
State2
275-
end,
286+
State = end_tc(Tc,[],Res,init_tc(set_suite(Suite,State1),[])),
276287
do_tc_skip(Res, State).
277288

278289
do_tc_skip(Res, State) ->
@@ -313,7 +324,7 @@ end_tc(Name, _Config, _Res, State = #state{ curr_suite = Suite,
313324
end,
314325
Url = make_url(UrlBase,Log),
315326
ClassName = atom_to_list(Suite),
316-
PGroup = lists:concat(lists:join(".",lists:reverse(Groups))),
327+
PGroup = make_group_string(Groups),
317328
TimeTakes = io_lib:format("~f",[timer:now_diff(?now,TS) / 1000000]),
318329
State#state{ test_cases = [#testcase{ log = Log,
319330
url = Url,
@@ -329,6 +340,9 @@ end_tc(Name, _Config, _Res, State = #state{ curr_suite = Suite,
329340
State#state.test_cases],
330341
tc_log = ""}. % so old tc_log is not set if next is on_tc_skip
331342

343+
make_group_string(Groups) ->
344+
lists:concat(lists:join(".",lists:reverse(Groups))).
345+
332346
set_suite(Suite,#state{curr_suite=undefined}=State) ->
333347
State#state{curr_suite=Suite, curr_suite_ts=?now};
334348
set_suite(_,State) ->

lib/common_test/test/ct_surefire_SUITE.erl

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,9 @@ test_suite_events(skip_init_per_group_SUITE) ->
252252
{?eh,tc_user_skip,
253253
{skip_init_per_group_SUITE,{test_case,left},skip_on_purpose}},
254254
{?eh,test_stats,{0,0,{1,0}}},
255+
{?eh,tc_user_skip,
256+
{skip_init_per_group_SUITE,{test_case,nested_group},skip_on_purpose}},
257+
{?eh,test_stats,{0,0,{2,0}}},
255258
{?eh,tc_user_skip,
256259
{skip_init_per_group_SUITE,{end_per_group,left},skip_on_purpose}}],
257260

@@ -261,7 +264,7 @@ test_suite_events(skip_init_per_group_SUITE) ->
261264
{skip_init_per_group_SUITE,{init_per_group,right,[]},ok}},
262265
{?eh,tc_start,{skip_init_per_group_SUITE,test_case}},
263266
{?eh,tc_done,{skip_init_per_group_SUITE,test_case,ok}},
264-
{?eh,test_stats,{1,0,{1,0}}},
267+
{?eh,test_stats,{1,0,{2,0}}},
265268
{?eh,tc_start,
266269
{skip_init_per_group_SUITE,{end_per_group,right,[]}}},
267270
{?eh,tc_done,
@@ -351,7 +354,7 @@ test_events(skip_suite_in_spec) ->
351354
test_suite_events(skip_suite_in_spec) ++
352355
[{?eh,stop_logging,[]}];
353356
test_events(skip_init_per_group) ->
354-
[{?eh,start_logging,'_'},{?eh,start_info,{1,1,2}}] ++
357+
[{?eh,start_logging,'_'},{?eh,start_info,{1,1,3}}] ++
355358
test_suite_events(skip_init_per_group_SUITE) ++
356359
[{?eh,stop_logging,[]}];
357360
test_events(Test) ->
@@ -472,15 +475,17 @@ assert_lines(skip_init_per_group, A) ->
472475
ok;
473476
("test_case", [{testcase,4}, {testsuite,1}, {testsuites,1}], "root.left") ->
474477
ok;
475-
("end_per_group", [{testcase,5}, {testsuite,1}, {testsuites,1}], "root.left") ->
478+
("test_case", [{testcase,5}, {testsuite,1}, {testsuites,1}], "root.left.nested_group") ->
479+
ok;
480+
("end_per_group", [{testcase,6}, {testsuite,1}, {testsuites,1}], "root.left") ->
476481
ok;
477-
("init_per_group", [{testcase,6}, {testsuite,1}, {testsuites,1}], "root.right") ->
482+
("init_per_group", [{testcase,7}, {testsuite,1}, {testsuites,1}], "root.right") ->
478483
ok;
479-
("test_case", [{testcase,7}, {testsuite,1}, {testsuites,1}], "root.right") ->
484+
("test_case", [{testcase,8}, {testsuite,1}, {testsuites,1}], "root.right") ->
480485
ok;
481-
("end_per_group", [{testcase,8}, {testsuite,1}, {testsuites,1}], "root.right") ->
486+
("end_per_group", [{testcase,9}, {testsuite,1}, {testsuites,1}], "root.right") ->
482487
ok;
483-
("end_per_group", [{testcase,9}, {testsuite,1}, {testsuites,1}], "root") ->
488+
("end_per_group", [{testcase,10}, {testsuite,1}, {testsuites,1}], "root") ->
484489
ok;
485490
(Tc, TcParents, TcGroupPath) ->
486491
exit({wrong_grouppath, [{tc, Tc},

lib/common_test/test/ct_surefire_SUITE_data/skip_init_per_group_SUITE.erl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ all() ->
3535

3636
groups() ->
3737
[{root, [], [{group, left}, {group, right}]},
38-
{left, [], [test_case]},
38+
{left, [], [test_case, {group, nested_group}]},
39+
{nested_group, [], [test_case]},
3940
{right, [], [test_case]}].
4041

4142
test_case(_Config) ->

0 commit comments

Comments
 (0)