diff options
Diffstat (limited to 'lib/test_server/src')
| -rw-r--r-- | lib/test_server/src/test_server.app.src | 2 | ||||
| -rw-r--r-- | lib/test_server/src/test_server.erl | 166 | ||||
| -rw-r--r-- | lib/test_server/src/test_server_ctrl.erl | 127 | ||||
| -rw-r--r-- | lib/test_server/src/test_server_node.erl | 5 | ||||
| -rw-r--r-- | lib/test_server/src/test_server_sup.erl | 15 | ||||
| -rw-r--r-- | lib/test_server/src/ts_install_cth.erl | 11 | 
6 files changed, 137 insertions, 189 deletions
| diff --git a/lib/test_server/src/test_server.app.src b/lib/test_server/src/test_server.app.src index 173f7075db..5538e8b851 100644 --- a/lib/test_server/src/test_server.app.src +++ b/lib/test_server/src/test_server.app.src @@ -34,5 +34,5 @@    {env, []},    {runtime_dependencies, ["tools-2.6.14","stdlib-2.0","runtime_tools-1.8.14",  			  "observer-2.0","kernel-3.0","inets-5.10", -			  "syntax_tools-1.6.16","erts-6.0"]}]}. +			  "syntax_tools-1.6.16","erts-7.0"]}]}. diff --git a/lib/test_server/src/test_server.erl b/lib/test_server/src/test_server.erl index 8d91778cbb..acd2e0bff2 100644 --- a/lib/test_server/src/test_server.erl +++ b/lib/test_server/src/test_server.erl @@ -1,7 +1,7 @@  %%  %% %CopyrightBegin%  %% -%% Copyright Ericsson AB 1996-2014. All Rights Reserved. +%% Copyright Ericsson AB 1996-2015. All Rights Reserved.  %%  %% The contents of this file are subject to the Erlang Public License,  %% Version 1.1, (the "License"); you may not use this file except in @@ -178,68 +178,35 @@ module_names(Beams) ->  do_cover_compile(Modules) ->      cover:start(), -    pmap1(fun(M) -> do_cover_compile1(M) end,lists:usort(Modules)), +    Sticky = prepare_cover_compile(Modules,[]), +    R = cover:compile_beam(Modules), +    [warn_compile(Error) || Error <- R,element(1,Error)=/=ok], +    [code:stick_mod(M) || M <- Sticky],      ok. -do_cover_compile1(M) -> +warn_compile({error,{Reason,Module}}) -> +    io:fwrite("\nWARNING: Could not cover compile ~ts: ~p\n", +	      [Module,{error,Reason}]). + +%% Make sure all modules are loaded and unstick if sticky +prepare_cover_compile([M|Ms],Sticky) ->      case {code:is_sticky(M),code:is_loaded(M)} of  	{true,_} ->  	    code:unstick_mod(M), -	    case cover:compile_beam(M) of -		{ok,_} -> -		    ok; -		Error -> -		    io:fwrite("\nWARNING: Could not cover compile ~w: ~p\n", -			      [M,Error]) -	    end, -	    code:stick_mod(M); +	    prepare_cover_compile(Ms,[M|Sticky]);  	{false,false} ->  	    case code:load_file(M) of  		{module,_} -> -		    do_cover_compile1(M); +		    prepare_cover_compile([M|Ms],Sticky);  		Error -> -		    io:fwrite("\nWARNING: Could not load ~w: ~p\n",[M,Error]) +		    io:fwrite("\nWARNING: Could not load ~w: ~p\n",[M,Error]), +		    prepare_cover_compile(Ms,Sticky)  	    end;  	{false,_} -> -	    case cover:compile_beam(M) of -		{ok,_} -> -		    ok; -		Error -> -		    io:fwrite("\nWARNING: Could not cover compile ~w: ~p\n", -			      [M,Error]) -	    end -    end. - -pmap1(Fun,List) -> -    NTot = length(List), -    NProcs = erlang:system_info(schedulers) * 2, -    NPerProc = (NTot div NProcs) + 1, - -    {[],Pids} = -	lists:foldr( -	  fun(_,{L,Ps}) -> -		  {L1,L2} = if length(L)>=NPerProc -> lists:split(NPerProc,L); -			       true -> {L,[]} % last chunk -			    end, -		  {P,_Ref} = -		      spawn_monitor(fun() -> -					    exit(lists:map(Fun,L1)) -				    end), -		  {L2,[P|Ps]} -	  end, -	  {List,[]}, -	  lists:seq(1,NProcs)), -    collect(Pids,[]). - -collect([],Acc) -> -    lists:append(Acc); -collect([Pid|Pids],Acc) -> -    receive -	{'DOWN', _Ref, process, Pid, Result} -> -	    %% collect(lists:delete(Pid,Pids),[Result|Acc]) -	    collect(Pids,[Result|Acc]) -    end. - +	    prepare_cover_compile(Ms,Sticky) +    end; +prepare_cover_compile([],Sticky) -> +    Sticky.  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% cover_analyse(Dir,#cover{level=Analyse,mods=Modules,stop=Stop) -> @@ -269,45 +236,40 @@ collect([Pid|Pids],Acc) ->  %% after the test is completed.  cover_analyse(Dir,#cover{level=Analyse,mods=Modules,stop=Stop}) ->      io:fwrite(user, "Cover analysing... ", []), -    DetailsFun = +    {ATFOk,ATFFail} =  	case Analyse of  	    details ->  		case cover:export(filename:join(Dir,"all.coverdata")) of  		    ok -> -			fun(M) -> -				OutFile = filename:join(Dir, -							atom_to_list(M) ++ -							".COVER.html"), -				case cover:analyse_to_file(M,OutFile,[html]) of -				    {ok,_} -> -					{file,OutFile}; -				    Error -> -					Error -				end -			end; +			{result,Ok1,Fail1} = +			    cover:analyse_to_file(Modules,[{outdir,Dir},html]), +			{lists:map(fun(OutFile) -> +					   M = list_to_atom( +						 filename:basename( +						   filename:rootname(OutFile, +								     ".COVER.html") +						  ) +						), +					   {M,{file,OutFile}} +				   end, Ok1), +			lists:map(fun({Reason,M}) -> +					  {M,{error,Reason}} +				  end, Fail1)};  		    Error -> -			fun(_) -> Error end +			{[],lists:map(fun(M) -> {M,Error} end, Modules)}  		end;  	    overview ->  		case cover:export(filename:join(Dir,"all.coverdata")) of  		    ok -> -			fun(_) -> undefined end; +			{[],lists:map(fun(M) -> {M,undefined} end, Modules)};  		    Error -> -			fun(_) -> Error end +			{[],lists:map(fun(M) -> {M,Error} end, Modules)}  		end  	end, -    R = pmap2( -	  fun(M) -> -		  case cover:analyse(M,module) of -		      {ok,{M,{Cov,NotCov}}} -> -			  {M,{Cov,NotCov,DetailsFun(M)}}; -		      Err -> -			  io:fwrite(user, -				    "\nWARNING: Analysis failed for ~w. Reason: ~p\n", -				    [M,Err]), -			  {M,Err} -		  end -	  end, Modules), +    {result,AOk,AFail} = cover:analyse(Modules,module), +    R0 = merge_analysis_results(AOk,ATFOk++ATFFail,[]) ++ +	[{M,{error,Reason}} || {Reason,M} <- AFail], +    R = lists:sort(R0),      io:fwrite(user, "done\n\n", []),      case Stop of @@ -320,19 +282,15 @@ cover_analyse(Dir,#cover{level=Analyse,mods=Modules,stop=Stop}) ->      end,      R. -pmap2(Fun,List) -> -    Collector = self(), -    Pids = lists:map(fun(E) -> -			     spawn(fun() -> -					   Collector ! {res,self(),Fun(E)} -				   end) -		     end, List), -    lists:map(fun(Pid) -> -		      receive -			  {res,Pid,Res} -> -			      Res -		      end -	      end, Pids). +merge_analysis_results([{M,{Cov,NotCov}}|T],ATF,Acc) -> +    case lists:keytake(M,1,ATF) of +	{value,{_,R},ATF1} -> +	    merge_analysis_results(T,ATF1,[{M,{Cov,NotCov,R}}|Acc]); +	false -> +	    merge_analysis_results(T,ATF,Acc) +    end; +merge_analysis_results([],_,Acc) -> +    Acc.  do_cover_for_node(Node,CoverFunc) ->      do_cover_for_node(Node,CoverFunc,true). @@ -1424,7 +1382,7 @@ lookup_config(Key,Config) ->  %% timer:tc/3  ts_tc(M, F, A) -> -    Before = erlang:now(), +    Before = erlang:monotonic_time(),      Result = try  		 apply(M, F, A)  	     catch @@ -1444,12 +1402,8 @@ ts_tc(M, F, A) ->  			     {'EXIT',Reason}  		     end  	     end, -    After = erlang:now(), -    Elapsed = -	(element(1,After)*1000000000000 -	 +element(2,After)*1000000+element(3,After)) - -	(element(1,Before)*1000000000000 -	 +element(2,Before)*1000000+element(3,Before)), +    After   = erlang:monotonic_time(), +    Elapsed = erlang:convert_time_unit(After-Before, native, micro_seconds),      {Elapsed, Result}.  set_loc(Stk) -> @@ -1868,7 +1822,7 @@ time_ms_check(Other) ->  time_ms_apply(Func, TCPid, MultAndScale) ->      {_,GL} = process_info(TCPid, group_leader),      WhoAmI = self(),				% either TC or IO server -    T0 = now(), +    T0 = os:timestamp(),      UserTTSup =   	spawn(fun() ->   		      user_timetrap_supervisor(Func, WhoAmI, TCPid, @@ -1901,7 +1855,7 @@ user_timetrap_supervisor(Func, Spawner, TCPid, GL, T0, MultAndScale) ->      receive  	{UserTT,Result} ->  	    demonitor(MonRef, [flush]), -	    Elapsed = trunc(timer:now_diff(now(), T0) / 1000), +	    Elapsed = trunc(timer:now_diff(os:timestamp(), T0) / 1000),  	    try time_ms_check(Result) of  		TimeVal ->  		    %% this is the new timetrap value to set (return value @@ -2424,9 +2378,8 @@ is_release_available(Release) ->  %%  run_on_shielded_node(Fun, CArgs) when is_function(Fun), is_list(CArgs) -> -    {A,B,C} = now(), -    Name = "shielded_node-" ++ integer_to_list(A) ++ "-" ++ integer_to_list(B) -	++ "-" ++ integer_to_list(C), +    Nr = erlang:unique_integer([positive]), +    Name = "shielded_node-" ++ integer_to_list(Nr),      Node = case start_node(Name, slave, [{args, "-hidden " ++ CArgs}]) of  	       {ok, N} -> N;  	       Err -> fail({failed_to_start_shielded_node, Err}) @@ -2485,9 +2438,8 @@ is_cover(Name) ->  %% A filename of the form <Stem><Number> is generated, and the  %% function checks that that file doesn't already exist.  temp_name(Stem) -> -    {A,B,C} = erlang:now(), -    RandomNum = A bxor B bxor C, -    RandomName = Stem ++ integer_to_list(RandomNum), +    Num = erlang:unique_integer([positive]), +    RandomName = Stem ++ integer_to_list(Num),      {ok,Files} = file:list_dir(filename:dirname(Stem)),      case lists:member(RandomName,Files) of  	true -> diff --git a/lib/test_server/src/test_server_ctrl.erl b/lib/test_server/src/test_server_ctrl.erl index 68b03a5987..bef0658b6d 100644 --- a/lib/test_server/src/test_server_ctrl.erl +++ b/lib/test_server/src/test_server_ctrl.erl @@ -99,7 +99,7 @@  -define(last_link, "last_link").  -define(last_test, "last_test").  -define(html_ext, ".html"). --define(now, erlang:now()). +-define(now, os:timestamp()).  -define(void_fun, fun() -> ok end).  -define(mod_result(X), if X == skip -> skipped; @@ -1204,19 +1204,14 @@ init_tester(Mod, Func, Args, Dir, Name, {_,_,MinLev}=Levels,  report_severe_error(Reason) ->      test_server_sup:framework_call(report, [severe_error,Reason]). -%% timer:tc/3 -ts_tc(M, F, A) -> -    Before = ?now, -    Val = (catch apply(M, F, A)), -    After = ?now, -    Elapsed = elapsed_time(Before, After), -    {Elapsed,Val}. - -elapsed_time(Before, After) -> -    (element(1,After)*1000000000000 + -     element(2,After)*1000000 + element(3,After)) - -    (element(1,Before)*1000000000000 + -     element(2,Before)*1000000 + element(3,Before)). +ts_tc(M,F,A) -> +    Before = erlang:monotonic_time(), +    Result = (catch apply(M, F, A)), +    After   = erlang:monotonic_time(), +    Elapsed = erlang:convert_time_unit(After-Before, +				       native, +				       micro_seconds), +    {Elapsed, Result}.  start_extra_tools(ExtraTools) ->      start_extra_tools(ExtraTools, []). @@ -1812,26 +1807,31 @@ start_minor_log_file1(Mod, Func, LogDir, AbsName, MFA) ->      io:put_chars(Fd, "<pre>\n"),      SrcListing = downcase(atom_to_list(Mod)) ++ ?src_listing_ext, -     -    {Info,Arity} = -	if Func == init_per_suite; Func == end_per_suite -> -		{"Config function: ", 1}; -	   Func == init_per_group; Func == end_per_group -> -		{"Config function: ", 2}; -	   true -> -		{"Test case: ", 1} -	end, -    case {filelib:is_file(filename:join(LogDir, SrcListing)), -	  lists:member(no_src, get(test_server_logopts))} of -	{true,false} -> -	    print(Lev, Info ++ "<a href=\"~ts#~ts\">~w:~w/~w</a> " -		  "(click for source code)\n", -		  [uri_encode(SrcListing), -		   uri_encode(atom_to_list(Func)++"-1",utf8), -		   Mod,Func,Arity]); +    case get_fw_mod(?MODULE) of +	Mod when Func == error_in_suite -> +	    ok;  	_ -> -	    print(Lev, Info ++ "~w:~w/~w\n", [Mod,Func,Arity]) +	    {Info,Arity} = +		if Func == init_per_suite; Func == end_per_suite -> +			{"Config function: ", 1}; +		   Func == init_per_group; Func == end_per_group -> +			{"Config function: ", 2}; +		   true -> +			{"Test case: ", 1} +		end, +	     +	    case {filelib:is_file(filename:join(LogDir, SrcListing)), +		  lists:member(no_src, get(test_server_logopts))} of +		{true,false} -> +		    print(Lev, Info ++ "<a href=\"~ts#~ts\">~w:~w/~w</a> " +			  "(click for source code)\n", +			  [uri_encode(SrcListing), +			   uri_encode(atom_to_list(Func)++"-1",utf8), +			   Mod,Func,Arity]); +		_ -> +		    print(Lev, Info ++ "~w:~w/~w\n", [Mod,Func,Arity]) +	    end      end,      AbsName. @@ -2025,7 +2025,7 @@ add_init_and_end_per_suite([{conf,_,_,{Mod,_}}=Case|Cases], LastMod,      PreCases ++ [Case|add_init_and_end_per_suite(Cases, NextMod,  						 NextRef, FwMod)];  add_init_and_end_per_suite([SkipCase|Cases], LastMod, LastRef, FwMod) -  when element(1,SkipCase) == skip_case -> +  when element(1,SkipCase) == skip_case;  element(1,SkipCase) == auto_skip_case->      [SkipCase|add_init_and_end_per_suite(Cases, LastMod, LastRef, FwMod)];  add_init_and_end_per_suite([{conf,_,_,_}=Case|Cases], LastMod, LastRef, FwMod) ->      [Case|add_init_and_end_per_suite(Cases, LastMod, LastRef, FwMod)]; @@ -2490,7 +2490,7 @@ run_test_cases_loop([{conf,Ref,Props,{Mod,Func}}|_Cases]=Cs0,  			file:set_cwd(filename:dirname(get(test_server_dir))),  			After = ?now,  			Before = get(test_server_parallel_start_time), -			Elapsed = elapsed_time(Before, After)/1000000, +			Elapsed = timer:now_diff(After, Before)/1000000,  			put(test_server_total_time, Elapsed),  			{false,tl(Mode0),undefined,Elapsed,  			 update_status(Ref, OkSkipFail, Status)}; @@ -2499,7 +2499,7 @@ run_test_cases_loop([{conf,Ref,Props,{Mod,Func}}|_Cases]=Cs0,  			%% parallel group (io buffering is active)  			OkSkipFail = wait_for_cases(Ref),  			queue_test_case_io(Ref, self(), 0, Mod, Func), -			Elapsed = elapsed_time(conf_start(Ref, Mode0),?now)/1000000, +			Elapsed = timer:now_diff(?now, conf_start(Ref, Mode0))/1000000,  			case CurrIOHandler of  			    {Ref,_} ->  				%% current_io_handler was set by start conf of this @@ -2516,12 +2516,12 @@ run_test_cases_loop([{conf,Ref,Props,{Mod,Func}}|_Cases]=Cs0,  		%% this is an end conf for a non-parallel group that's not  		%% nested under a parallel group, so no need to buffer io  		{false,tl(Mode0),undefined, -		 elapsed_time(conf_start(Ref, Mode0),?now)/1000000, Status}; +		 timer:now_diff(?now, conf_start(Ref, Mode0))/1000000, Status};  	    {Ref,_} ->  		%% this is an end conf for a non-parallel group nested under  		%% a parallel group (io buffering is active)  		queue_test_case_io(Ref, self(), 0, Mod, Func), -		Elapsed = elapsed_time(conf_start(Ref, Mode0),?now)/1000000, +		Elapsed = timer:now_diff(?now, conf_start(Ref, Mode0))/1000000,  		case CurrIOHandler of  		    {Ref,_} ->  			%% current_io_handler was set by start conf of this @@ -2576,7 +2576,7 @@ run_test_cases_loop([{conf,Ref,Props,{Mod,Func}}|_Cases]=Cs0,  			    %% 1. check the TS_RANDOM_SEED env variable  			    %% 2. check random_seed in process state  			    %% 3. use value provided with shuffle option -			    %% 4. use now() values for seed +			    %% 4. use timestamp() values for seed  			    case os:getenv("TS_RANDOM_SEED") of  				Undef when Undef == false ; Undef == "undefined" ->  				    case get(test_server_random_seed) of @@ -3710,8 +3710,8 @@ run_test_case1(Ref, Num, Mod, Func, Args, RunInit,  		RunDir = filename:dirname(MinorName),  		Ext =  		    if Num == 0 -> -			    {_,S,Us} = now(), -			    lists:flatten(io_lib:format(".~w.~w", [S,Us])); +			    Nr = erlang:unique_integer([positive]), +			    lists:flatten(io_lib:format(".~w", [Nr]));  		       true ->  			    lists:flatten(io_lib:format(".~w", [Num]))  		    end, @@ -3951,8 +3951,8 @@ progress(skip, CaseNum, Mod, Func, GrName, Loc, Reason, Time,  	  "<td>~ts~ts</td></tr>\n",  	  [Time,Color,ReasonStr2,Comment1]),      FormatLoc = test_server_sup:format_loc(Loc), -    print(minor, "=== location ~ts", [FormatLoc]), -    print(minor, "=== reason = ~ts", [ReasonStr1]), +    print(minor, "=== Location: ~ts", [FormatLoc]), +    print(minor, "=== Reason: ~ts", [ReasonStr1]),      Ret;  progress(failed, CaseNum, Mod, Func, GrName, Loc, timetrap_timeout, T, @@ -3977,8 +3977,8 @@ progress(failed, CaseNum, Mod, Func, GrName, Loc, timetrap_timeout, T,  	  "<td>~ts</td></tr>\n",  	  [T/1000,Comment]),      FormatLoc = test_server_sup:format_loc(Loc), -    print(minor, "=== location ~ts", [FormatLoc]), -    print(minor, "=== reason = timetrap timeout", []), +    print(minor, "=== Location: ~ts", [FormatLoc]), +    print(minor, "=== Reason: timetrap timeout", []),      failed;  progress(failed, CaseNum, Mod, Func, GrName, Loc, {testcase_aborted,Reason}, _T, @@ -4003,13 +4003,13 @@ progress(failed, CaseNum, Mod, Func, GrName, Loc, {testcase_aborted,Reason}, _T,  	  "<td>~ts</td></tr>\n",  	  [Comment]),      FormatLoc = test_server_sup:format_loc(Loc), -    print(minor, "=== location ~ts", [FormatLoc]), -    print(minor, "=== reason = {testcase_aborted,~p}", [Reason]), +    print(minor, "=== Location: ~ts", [FormatLoc]), +    print(minor, "=== Reason: {testcase_aborted,~p}", [Reason]),      failed;  progress(failed, CaseNum, Mod, Func, GrName, unknown, Reason, Time,  	 Comment0, {St0,St1}) -> -    print(major, "=result        failed: ~p, ~w", [Reason,unknown]), +    print(major, "=result        failed: ~p, ~w", [Reason,unknown_location]),      print(1, "*** FAILED ~ts ***",  	  [get_info_str(Mod,Func, CaseNum, get(test_server_cases))]),      test_server_sup:framework_call(report, [tc_done,{Mod,{Func,GrName}, @@ -4038,14 +4038,21 @@ progress(failed, CaseNum, Mod, Func, GrName, unknown, Reason, Time,  	  "<td><font color=\"red\">FAILED</font></td>"  	  "<td>~ts</td></tr>\n",  	  [TimeStr,Comment]), -    print(minor, "=== location ~w", [unknown]), +    print(minor, "=== Location: ~w", [unknown]),      {FStr,FormattedReason} = format_exception(Reason), -    print(minor, "=== reason = " ++ FStr, [FormattedReason]), +    print(minor, "=== Reason: " ++ FStr, [FormattedReason]),      failed;  progress(failed, CaseNum, Mod, Func, GrName, Loc, Reason, Time,  	 Comment0, {St0,St1}) -> -    print(major, "=result        failed: ~p, ~p", [Reason,Loc]), +    {LocMaj,LocMin} = if Func == error_in_suite -> +			      case get_fw_mod(undefined) of +				  Mod -> {unknown_location,unknown}; +				  _   -> {Loc,Loc} +			      end; +			 true -> {Loc,Loc} +		       end, +    print(major, "=result        failed: ~p, ~p", [Reason,LocMaj]),      print(1, "*** FAILED ~ts ***",  	  [get_info_str(Mod,Func, CaseNum, get(test_server_cases))]),      test_server_sup:framework_call(report, [tc_done,{Mod,{Func,GrName}, @@ -4058,16 +4065,16 @@ progress(failed, CaseNum, Mod, Func, GrName, Loc, Reason, Time,  	    "" -> "";  	    _ -> xhtml("<br>","<br />") ++ to_string(Comment0)  	end, -    FormatLastLoc = test_server_sup:format_loc(get_last_loc(Loc)), +    FormatLastLoc = test_server_sup:format_loc(get_last_loc(LocMaj)),      print(html,  	  "<td>" ++ St0 ++ "~ts" ++ St1 ++ "</td>"  	  "<td><font color=\"red\">FAILED</font></td>"  	  "<td><font color=\"red\">~ts</font>~ts</td></tr>\n",  	  [TimeStr,FormatLastLoc,Comment]), -    FormatLoc = test_server_sup:format_loc(Loc), -    print(minor, "=== location ~ts", [FormatLoc]), +    FormatLoc = test_server_sup:format_loc(LocMin), +    print(minor, "=== Location: ~ts", [FormatLoc]),      {FStr,FormattedReason} = format_exception(Reason), -    print(minor, "=== reason = " ++ FStr, [FormattedReason]), +    print(minor, "=== Reason: " ++ FStr, [FormattedReason]),      failed;  progress(ok, _CaseNum, Mod, Func, GrName, _Loc, RetVal, Time, @@ -4096,7 +4103,7 @@ progress(ok, _CaseNum, Mod, Func, GrName, _Loc, RetVal, Time,  	  "<td><font color=\"green\">Ok</font></td>"  	  "~ts</tr>\n",  	  [Time,Comment]), -    print(minor, "=== returned value = ~p", [RetVal]), +    print(minor, "=== Returned value: ~p", [RetVal]),      ok.  %%-------------------------------------------------------------------- @@ -4684,10 +4691,10 @@ collect_cases({make,InitMFA,CaseList,FinMFA}, St0, Mode) ->  collect_cases({Module, Cases}, St, Mode) when is_list(Cases)  ->      case (catch collect_case(Cases, St#cc{mod=Module}, [], Mode)) of -	{ok, NewCases, NewSt} -> - 	    {ok, NewCases, NewSt}; +	Result = {ok,_,_} -> + 	    Result;   	Other -> -	    {error, Other} +	    {error,Other}       end;  collect_cases({_Mod,_Case}=Spec, St, Mode) -> @@ -4705,9 +4712,9 @@ collect_case({Mod,{conf,_,_,_,_}=Conf}, St, Mode) ->  collect_case(MFA, St, Mode) ->      case in_skip_list(MFA, St#cc.skip) of -	{true,Comment} -> +	{true,Comment} when Comment /= make_failed ->  	    {ok,[{skip_case,{MFA,Comment},Mode}],St}; -	false -> +	_ ->  	    case MFA of  		{Mod,Case} -> collect_case_invoke(Mod, Case, MFA, St, Mode);  		{_Mod,_Case,_Args} -> {ok,[MFA],St} diff --git a/lib/test_server/src/test_server_node.erl b/lib/test_server/src/test_server_node.erl index acd47788db..9d87eca07e 100644 --- a/lib/test_server/src/test_server_node.erl +++ b/lib/test_server/src/test_server_node.erl @@ -618,9 +618,8 @@ do_quote_progname([Prog,Arg|Args]) ->      end.  random_element(L) -> -    {A,B,C} = now(), -    E = lists:sum([A,B,C]) rem length(L), -    lists:nth(E+1, L). +    random:seed(os:timestamp()), +    lists:nth(random:uniform(length(L)), L).  find_release(latest) ->      "/usr/local/otp/releases/latest/bin/erl"; diff --git a/lib/test_server/src/test_server_sup.erl b/lib/test_server/src/test_server_sup.erl index 96e369a138..7a1f7803eb 100644 --- a/lib/test_server/src/test_server_sup.erl +++ b/lib/test_server/src/test_server_sup.erl @@ -121,14 +121,8 @@ messages_get(Msgs) ->      end.  timecall(M, F, A) -> -    Befor = erlang:now(), -    Val = apply(M, F, A), -    After = erlang:now(), -    Elapsed = -        (element(1,After)*1000000+element(2,After)+element(3,After)/1000000)- -        (element(1,Befor)*1000000+element(2,Befor)+element(3,Befor)/1000000), -    {Elapsed, Val}. - +    {Elapsed, Val} = timer:tc(M, F, A), +    {Elapsed / 1000000, Val}.  call_crash(Time,Crash,M,F,A) -> @@ -874,9 +868,8 @@ unique_name() ->  util_loop(State) ->		             receive  	{From,unique_name} -> -	    {_,S,Us} = now(), -	    Ms = trunc(Us/1000), -	    Name = lists:flatten(io_lib:format("~w.~w", [S,Ms])), +	    Nr = erlang:unique_integer([positive]), +	    Name = integer_to_list(Nr),  	    if Name == State#util_state.latest_name ->  		    timer:sleep(1),  		    self() ! {From,unique_name}, diff --git a/lib/test_server/src/ts_install_cth.erl b/lib/test_server/src/ts_install_cth.erl index 7746bbed6f..3dfa6174fe 100644 --- a/lib/test_server/src/ts_install_cth.erl +++ b/lib/test_server/src/ts_install_cth.erl @@ -238,12 +238,9 @@ generate_nodenames2(0, _Hosts, Acc) ->      Acc;  generate_nodenames2(N, Hosts, Acc) ->      Host=lists:nth((N rem (length(Hosts)))+1, Hosts), -    Name=list_to_atom(temp_nodename("nod", []) ++ "@" ++ Host), +    Name=list_to_atom(temp_nodename("nod") ++ "@" ++ Host),      generate_nodenames2(N-1, Hosts, [Name|Acc]). -temp_nodename([], Acc) -> -    lists:flatten(Acc); -temp_nodename([Chr|Base], Acc) -> -    {A,B,C} = erlang:now(), -    New = [Chr | integer_to_list(Chr bxor A bxor B+A bxor C+B)], -    temp_nodename(Base, [New|Acc]). +temp_nodename(Base) -> +    Num = erlang:unique_integer([positive]), +    Base ++ integer_to_list(Num). | 
