Skip to content

Commit 2a0db91

Browse files
committed
Make CI: Make ct_master handle all testspec instructions
1 parent 5da43ea commit 2a0db91

File tree

3 files changed

+121
-69
lines changed

3 files changed

+121
-69
lines changed

deps/rabbit/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,9 @@ define tpl_parallel_ct_test_spec
299299
{node, shard3, 'rabbit_shard3@localhost'}.
300300
{node, shard4, 'rabbit_shard4@localhost'}.
301301

302+
{auto_compile, false}.
303+
{ct_hooks, [cth_parallel_ct_detect_failure]}.
304+
302305
{define, 'Set1', [$(call comma_list,$(addsuffix _SUITE,$1))]}.
303306
{define, 'Set2', [$(call comma_list,$(addsuffix _SUITE,$2))]}.
304307
{define, 'Set3', [$(call comma_list,$(addsuffix _SUITE,$3))]}.

deps/rabbitmq_ct_helpers/src/ct_master_fork.erl

Lines changed: 115 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -177,23 +177,14 @@ run([TS|TestSpecs],AllowUserTerms,InclNodes,ExclNodes) when is_list(TS),
177177
Tests ->
178178
RunResult =
179179
lists:map(
180-
fun({Specs,TSRec=#testspec{logdir=AllLogDirs,
181-
config=StdCfgFiles,
182-
userconfig=UserCfgFiles,
183-
include=AllIncludes,
184-
init=AllInitOpts,
185-
event_handler=AllEvHs}}) ->
186-
AllCfgFiles =
187-
{StdCfgFiles,UserCfgFiles},
180+
fun({Specs,TSRec=#testspec{}}) ->
188181
RunSkipPerNode =
189182
ct_testspec:prepare_tests(TSRec),
190183
RunSkipPerNode2 =
191184
exclude_nodes(ExclNodes,RunSkipPerNode),
192185
TSList = if is_integer(hd(TS)) -> [TS];
193186
true -> TS end,
194-
{Specs,run_all(RunSkipPerNode2,AllLogDirs,
195-
AllCfgFiles,AllEvHs,
196-
AllIncludes,[],[],AllInitOpts,TSList)}
187+
{Specs,run_all(RunSkipPerNode2,TSRec,[],[],TSList)}
197188
end, Tests),
198189
RunResult ++ run(TestSpecs,AllowUserTerms,InclNodes,ExclNodes)
199190
end;
@@ -258,19 +249,11 @@ run_on_node([TS|TestSpecs],AllowUserTerms,Node) when is_list(TS),is_atom(Node) -
258249
Tests ->
259250
RunResult =
260251
lists:map(
261-
fun({Specs,TSRec=#testspec{logdir=AllLogDirs,
262-
config=StdCfgFiles,
263-
init=AllInitOpts,
264-
include=AllIncludes,
265-
userconfig=UserCfgFiles,
266-
event_handler=AllEvHs}}) ->
267-
AllCfgFiles = {StdCfgFiles,UserCfgFiles},
252+
fun({Specs,TSRec=#testspec{}}) ->
268253
{Run,Skip} = ct_testspec:prepare_tests(TSRec,Node),
269254
TSList = if is_integer(hd(TS)) -> [TS];
270255
true -> TS end,
271-
{Specs,run_all([{Node,Run,Skip}],AllLogDirs,
272-
AllCfgFiles,AllEvHs,
273-
AllIncludes, [],[],AllInitOpts,TSList)}
256+
{Specs,run_all([{Node,Run,Skip}],TSRec,[],[],TSList)}
274257
end, Tests),
275258
RunResult ++ run_on_node(TestSpecs,AllowUserTerms,Node)
276259
end;
@@ -291,62 +274,125 @@ run_on_node(TestSpecs,Node) ->
291274

292275

293276

294-
run_all([{Node,Run,Skip}|Rest],AllLogDirs,
295-
{AllStdCfgFiles, AllUserCfgFiles}=AllCfgFiles,
296-
AllEvHs,AllIncludes,NodeOpts,LogDirs,InitOptions,Specs) ->
297-
LogDir =
298-
lists:foldl(fun({N,Dir},_Found) when N == Node ->
299-
Dir;
300-
({_N,_Dir},Found) ->
301-
Found;
302-
(Dir,".") ->
303-
Dir;
304-
(_Dir,Found) ->
305-
Found
306-
end,".",AllLogDirs),
307-
308-
StdCfgFiles =
309-
lists:foldr(fun({N,F},Fs) when N == Node -> [F|Fs];
310-
({_N,_F},Fs) -> Fs;
311-
(F,Fs) -> [F|Fs]
312-
end,[],AllStdCfgFiles),
313-
UserCfgFiles =
277+
run_all([{Node,Run,Skip}|Rest],TSRec=#testspec{label = Labels,
278+
% profile = Profiles,
279+
logdir = LogDirs,
280+
logopts = LogOptsList,
281+
basic_html = BHs,
282+
esc_chars = EscChs,
283+
stylesheet = SSs,
284+
verbosity = VLvls,
285+
silent_connections = SilentConnsList,
286+
cover = CoverFs,
287+
cover_stop = CoverStops,
288+
config = Cfgs,
289+
userconfig = UsrCfgs,
290+
event_handler = EvHs,
291+
ct_hooks = CTHooks,
292+
%% Not available in OTP-26. We don't use it so leave commented for now.
293+
% ct_hooks_order = CTHooksOrder0,
294+
enable_builtin_hooks = EnableBuiltinHooks0,
295+
auto_compile = ACs,
296+
abort_if_missing_suites = AiMSs,
297+
include = Incl,
298+
multiply_timetraps = MTs,
299+
scale_timetraps = STs,
300+
create_priv_dir = PDs},
301+
NodeOpts,LogDirsRun,Specs) ->
302+
%% We mirror ct_run:get_data_for_node to retrieve data from #testspec,
303+
%% but set the default values where appropriate.
304+
Label = proplists:get_value(Node, Labels),
305+
% Profile = proplists:get_value(Node, Profiles),
306+
LogDir = case proplists:get_value(Node, LogDirs) of
307+
undefined -> ".";
308+
Dir -> Dir
309+
end,
310+
LogOpts = case proplists:get_value(Node, LogOptsList) of
311+
undefined -> [];
312+
LOs -> LOs
313+
end,
314+
BasicHtml = proplists:get_value(Node, BHs, false),
315+
EscChars = proplists:get_value(Node, EscChs, true),
316+
Stylesheet = proplists:get_value(Node, SSs),
317+
Verbosity = case proplists:get_value(Node, VLvls) of
318+
undefined -> [];
319+
Lvls -> Lvls
320+
end,
321+
SilentConns = case proplists:get_value(Node, SilentConnsList) of
322+
undefined -> [];
323+
SCs -> SCs
324+
end,
325+
Cover = proplists:get_value(Node, CoverFs),
326+
CoverStop = proplists:get_value(Node, CoverStops, true),
327+
MT = proplists:get_value(Node, MTs, 1),
328+
ST = proplists:get_value(Node, STs, false),
329+
CreatePrivDir = proplists:get_value(Node, PDs, auto_per_run),
330+
%% For these two values we can't exactly mirror get_data_for_node.
331+
ConfigFiles =
332+
lists:foldr(fun({N,F},Fs) when N == Node -> [F|Fs];
333+
({_N,_F},Fs) -> Fs;
334+
(F,Fs) -> [F|Fs]
335+
end,[],Cfgs),
336+
UsrConfigFiles =
314337
lists:foldr(fun({N,F},Fs) when N == Node -> [{userconfig, F}|Fs];
315-
({_N,_F},Fs) -> Fs;
316-
(F,Fs) -> [{userconfig, F}|Fs]
317-
end,[],AllUserCfgFiles),
318-
319-
Includes = lists:foldr(fun({N,I},Acc) when N =:= Node ->
320-
[I|Acc];
321-
({_,_},Acc) ->
322-
Acc;
323-
(I,Acc) ->
324-
[I | Acc]
325-
end, [], AllIncludes),
326-
EvHs =
327-
lists:foldr(fun({N,H,A},Hs) when N == Node -> [{H,A}|Hs];
328-
({_N,_H,_A},Hs) -> Hs;
329-
({H,A},Hs) -> [{H,A}|Hs]
330-
end,[],AllEvHs),
331-
332-
NO = {Node,[{prepared_tests,{Run,Skip},Specs},
333-
{ct_hooks, [cth_parallel_ct_detect_failure]},
334-
{logdir,LogDir},
335-
{include, Includes},
336-
{config,StdCfgFiles},
337-
{event_handler,EvHs}] ++ UserCfgFiles},
338-
run_all(Rest,AllLogDirs,AllCfgFiles,AllEvHs,AllIncludes,
339-
[NO|NodeOpts],[LogDir|LogDirs],InitOptions,Specs);
340-
run_all([],AllLogDirs,_,AllEvHs,_AllIncludes,
341-
NodeOpts,LogDirs,InitOptions,Specs) ->
338+
({_N,_F},Fs) -> Fs;
339+
(F,Fs) -> [{userconfig, F}|Fs]
340+
end,[],UsrCfgs),
341+
EvHandlers = [{H,A} || {N,H,A} <- EvHs, N==Node],
342+
FiltCTHooks = [Hook || {N,Hook} <- CTHooks, N==Node],
343+
% CTHooksOrder = case CTHooksOrder0 of
344+
% undefined -> test;
345+
% _ -> CTHooksOrder0
346+
% end,
347+
EnableBuiltinHooks = case EnableBuiltinHooks0 of
348+
undefined -> true;
349+
_ -> EnableBuiltinHooks0
350+
end,
351+
AutoCompile = proplists:get_value(Node, ACs, true),
352+
AbortIfMissing = proplists:get_value(Node, AiMSs, false),
353+
Include = [I || {N,I} <- Incl, N==Node],
354+
%% We then build the ct:run_test/1 options list.
355+
RunTestOpts0 =
356+
[{label, Label} || Label =/= undefined] ++
357+
[{stylesheet, Stylesheet} || Stylesheet =/= undefined] ++
358+
[{cover, Cover} || Cover =/= undefined] ++
359+
UsrConfigFiles,
360+
RunTestOpts = [
361+
% {profile, Profile},
362+
{logdir, LogDir},
363+
{logopts, LogOpts},
364+
{basic_html, BasicHtml},
365+
{esc_chars, EscChars},
366+
{verbosity, Verbosity},
367+
{silent_connections, SilentConns},
368+
{cover_stop, CoverStop},
369+
{config, ConfigFiles},
370+
{event_handler, EvHandlers},
371+
{ct_hooks, FiltCTHooks},
372+
% {ct_hooks_order, CTHooksOrder},
373+
{enable_builtin_hooks, EnableBuiltinHooks},
374+
{auto_compile, AutoCompile},
375+
{abort_if_missing_suites, AbortIfMissing},
376+
{include, Include},
377+
{multiply_timetraps, MT},
378+
{scale_timetraps, ST},
379+
{create_priv_dir, CreatePrivDir}
380+
|RunTestOpts0],
381+
NO = {Node,[{prepared_tests,{Run,Skip},Specs}|RunTestOpts]},
382+
run_all(Rest,TSRec,[NO|NodeOpts],[LogDir|LogDirsRun],Specs);
383+
run_all([],#testspec{
384+
logdir=AllLogDirs,
385+
init=InitOptions,
386+
event_handler=AllEvHs},
387+
NodeOpts,LogDirsRun,Specs) ->
342388
Handlers = [{H,A} || {Master,H,A} <- AllEvHs, Master == master],
343389
MasterLogDir = case lists:keysearch(master,1,AllLogDirs) of
344390
{value,{_,Dir}} -> Dir;
345391
false -> "."
346392
end,
347393
log(tty,"Master Logdir","~ts",[MasterLogDir]),
348394
start_master(lists:reverse(NodeOpts),Handlers,MasterLogDir,
349-
LogDirs,InitOptions,Specs),
395+
LogDirsRun,InitOptions,Specs),
350396
ok.
351397

352398

deps/rabbitmq_mqtt/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@ define tpl_parallel_ct_test_spec
122122
{node, shard3, 'rabbit_shard3@localhost'}.
123123
{node, shard4, 'rabbit_shard4@localhost'}.
124124

125+
{auto_compile, false}.
126+
{ct_hooks, [cth_parallel_ct_detect_failure]}.
127+
125128
{define, 'Set1', [$(call comma_list,$(addsuffix _SUITE,$1))]}.
126129
{define, 'Set2', [$(call comma_list,$(addsuffix _SUITE,$2))]}.
127130
{define, 'Set3', [$(call comma_list,$(addsuffix _SUITE,$3))]}.

0 commit comments

Comments
 (0)