%%
%% %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%
%%
%%%-------------------------------------------------------------------
%%% File:
%%%
%%% Description:
%%%
%%%
%%% The suites used for the test are located in the data directory.
%%%
%%% The group(s) and case(s) are specified according to this:
%%%
%%% Tests = ct_groups:find_groups(Mod, GroupPaths, TestCases, GroupDef)
%%%
%%% GroupPaths = GroupPath | [GroupPath]
%%% GroupPath = atom() | [atom()]
%%%
%%% CT will find all paths that include GroupPath. GroupPath can be a
%%% single group, or a list of groups along the path to TestCases.
%%% If GroupPath is the latter, the last group in the list must be
%%% the "terminating" group in the path, or it will be impossible to
%%% execute test cases in higher level groups *only*, as in this case:
%%% groups() -> [{g1,[],[tc1,{g2,[],[tc2]}]}].
%%% Compare: find_groups(x, g1, all, groups()), and
%%% find_groups(x, [[g1]], all, groups())
%%%
%%% Some examples:
%%%
%%% GroupPaths = g1, means find all paths with g1 included
%%% GroupPaths = [g1], -''-
%%% GroupPaths = [g1,g2], search twice - once for g1 and once for g2
%%% GroupPaths = [[g1,g2]], find cases under group g1 and sub group g2
%%% GroupPaths = [[g1,g2],[g1,g3]], find cases for g1-g2 AND g1-g3
%%%
%%% TestCases = all | atom() | [atom()]
%%%
%%%-------------------------------------------------------------------
-module(ct_groups_search_SUITE).
-compile(export_all).
-include_lib("common_test/include/ct.hrl").
-include_lib("common_test/src/ct_util.hrl").
-define(eh, ct_test_support_eh).
-define(M1, groups_search_dummy_1_SUITE).
-define(M2, groups_search_dummy_2_SUITE).
%%--------------------------------------------------------------------
%% TEST SERVER CALLBACK FUNCTIONS
%%--------------------------------------------------------------------
init_per_suite(Config) ->
DataDir = proplists:get_value(data_dir, Config),
code:add_patha(DataDir),
M1Erl = filename:join(DataDir, atom_to_list(?M1)++".erl"),
M2Erl = filename:join(DataDir, atom_to_list(?M2)++".erl"),
{ok,?M1} = compile:file(M1Erl, [{outdir,DataDir}]),
{ok,?M2} = compile:file(M2Erl, [{outdir,DataDir}]),
{module,?M1} = code:load_file(?M1),
{module,?M2} = code:load_file(?M2),
Config1 = ct_test_support:init_per_suite(Config),
Config1.
end_per_suite(Config) ->
ct_test_support:end_per_suite(Config).
init_per_testcase(TestCase, Config) ->
ct_test_support:init_per_testcase(TestCase, Config).
end_per_testcase(TestCase, Config) ->
ct_test_support:end_per_testcase(TestCase, Config).
suite() -> [{ct_hooks,[ts_install_cth]}].
groups() ->
[
{find_groups,[],[all_groups,
testcases_in_all_groups,
all_in_top_group1,
all_in_top_group2,
all_in_sub_group1,
all_in_sub_group2,
testcase_in_top_group1,
testcase_in_top_group2,
testcase_in_sub_group1,
testcase_in_sub_group2,
testcase_in_top_groups1,
testcase_in_top_groups2,
testcase_in_top_groups3,
testcase_in_top_groups4,
testcase_in_top_groups5,
testcase_in_top_groups6,
testcase_in_top_groups7,
testcase_in_sub_groups1,
testcase_in_sub_groups2,
testcase_in_sub_groups3,
testcase_in_sub_groups4,
testcase_in_sub_groups5,
testcase_in_sub_groups6,
testcase_in_sub_groups7,
testcase_in_sub_groups8,
testcase_in_sub_groups9,
testcase_in_sub_groups10,
testcase_in_sub_groups11,
testcase_in_sub_groups12,
testcase_in_sub_groups13,
bad_testcase_in_sub_groups1]},
{run_groups,[sequence],[run_groups_with_options,
run_groups_with_testspec]}
].
all() ->
[{group,find_groups,[parallel]},
{group,run_groups}].
%%--------------------------------------------------------------------
%% TEST CASES CHECKING RETURN VALUE ONLY
%%--------------------------------------------------------------------
all_groups(_) ->
GPath = all, TCs = all,
Found = ct_groups:find_groups(?M1, GPath, TCs, groups1()),
Top1 = ct_groups:find_groups(?M1, top1, TCs, groups1()),
Top2 = ct_groups:find_groups(?M1, top2, TCs, groups1()),
All = Top1 ++ Top2 ++ [{conf,[{name,sub2}],
{?M1,init_per_group},
[{?M1,sub2_tc1},{?M1,sub2_tc2}],
{?M1,end_per_group}}],
All = Found,
{?M1,GPath,TCs,Top1++Top2}.
%%%-----------------------------------------------------------------
%%%
testcases_in_all_groups(_) ->
GPath = all, TCs = [tc3,sub_tc2],
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[Top1 =
{conf,[{name,top1}],{?M2,init_per_group},
[{?M2,tc3},
{conf,[{name,sub11}],
{?M2,init_per_group},[{?M2,tc3},{?M2,sub_tc2}],
{?M2,end_per_group}},
{conf,[{name,sub12}],
{?M2,init_per_group},
[{?M2,tc3},{?M2,sub_tc2},
{conf,[{name,sub121}],
{?M2,init_per_group},[{?M2,tc3},{?M2,sub_tc2}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
Top2 =
{conf,[{name,top2}],{?M2,init_per_group},
[{?M2,tc3},
{conf,[{name,sub21}],
{?M2,init_per_group},
[{?M2,tc3},{?M2,sub_tc2},
{conf,[{name,sub2xx}],
{?M2,init_per_group},[{?M2,tc3},{?M2,sub_tc2}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,sub22}],
{?M2,init_per_group},
[{?M2,tc3},{?M2,sub_tc2},
{conf,[{name,sub221}],
{?M2,init_per_group},[{?M2,tc3},{?M2,sub_tc2}],
{?M2,end_per_group}},
{conf,[{name,sub2xx}],
{?M2,init_per_group},[{?M2,tc3},{?M2,sub_tc2}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,sub21}],
{?M2,init_per_group},
[{?M2,tc3},{?M2,sub_tc2},
{conf,[{name,sub2xx}],
{?M2,init_per_group},[{?M2,tc3},{?M2,sub_tc2}],{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,sub22}],
{?M2,init_per_group},
[{?M2,tc3},{?M2,sub_tc2},
{conf,[{name,sub221}],
{?M2,init_per_group},[{?M2,tc3},{?M2,sub_tc2}],{?M2,end_per_group}},
{conf,[{name,sub2xx}],
{?M2,init_per_group},[{?M2,tc3},{?M2,sub_tc2}],{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,sub221}],
{?M2,init_per_group},[{?M2,tc3},{?M2,sub_tc2}],{?M2,end_per_group}},
{conf,[{name,sub2xx}],
{?M2,init_per_group},[{?M2,tc3},{?M2,sub_tc2}],{?M2,end_per_group}}]
= Found,
{?M2,GPath,TCs,[Top1,Top2]}.
%%%-----------------------------------------------------------------
%%%
all_in_top_group1(_) ->
GPath= top1, TCs = all,
Found = ct_groups:find_groups(?M1, GPath, TCs, groups1()),
[{conf,[{name,top1}],
{?M1,init_per_group},
[{?M1,top1_tc1},{?M1,top1_tc2},
{conf,[{name,sub1}],
{?M1,init_per_group},
[{?M1,sub1_tc1},{?M1,sub1_tc2}],
{?M1,end_per_group}}],
{?M1,end_per_group}}] = Found,
{?M1,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
all_in_top_group2(_) ->
GPath= top2, TCs = all,
Found = ct_groups:find_groups(?M1, GPath, TCs, groups1()),
[{conf,[{name,top2}],
{?M1,init_per_group},
[{conf,[{name,sub2}],
{?M1,init_per_group},
[{?M1,sub2_tc1},{?M1,sub2_tc2}],
{?M1,end_per_group}},
{?M1,top2_tc1},{?M1,top2_tc2}],
{?M1,end_per_group}}] = Found,
{?M1,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
all_in_sub_group1(_) ->
GPath = sub1, TCs = all,
Found = ct_groups:find_groups(?M1, GPath, TCs, groups1()),
[{conf,[{name,top1}],
{?M1,init_per_group},
[{conf,[{name,sub1}],
{?M1,init_per_group},
[{?M1,sub1_tc1},{?M1,sub1_tc2}],
{?M1,end_per_group}}],
{?M1,end_per_group}}] = Found,
{?M1,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
all_in_sub_group2(_) ->
GPath = sub2, TCs = all,
Found = ct_groups:find_groups(?M1, GPath, TCs, groups1()),
[Top2 =
{conf,[{name,top2}],
{?M1,init_per_group},
[{conf,[{name,sub2}],
{?M1,init_per_group},
[{?M1,sub2_tc1},{?M1,sub2_tc2}],
{?M1,end_per_group}}],
{?M1,end_per_group}},
{conf,[{name,sub2}],
{?M1,init_per_group},
[{?M1,sub2_tc1},{?M1,sub2_tc2}],
{?M1,end_per_group}}] = Found,
{?M1,GPath,TCs,Top2}.
%%%-----------------------------------------------------------------
%%%
testcase_in_top_group1(_) ->
GPath = top1, TCs = [top1_tc2],
Found = ct_groups:find_groups(?M1, GPath, TCs, groups1()),
[{conf,[{name,top1}],
{?M1,init_per_group},
[{?M1,top1_tc2}],
{?M1,end_per_group}}] = Found,
{?M1,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_top_group2(_) ->
GPath = top2, TCs = [top2_tc2],
Found = ct_groups:find_groups(?M1, GPath, TCs, groups1()),
[{conf,[{name,top2}],
{?M1,init_per_group},
[{?M1,top2_tc2}],
{?M1,end_per_group}}] = Found,
{?M1,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_sub_group1(_) ->
GPath = sub1, TCs = [sub1_tc2],
Found = ct_groups:find_groups(?M1, GPath, TCs, groups1()),
[{conf,[{name,top1}],
{?M1,init_per_group},
[{conf,[{name,sub1}],
{?M1,init_per_group},
[{?M1,sub1_tc2}],
{?M1,end_per_group}}],
{?M1,end_per_group}}] = Found,
{?M1,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_sub_group2(_) ->
GPath = sub2, TCs = [sub2_tc2],
Found = ct_groups:find_groups(?M1, GPath, TCs, groups1()),
[Top2 =
{conf,[{name,top2}],
{?M1,init_per_group},
[{conf,[{name,sub2}],
{?M1,init_per_group},
[{?M1,sub2_tc2}],
{?M1,end_per_group}}],
{?M1,end_per_group}},
{conf,[{name,sub2}],
{?M1,init_per_group},
[{?M1,sub2_tc2}],
{?M1,end_per_group}}] = Found,
{?M1,GPath,TCs,Top2}.
%%%-----------------------------------------------------------------
%%%
testcase_in_top_groups1(_) ->
GPath = [top1,top2], TCs = all,
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[{conf,[{name,top1}],
{?M2,init_per_group},
[{?M2,top1_tc1},{?M2,top_tc2},{?M2,tc3},
{conf,[{name,sub11}],
{?M2,init_per_group},
[{?M2,sub11_tc1},{?M2,sub_tc2},{?M2,tc3}],
{?M2,end_per_group}},
{conf,[{name,sub12}],
{?M2,init_per_group},
[{?M2,sub12_tc1},{?M2,sub_tc2},{?M2,tc3},
{conf,[{name,sub121}],
{?M2,init_per_group},
[{?M2,sub121_tc1},{?M2,sub_tc2},{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,top2}],
{?M2,init_per_group},
[{conf,[{name,sub21}],
{?M2,init_per_group},
[{?M2,sub21_tc1},{?M2,sub_tc2},{?M2,tc3},
{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,sub2xx_tc1},{?M2,sub_tc2},{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{?M2,top2_tc1},{?M2,top_tc2},{?M2,tc3},
{conf,[{name,sub22}],
{?M2,init_per_group},
[{conf,[{name,sub221}],
{?M2,init_per_group},
[{?M2,sub221_tc1},{?M2,sub_tc2},{?M2,tc3}],
{?M2,end_per_group}},
{?M2,sub22_tc1},{?M2,sub_tc2},{?M2,tc3},
{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,sub2xx_tc1},{?M2,sub_tc2},{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_top_groups2(_) ->
GPath = [top1,top2], TCs = tc3,
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[{conf,[{name,top1}],
{?M2,init_per_group},
[{?M2,tc3},
{conf,[{name,sub11}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}},
{conf,[{name,sub12}],
{?M2,init_per_group},
[{?M2,tc3},
{conf,[{name,sub121}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,top2}],
{?M2,init_per_group},
[{?M2,tc3},
{conf,[{name,sub21}],
{?M2,init_per_group},
[{?M2,tc3},
{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,sub22}],
{?M2,init_per_group},
[{?M2,tc3},
{conf,[{name,sub221}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}},
{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_top_groups3(_) ->
GPath = [top1,top2], TCs = top1_tc1,
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[{conf,[{name,top1}],
{?M2,init_per_group},
[{?M2,top1_tc1}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_top_groups4(_) ->
GPath = [top1,top2], TCs = sub2xx_tc1,
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[{conf,[{name,top2}],
{?M2,init_per_group},
[{conf,[{name,sub21}],
{?M2,init_per_group},
[{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,sub2xx_tc1}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,sub22}],
{?M2,init_per_group},
[{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,sub2xx_tc1}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_top_groups5(_) ->
GPath = [top1,top2], TCs = [sub21_tc1,sub22_tc1],
Found = ct_groups:find_groups(?M2, [top1,top2], [sub21_tc1,sub22_tc1],
groups2()),
[{conf,[{name,top2}],
{?M2,init_per_group},
[{conf,[{name,sub21}],
{?M2,init_per_group},
[{?M2,sub21_tc1}],
{?M2,end_per_group}},
{conf,[{name,sub22}],
{?M2,init_per_group},
[{?M2,sub22_tc1}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_top_groups6(_) ->
GPath = [[top1],[top2]], TCs = tc3,
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[{conf,[{name,top1}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}},
{conf,[{name,top2}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_top_groups7(_) ->
GPath = [[top1],[top2]], TCs = all,
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[{conf,[{name,top1}],
{?M2,init_per_group},
[{?M2,top1_tc1},
{?M2,top_tc2},
{?M2,tc3}],
{?M2,end_per_group}},
{conf,[{name,top2}],
{?M2,init_per_group},
[{?M2,top2_tc1},
{?M2,top_tc2},
{?M2,tc3}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_sub_groups1(_) ->
GPath = [sub121], TCs = tc3,
Found = ct_groups:find_groups(?M2, sub121, tc3, groups2()),
Found = ct_groups:find_groups(?M2, [sub121], tc3, groups2()),
[{conf,[{name,top1}],
{?M2,init_per_group},
[{conf,[{name,sub12}],
{?M2,init_per_group},
[{conf,[{name,sub121}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_sub_groups2(_) ->
GPath = sub12, TCs = tc3,
Found = ct_groups:find_groups(?M2, sub12, tc3, groups2()),
Found = ct_groups:find_groups(?M2, [sub12], tc3, groups2()),
[{conf,[{name,top1}],
{?M2,init_per_group},
[{conf,[{name,sub12}],
{?M2,init_per_group},
[{?M2,tc3},
{conf,[{name,sub121}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
FoundX = ct_groups:find_groups(?M2, [[sub12]], tc3, groups2()),
[{conf,[{name,top1}],
{?M2,init_per_group},
[{conf,[{name,sub12}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = FoundX,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_sub_groups3(_) ->
GPath = [sub121,sub221], TCs = all,
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[Top1 =
{conf,[{name,top1}],
{?M2,init_per_group},
[{conf,[{name,sub12}],
{?M2,init_per_group},
[{conf,[{name,sub121}],
{?M2,init_per_group},
[{?M2,sub121_tc1},
{?M2,sub_tc2},
{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
Top2 =
{conf,[{name,top2}],
{?M2,init_per_group},
[{conf,[{name,sub22}],
{?M2,init_per_group},
[{conf,[{name,sub221}],
{?M2,init_per_group},
[{?M2,sub221_tc1},
{?M2,sub_tc2},
{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,sub22}],
{?M2,init_per_group},
[{conf,[{name,sub221}],
{?M2,init_per_group},
[{?M2,sub221_tc1},
{?M2,sub_tc2},
{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,sub221}],
{?M2,init_per_group},
[{?M2,sub221_tc1},
{?M2,sub_tc2},
{?M2,tc3}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,[Top1,Top2]}.
%%%-----------------------------------------------------------------
%%%
testcase_in_sub_groups4(_) ->
GPath = [top1,sub21], TCs = sub_tc2,
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[Top1 =
{conf,[{name,top1}],
{?M2,init_per_group},
[{conf,[{name,sub11}],
{?M2,init_per_group},
[{?M2,sub_tc2}],
{?M2,end_per_group}},
{conf,[{name,sub12}],
{?M2,init_per_group},
[{?M2,sub_tc2},
{conf,[{name,sub121}],
{?M2,init_per_group},
[{?M2,sub_tc2}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
Top2 =
{conf,[{name,top2}],
{?M2,init_per_group},
[{conf,[{name,sub21}],
{?M2,init_per_group},
[{?M2,sub_tc2},
{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,sub_tc2}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,sub21}],
{?M2,init_per_group},
[{?M2,sub_tc2},
{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,sub_tc2}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,[Top1,Top2]}.
%%%-----------------------------------------------------------------
%%%
testcase_in_sub_groups5(_) ->
GPath = [[top1,sub12]], TCs = sub12_tc1,
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[{conf,[{name,top1}],
{?M2,init_per_group},
[{conf,[{name,sub12}],
{?M2,init_per_group},
[{?M2,sub12_tc1}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_sub_groups6(_) ->
GPath = [[top1,sub12]], TCs = [sub_tc2],
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[{conf,[{name,top1}],
{?M2,init_per_group},
[{conf,[{name,sub12}],
{?M2,init_per_group},
[{?M2,sub_tc2}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_sub_groups7(_) ->
GPath = [[top1,sub12]], TCs = [sub12_tc1,sub_tc2],
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[{conf,[{name,top1}],
{?M2,init_per_group},
[{conf,[{name,sub12}],
{?M2,init_per_group},
[{?M2,sub12_tc1},
{?M2,sub_tc2}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_sub_groups8(_) ->
GPath = [[top2,sub22]], TCs = [sub22_tc1,sub_tc2],
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[{conf,[{name,top2}],
{?M2,init_per_group},
[{conf,[{name,sub22}],
{?M2,init_per_group},
[{?M2,sub22_tc1},
{?M2,sub_tc2}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_sub_groups9(_) ->
GPath = [[sub2xx]], TCs = tc3,
Found = ct_groups:find_groups(?M2, sub2xx, tc3, groups2()),
Found = ct_groups:find_groups(?M2, [[sub2xx]], tc3, groups2()),
[Top2 =
{conf,[{name,top2}],
{?M2,init_per_group},
[{conf,[{name,sub21}],
{?M2,init_per_group},
[{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,sub22}],
{?M2,init_per_group},
[{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,sub21}],
{?M2,init_per_group},
[{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,sub22}],
{?M2,init_per_group},
[{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Top2}.
%%%-----------------------------------------------------------------
%%%
testcase_in_sub_groups10(_) ->
GPath = [[sub22,sub2xx]], TCs = tc3,
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[Top2 =
{conf,[{name,top2}],
{?M2,init_per_group},
[{conf,[{name,sub22}],
{?M2,init_per_group},
[{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,sub22}],
{?M2,init_per_group},
[{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Top2}.
%%%-----------------------------------------------------------------
%%%
testcase_in_sub_groups11(_) ->
GPath = [[top1,sub12,sub121]], TCs = all,
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[{conf,[{name,top1}],
{?M2,init_per_group},
[{conf,[{name,sub12}],
{?M2,init_per_group},
[{conf,[{name,sub121}],
{?M2,init_per_group},
[{?M2,sub121_tc1},
{?M2,sub_tc2},
{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_sub_groups12(_) ->
GPath = [[top2,sub2xx]], TCs = [sub2xx_tc1,tc3],
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[{conf,[{name,top2}],
{?M2,init_per_group},
[{conf,[{name,sub21}],
{?M2,init_per_group},
[{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,sub2xx_tc1},
{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}},
{conf,[{name,sub22}],
{?M2,init_per_group},
[{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,sub2xx_tc1},
{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
testcase_in_sub_groups13(_) ->
GPath = [[top2,sub22,sub2xx]], TCs = [top2_tc1,sub2xx_tc1,tc3],
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[{conf,[{name,top2}],
{?M2,init_per_group},
[{conf,[{name,sub22}],
{?M2,init_per_group},
[{conf,[{name,sub2xx}],
{?M2,init_per_group},
[{?M2,sub2xx_tc1},
{?M2,tc3}],
{?M2,end_per_group}}],
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
bad_testcase_in_sub_groups1(_) ->
GPath = [sub2xx], TCs = [top2_tc1],
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
bad_testcase_in_sub_groups2(_) ->
GPath = [sub12,sub2xx], TCs = [top1_tc1,top2_tc1],
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
[] = Found,
{?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%% CASES EXECUTING THE TESTS
%%%-----------------------------------------------------------------
run_groups_with_options(Config) ->
DataDir = ?config(data_dir, Config),
{M1All,M1Rest,M2All,M2Rest} = get_all_groups_and_cases(Config),
M1AllGrs = lists:flatmap(fun({Path,_,_}) when is_atom(hd(Path)) -> Path;
({Path,_,_}) when is_list(hd(Path)) -> Path;
({Path,_,_}) -> [Path]
end, M1All),
%% ct:pal("NOW RUNNING M1 TEST: ~p", [M1All]),
{OptsM11,ERPidM11} = setup([{dir,DataDir},{suite,?M1},
{group,M1AllGrs},{label,m1_all_cases}], Config),
M1AllGrInfo = {M1AllGrs,lists:flatten([Found || {_,_,Found} <- M1All])},
ok = execute(m1_all_cases, M1AllGrInfo, OptsM11, ERPidM11, Config),
lists:foldl(
fun({GrPath,TCs,Found}, N) ->
TestName = list_to_atom("m1_spec_cases_" ++ integer_to_list(N)),
%% ct:pal("NOW RUNNING M1 TEST ~p: ~p + ~p",
%% [TestName,GrPath,TCs]),
{OptsM12,ERPidM12} = setup([{dir,DataDir},{suite,?M1},
{group,GrPath},{testcase,TCs},
{label,TestName}], Config),
ok = execute(TestName, {GrPath,TCs,Found},
OptsM12, ERPidM12, Config),
N+1
end, 1, M1Rest),
%% ct:pal("NOW RUNNING M2 TEST: ~p", [M2All]),
M2AllGrs = lists:flatmap(fun({Path,_,_}) when is_atom(hd(Path)) -> Path;
({Path,_,_}) when is_list(hd(Path)) -> Path;
({Path,_,_}) -> [Path]
end, M2All),
{OptsM21,ERPidM21} = setup([{dir,DataDir},{suite,?M2},
{group,M2AllGrs},{testcase,all},
{label,m2_all_cases}], Config),
M2AllGrInfo = {M2AllGrs,lists:flatten([Found || {_,_,Found} <- M2All])},
ok = execute(m2_all_cases, M2AllGrInfo, OptsM21, ERPidM21, Config),
lists:foldl(
fun({GrPath,TCs,Found}, N) ->
TestName = list_to_atom("m2_spec_cases_" ++ integer_to_list(N)),
%% ct:pal("NOW RUNNING M2 TEST ~p: ~p + ~p", [TestName,GrPath,TCs]),
{OptsM22,ERPidM22} = setup([{dir,DataDir},{suite,?M2},
{group,GrPath},{testcase,TCs},
{label,TestName}], Config),
ok = execute(TestName, {GrPath,TCs,Found},
OptsM22, ERPidM22, Config),
N+1
end, 1, M2Rest),
ok.
%%%-----------------------------------------------------------------
%%%
run_groups_with_testspec(Config) ->
Name = run_groups_with_testspec,
DataDir = ?config(data_dir, Config),
PrivDir = ?config(priv_dir, Config),
{M1All,M1Rest,M2All,M2Rest} = get_all_groups_and_cases(Config),
M1AllGrs = lists:flatmap(fun({Path,_,_}) when is_atom(hd(Path)) -> Path;
({Path,_,_}) when is_list(hd(Path)) -> Path;
({Path,_,_}) -> [Path]
end, M1All),
M1AllTerm = {groups,DataDir,?M1,M1AllGrs},
M1RestTerms = lists:map(
fun({GrPath,TCs,_}) ->
{groups,DataDir,?M1,GrPath,{cases,TCs}}
end, M1Rest),
M2AllGrs = lists:flatmap(fun({Path,_,_}) when is_atom(hd(Path)) -> Path;
({Path,_,_}) when is_list(hd(Path)) -> Path;
({Path,_,_}) -> [Path]
end, M2All),
M2AllTerm = {groups,DataDir,?M2,M2AllGrs,{cases,all}},
M2RestTerms = lists:map(
fun({GrPath,TCs,_}) ->
{groups,DataDir,?M2,GrPath,{cases,TCs}}
end, M2Rest),
GroupTerms = lists:flatten([M1AllTerm,
M1RestTerms,
M2AllTerm,
M2RestTerms]),
TestSpec = [{merge_tests,false},
{label,Name}] ++ GroupTerms,
ct:pal("Here's the test spec:~n~p", [TestSpec]),
TestSpecName = ct_test_support:write_testspec(TestSpec, PrivDir,
"groups_search_spec"),
{Opts,ERPid} = setup([{spec,TestSpecName}], Config),
GroupInfo =
[{M1AllTerm,lists:flatten([Found || {_,_,Found} <- M1All])} |
M1Rest] ++
[{M2AllTerm,lists:flatten([Found || {_,_,Found} <- M2All])} |
M2Rest],
ok = execute(Name, GroupInfo, Opts, ERPid, Config).
%%%-----------------------------------------------------------------
%%% HELP FUNCTIONS
%%%-----------------------------------------------------------------
groups1() ->
[{top1,[],[top1_tc1,top1_tc2,{sub1,[],[sub1_tc1,sub1_tc2]}]},
{top2,[],[{group,sub2},top2_tc1,top2_tc2]},
{sub2,[],[sub2_tc1,sub2_tc2]}].
groups2() ->
[{top1,[],[top1_tc1,top_tc2,tc3,
{sub11,[],[sub11_tc1,sub_tc2,tc3]},
{sub12,[],[sub12_tc1,sub_tc2,tc3,
{sub121,[],[sub121_tc1,sub_tc2,tc3]}]}]},
{top2,[],[{group,sub21},top2_tc1,top_tc2,tc3,{group,sub22}]},
{sub21,[],[sub21_tc1,sub_tc2,tc3,{group,sub2xx}]},
{sub22,[],[{group,sub221},sub22_tc1,sub_tc2,tc3,{group,sub2xx}]},
{sub221,[],[sub221_tc1,sub_tc2,tc3]},
{sub2xx,[],[sub2xx_tc1,sub_tc2,tc3]}].
get_all_groups_and_cases(Config) ->
{value,{_,_,FindGrTCs}} = lists:keysearch(find_groups, 1, groups()),
MGTFs = [apply(?MODULE, TC, [Config]) || TC <- FindGrTCs],
ct:pal("Extracted data from ~p test cases", [length(MGTFs)]),
lists:foldr(fun({M,Gs,TCs,F},
{M11,M12,M21,M22}) ->
case {M,Gs,TCs} of
{?M1,all,_} -> {M11,[{Gs,TCs,F}|M12],M21,M22};
{?M1,_,all} -> {[{Gs,all,F}|M11],M12,M21,M22};
{?M1,_,_} -> {M11,[{Gs,TCs,F}|M12],M21,M22};
{?M2,all,_} -> {M11,M12,M21,[{Gs,TCs,F}|M22]};
{?M2,_,all} -> {M11,M12,[{Gs,all,F}|M21],M22};
{?M2,_,_} -> {M11,M12,M21,[{Gs,TCs,F}|M22]}
end
end, {[],[],[],[]}, MGTFs).
%%%-----------------------------------------------------------------
setup(Test, Config) ->
Opts0 = ct_test_support:get_opts(Config),
Level = ?config(trace_level, Config),
EvHArgs = [{cbm,ct_test_support},{trace_level,Level}],
Opts = Opts0 ++ [{event_handler,{?eh,EvHArgs}}|Test],
ERPid = ct_test_support:start_event_receiver(Config),
{Opts,ERPid}.
execute(Name, TestParams, Opts, ERPid, Config) ->
ok = ct_test_support:run(Opts, Config),
Events = ct_test_support:get_events(ERPid, Config),
Events1 = reformat(Events, ?eh),
ct_test_support:log_events(Name,
Events1,
?config(priv_dir, Config),
Opts),
verify_events(Name, TestParams, Events1).
reformat(Events, EH) ->
ct_test_support:reformat(Events, EH).
%%%-----------------------------------------------------------------
%%% TEST EVENTS
verify_events(Name, Params, Events) ->
%% 2 tests (ct:run_test + script_start) is default
verify_events(Name, Params, Events, 2).
verify_events(_, _, _, 0) ->
ok;
verify_events(Name, Params, Events, N) ->
test_events(Name, Params, Events),
verify_events(Name, Params, Events, N-1).
%%%-----------------------------------------------------------------
%%% check run_groups_with_options
test_events(TestName, {GrPath,Found}, Events) ->
test_events(TestName, {GrPath,all,Found}, Events);
test_events(TestName, {GrPath,TCs,Found}, Events)
when TestName /= run_groups_with_testspec ->
try check_events(Events, flatten_tests(Found)) of
ok -> ok
catch
throw:Reason ->
ct:pal("Test failed for ~p with group path ~p and cases ~p"
"~nReason: ~p", [TestName,GrPath,TCs,Reason]),
throw(failed)
end;
%%%-----------------------------------------------------------------
%%% check run_groups_with_testspec
test_events(run_groups_with_testspec, Params, Events) ->
AllFound = lists:flatmap(fun({_All,Found}) when is_tuple(Found) ->
[Found];
({_All,Found}) ->
Found;
({_Gr,_TCs,Found}) when is_tuple(Found) ->
[Found];
({_Gr,_TCs,Found}) ->
Found
end, Params),
try check_events(Events, flatten_tests(AllFound)) of
ok -> ok
catch
throw:Reason ->
ct:pal("Test failed for run_groups_with_testspec."
"~nReason: ~p", [Reason]),
throw(failed)
end.
flatten_tests({conf,[{name,G}|_],{Mod,_I},Tests,_E}) ->
lists:flatten([{group,Mod,G} | flatten_tests(Tests)]);
flatten_tests([{conf,[{name,G}|_],{Mod,_I},Tests,_E} | Confs]) ->
lists:flatten([{group,Mod,G} | flatten_tests(Tests)]) ++
lists:flatten(flatten_tests(Confs));
flatten_tests([{_Mod,_TC} = Case | Tests]) ->
lists:flatten([Case | flatten_tests(Tests)]);
flatten_tests([]) ->
[].
check_events([{_,tc_start,{Mod,{init_per_group,G,_}}} | Evs],
[{group,Mod,G} | Check]) ->
check_events(Evs, Check);
check_events([{_,tc_start,{Mod,TC}} | Evs],
[{Mod,TC} | Check]) when is_atom(TC) ->
check_events(Evs, Check);
check_events([{_,tc_start,{Mod,{init_per_group,G,_}}} | _Evs], Check) ->
ct:pal("CHECK FAILED!~nGroup ~p in ~p not found in ~p.",
[G,Mod,Check]),
throw({test_not_found,{Mod,G}});
check_events([{_,tc_start,{Mod,TC}} | _Evs], Check)
when is_atom(TC), TC /= init_per_suite, TC /= end_per_suite ->
ct:pal("CHECK FAILED!~nCase ~p in ~p not found in ~p.",
[TC,Mod,Check]),
throw({test_not_found,{Mod,TC}});
check_events([Group | Evs], Check) when is_list(Group) ->
Check1 = check_events(Group, Check),
check_events(Evs, Check1);
check_events(_, []) ->
ok;
check_events([Elem | Evs], Check) when is_tuple(Elem) ->
check_events(Evs, Check);
check_events([], Check = [_|_]) ->
ct:pal("CHECK FAILED!~nTests remain: ~p", [Check]),
throw({tests_remain,Check});
check_events([Wut | _],_) ->
throw({unexpected,Wut}).