diff options
Diffstat (limited to 'lib/common_test/src')
| -rw-r--r-- | lib/common_test/src/ct_config.erl | 8 | ||||
| -rw-r--r-- | lib/common_test/src/ct_netconfc.erl | 10 | ||||
| -rw-r--r-- | lib/common_test/src/ct_telnet.erl | 144 | ||||
| -rw-r--r-- | lib/common_test/src/ct_telnet_client.erl | 6 | ||||
| -rw-r--r-- | lib/common_test/src/test_server.erl | 47 | 
5 files changed, 139 insertions, 76 deletions
| diff --git a/lib/common_test/src/ct_config.erl b/lib/common_test/src/ct_config.erl index a10d939919..a07e61199b 100644 --- a/lib/common_test/src/ct_config.erl +++ b/lib/common_test/src/ct_config.erl @@ -592,7 +592,7 @@ encrypt_config_file(SrcFileName, EncryptFileName, {file,KeyFile}) ->  encrypt_config_file(SrcFileName, EncryptFileName, {key,Key}) ->      _ = crypto:start(), -    {Key,IVec} = make_crypto_key(Key), +    {CryptoKey,IVec} = make_crypto_key(Key),      case file:read_file(SrcFileName) of  	{ok,Bin0} ->  	    Bin1 = term_to_binary({SrcFileName,Bin0}), @@ -600,7 +600,7 @@ encrypt_config_file(SrcFileName, EncryptFileName, {key,Key}) ->  		       0 -> Bin1;  		       N -> list_to_binary([Bin1,random_bytes(8-N)])  		   end, -	    EncBin = crypto:block_encrypt(des3_cbc, Key, IVec, Bin2), +	    EncBin = crypto:block_encrypt(des3_cbc, CryptoKey, IVec, Bin2),  	    case file:write_file(EncryptFileName, EncBin) of  		ok ->  		    io:format("~ts --(encrypt)--> ~ts~n", @@ -631,10 +631,10 @@ decrypt_config_file(EncryptFileName, TargetFileName, {file,KeyFile}) ->  decrypt_config_file(EncryptFileName, TargetFileName, {key,Key}) ->      _ = crypto:start(), -    {Key,IVec} = make_crypto_key(Key), +    {CryptoKey,IVec} = make_crypto_key(Key),      case file:read_file(EncryptFileName) of  	{ok,Bin} -> -	    DecBin = crypto:block_decrypt(des3_cbc, Key, IVec, Bin), +	    DecBin = crypto:block_decrypt(des3_cbc, CryptoKey, IVec, Bin),  	    case catch binary_to_term(DecBin) of  		{'EXIT',_} ->  		    {error,bad_file}; diff --git a/lib/common_test/src/ct_netconfc.erl b/lib/common_test/src/ct_netconfc.erl index 29188a648e..6a758c4ea3 100644 --- a/lib/common_test/src/ct_netconfc.erl +++ b/lib/common_test/src/ct_netconfc.erl @@ -583,7 +583,7 @@ get_config(Client, Source, Filter, Timeout) ->  -spec edit_config(Client, Target, Config) -> Result when        Client :: client(),        Target :: netconf_db(), -      Config :: simple_xml(), +      Config :: simple_xml() | [simple_xml()],        Result :: ok | {error,error_reason()}.  edit_config(Client, Target, Config) ->      edit_config(Client, Target, Config, ?DEFAULT_TIMEOUT). @@ -591,7 +591,7 @@ edit_config(Client, Target, Config) ->  -spec edit_config(Client, Target, Config, OptParams) -> Result when        Client :: client(),        Target :: netconf_db(), -      Config :: simple_xml(), +      Config :: simple_xml() | [simple_xml()],        OptParams :: [simple_xml()],        Result :: ok | {error,error_reason()};                   (Client, Target, Config, Timeout) -> Result when @@ -608,10 +608,12 @@ edit_config(Client, Target, Config, OptParams) when is_list(OptParams) ->  -spec edit_config(Client, Target, Config, OptParams, Timeout) -> Result when        Client :: client(),        Target :: netconf_db(), -      Config :: simple_xml(), +      Config :: simple_xml() | [simple_xml()],        OptParams :: [simple_xml()],        Timeout :: timeout(),        Result :: ok | {error,error_reason()}. +edit_config(Client, Target, Config, OptParams, Timeout) when not is_list(Config)-> +    edit_config(Client, Target, [Config], OptParams, Timeout);  edit_config(Client, Target, Config, OptParams, Timeout) ->      call(Client, {send_rpc_op, edit_config, [Target,Config,OptParams], Timeout}). @@ -1113,7 +1115,7 @@ encode_rpc_operation(get,[Filter]) ->  encode_rpc_operation(get_config,[Source,Filter]) ->      {'get-config',[{source,[Source]}] ++ filter(Filter)};  encode_rpc_operation(edit_config,[Target,Config,OptParams]) -> -    {'edit-config',[{target,[Target]}] ++ OptParams ++ [{config,[Config]}]}; +    {'edit-config',[{target,[Target]}] ++ OptParams ++ [{config,Config}]};  encode_rpc_operation(delete_config,[Target]) ->      {'delete-config',[{target,[Target]}]};  encode_rpc_operation(copy_config,[Target,Source]) -> diff --git a/lib/common_test/src/ct_telnet.erl b/lib/common_test/src/ct_telnet.erl index f9abecfd38..174008c790 100644 --- a/lib/common_test/src/ct_telnet.erl +++ b/lib/common_test/src/ct_telnet.erl @@ -194,6 +194,15 @@ send(Connection,Cmd,Opts) ->  check_send_opts([{newline,Bool}|Opts]) when is_boolean(Bool) ->      check_send_opts(Opts); +check_send_opts([{newline,String}|Opts]) when is_list(String) -> +    case lists:all(fun(I) when is_integer(I), I>=0, I=<127 -> true; +                      (_) -> false +                   end, String) of +        true -> +            check_send_opts(Opts); +        false -> +            {error,{invalid_option,{newline,String}}} +    end;  check_send_opts([Invalid|_]) ->      {error,{invalid_option,Invalid}};  check_send_opts([]) -> @@ -211,10 +220,16 @@ expect(Connection,Patterns) ->  expect(Connection,Patterns,Opts) ->      case get_handle(Connection) of -	{ok,Pid} -> -	    call(Pid,{expect,Patterns,Opts}); -	Error -> -	    Error +        {ok,Pid} -> +            case call(Pid,{expect,Patterns,Opts}) of +                {error,Reason} when element(1,Reason)==bad_pattern -> +                    %% Faulty user input - should fail the test case +                    exit({Reason,{?MODULE,?FUNCTION_NAME,3}}); +                Other -> +                    Other +            end; +        Error -> +            Error      end.  %%%================================================================= @@ -674,60 +689,68 @@ silent_teln_expect(Name,Pid,Data,Pattern,Prx,Opts) ->  %% 3b) Repeat (sequence): 2) is repeated either N times or until a  %% halt condition is fulfilled.  teln_expect(Name,Pid,Data,Pattern0,Prx,Opts) -> -    HaltPatterns = +    HaltPatterns0 =  	case get_ignore_prompt(Opts) of  	    true ->  		get_haltpatterns(Opts);  	    false ->  		[prompt | get_haltpatterns(Opts)]  	end, - -    PromptCheck = get_prompt_check(Opts), - -    {WaitForPrompt,Pattern1,Opts1} = wait_for_prompt(Pattern0,Opts), - -    Seq = get_seq(Opts1), -    Pattern2 = convert_pattern(Pattern1,Seq), -    {IdleTimeout,TotalTimeout} = get_timeouts(Opts1), - -    EO = #eo{teln_pid=Pid, -	     prx=Prx, -	     idle_timeout=IdleTimeout, -	     total_timeout=TotalTimeout, -	     seq=Seq, -	     haltpatterns=HaltPatterns, -	     prompt_check=PromptCheck}, +    case convert_pattern(HaltPatterns0,false) of +        {ok,HaltPatterns} -> +            {WaitForPrompt,Pattern1,Opts1} = wait_for_prompt(Pattern0,Opts), +            Seq = get_seq(Opts1), +            case convert_pattern(Pattern1,Seq) of +                {ok,Pattern2} -> +                    {IdleTimeout,TotalTimeout} = get_timeouts(Opts1), +                    PromptCheck = get_prompt_check(Opts1), + +                    EO = #eo{teln_pid=Pid, +                             prx=Prx, +                             idle_timeout=IdleTimeout, +                             total_timeout=TotalTimeout, +                             seq=Seq, +                             haltpatterns=HaltPatterns, +                             prompt_check=PromptCheck}, -    case get_repeat(Opts1) of -	false -> -	    case teln_expect1(Name,Pid,Data,Pattern2,[],EO) of -		{ok,Matched,Rest} when WaitForPrompt -> -		    case lists:reverse(Matched) of -			[{prompt,_},Matched1] -> -			    {ok,Matched1,Rest}; -			[{prompt,_}|Matched1] -> -			    {ok,lists:reverse(Matched1),Rest} -		    end; -		{ok,Matched,Rest} -> -		    {ok,Matched,Rest}; -		{halt,Why,Rest} -> -		    {error,Why,Rest}; -		{error,Reason} -> -		    {error,Reason} -	    end; -	N -> -	    EO1 = EO#eo{repeat=N}, -	    repeat_expect(Name,Pid,Data,Pattern2,[],EO1) +                    case get_repeat(Opts1) of +                        false -> +                            case teln_expect1(Name,Pid,Data,Pattern2,[],EO) of +                                {ok,Matched,Rest} when WaitForPrompt -> +                                    case lists:reverse(Matched) of +                                        [{prompt,_},Matched1] -> +                                            {ok,Matched1,Rest}; +                                        [{prompt,_}|Matched1] -> +                                            {ok,lists:reverse(Matched1),Rest} +                                    end; +                                {ok,Matched,Rest} -> +                                    {ok,Matched,Rest}; +                                {halt,Why,Rest} -> +                                    {error,Why,Rest}; +                                {error,Reason} -> +                                    {error,Reason} +                            end; +                        N -> +                            EO1 = EO#eo{repeat=N}, +                            repeat_expect(Name,Pid,Data,Pattern2,[],EO1) +                    end; +               Error -> +                    Error +            end; +        Error -> +            Error      end. -convert_pattern(Pattern,Seq)  -  when is_list(Pattern) and not is_integer(hd(Pattern)) -> -    case Seq of -	true -> Pattern; -	false -> rm_dupl(Pattern,[]) -    end; +convert_pattern(Pattern0,Seq) +  when Pattern0==[] orelse (is_list(Pattern0) and not is_integer(hd(Pattern0))) -> +    Pattern = +        case Seq of +            true -> Pattern0; +            false -> rm_dupl(Pattern0,[]) +        end, +    compile_pattern(Pattern,[]);  convert_pattern(Pattern,_Seq) -> -    [Pattern]. +    compile_pattern([Pattern],[]).  rm_dupl([P|Ps],Acc) ->      case lists:member(P,Acc) of @@ -739,6 +762,25 @@ rm_dupl([P|Ps],Acc) ->  rm_dupl([],Acc) ->      lists:reverse(Acc). +compile_pattern([prompt|Patterns],Acc) -> +    compile_pattern(Patterns,[prompt|Acc]); +compile_pattern([{prompt,_}=P|Patterns],Acc) -> +    compile_pattern(Patterns,[P|Acc]); +compile_pattern([{Tag,Pattern}|Patterns],Acc) -> +    try re:compile(Pattern,[unicode]) of +        {ok,MP} -> compile_pattern(Patterns,[{Tag,MP}|Acc]); +        {error,Error} -> {error,{bad_pattern,{Tag,Pattern},Error}} +    catch error:badarg -> {error,{bad_pattern,{Tag,Pattern}}} +    end; +compile_pattern([Pattern|Patterns],Acc) -> +    try re:compile(Pattern,[unicode]) of +        {ok,MP} -> compile_pattern(Patterns,[MP|Acc]); +        {error,Error} -> {error,{bad_pattern,Pattern,Error}} +    catch error:badarg -> {error,{bad_pattern,Pattern}} +    end; +compile_pattern([],Acc) -> +    {ok,lists:reverse(Acc)}. +  get_timeouts(Opts) ->      {case lists:keysearch(idle_timeout,1,Opts) of  	 {value,{_,T}} -> @@ -772,7 +814,7 @@ get_seq(Opts) ->  get_haltpatterns(Opts) ->      case lists:keysearch(halt,1,Opts) of  	{value,{halt,HaltPatterns}} -> -	    convert_pattern(HaltPatterns,false); +	    HaltPatterns;  	false ->  	    []      end. @@ -1068,7 +1110,7 @@ match_line(Name,Pid,Line,[{prompt,PromptType}|Patterns],FoundPrompt,Term,    when PromptType=/=FoundPrompt ->      match_line(Name,Pid,Line,Patterns,FoundPrompt,Term,EO,RetTag);  match_line(Name,Pid,Line,[{Tag,Pattern}|Patterns],FoundPrompt,Term,EO,RetTag) -> -    case re:run(Line,Pattern,[{capture,all,list},unicode]) of +    case re:run(Line,Pattern,[{capture,all,list}]) of  	nomatch ->  	    match_line(Name,Pid,Line,Patterns,FoundPrompt,Term,EO,RetTag);  	{match,Match} -> @@ -1076,7 +1118,7 @@ match_line(Name,Pid,Line,[{Tag,Pattern}|Patterns],FoundPrompt,Term,EO,RetTag) ->  	    {RetTag,{Tag,Match}}      end;  match_line(Name,Pid,Line,[Pattern|Patterns],FoundPrompt,Term,EO,RetTag) -> -    case re:run(Line,Pattern,[{capture,all,list},unicode]) of +    case re:run(Line,Pattern,[{capture,all,list}]) of  	nomatch ->  	    match_line(Name,Pid,Line,Patterns,FoundPrompt,Term,EO,RetTag);  	{match,Match} -> diff --git a/lib/common_test/src/ct_telnet_client.erl b/lib/common_test/src/ct_telnet_client.erl index 76e4b9ea70..007477c855 100644 --- a/lib/common_test/src/ct_telnet_client.erl +++ b/lib/common_test/src/ct_telnet_client.erl @@ -101,9 +101,11 @@ close(Pid) ->      end.	      send_data(Pid, Data) -> -    send_data(Pid, Data, true). +    send_data(Pid, Data, "\n").  send_data(Pid, Data, true) -> -    send_data(Pid, Data++"\n", false); +    send_data(Pid, Data, "\n"); +send_data(Pid, Data, Newline) when is_list(Newline) -> +    send_data(Pid, Data++Newline, false);  send_data(Pid, Data, false) ->      Pid ! {send_data, Data},      ok. diff --git a/lib/common_test/src/test_server.erl b/lib/common_test/src/test_server.erl index a896a0551b..9eda3f2152 100644 --- a/lib/common_test/src/test_server.erl +++ b/lib/common_test/src/test_server.erl @@ -850,17 +850,23 @@ spawn_fw_call(Mod,EPTC={end_per_testcase,Func},EndConf,Pid,  				"WARNING: end_per_testcase failed!</font>",  			    {died,W}  		    end, -		try do_end_tc_call(Mod,EPTC,{Pid,Report,[EndConf]}, Why) of -		    _ -> ok -		catch -		    _:FwEndTCErr -> -			exit({fw_notify_done,end_tc,FwEndTCErr}) -		end, -		FailLoc = proplists:get_value(tc_fail_loc, EndConf), +                FailLoc0 = proplists:get_value(tc_fail_loc, EndConf), +                {RetVal1,FailLoc} = +                    try do_end_tc_call(Mod,EPTC,{Pid,Report,[EndConf]}, Why) of +                        Why -> +                            {RetVal,FailLoc0}; +                        {failed,_} = R -> +                            {R,[{Mod,Func}]}; +                        R -> +                            {R,FailLoc0} +                    catch +                        _:FwEndTCErr -> +                            exit({fw_notify_done,end_tc,FwEndTCErr}) +                    end,  		%% finished, report back (if end_per_testcase fails, a warning  		%% should be printed as part of the comment)  		SendTo ! {self(),fw_notify_done, -			  {Time,RetVal,FailLoc,[],Warn}} +			  {Time,RetVal1,FailLoc,[],Warn}}  	end,      spawn_link(FwCall); @@ -902,14 +908,25 @@ spawn_fw_call(Mod,Func,CurrConf,Pid,Error,Loc,SendTo) ->  			      FwErrorNotifyErr})  		end,  		Conf = [{tc_status,{failed,Error}}|CurrConf], -		try do_end_tc_call(Mod,EndTCFunc,{Pid,Error,[Conf]},Error) of -		    _ -> ok -		catch -		    _:FwEndTCErr -> -			exit({fw_notify_done,end_tc,FwEndTCErr}) -		end, +                {Time,RetVal,Loc1} = +                    try do_end_tc_call(Mod,EndTCFunc,{Pid,Error,[Conf]},Error) of +                        Error -> +                            {died, Error, Loc}; +                        {failed,Reason} = NewReturn -> +                            fw_error_notify(Mod,Func1,Conf,Reason), +                            {died, NewReturn, [{Mod,Func}]}; +                        NewReturn -> +                            T = case Error of +                                    {timetrap_timeout,TT} -> TT; +                                    _ -> 0 +                                end, +                            {T, NewReturn, Loc} +                    catch +                        _:FwEndTCErr -> +                            exit({fw_notify_done,end_tc,FwEndTCErr}) +                    end,  		%% finished, report back -		SendTo ! {self(),fw_notify_done,{died,Error,Loc,[],undefined}} +		SendTo ! {self(),fw_notify_done,{Time,RetVal,Loc1,[],undefined}}  	end,      spawn_link(FwCall). | 
