From 139524f226e9fde387dea203396d5fccf2bdca41 Mon Sep 17 00:00:00 2001 From: Peter Andersson Date: Fri, 2 Dec 2011 01:31:38 +0100 Subject: Implement support for overriding group properties with test specification --- lib/common_test/src/ct_framework.erl | 88 ++++++++++++++++++++++-------------- lib/common_test/src/ct_run.erl | 8 ++++ lib/common_test/src/ct_testspec.erl | 8 +++- 3 files changed, 67 insertions(+), 37 deletions(-) (limited to 'lib/common_test/src') diff --git a/lib/common_test/src/ct_framework.erl b/lib/common_test/src/ct_framework.erl index eaee45b21a..4c539fe696 100644 --- a/lib/common_test/src/ct_framework.erl +++ b/lib/common_test/src/ct_framework.erl @@ -850,10 +850,6 @@ group_or_func(Func, _Config) -> %%% should be returned. get_suite(Mod, all) -> - -%%! --- Wed Nov 30 21:29:30 2011 --- peppe was here! -io:format(user, "*** GET SUITE ~p~n", [Mod]), - case catch apply(Mod, groups, []) of {'EXIT',_} -> get_all(Mod, []); @@ -864,13 +860,7 @@ io:format(user, "*** GET SUITE ~p~n", [Mod]), %% (and only) test case so we can report Error properly [{?MODULE,error_in_suite,[[Error]]}]; ConfTests -> - %% get_all(Mod, ConfTests) - - %%! --- Wed Nov 30 21:30:35 2011 --- peppe was here! - All = get_all(Mod, ConfTests), - io:format(user, "*** All = ~p~n", [All]), - All - + get_all(Mod, ConfTests) end; _ -> E = "Bad return value from "++atom_to_list(Mod)++":groups/0", @@ -885,10 +875,6 @@ io:format(user, "*** GET SUITE ~p~n", [Mod]), %% group get_suite(Mod, Group={conf,Props,_Init,TCs,_End}) -> Name = ?val(name, Props), - - %%! --- Wed Nov 30 21:31:34 2011 --- peppe was here! - io:format(user, "*** GET GROUP ~p (~p)~n", [Name,Props]), - case catch apply(Mod, groups, []) of {'EXIT',_} -> [Group]; @@ -913,7 +899,18 @@ get_suite(Mod, Group={conf,Props,_Init,TCs,_End}) -> [] end; false -> - delete_subs(ConfTests, ConfTests) + ConfTests1 = delete_subs(ConfTests, ConfTests), + case ?val(override, Props) of + undefined -> + ConfTests1; + [] -> + ConfTests1; + ORSpec -> + ORSpec1 = if is_tuple(ORSpec) -> [ORSpec]; + true -> ORSpec end, + search_and_override(ConfTests1, + ORSpec1, Mod) + end end end; _ -> @@ -1224,7 +1221,7 @@ expand_groups({group,Name,default}, ConfTests, Mod) -> expand_groups({group,Name,default,[]}, ConfTests, Mod); expand_groups({group,Name,ORProps}, ConfTests, Mod) when is_list(ORProps) -> expand_groups({group,Name,ORProps,[]}, ConfTests, Mod); -expand_groups({group,Name,ORProps,SubGrSpec}, ConfTests, Mod) -> +expand_groups({group,Name,ORProps,SubORSpec}, ConfTests, Mod) -> FindConf = fun(Conf = {conf,Props,Init,Ts,End}) -> case ?val(name, Props) of @@ -1239,29 +1236,50 @@ expand_groups({group,Name,ORProps,SubGrSpec}, ConfTests, Mod) -> case lists:flatmap(FindConf, ConfTests) of [] -> throw({error,invalid_ref_msg(Name, Mod)}); - Matching when SubGrSpec == [] -> + Matching when SubORSpec == [] -> Matching; Matching -> - override_props(Matching, SubGrSpec, Name,Mod) + override_props(Matching, SubORSpec, Name,Mod) end; expand_groups(SeqOrTC, _ConfTests, _Mod) -> SeqOrTC. -override_props([{conf,Props,Init,Tests,End} | Confs], SubGrSpec, Name,Mod) -> - {Subs,SubGrSpec1} = override_sub_props(Tests, [], SubGrSpec, Mod), - [{conf,Props,Init,Subs,End} | override_props(Confs, SubGrSpec1, Name,Mod)]; +%% search deep for the matching conf test and modify it and any +%% sub tests according to the override specification +search_and_override([Conf = {conf,Props,Init,Tests,End}], ORSpec, Mod) -> + Name = ?val(name, Props), + case lists:keysearch(Name, 1, ORSpec) of + {value,{Name,default}} -> + [Conf]; + {value,{Name,ORProps}} -> + [{conf,[{name,Name}|ORProps],Init,Tests,End}]; + {value,{Name,default,[]}} -> + [Conf]; + {value,{Name,default,SubORSpec}} -> + override_props([Conf], SubORSpec, Name,Mod); + {value,{Name,ORProps,SubORSpec}} -> + override_props([{conf,[{name,Name}|ORProps], + Init,Tests,End}], SubORSpec, Name,Mod); + _ -> + [{conf,Props,Init,search_and_override(Tests,ORSpec,Mod),End}] + end. + +%% Modify the Tests element according to the override specification +override_props([{conf,Props,Init,Tests,End} | Confs], SubORSpec, Name,Mod) -> + {Subs,SubORSpec1} = override_sub_props(Tests, [], SubORSpec, Mod), + [{conf,Props,Init,Subs,End} | override_props(Confs, SubORSpec1, Name,Mod)]; override_props([], [], _,_) -> []; -override_props([], SubGrSpec, Name,Mod) -> - Es = [invalid_ref_msg(Name, element(1,Spec), Mod) || Spec <- SubGrSpec], +override_props([], SubORSpec, Name,Mod) -> + Es = [invalid_ref_msg(Name, element(1,Spec), Mod) || Spec <- SubORSpec], throw({error,Es}). -override_sub_props([], New, GroupSpec, _) -> - {?rev(New),GroupSpec}; +override_sub_props([], New, ORSpec, _) -> + {?rev(New),ORSpec}; override_sub_props([T = {conf,Props,Init,Tests,End} | Ts], - New, GroupSpec, Mod) -> + New, ORSpec, Mod) -> Name = ?val(name, Props), - case lists:keysearch(Name, 1, GroupSpec) of + case lists:keysearch(Name, 1, ORSpec) of {value,Spec} -> % group found in spec Props1 = case element(2, Spec) of @@ -1271,13 +1289,13 @@ override_sub_props([T = {conf,Props,Init,Tests,End} | Ts], case catch element(3, Spec) of Undef when Undef == [] ; 'EXIT' == element(1, Undef) -> override_sub_props(Ts, [{conf,Props1,Init,Tests,End} | New], - lists:keydelete(Name, 1, GroupSpec), Mod); - SubGrSpec when is_list(SubGrSpec) -> - case override_sub_props(Tests, [], SubGrSpec, Mod) of + lists:keydelete(Name, 1, ORSpec), Mod); + SubORSpec when is_list(SubORSpec) -> + case override_sub_props(Tests, [], SubORSpec, Mod) of {Subs,[]} -> override_sub_props(Ts, [{conf,Props1,Init, Subs,End} | New], - lists:keydelete(Name, 1, GroupSpec), + lists:keydelete(Name, 1, ORSpec), Mod); {_,NonEmptySpec} -> Es = [invalid_ref_msg(Name, element(1, GrRef), @@ -1288,10 +1306,10 @@ override_sub_props([T = {conf,Props,Init,Tests,End} | Ts], throw({error,{invalid_form,BadGrSpec}}) end; _ -> % not a group in spec - override_sub_props(Ts, [T | New], GroupSpec, Mod) + override_sub_props(Ts, [T | New], ORSpec, Mod) end; -override_sub_props([TC | Ts], New, GroupSpec, Mod) -> - override_sub_props(Ts, [TC | New], GroupSpec, Mod). +override_sub_props([TC | Ts], New, ORSpec, Mod) -> + override_sub_props(Ts, [TC | New], ORSpec, Mod). invalid_ref_msg(Name, Mod) -> E = "Invalid reference to group "++ diff --git a/lib/common_test/src/ct_run.erl b/lib/common_test/src/ct_run.erl index 0a9bb5af67..05b10bca32 100644 --- a/lib/common_test/src/ct_run.erl +++ b/lib/common_test/src/ct_run.erl @@ -1660,6 +1660,14 @@ final_tests1([{TestDir,Suite,GrsOrCs}|Tests], Final, Skip, Bad) when ({skipped,Group,TCs}) -> [ct_framework:make_conf(TestDir, Suite, Group, [skipped], TCs)]; + ({GrSpec = {Group,_},TCs}) -> + Props = [{override,GrSpec}], + [ct_framework:make_conf(TestDir, Suite, + Group, Props, TCs)]; + ({GrSpec = {Group,_,_},TCs}) -> + Props = [{override,GrSpec}], + [ct_framework:make_conf(TestDir, Suite, + Group, Props, TCs)]; ({Group,TCs}) -> [ct_framework:make_conf(TestDir, Suite, Group, [], TCs)]; diff --git a/lib/common_test/src/ct_testspec.erl b/lib/common_test/src/ct_testspec.erl index 317910d5c8..b68cbd3aa1 100644 --- a/lib/common_test/src/ct_testspec.erl +++ b/lib/common_test/src/ct_testspec.erl @@ -878,7 +878,11 @@ separate([],_,_,_) -> %% {Suite2,[GrOrCase21,GrOrCase22,...]},...]} %% {{Node,Dir},[{Suite1,{skip,Cmt}}, %% {Suite2,[{GrOrCase21,{skip,Cmt}},GrOrCase22,...]},...]} -%% GrOrCase = {GroupName,[Case1,Case2,...]} | Case +%% GrOrCase = {GroupSpec,[Case1,Case2,...]} | Case +%% GroupSpec = {GroupName,OverrideProps} | +%% {GroupName,OverrideProps,SubGroupSpec} +%% OverrideProps = Props | default +%% SubGroupSpec = GroupSpec | [] insert_suites(Node,Dir,[S|Ss],Tests, MergeTests) -> Tests1 = insert_cases(Node,Dir,S,all,Tests,MergeTests), @@ -889,7 +893,7 @@ insert_suites(Node,Dir,S,Tests,MergeTests) -> insert_suites(Node,Dir,[S],Tests,MergeTests). insert_groups(Node,Dir,Suite,Group,Cases,Tests,MergeTests) - when is_atom(Group) -> + when is_atom(Group); is_tuple(Group) -> 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) -> -- cgit v1.2.3