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

openSUSE Build Service is sponsored by