aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/common_test/src/ct_groups.erl131
-rw-r--r--lib/common_test/src/ct_run.erl32
-rw-r--r--lib/common_test/src/ct_testspec.erl14
-rw-r--r--lib/common_test/test/ct_groups_search_SUITE.erl976
4 files changed, 618 insertions, 535 deletions
diff --git a/lib/common_test/src/ct_groups.erl b/lib/common_test/src/ct_groups.erl
index 29fbc97d3e..fc0f67d21d 100644
--- a/lib/common_test/src/ct_groups.erl
+++ b/lib/common_test/src/ct_groups.erl
@@ -26,7 +26,7 @@
-module(ct_groups).
-export([find_groups/4]).
--export([make_all_conf/3, make_conf/5]).
+-export([make_all_conf/3, make_all_conf/4, make_conf/5]).
-export([delete_subs/2]).
-export([expand_groups/3, search_and_override/3]).
@@ -39,14 +39,15 @@ find_groups(Mod, GrNames, TCs, GroupDefs) when is_atom(GrNames) ;
find_groups1(Mod, GrNames, TCs, GroupDefs);
find_groups(Mod, Groups, TCs, GroupDefs) when Groups /= [] ->
- [find_groups1(Mod, [GrNames], TCs, GroupDefs) || GrNames <- Groups];
+ lists:append([find_groups1(Mod, [GrNames], TCs, GroupDefs) ||
+ GrNames <- Groups]);
find_groups(_Mod, [], _TCs, _GroupDefs) ->
[].
-%% GrNames == atom: Single group name, perform full search
-%% GrNames == list: List of groups, find all matching paths
-%% GrNames == [list]: Search path terminated by last group in GrNames
+%% GrNames == atom(): Single group name, perform full search
+%% GrNames == list(): List of groups, find all matching paths
+%% GrNames == [list()]: Search path terminated by last group in GrNames
find_groups1(Mod, GrNames, TCs, GroupDefs) ->
{GrNames1,FindAll} =
case GrNames of
@@ -57,8 +58,11 @@ find_groups1(Mod, GrNames, TCs, GroupDefs) ->
Path ->
{Path,true}
end,
- TCs1 = if is_atom(TCs), TCs /= all -> [TCs];
- true -> TCs end,
+ TCs1 = if (is_atom(TCs) and (TCs /= all)) or is_tuple(TCs) ->
+ [TCs];
+ true ->
+ TCs
+ end,
Found = find(Mod, GrNames1, TCs1, GroupDefs, [],
GroupDefs, FindAll),
[Conf || Conf <- Found, Conf /= 'NOMATCH'].
@@ -94,11 +98,30 @@ find(Mod, [Name|GrNames]=SPath, TCs, [{Name,Props,Tests} | Gs], Known,
%% Group path terminated, stop the search
find(Mod, [], TCs, Tests, _Known, _Defs, false) ->
- case [{Mod,TC} || TC <- Tests,
- (((TCs == all) and is_atom(TC))
- or ((catch lists:member(TC, TCs)) == true))] of
- [] -> ['NOMATCH'];
- Cases -> Cases
+ Cases = lists:flatmap(fun(TC) when is_atom(TC), TCs == all ->
+ [{Mod,TC}];
+ ({group,_}) ->
+ [];
+ ({_,_}=TC) when TCs == all ->
+ [TC];
+ (TC) ->
+ if is_atom(TC) ->
+ Tuple = {Mod,TC},
+ case lists:member(Tuple, TCs) of
+ true ->
+ [Tuple];
+ false ->
+ case lists:member(TC, TCs) of
+ true -> [{Mod,TC}];
+ false -> []
+ end
+ end;
+ true ->
+ []
+ end
+ end, Tests),
+ if Cases == [] -> ['NOMATCH'];
+ true -> Cases
end;
%% No more groups
@@ -143,17 +166,39 @@ find(Mod, GrNames, TCs, [{ExternalTC, Case} = TC | Gs], Known,
%% Save test case
find(Mod, GrNames, all, [TC | Gs], Known,
Defs, FindAll) when is_atom(TC) ->
- [{Mod, TC} | find(Mod, GrNames, all, Gs, Known, Defs, FindAll)];
+ [{Mod,TC} | find(Mod, GrNames, all, Gs, Known, Defs, FindAll)];
+
+%% Save test case
+find(Mod, GrNames, all, [{M,TC} | Gs], Known,
+ Defs, FindAll) when is_atom(M), M /= group, is_atom(TC) ->
+ [{M,TC} | find(Mod, GrNames, all, Gs, Known, Defs, FindAll)];
%% Check if test case should be saved
find(Mod, GrNames, TCs, [TC | Gs], Known,
- Defs, FindAll) when is_atom(TC) ->
- case lists:member(TC, TCs) of
- true ->
- [{Mod, TC} | find(Mod, GrNames, TCs, Gs, Known,
- Defs, FindAll)];
- false ->
- find(Mod, GrNames, TCs, Gs, Known, Defs, FindAll)
+ Defs, FindAll) when is_atom(TC) orelse
+ ((size(TC) == 2) and (hd(TC) /= group)) ->
+ Case =
+ if is_atom(TC) ->
+ Tuple = {Mod,TC},
+ case lists:member(Tuple, TCs) of
+ true ->
+ Tuple;
+ false ->
+ case lists:member(TC, TCs) of
+ true -> {Mod,TC};
+ false -> []
+ end
+ end;
+ true ->
+ case lists:member(TC, TCs) of
+ true -> {Mod,TC};
+ false -> []
+ end
+ end,
+ if Case == [] ->
+ find(Mod, GrNames, TCs, Gs, Known, Defs, FindAll);
+ true ->
+ [Case | find(Mod, GrNames, TCs, Gs, Known, Defs, FindAll)]
end;
%% Unexpeted term in group list
@@ -242,10 +287,28 @@ rm_unwanted_tcs(Tests, all, []) ->
Tests;
rm_unwanted_tcs(Tests, TCs, []) ->
- [Test || Test <- Tests,
- ((is_atom(Test) and (lists:member(Test, TCs) == true))
- or (not is_atom(Test)))];
-
+ lists:flatmap(fun(Test) when is_tuple(Test), (size(Test) > 2) ->
+ [Test];
+ (Test={group,_}) ->
+ [Test];
+ (Test={_M,TC}) ->
+ case lists:member(TC, TCs) of
+ true -> [Test];
+ false -> []
+ end;
+ (Test) when is_atom(Test) ->
+ case lists:keysearch(Test, 2, TCs) of
+ {value,_} ->
+ [Test];
+ _ ->
+ case lists:member(Test, TCs) of
+ true -> [Test];
+ false -> []
+ end
+ end;
+ (Test) -> [Test]
+ end, Tests);
+
rm_unwanted_tcs(Tests, _TCs, _) ->
[Test || Test <- Tests, not is_atom(Test)].
@@ -282,7 +345,7 @@ is_sub({conf,Props,_,_,_}=Conf, [{conf,_,_,Tests,_} | Confs]) ->
true ->
true;
false ->
- is_sub(Conf, Tests) or is_sub(Conf, Confs)
+ is_sub(Conf, Tests) orelse is_sub(Conf, Confs)
end;
is_sub(Conf, [_TC | Tests]) ->
@@ -312,31 +375,29 @@ expand(Mod, Name, Defs) ->
throw({error,list_to_atom(E)})
end.
-make_all_conf(Dir, Mod, _Props) ->
+make_all_conf(Dir, Mod, Props, TestSpec) ->
case code:is_loaded(Mod) of
false ->
code:load_abs(filename:join(Dir,atom_to_list(Mod)));
_ ->
ok
end,
- make_all_conf(Mod).
+ make_all_conf(Mod, Props, TestSpec).
-make_all_conf(Mod) ->
+make_all_conf(Mod, Props, TestSpec) ->
case catch apply(Mod, groups, []) of
{'EXIT',_} ->
- {error,{invalid_group_definition,Mod}};
+ exit({invalid_group_definition,Mod});
GroupDefs when is_list(GroupDefs) ->
- case catch find_groups(Mod, all, all, GroupDefs) of
+ case catch find_groups(Mod, all, TestSpec, GroupDefs) of
{error,_} = Error ->
%% this makes test_server call error_in_suite as first
%% (and only) test case so we can report Error properly
[{ct_framework,error_in_suite,[[Error]]}];
[] ->
- {error,{invalid_group_spec,Mod}};
- ConfTests ->
- [{conf,Props,Init,all,End} ||
- {conf,Props,Init,_,End}
- <- delete_subs(ConfTests, ConfTests)]
+ exit({invalid_group_spec,Mod});
+ _ConfTests ->
+ make_conf(Mod, all, Props, TestSpec)
end
end.
diff --git a/lib/common_test/src/ct_run.erl b/lib/common_test/src/ct_run.erl
index c1296d34bc..199accfc70 100644
--- a/lib/common_test/src/ct_run.erl
+++ b/lib/common_test/src/ct_run.erl
@@ -1708,11 +1708,15 @@ compile_and_run(Tests, Skip, Opts, Args) ->
SavedErrors = save_make_errors(SuiteMakeErrors),
ct_repeat:log_loop_info(Args),
- {Tests1,Skip1} = final_tests(Tests,Skip,SavedErrors),
-
- ReleaseSh = proplists:get_value(release_shell, Args),
- ct_util:set_testdata({release_shell,ReleaseSh}),
- possibly_spawn(ReleaseSh == true, Tests1, Skip1, Opts);
+ try final_tests(Tests,Skip,SavedErrors) of
+ {Tests1,Skip1} ->
+ ReleaseSh = proplists:get_value(release_shell, Args),
+ ct_util:set_testdata({release_shell,ReleaseSh}),
+ possibly_spawn(ReleaseSh == true, Tests1, Skip1, Opts)
+ catch
+ _:BadFormat ->
+ {error,BadFormat}
+ end;
false ->
io:nl(),
ct_util:stop(clean),
@@ -1982,8 +1986,7 @@ final_tests1([{TestDir,Suite,GrsOrCs}|Tests], Final, Skip, Bad) when
%% for now, only flat group defs are allowed as
%% start options and test spec terms
fun({all,all}) ->
- ct_groups:make_all_conf(TestDir,
- Suite, []);
+ [ct_groups:make_conf(TestDir, Suite, all, [], all)];
({skipped,Group,TCs}) ->
[ct_groups:make_conf(TestDir, Suite,
Group, [skipped], TCs)];
@@ -2277,9 +2280,11 @@ add_jobs([{TestDir,all,_}|Tests], Skip, Opts, CleanUp) ->
wait_for_idle(),
add_jobs(Tests, Skip, Opts, CleanUp)
end;
-add_jobs([{TestDir,[Suite],all}|Tests], Skip, Opts, CleanUp) when is_atom(Suite) ->
+add_jobs([{TestDir,[Suite],all}|Tests], Skip,
+ Opts, CleanUp) when is_atom(Suite) ->
add_jobs([{TestDir,Suite,all}|Tests], Skip, Opts, CleanUp);
-add_jobs([{TestDir,Suites,all}|Tests], Skip, Opts, CleanUp) when is_list(Suites) ->
+add_jobs([{TestDir,Suites,all}|Tests], Skip,
+ Opts, CleanUp) when is_list(Suites) ->
Name = get_name(TestDir) ++ ".suites",
case catch test_server_ctrl:add_module_with_skip(Name, Suites,
skiplist(TestDir,Skip)) of
@@ -2294,7 +2299,8 @@ add_jobs([{TestDir,Suite,all}|Tests], Skip, Opts, CleanUp) ->
ok ->
Name = get_name(TestDir) ++ "." ++ atom_to_list(Suite),
case catch test_server_ctrl:add_module_with_skip(Name, [Suite],
- skiplist(TestDir,Skip)) of
+ skiplist(TestDir,
+ Skip)) of
{'EXIT',_} ->
CleanUp;
_ ->
@@ -2473,8 +2479,10 @@ run_make(Targets, TestDir0, Mod, UserInclude) ->
FileTest = fun(F, suites) -> is_suite(F);
(F, helpmods) -> not is_suite(F)
end,
- Files = lists:flatmap(fun({F,out_of_date}) ->
- case FileTest(F, Targets) of
+ Files =
+ lists:flatmap(fun({F,out_of_date}) ->
+ case FileTest(F,
+ Targets) of
true -> [F];
false -> []
end;
diff --git a/lib/common_test/src/ct_testspec.erl b/lib/common_test/src/ct_testspec.erl
index 321af66dbb..5ce095e38e 100644
--- a/lib/common_test/src/ct_testspec.erl
+++ b/lib/common_test/src/ct_testspec.erl
@@ -1026,20 +1026,24 @@ insert_groups(Node,Dir,Suite,Group,Cases,Tests,MergeTests)
insert_groups(Node,Dir,Suite,[Group],Cases,Tests,MergeTests);
insert_groups(Node,Dir,Suite,Groups,Cases,Tests,false) when
((Cases == all) or is_list(Cases)) and is_list(Groups) ->
- Groups1 = [{Gr,Cases} || Gr <- Groups],
+ Groups1 = [if is_list(Gr) -> % preserve group path
+ {[Gr],Cases};
+ true ->
+ {Gr,Cases} end || Gr <- Groups],
append({{Node,Dir},[{Suite,Groups1}]},Tests);
insert_groups(Node,Dir,Suite,Groups,Cases,Tests,true) when
((Cases == all) or is_list(Cases)) and is_list(Groups) ->
+ Groups1 = [if is_list(Gr) -> % preserve group path
+ {[Gr],Cases};
+ true ->
+ {Gr,Cases} end || Gr <- Groups],
case lists:keysearch({Node,Dir},1,Tests) of
{value,{{Node,Dir},[{all,_}]}} ->
Tests;
{value,{{Node,Dir},Suites0}} ->
- Suites1 = insert_groups1(Suite,
- [{Gr,Cases} || Gr <- Groups],
- Suites0),
+ Suites1 = insert_groups1(Suite,Groups1,Suites0),
insert_in_order({{Node,Dir},Suites1},Tests);
false ->
- Groups1 = [{Gr,Cases} || Gr <- Groups],
insert_in_order({{Node,Dir},[{Suite,Groups1}]},Tests)
end;
insert_groups(Node,Dir,Suite,Groups,Case,Tests, MergeTests)
diff --git a/lib/common_test/test/ct_groups_search_SUITE.erl b/lib/common_test/test/ct_groups_search_SUITE.erl
index 90dca098a3..76b2d14e5c 100644
--- a/lib/common_test/test/ct_groups_search_SUITE.erl
+++ b/lib/common_test/test/ct_groups_search_SUITE.erl
@@ -128,8 +128,8 @@ groups() ->
testcase_in_sub_groups13,
bad_testcase_in_sub_groups1]},
- {run_groups,[],[run_groups_with_options,
- run_groups_with_testspec]}
+ {run_groups,[sequence],[run_groups_with_options,
+ run_groups_with_testspec]}
].
all() ->
@@ -157,7 +157,7 @@ all_groups(_) ->
All = Found,
- {?M1,GPath,TCs}.
+ {?M1,GPath,TCs,Top1++Top2}.
%%%-----------------------------------------------------------------
%%%
@@ -166,35 +166,42 @@ testcases_in_all_groups(_) ->
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,sub_tc2},{?M2,tc3}],{?M2,end_per_group}},
- {conf,[{name,sub12}],
- {?M2,init_per_group},
- [{?M2,sub_tc2},{?M2,tc3},
- {conf,[{name,sub121}],
- {?M2,init_per_group},[{?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,sub_tc2},{?M2,tc3},
- {conf,[{name,sub2xx}],
- {?M2,init_per_group},[{?M2,sub_tc2},{?M2,tc3}],{?M2,end_per_group}}],
- {?M2,end_per_group}},
- {?M2,tc3}, % in top2
- {conf,[{name,sub22}],
- {?M2,init_per_group},
- [{conf,[{name,sub221}],
- {?M2,init_per_group},[{?M2,sub_tc2},{?M2,tc3}],{?M2,end_per_group}},
- {?M2,sub_tc2},{?M2,tc3}, % in sub22
- {conf,[{name,sub2xx}],
- {?M2,init_per_group},[{?M2,sub_tc2},{?M2,tc3}],{?M2,end_per_group}}],
- {?M2,end_per_group}}],
- {?M2,end_per_group}},
+ [Top1 =
+ {conf,[{name,top1}],{?M2,init_per_group},
+ [{?M2,tc3},
+ {conf,[{name,sub11}],
+ {?M2,init_per_group},[{?M2,sub_tc2},{?M2,tc3}],
+ {?M2,end_per_group}},
+ {conf,[{name,sub12}],
+ {?M2,init_per_group},
+ [{?M2,sub_tc2},{?M2,tc3},
+ {conf,[{name,sub121}],
+ {?M2,init_per_group},[{?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,sub21}],
+ {?M2,init_per_group},
+ [{?M2,sub_tc2},{?M2,tc3},
+ {conf,[{name,sub2xx}],
+ {?M2,init_per_group},[{?M2,sub_tc2},{?M2,tc3}],
+ {?M2,end_per_group}}],
+ {?M2,end_per_group}},
+ {?M2,tc3}, % in top2
+ {conf,[{name,sub22}],
+ {?M2,init_per_group},
+ [{conf,[{name,sub221}],
+ {?M2,init_per_group},[{?M2,sub_tc2},{?M2,tc3}],
+ {?M2,end_per_group}},
+ {?M2,sub_tc2},{?M2,tc3}, % in sub22
+ {conf,[{name,sub2xx}],
+ {?M2,init_per_group},[{?M2,sub_tc2},{?M2,tc3}],
+ {?M2,end_per_group}}],
+ {?M2,end_per_group}}],
+ {?M2,end_per_group}},
{conf,[{name,sub21}],
{?M2,init_per_group},
@@ -220,7 +227,7 @@ testcases_in_all_groups(_) ->
= Found,
- {?M2,GPath,TCs}.
+ {?M2,GPath,TCs,[Top1,Top2]}.
%%%-----------------------------------------------------------------
%%%
@@ -238,7 +245,7 @@ all_in_top_group1(_) ->
{?M1,end_per_group}}],
{?M1,end_per_group}}] = Found,
- {?M1,GPath,TCs}.
+ {?M1,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -256,7 +263,7 @@ all_in_top_group2(_) ->
{?M1,top2_tc1},{?M1,top2_tc2}],
{?M1,end_per_group}}] = Found,
- {?M1,GPath,TCs}.
+ {?M1,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -273,7 +280,7 @@ all_in_sub_group1(_) ->
{?M1,end_per_group}}],
{?M1,end_per_group}}] = Found,
- {?M1,GPath,TCs}.
+ {?M1,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -282,20 +289,21 @@ all_in_sub_group2(_) ->
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,end_per_group}},
-
+ [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}.
+
+ {?M1,GPath,TCs,Top2}.
%%%-----------------------------------------------------------------
%%%
@@ -309,7 +317,7 @@ testcase_in_top_group1(_) ->
[{?M1,top1_tc2}],
{?M1,end_per_group}}] = Found,
- {?M1,GPath,TCs}.
+ {?M1,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -323,7 +331,7 @@ testcase_in_top_group2(_) ->
[{?M1,top2_tc2}],
{?M1,end_per_group}}] = Found,
- {?M1,GPath,TCs}.
+ {?M1,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -340,7 +348,7 @@ testcase_in_sub_group1(_) ->
{?M1,end_per_group}}],
{?M1,end_per_group}}] = Found,
- {?M1,GPath,TCs}.
+ {?M1,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -349,20 +357,21 @@ testcase_in_sub_group2(_) ->
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_tc2}],
- {?M1,end_per_group}}],
- {?M1,end_per_group}},
-
+ [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}.
+
+ {?M1,GPath,TCs,Top2}.
%%%-----------------------------------------------------------------
%%%
@@ -371,52 +380,49 @@ testcase_in_top_groups1(_) ->
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}.
+ [{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}.
%%%-----------------------------------------------------------------
%%%
@@ -425,51 +431,49 @@ testcase_in_top_groups2(_) ->
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},
- [{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}},
- {?M2,tc3},
- {conf,[{name,sub22}],
- {?M2,init_per_group},
- [{conf,[{name,sub221}],
- {?M2,init_per_group},
- [{?M2,tc3}],
- {?M2,end_per_group}},
- {?M2,tc3},
- {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}.
+ [{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},
+ [{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}},
+ {?M2,tc3},
+ {conf,[{name,sub22}],
+ {?M2,init_per_group},
+ [{conf,[{name,sub221}],
+ {?M2,init_per_group},
+ [{?M2,tc3}],
+ {?M2,end_per_group}},
+ {?M2,tc3},
+ {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}.
%%%-----------------------------------------------------------------
%%%
@@ -478,12 +482,12 @@ testcase_in_top_groups3(_) ->
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
- [[{conf,[{name,top1}],
- {?M2,init_per_group},
- [{?M2,top1_tc1}],
- {?M2,end_per_group}}], []] = Found,
+ [{conf,[{name,top1}],
+ {?M2,init_per_group},
+ [{?M2,top1_tc1}],
+ {?M2,end_per_group}}] = Found,
- {?M2,GPath,TCs}.
+ {?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -492,26 +496,25 @@ testcase_in_top_groups4(_) ->
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}.
+ [{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}.
%%%-----------------------------------------------------------------
%%%
@@ -521,20 +524,19 @@ testcase_in_top_groups5(_) ->
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}.
+ [{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}.
%%%-----------------------------------------------------------------
%%%
@@ -542,17 +544,17 @@ 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,
- [[{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}.
+ {?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -561,20 +563,20 @@ testcase_in_top_groups7(_) ->
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}.
+ [{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}.
%%%-----------------------------------------------------------------
%%%
@@ -595,7 +597,7 @@ testcase_in_sub_groups1(_) ->
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
- {?M2,GPath,TCs}.
+ {?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -627,7 +629,7 @@ testcase_in_sub_groups2(_) ->
{?M2,end_per_group}}],
{?M2,end_per_group}}] = FoundX,
- {?M2,GPath,TCs}.
+ {?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -635,54 +637,53 @@ 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,
- [
- [{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}}],
-
- [{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}.
+ {?M2,GPath,TCs,[Top1,Top2]}.
%%%-----------------------------------------------------------------
%%%
@@ -691,47 +692,46 @@ testcase_in_sub_groups4(_) ->
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
- [
- [{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}}],
-
- [{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 =
+ {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]}.
%%%-----------------------------------------------------------------
%%%
@@ -748,7 +748,7 @@ testcase_in_sub_groups5(_) ->
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
- {?M2,GPath,TCs}.
+ {?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -765,7 +765,7 @@ testcase_in_sub_groups6(_) ->
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
- {?M2,GPath,TCs}.
+ {?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -783,7 +783,7 @@ testcase_in_sub_groups7(_) ->
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
- {?M2,GPath,TCs}.
+ {?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -801,7 +801,7 @@ testcase_in_sub_groups8(_) ->
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
- {?M2,GPath,TCs}.
+ {?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -811,24 +811,25 @@ testcase_in_sub_groups9(_) ->
Found = ct_groups:find_groups(?M2, sub2xx, tc3, groups2()),
Found = ct_groups:find_groups(?M2, [[sub2xx]], tc3, groups2()),
- [{conf,[{name,top2}],
- {?M2,init_per_group},
- [{conf,[{name,sub21}],
- {?M2,init_per_group},
- [{conf,[{name,sub2xx}],
+ [Top2 =
+ {conf,[{name,top2}],
{?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}}],
+ {?M2,end_per_group}},
+
{conf,[{name,sub21}],
{?M2,init_per_group},
[{conf,[{name,sub2xx}],
@@ -850,7 +851,7 @@ testcase_in_sub_groups9(_) ->
[{?M2,tc3}],
{?M2,end_per_group}}] = Found,
- {?M2,GPath,TCs}.
+ {?M2,GPath,TCs,Top2}.
%%%-----------------------------------------------------------------
%%%
@@ -859,16 +860,17 @@ testcase_in_sub_groups10(_) ->
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}],
+ [Top2 =
+ {conf,[{name,top2}],
{?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}}],
+ {?M2,end_per_group}},
{conf,[{name,sub22}],
{?M2,init_per_group},
@@ -878,7 +880,7 @@ testcase_in_sub_groups10(_) ->
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
- {?M2,GPath,TCs}.
+ {?M2,GPath,TCs,Top2}.
%%%-----------------------------------------------------------------
%%%
@@ -900,7 +902,7 @@ testcase_in_sub_groups11(_) ->
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
- {?M2,GPath,TCs}.
+ {?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -929,7 +931,7 @@ testcase_in_sub_groups12(_) ->
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
- {?M2,GPath,TCs}.
+ {?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -950,7 +952,7 @@ testcase_in_sub_groups13(_) ->
{?M2,end_per_group}}],
{?M2,end_per_group}}] = Found,
- {?M2,GPath,TCs}.
+ {?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -961,7 +963,7 @@ bad_testcase_in_sub_groups1(_) ->
[] = Found,
- {?M2,GPath,TCs}.
+ {?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%%
@@ -970,9 +972,9 @@ bad_testcase_in_sub_groups2(_) ->
Found = ct_groups:find_groups(?M2, GPath, TCs, groups2()),
- [[],[]] = Found,
+ [] = Found,
- {?M2,GPath,TCs}.
+ {?M2,GPath,TCs,Found}.
%%%-----------------------------------------------------------------
%%% CASES EXECUTING THE TESTS
@@ -983,45 +985,55 @@ run_groups_with_options(Config) ->
{M1All,M1Rest,M2All,M2Rest} = get_all_groups_and_cases(Config),
- ct:pal("NOW RUNNING M1 TEST: ~p", [M1All]),
+ M1AllGrs = lists:flatmap(fun({Path,_,_}) when is_atom(hd(Path)) -> Path;
+ ({Path,_,_}) when is_list(hd(Path)) -> Path;
+ ({Path,_,_}) -> [Path]
+ end, M1All),
- M1AllGrSpec = {group, [Path || {Path,_} <- M1All]},
- {OptsM11,ERPidM11} = setup([{dir,DataDir},{suite,?M1},
- M1AllGrSpec,{label,m1_all_cases}], Config),
- ok = execute(m1_all_cases, M1AllGrSpec, OptsM11, ERPidM11, Config),
+ %% ct:pal("NOW RUNNING M1 TEST: ~p", [M1All]),
- ct:pal("NOW RUNNING M1 TESTS: ~p", [M1Rest]),
+ {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}, N) ->
- TestName = list_to_atom("m1_spec_cases_" ++ integer_to_list(N)),
- {OptsM12,ERPidM12} = setup([{dir,DataDir},{suite,?M1},
- {group,GrPath},{testcases,TCs},
- {label,TestName}], Config),
- ok = execute(TestName, {{group,GrPath},{testcases,TCs}},
- OptsM12, ERPidM12, Config),
- N+1
+ 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]),
+ %% ct:pal("NOW RUNNING M2 TEST: ~p", [M2All]),
- M2AllGrSpec = {group, [Path || {Path,_} <- M2All]},
- {OptsM21,ERPidM21} = setup([{dir,DataDir},{suite,?M2},
- M2AllGrSpec,{testcases,all},
- {label,m2_all_cases}], Config),
- ok = execute(m2_all_cases, M2AllGrSpec, OptsM21, ERPidM21, Config),
+ M2AllGrs = lists:flatmap(fun({Path,_,_}) when is_atom(hd(Path)) -> Path;
+ ({Path,_,_}) when is_list(hd(Path)) -> Path;
+ ({Path,_,_}) -> [Path]
+ end, M2All),
- ct:pal("NOW RUNNING M2 TESTS: ~p", [M2Rest]),
+
+ {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}, N) ->
- TestName = list_to_atom("m2_spec_cases_" ++ integer_to_list(N)),
- {OptsM22,ERPidM22} = setup([{dir,DataDir},{suite,?M2},
- {group,GrPath},{testcases,TCs},
- {label,TestName}], Config),
- ok = execute(TestName, {{group,GrPath},{testcases,TCs}},
- OptsM22, ERPidM22, Config),
- N+1
+ 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.
@@ -1029,20 +1041,31 @@ run_groups_with_options(Config) ->
%%%-----------------------------------------------------------------
%%%
run_groups_with_testspec(Config) ->
- TC = run_groups_with_testspec,
+ 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),
- M1AllTerm = {groups,DataDir,?M1,[Path || {Path,_} <- M1All]},
+ 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}) ->
+ fun({GrPath,TCs,_}) ->
{groups,DataDir,?M1,GrPath,{cases,TCs}}
end, M1Rest),
- M2AllTerm = {groups,DataDir,?M2,[Path || {Path,_} <- M2All],{cases,all}},
+
+ 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}) ->
+ fun({GrPath,TCs,_}) ->
{groups,DataDir,?M2,GrPath,{cases,TCs}}
end, M2Rest),
@@ -1052,7 +1075,7 @@ run_groups_with_testspec(Config) ->
M2RestTerms]),
TestSpec = [{merge_tests,false},
- {label,TC}] ++ GroupTerms,
+ {label,Name}] ++ GroupTerms,
ct:pal("Here's the test spec:~n~p", [TestSpec]),
@@ -1060,7 +1083,12 @@ run_groups_with_testspec(Config) ->
"groups_search_spec"),
{Opts,ERPid} = setup([{spec,TestSpecName}], Config),
- ok = execute(TC, GroupTerms, Opts, ERPid, 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
@@ -1085,19 +1113,21 @@ groups2() ->
get_all_groups_and_cases(Config) ->
{value,{_,_,FindGrTCs}} = lists:keysearch(find_groups, 1, groups()),
- MGTs = [apply(?MODULE, TC, [Config]) || TC <- FindGrTCs],
+ MGTFs = [apply(?MODULE, TC, [Config]) || TC <- FindGrTCs],
- ct:pal("Extracted data from ~p test cases", [length(MGTs)]),
+ ct:pal("Extracted data from ~p test cases", [length(MGTFs)]),
- lists:foldr(fun({M,Gs,TCs},
+ lists:foldr(fun({M,Gs,TCs,F},
{M11,M12,M21,M22}) ->
- case {M,TCs} of
- {?M1,all} -> {[{Gs,all}|M11],M12,M21,M22};
- {?M1,_} -> {M11,[{Gs,TCs}|M12],M21,M22};
- {?M2,all} -> {M11,M12,[{Gs,all}|M21],M22};
- {?M2,_} -> {M11,M12,M21,[{Gs,TCs}|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, {[],[],[],[]}, MGTs).
+ end, {[],[],[],[]}, MGTFs).
%%%-----------------------------------------------------------------
@@ -1112,122 +1142,102 @@ setup(Test, Config) ->
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,
- reformat(Events, ?eh),
+ Events1,
?config(priv_dir, Config),
Opts),
-
- TestEvents = events_to_check(Name, TestParams),
- ct_test_support:verify_events(TestEvents, Events, Config).
+ verify_events(Name, TestParams, Events1).
reformat(Events, EH) ->
ct_test_support:reformat(Events, EH).
%%%-----------------------------------------------------------------
%%% TEST EVENTS
-events_to_check(Test, Params) ->
+verify_events(Name, Params, Events) ->
%% 2 tests (ct:run_test + script_start) is default
- events_to_check(Test, Params, 2).
+ verify_events(Name, Params, Events, 2).
-events_to_check(_, _, 0) ->
- [];
-events_to_check(Test, Params, N) ->
- test_events(Test, Params) ++ events_to_check(Test, Params, N-1).
+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(m1_all_cases, {_,[all,top1,top2,sub1,sub2]}) ->
- [];
-
-test_events(m1_spec_cases_1, {{_,top1},{_,[top1_tc2]}}) ->
- [];
-test_events(m1_spec_cases_2, {{_,top2},{_,[top2_tc2]}}) ->
- [];
-test_events(m1_spec_cases_3, {{_,sub1},{_,[sub1_tc2]}}) ->
- [];
-test_events(m1_spec_cases_4, {{_,sub2},{_,[sub2_tc2]}}) ->
- [];
-test_events(m1_spec_cases_5, {{_,[top1,top2]},{_,[sub21_tc1,sub22_tc1]}}) ->
- [];
-test_events(m1_spec_cases_6, {{_,[[top1],[top2]]},{_,tc3}}) ->
- [];
-
-test_events(m2_all_cases, {_,[[top1,top2],
- [[top1],[top2]],
- [sub121,sub221],
- [[top1,sub12,sub121]]]}) ->
- [];
-
-test_events(m2_spec_cases_1, {{_,all},{_,[sub_tc2,tc3]}}) ->
- [];
-test_events(m2_spec_cases_2, {{_,[top1,top2]},{_,tc3}}) ->
- [];
-test_events(m2_spec_cases_3, {{_,[top1,top2]},{_,top1_tc1}}) ->
- [];
-test_events(m2_spec_cases_4, {{_,[top1,top2]},{_,sub2xx_tc1}}) ->
- [];
-test_events(m2_spec_cases_5, {{_,[top1,top2]},{_,[sub21_tc1,sub22_tc1]}}) ->
- [];
-test_events(m2_spec_cases_6, {{_,[[top1],[top2]]},{_,tc3}}) ->
- [];
-test_events(m2_spec_cases_7, {{_,[sub121]},{_,tc3}}) ->
- [];
-test_events(m2_spec_cases_8, {{_,sub12},{_,tc3}}) ->
- [];
-test_events(m2_spec_cases_9, {{_,[top1,sub21]},{_,sub_tc2}}) ->
- [];
-test_events(m2_spec_cases_10, {{_,[[top1,sub12]]},{_,sub12_tc1}}) ->
- [];
-test_events(m2_spec_cases_11, {{_,[[top1,sub12]]},{_,[sub_tc2]}}) ->
- [];
-test_events(m2_spec_cases_12, {{_,[[top1,sub12]]},{_,[sub12_tc1,sub_tc2]}}) ->
- [];
-test_events(m2_spec_cases_13, {{_,[[top2,sub22]]},{_,[sub22_tc1,sub_tc2]}}) ->
- [];
-test_events(m2_spec_cases_14, {{_,[[sub2xx]]},{_,tc3}}) ->
- [];
-test_events(m2_spec_cases_15, {{_,[[sub22,sub2xx]]},{_,tc3}}) ->
- [];
-test_events(m2_spec_cases_16, {{_,[[top2,sub2xx]]},{_,[sub2xx_tc1,tc3]}}) ->
- [];
-test_events(m2_spec_cases_17, {{_,[[top2,sub22,sub2xx]]},
- {_,[top2_tc1,sub2xx_tc1,tc3]}}) ->
- [];
-test_events(m2_spec_cases_18, {{_,[sub2xx]},{_,[top2_tc1]}}) ->
- [];
+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,
- [{_,_,_,[all,top1,top2,sub1,sub2]},
- {_,_,_,top1,{cases,[top1_tc2]}},
- {_,_,_,top2,{cases,[top2_tc2]}},
- {_,_,_,sub1,{cases,[sub1_tc2]}},
- {_,_,_,sub2,{cases,[sub2_tc2]}},
- {_,_,_,[[top1,top2],[[top1],[top2]],
- [sub121,sub221],[[top1,sub12,sub121]]],{cases,all}},
- {_,_,_,all,{cases,[sub_tc2,tc3]}},
- {_,_,_,[top1,top2],{cases,tc3}},
- {_,_,_,[top1,top2],{cases,top1_tc1}},
- {_,_,_,[top1,top2],{cases,sub2xx_tc1}},
- {_,_,_,[top1,top2],{cases,[sub21_tc1,sub22_tc1]}},
- {_,_,_,[[top1],[top2]],{cases,tc3}},
- {_,_,_,[sub121],{cases,tc3}},
- {_,_,_,sub12,{cases,tc3}},
- {_,_,_,[top1,sub21],{cases,sub_tc2}},
- {_,_,_,[[top1,sub12]],{cases,sub12_tc1}},
- {_,_,_,[[top1,sub12]],{cases,[sub_tc2]}},
- {_,_,_,[[top1,sub12]],{cases,[sub12_tc1,sub_tc2]}},
- {_,_,_,[[top2,sub22]],{cases,[sub22_tc1,sub_tc2]}},
- {_,_,_,[[sub2xx]],{cases,tc3}},
- {_,_,_,[[sub22,sub2xx]],{cases,tc3}},
- {_,_,_,[[top2,sub2xx]],{cases,[sub2xx_tc1,tc3]}},
- {_,_,_,[[top2,sub22,sub2xx]],{cases,[top2_tc1,sub2xx_tc1,tc3]}},
- {_,_,_,[sub2xx],{cases,[top2_tc1]}}]) ->
+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}).