File 1200-common_test-Fix-Config-leakage-for-nested-groups.patch of Package erlang
From 51ada4158ee66e84e850dd8bc57f1081331dd959 Mon Sep 17 00:00:00 2001
From: Jakub Witczak <kuba@erlang.org>
Date: Tue, 20 Apr 2021 20:07:46 +0200
Subject: [PATCH] common_test: Fix Config leakage for nested groups
Before this change Config leaked between test groups in case of a subgroup was
skipped (GH-3480).
---
lib/common_test/src/test_server_ctrl.erl | 2 +-
lib/common_test/test/ct_skip_SUITE.erl | 52 +++++++-
.../skip/test/user_skip_13_SUITE.erl | 114 ++++++++++++++++++
3 files changed, 161 insertions(+), 7 deletions(-)
create mode 100644 lib/common_test/test/ct_skip_SUITE_data/skip/test/user_skip_13_SUITE.erl
diff --git a/lib/common_test/src/test_server_ctrl.erl b/lib/common_test/src/test_server_ctrl.erl
index dbd5537206..2674b02798 100644
--- a/lib/common_test/src/test_server_ctrl.erl
+++ b/lib/common_test/src/test_server_ctrl.erl
@@ -2851,7 +2851,7 @@ run_test_cases_loop([{conf,Ref,Props,{Mod,Func}}|_Cases]=Cs0,
stop_minor_log_file(),
run_test_cases_loop(skip_cases_upto(Ref, Cases, Reason, conf,
CurrMode, skip_case),
- [hd(Config)|Config], TimetrapData, Mode,
+ Config, TimetrapData, Mode,
delete_status(Ref, Status2));
{_,{skip_and_save,Reason,_SavedConfig},_} when StartConf ->
ReportAbortRepeat(skipped),
diff --git a/lib/common_test/test/ct_skip_SUITE.erl b/lib/common_test/test/ct_skip_SUITE.erl
index 06152ed354..43c69d21ba 100644
--- a/lib/common_test/test/ct_skip_SUITE.erl
+++ b/lib/common_test/test/ct_skip_SUITE.erl
@@ -119,7 +119,8 @@ user_skip(Config) when is_list(Config) ->
Join(DataDir, "user_skip_3_SUITE"),
Join(DataDir, "user_skip_4_SUITE"),
Join(DataDir, "user_skip_5_SUITE"),
- Join(DataDir, "user_skip_6_SUITE")],
+ Join(DataDir, "user_skip_6_SUITE"),
+ Join(DataDir, "user_skip_13_SUITE")],
{Opts,ERPid} = setup({suite,Suites}, Config),
ok = ct_test_support:run(Opts, Config),
@@ -566,7 +567,7 @@ test_events(auto_skip) ->
test_events(user_skip) ->
[{?eh,start_logging,{'DEF','RUNDIR'}},
{?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}},
- {?eh,start_info,{6,6,35}},
+ {?eh,start_info,{7,7,39}},
{?eh,tc_start,{user_skip_1_SUITE,init_per_suite}},
{?eh,tc_done,
@@ -723,15 +724,54 @@ test_events(user_skip) ->
{?eh,tc_user_skip,{user_skip_6_SUITE,{tc4,psub2},"Sub group skipped"}},
{?eh,tc_user_skip,{user_skip_6_SUITE,{end_per_group,psub2},
"Sub group skipped"}}]},
-
{?eh,tc_start,{user_skip_6_SUITE,tc2}},
{?eh,tc_done,{user_skip_6_SUITE,tc2,ok}},
{?eh,test_stats,{8,0,{27,0}}},
{?eh,tc_start,{user_skip_6_SUITE,{end_per_group,ptop2,[parallel]}}},
{?eh,tc_done,{user_skip_6_SUITE,{end_per_group,ptop2,[parallel]},ok}}]},
-
- {?eh,test_done,{'DEF','STOP_TIME'}},
- {?eh,stop_logging,[]}
+
+ [{?eh,tc_start,{user_skip_13_SUITE,{init_per_group,top1,[]}}},
+ {?eh,tc_done,{user_skip_13_SUITE,{init_per_group,top1,[]},ok}},
+ [{?eh,tc_start,{user_skip_13_SUITE,{init_per_group,sub11,[]}}},
+ {?eh,tc_done,{user_skip_13_SUITE,{init_per_group,sub11,[]},ok}},
+ {?eh,tc_start,{user_skip_13_SUITE,tc1}},
+ {?eh,tc_done,{user_skip_13_SUITE,tc1,ok}},
+ {?eh,test_stats,{9,0,{27,0}}},
+ {?eh,tc_start,{user_skip_13_SUITE,{end_per_group,sub11,[]}}},
+ {?eh,tc_done,{user_skip_13_SUITE,{end_per_group,sub11,[]},ok}}],
+ [{?eh,tc_start,{user_skip_13_SUITE,{init_per_group,sub12,[]}}},
+ {?eh,tc_done,{user_skip_13_SUITE, {init_per_group,sub12,[]},
+ {skipped,"Sub group skipped"}}},
+ {?eh,tc_user_skip,{user_skip_13_SUITE,{tc1,sub12},"Sub group skipped"}},
+ {?eh,test_stats,{9,0,{28,0}}},
+ {?eh,tc_user_skip,{user_skip_13_SUITE,{end_per_group,sub12},
+ "Sub group skipped"}},
+ {?eh,tc_start,{user_skip_13_SUITE,{end_per_group,top1,[]}}},
+ {?eh,tc_done,{user_skip_13_SUITE,{end_per_group,top1,[]},ok}}
+ ]],
+ [{?eh,tc_start,{user_skip_13_SUITE,{init_per_group,top2,[]}}},
+ {?eh,tc_done,{user_skip_13_SUITE,{init_per_group,top2,[]},ok}},
+ [{?eh,tc_start,
+ {user_skip_13_SUITE,{init_per_group,sub21,[]}}},
+ {?eh,tc_done,
+ {user_skip_13_SUITE,{init_per_group,sub21,[]},ok}},
+ {?eh,tc_start,{user_skip_13_SUITE,tc2}},
+ {?eh,tc_done,{user_skip_13_SUITE,tc2,ok}},
+ {?eh,test_stats,{10,0,{28,0}}},
+ {?eh,tc_start,{user_skip_13_SUITE,{end_per_group,sub21,[]}}},
+ {?eh,tc_done,{user_skip_13_SUITE,{end_per_group,sub21,[]},ok}}],
+ [{?eh,tc_start,{user_skip_13_SUITE,{init_per_group,sub22,[]}}},
+ {?eh,tc_done,{user_skip_13_SUITE,{init_per_group,sub22,[]},ok}},
+ {?eh,tc_start,{user_skip_13_SUITE,tc2}},
+ {?eh,tc_done,{user_skip_13_SUITE,tc2,ok}},
+ {?eh,test_stats,{11,0,{28,0}}},
+ {?eh,tc_start,{user_skip_13_SUITE,{end_per_group,sub22,[]}}},
+ {?eh,tc_done,{user_skip_13_SUITE,{end_per_group,sub22,[]},ok}}],
+ {?eh,tc_start,{user_skip_13_SUITE,{end_per_group,top2,[]}}},
+ {?eh,tc_done,{user_skip_13_SUITE,{end_per_group,top2,[]},ok}}],
+
+ {?eh,test_done,{'DEF','STOP_TIME'}},
+ {?eh,stop_logging,[]}
];
test_events(testspec_skip) ->
diff --git a/lib/common_test/test/ct_skip_SUITE_data/skip/test/user_skip_13_SUITE.erl b/lib/common_test/test/ct_skip_SUITE_data/skip/test/user_skip_13_SUITE.erl
new file mode 100644
index 0000000000..3b9e388328
--- /dev/null
+++ b/lib/common_test/test/ct_skip_SUITE_data/skip/test/user_skip_13_SUITE.erl
@@ -0,0 +1,114 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2009-2016. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(user_skip_13_SUITE).
+
+-compile(export_all).
+-define(TOP1_KEY, top1_key).
+
+-include_lib("common_test/include/ct.hrl").
+
+%%--------------------------------------------------------------------
+%% Function: suite() -> Info
+%% Info = [tuple()]
+%%--------------------------------------------------------------------
+suite() ->
+ [{timetrap,{seconds,30}}].
+
+%%--------------------------------------------------------------------
+%% Function: init_per_group(GroupName, Config0) ->
+%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}
+%% GroupName = atom()
+%% Config0 = Config1 = [tuple()]
+%% Reason = term()
+%%--------------------------------------------------------------------
+init_per_group(top1, Config) ->
+ [{?TOP1_KEY, top1_specific} | Config];
+init_per_group(sub12, Config) ->
+ {skip,"Sub group skipped"};
+init_per_group(_GroupName, Config) ->
+ Config.
+
+%%--------------------------------------------------------------------
+%% Function: end_per_group(GroupName, Config0) ->
+%% void() | {save_config,Config1}
+%% GroupName = atom()
+%% Config0 = Config1 = [tuple()]
+%%--------------------------------------------------------------------
+end_per_group(_GroupName, _Config) ->
+ ok.
+
+%%--------------------------------------------------------------------
+%% Function: init_per_testcase(TestCase, Config0) ->
+%% Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}
+%% TestCase = atom()
+%% Config0 = Config1 = [tuple()]
+%% Reason = term()
+%%--------------------------------------------------------------------
+init_per_testcase(_TestCase, Config) ->
+ Config.
+
+%%--------------------------------------------------------------------
+%% Function: end_per_testcase(TestCase, Config0) ->
+%% void() | {save_config,Config1}
+%% TestCase = atom()
+%% Config0 = Config1 = [tuple()]
+%%--------------------------------------------------------------------
+end_per_testcase(_TestCase, _Config) ->
+ ok.
+
+%%--------------------------------------------------------------------
+%% Function: groups() -> [Group]
+%% Group = {GroupName,Properties,GroupsAndTestCases}
+%% GroupName = atom()
+%% Properties = [parallel | sequence | Shuffle | {RepeatType,N}]
+%% GroupsAndTestCases = [Group | {group,GroupName} | TestCase]
+%% TestCase = atom()
+%% Shuffle = shuffle | {shuffle,{integer(),integer(),integer()}}
+%% RepeatType = repeat | repeat_until_all_ok | repeat_until_all_fail |
+%% repeat_until_any_ok | repeat_until_any_fail
+%% N = integer() | forever
+%%--------------------------------------------------------------------
+groups() ->
+ [{top1,[],[{sub11, [], [tc1]}, {sub12, [], [tc1]}]},
+ {top2,[],[{sub21, [], [tc2]}, {sub22, [], [tc2]}]}].
+
+%%--------------------------------------------------------------------
+%% Function: all() -> GroupsAndTestCases | {skip,Reason}
+%% GroupsAndTestCases = [{group,GroupName} | TestCase]
+%% GroupName = atom()
+%% TestCase = atom()
+%% Reason = term()
+%%--------------------------------------------------------------------
+all() ->
+ [{group,top1}, {group,top2}].
+
+%%--------------------------------------------------------------------
+%% Function: TestCase(Config0) ->
+%% ok | exit() | {skip,Reason} | {comment,Comment} |
+%% {save_config,Config1} | {skip_and_save,Reason,Config1}
+%% Config0 = Config1 = [tuple()]
+%% Reason = term()
+%% Comment = term()
+%%--------------------------------------------------------------------
+tc1(_) ->
+ ok.
+
+tc2(Config) ->
+ undefined = ?config(?TOP1_KEY, Config).
--
2.26.2