@@ -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,124 @@ 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+ ct_hooks_order = CTHooksOrder0 ,
293+ enable_builtin_hooks = EnableBuiltinHooks0 ,
294+ auto_compile = ACs ,
295+ abort_if_missing_suites = AiMSs ,
296+ include = Incl ,
297+ multiply_timetraps = MTs ,
298+ scale_timetraps = STs ,
299+ create_priv_dir = PDs },
300+ NodeOpts ,LogDirsRun ,Specs ) ->
301+ % % We mirror ct_run:get_data_for_node to retrieve data from #testspec,
302+ % % but set the default values where appropriate.
303+ Label = proplists :get_value (Node , Labels ),
304+ % Profile = proplists:get_value(Node, Profiles),
305+ LogDir = case proplists :get_value (Node , LogDirs ) of
306+ undefined -> " ." ;
307+ Dir -> Dir
308+ end ,
309+ LogOpts = case proplists :get_value (Node , LogOptsList ) of
310+ undefined -> [];
311+ LOs -> LOs
312+ end ,
313+ BasicHtml = proplists :get_value (Node , BHs , false ),
314+ EscChars = proplists :get_value (Node , EscChs , true ),
315+ Stylesheet = proplists :get_value (Node , SSs ),
316+ Verbosity = case proplists :get_value (Node , VLvls ) of
317+ undefined -> [];
318+ Lvls -> Lvls
319+ end ,
320+ SilentConns = case proplists :get_value (Node , SilentConnsList ) of
321+ undefined -> [];
322+ SCs -> SCs
323+ end ,
324+ Cover = proplists :get_value (Node , CoverFs ),
325+ CoverStop = proplists :get_value (Node , CoverStops , true ),
326+ MT = proplists :get_value (Node , MTs , 1 ),
327+ ST = proplists :get_value (Node , STs , false ),
328+ CreatePrivDir = proplists :get_value (Node , PDs , auto_per_run ),
329+ % % For these two values we can't exactly mirror get_data_for_node.
330+ ConfigFiles =
331+ lists :foldr (fun ({N ,F },Fs ) when N == Node -> [F |Fs ];
332+ ({_N ,_F },Fs ) -> Fs ;
333+ (F ,Fs ) -> [F |Fs ]
334+ end ,[],Cfgs ),
335+ UsrConfigFiles =
314336 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 ) ->
337+ ({_N ,_F },Fs ) -> Fs ;
338+ (F ,Fs ) -> [{userconfig , F }|Fs ]
339+ end ,[],UsrCfgs ),
340+ EvHandlers = [{H ,A } || {N ,H ,A } <- EvHs , N == Node ],
341+ FiltCTHooks = [Hook || {N ,Hook } <- CTHooks , N == Node ],
342+ CTHooksOrder = case CTHooksOrder0 of
343+ undefined -> test ;
344+ _ -> CTHooksOrder0
345+ end ,
346+ EnableBuiltinHooks = case EnableBuiltinHooks0 of
347+ undefined -> true ;
348+ _ -> EnableBuiltinHooks0
349+ end ,
350+ AutoCompile = proplists :get_value (Node , ACs , true ),
351+ AbortIfMissing = proplists :get_value (Node , AiMSs , false ),
352+ Include = [I || {N ,I } <- Incl , N == Node ],
353+ % % We then build the ct:run_test/1 options list.
354+ RunTestOpts0 =
355+ [{label , Label } || Label =/= undefined ] ++
356+ [{stylesheet , Stylesheet } || Stylesheet =/= undefined ] ++
357+ [{cover , Cover } || Cover =/= undefined ] ++
358+ UsrConfigFiles ,
359+ RunTestOpts = [
360+ % {profile, Profile},
361+ {logdir , LogDir },
362+ {logopts , LogOpts },
363+ {basic_html , BasicHtml },
364+ {esc_chars , EscChars },
365+ {verbosity , Verbosity },
366+ {silent_connections , SilentConns },
367+ {cover_stop , CoverStop },
368+ {config , ConfigFiles },
369+ {event_handler , EvHandlers },
370+ {ct_hooks , FiltCTHooks },
371+ {ct_hooks_order , CTHooksOrder },
372+ {enable_builtin_hooks , EnableBuiltinHooks },
373+ {auto_compile , AutoCompile },
374+ {abort_if_missing_suites , AbortIfMissing },
375+ {include , Include },
376+ {multiply_timetraps , MT },
377+ {scale_timetraps , ST },
378+ {create_priv_dir , CreatePrivDir }
379+ |RunTestOpts0 ],
380+ NO = {Node ,[{prepared_tests ,{Run ,Skip },Specs }|RunTestOpts ]},
381+ run_all (Rest ,TSRec ,[NO |NodeOpts ],[LogDir |LogDirsRun ],Specs );
382+ run_all ([],# testspec {
383+ logdir = AllLogDirs ,
384+ init = InitOptions ,
385+ event_handler = AllEvHs },
386+ NodeOpts ,LogDirsRun ,Specs ) ->
342387 Handlers = [{H ,A } || {Master ,H ,A } <- AllEvHs , Master == master ],
343388 MasterLogDir = case lists :keysearch (master ,1 ,AllLogDirs ) of
344389 {value ,{_ ,Dir }} -> Dir ;
345390 false -> " ."
346391 end ,
347392 log (tty ," Master Logdir" ," ~ts " ,[MasterLogDir ]),
348393 start_master (lists :reverse (NodeOpts ),Handlers ,MasterLogDir ,
349- LogDirs ,InitOptions ,Specs ),
394+ LogDirsRun ,InitOptions ,Specs ),
350395 ok .
351396
352397
0 commit comments