megaco_mess_test.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 2,078 行 · 第 1/5 页

ERL
2,078
字号
    ?VERIFY(ok,	megaco:start_user(MgMid, UserConfig)),    d("request_and_reply_plain -> start (MGC) user ~p",[MgcMid]),    ?VERIFY(ok,	megaco:start_user(MgcMid, UserConfig)),    d("request_and_reply_plain -> get receive info for ~p",[MgMid]),    MgRH = user_info(MgMid, receive_handle),    d("request_and_reply_plain -> get receive info for ~p",[MgcMid]),    MgcRH = user_info(MgcMid, receive_handle),     d("request_and_reply_plain -> start transport",[]),    {ok, MgPid, MgSH} =	?VERIFY({ok, _, _}, UserMod:start_transport(MgRH, MgcRH)),    PrelMgCH = #megaco_conn_handle{local_mid = MgMid,				   remote_mid = preliminary_mid},    MgCH  = #megaco_conn_handle{local_mid = MgMid,				remote_mid = MgcMid},    MgcCH = #megaco_conn_handle{local_mid = MgcMid,				remote_mid = MgMid},    d("request_and_reply_plain -> (MG) try connect to MGC",[]),    ?SEND(megaco:connect(MgRH, PrelMid, MgSH, MgPid)), % Mg prel    d("request_and_reply_plain -> (MGC) await connect from MG",[]),    ?USER({connect, PrelMgCH, _V, []}, ok),    ?RECEIVE([{res, _, {ok, PrelMgCH}}]),    d("request_and_reply_plain -> (MG) send service change request",[]),    Req = service_change_request(),    ?SEND(megaco:call(PrelMgCH, [Req], [])),    d("request_and_reply_plain -> (MGC) send service change reply",[]),    ?USER({connect, MgcCH, _V, []}, ok), % Mgc auto    Rep = service_change_reply(MgcMid),    ?USER({request, MgcCH, _V, [[Req]]}, {discard_ack, [Rep]}),    ?USER({connect, MgCH, _V, []}, ok), % Mg confirm    ?RECEIVE([{res, _, {1, {ok, [Rep]}}}]),    d("request_and_reply_plain -> get (system info) connections",[]),    connections([MgCH, MgcCH]),    d("request_and_reply_plain -> get (~p) connections",[MgMid]),    ?VERIFY([MgCH], megaco:user_info(MgMid, connections)),    d("request_and_reply_plain -> get (~p) connections",[MgcMid]),    ?VERIFY([MgcCH], megaco:user_info(MgcMid, connections)),    Reason = shutdown,    d("request_and_reply_plain -> (MG) disconnect",[]),    ?SEND(megaco:disconnect(MgCH, Reason)),    ?USER({disconnect, MgCH, _V, [{user_disconnect, Reason}]}, ok),    ?RECEIVE([{res, _, ok}]),    ?VERIFY(ok,	megaco:stop_user(MgMid)),    d("request_and_reply_plain -> (MGC) disconnect",[]),    ?SEND(megaco:disconnect(MgcCH, Reason)),    ?USER({disconnect, MgcCH, _V, [{user_disconnect, Reason}]}, ok),    ?RECEIVE([{res, _, ok}]),    ?VERIFY(ok,	megaco:stop_user(MgcMid)),    d("request_and_reply_plain -> stop megaco app",[]),    ?VERIFY(ok, application:stop(megaco)),    ?RECEIVE([]),    d("request_and_reply_plain -> done",[]),    ok.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% OTP-4760request_and_no_reply(suite) ->    [];request_and_no_reply(doc) ->    [];request_and_no_reply(Config) when is_list(Config) ->    put(verbosity, ?TEST_VERBOSITY),    put(sname,     "TEST"),    put(tc,        request_and_no_reply),    i("starting"),    MgcNode = make_node_name(mgc),    MgNode  = make_node_name(mg),    d("start nodes: "      "~n   MgcNode: ~p"      "~n   MgNode:  ~p",       [MgcNode, MgNode]),    ok = megaco_test_lib:start_nodes([MgcNode, MgNode], ?FILE, ?LINE),    %% Start the MGC    i("[MGC] start"),        ET = [{text,tcp}, {text,udp}, {binary,tcp}, {binary,udp}],    {ok, Mgc} = 	?MGC_START(MgcNode, {deviceName, "ctrl"}, ET, [], ?MGC_VERBOSITY),    i("[MG] start"),        MgMid = {deviceName, "mg"},    ReqTmr = #megaco_incr_timer{wait_for    = 3000,				factor      = 1, 				incr        = 0,				max_retries = 2			       },    LongReqTmr = #megaco_incr_timer{wait_for    = 10000,				    factor      = 1, 				    incr        = 0,				    max_retries = 3				   },    %% Start the MGs    PendingTmr = 10000,    ReplyTmr = 16000,    MgConfig = [{request_timer,      ReqTmr}, 		{long_request_timer, LongReqTmr}, 		{pending_timer,      PendingTmr},		{reply_timer,        ReplyTmr}],    {ok, Mg} = ?MG_START(MgNode, MgMid, text, tcp, MgConfig, ?MG_VERBOSITY),    d("MG user info: ~p", [?MG_USER_INFO(Mg, all)]),    i("[MG] connect to the MGC (service change)"),        ServChRes = ?MG_SERV_CHANGE(Mg),    d("service change result: ~p", [ServChRes]),    d("tell the MGC to ignore requests"),    ?MGC_REQ_PEND(Mgc, infinity),    d("[MG] send the notify"),    ?MG_NOTIF_REQ(Mg),    d("[MG] await notify reply"),    {ok, {_Vsn, {error, timeout}}} = ?MG_AWAIT_NOTIF_REP(Mg),    d("[MG] received expected reply"),    ok.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%request_and_reply_pending_ack_no_pending(suite) ->    [];request_and_reply_pending_ack_no_pending(doc) ->    ["This test case tests that megaco correctly handles the return "     "value handle_pending_ack from handle_trans_request when NO "     "pending message has been sent"];request_and_reply_pending_ack_no_pending(Config) when is_list(Config) ->    put(verbosity, ?TEST_VERBOSITY),    put(sname,     "TEST"),    put(tc,        rar_panp),    i("starting"),    MgcNode = make_node_name(mgc),    MgNode  = make_node_name(mg),    d("start nodes: "      "~n   MgcNode: ~p"      "~n   MgNode:  ~p",      [MgcNode, MgNode]),    ok = megaco_test_lib:start_nodes([MgcNode, MgNode], ?FILE, ?LINE),    d("[MGC] start the simulator "),    {ok, Mgc} = megaco_test_generator:start_link("MGC", MgcNode),    d("[MGC] create the event sequence"),    MgcEvSeq = rarpanp_mgc_event_sequence(text, tcp),    i("wait some time before starting the MGC simulation"),    sleep(1000),    d("[MGC] start the simulation"),    megaco_test_generator:megaco(Mgc, MgcEvSeq),    i("wait some time before starting the MG simulator"),    sleep(1000),    d("[MG] start the simulator (generator)"),    {ok, Mg} = megaco_test_generator:start_link("MG", MgNode),    d("[MG] create the event sequence"),    MgEvSeq = rarpanp_mg_event_sequence(text, tcp),    i("wait some time before starting the MG simulation"),    sleep(1000),    d("[MG] start the simulation"),    megaco_test_generator:tcp(Mg, MgEvSeq),    d("[MGC] await the generator reply"),    case megaco_test_generator:megaco_await_reply(Mgc) of        {ok, MgcReply} ->            d("[MGC] OK => MgcReply: ~n~p", [MgcReply]),            ok;        {error, MgcReply} ->            d("[MGC] ERROR => MgcReply: ~n~p", [MgcReply]),            ?ERROR(mgc_failed)    end,    d("[MG] await the generator reply"),    case megaco_test_generator:tcp_await_reply(Mg) of        {ok, MgReply} ->            d("[MG] OK => MgReply: ~n~p", [MgReply]),            ok;        {error, MgReply} ->            d("[MG] ERROR => MgReply: ~n~p", [MgReply]),            ?ERROR(mg_failed)    end,    %% Tell Mgc to stop    i("[MGC] stop generator"),    megaco_test_generator:stop(Mgc),    %% Tell Mg to stop    i("[MG] stop generator"),    megaco_test_generator:stop(Mg),    i("done", []),    ok.%%%% MGC generator stuff%%-ifdef(megaco_hipe_special).-define(rarpanp_mgc_verify_handle_connect_fun(),         {?MODULE, rarpanp_mgc_verify_handle_connect, []}).-define(rarpanp_mgc_verify_service_change_req_fun(Mid),        {?MODULE, rarpanp_mgc_verify_service_change_req, [Mid]}).-define(rarpanp_mgc_verify_notify_req_fun(),        {?MODULE, rarpanp_mgc_verify_notify_request, []}).-define(rarpanp_mgc_verify_handle_disconnect_fun(),        {?MODULE, rarpanp_mgc_verify_handle_disconnect, []}).-else.-define(rarpanp_mgc_verify_handle_connect_fun(),         fun rarpanp_mgc_verify_handle_connect/1).-define(rarpanp_mgc_verify_service_change_req_fun(Mid),        rarpanp_mgc_verify_service_change_req_fun(Mid)).-define(rarpanp_mgc_verify_notify_req_fun(),	rarpanp_mgc_verify_notify_request_fun()).-define(rarpanp_mgc_verify_handle_disconnect_fun(),	fun rarpanp_mgc_verify_handle_disconnect/1).-endif.rarpanp_mgc_event_sequence(text, tcp) ->    Mid = {deviceName,"ctrl"},    RI = [          {port,             2944},          {encoding_module,  megaco_pretty_text_encoder},          {encoding_config,  []},          {transport_module, megaco_tcp}         ],    ConnectVerify = ?rarpanp_mgc_verify_handle_connect_fun(),     ScrVerify     = ?rarpanp_mgc_verify_service_change_req_fun(Mid),    NrVerify      = ?rarpanp_mgc_verify_notify_req_fun(),    DiscoVerify   = ?rarpanp_mgc_verify_handle_disconnect_fun(), %%     ConnectVerify = fun rarpanp_mgc_verify_handle_connect/1,%%     ScrVerify     = rarpanp_mgc_verify_service_change_req_fun(Mid),%%     NrVerify      = rarpanp_mgc_verify_notify_request_fun(),%%     DiscoVerify   = fun rarpanp_mgc_verify_handle_disconnect/1,    EvSeq = [             {debug, true},             {megaco_trace, disable},             {megaco_trace, max},             megaco_start,             {megaco_start_user, Mid, RI, []},             {megaco_update_user_info, sent_pending_limit, 100},             start_transport,             listen,             {megaco_callback, handle_connect,       ConnectVerify},             {megaco_conn_info, all},             {megaco_callback, handle_trans_request, ScrVerify},	     {megaco_callback, handle_trans_request, NrVerify},             {megaco_callback, nocall, 10000},             {megaco_callback, handle_disconnect,    DiscoVerify},             megaco_stop_user,             megaco_stop            ],    EvSeq.%% Connect verificationrarpanp_mgc_verify_handle_connect({handle_connect, CH, ?VERSION}) ->    {ok, CH, ok};rarpanp_mgc_verify_handle_connect(Else) ->    {error, Else, ok}.%% Service Change verification-ifndef(megaco_hipe_special).rarpanp_mgc_verify_service_change_req_fun(Mid) ->    fun(Req) -> 	    rarpanp_mgc_verify_service_change_req(Req, Mid)     end.-endif.rarpanp_mgc_verify_service_change_req(  {handle_trans_request, _, ?VERSION, [AR]}, Mid) ->    io:format("rarpanp_mgc_verify_service_change_req -> entry with"	      "~n   AR:  ~p"	      "~n   Mid: ~p"	      "~n", [AR, Mid]),    (catch rarpanp_mgc_do_verify_service_change_req(AR, Mid));rarpanp_mgc_verify_service_change_req(Crap, _Mid) ->    ED       = cre_ErrDesc(Crap),    ErrReply = {discard_ack, ED},    {error, Crap, ErrReply}.rarpanp_mgc_do_verify_service_change_req(AR, Mid) ->    io:format("rarpanp_mgc_do_verify_service_change_req -> entry with"	      "~n   AR:  ~p"	      "~n   Mid: ~p"	      "~n", [AR, Mid]),    CR = 	case AR of	    #'ActionRequest'{commandRequests = [CmdReq]} ->		CmdReq;	    _ ->		Err1      = {invalid_action_request, AR},		ED1       = cre_ErrDesc(AR),		ErrReply1 = {discard_ack, ED1},		throw({error, Err1, ErrReply1})	end,    Cmd = 	case CR of	    #'CommandRequest'{command = Command} ->		Command; 	    _ ->		Err2      = {invalid_command_request, CR},		ED2       = cre_ErrDesc(CR),		ErrReply2 = {discard_ack, ED2},		throw({error, Err2, ErrReply2})	end,    {Tid, Parms} = 	case Cmd of	    {serviceChangeReq, 	     #'ServiceChangeRequest'{terminationID = [TermID],				     serviceChangeParms = ServChParms}} ->		{TermID, ServChParms};	    _ ->		Err3      = {invalid_command, Cmd},		ED3       = cre_ErrDesc(Cmd),		ErrReply3 = {discard_ack, ED3},		throw({error, Err3, ErrReply3})	end,    case Tid of	#megaco_term_id{contains_wildcards = false, id = ["root"]} ->	    ok;	_ ->	    Err4      = {invalid_termination_id, Tid},	    ED4       = cre_ErrDesc(Tid),	    ErrReply4 = {discard_ack, ED4},	    throw({error, Err4, ErrReply4})    end,    case Parms of	#'ServiceChangeParm'{serviceChangeMethod = restart,			     serviceChangeReason = [[$9,$0,$1|_]]} ->	    AckData = [rarpanp_mgc_service_change_reply_ar(Mid, 1)], 	    Reply   = {discard_ack, AckData},	    {ok, AR, Reply};	_ ->	    Err5      = {invalid_SCP, Parms},	    ED5       = cre_ErrDesc(Parms),	    ErrReply5 = {discard_ack, ED5},	    {error, Err5, ErrReply5}    end.%% Notify Request verification-ifndef(megaco_hipe_special).rarpanp_mgc_verify_notify_request_fun() ->    fun(Req) -> 	    rarpanp_mgc_verify_notify_request(Req)     end.-endif.rarpanp_mgc_verify_notify_request(  {handle_trans_request, _, ?VERSION, [AR]}) ->    (catch rarpanp_mgc_do_verify_notify_request(AR));rarpanp_mgc_verify_notify_request(Crap) ->    ED = cre_ErrDesc(Crap),    ErrReply = {discard_ack, ED},    {error, Crap, ErrReply}.rarpanp_mgc_do_verify_notify_request(AR) ->    io:format("rarpanp_mgc_do_verify_notify_request -> entry with"	      "~n   AR: ~p"	      "~n", [AR]),    {Cid, CR} = 	case AR of	    #'ActionRequest'{contextId       = CtxID,			     commandRequests = [CmdReq]} ->		{CtxID, CmdReq};	    _ ->		Err1      = {invalid_action_request, AR},		ED1       = cre_ErrDesc(AR),		ErrReply1 = {discard_ack, ED1},		throw({error, Err1, ErrReply1})	end,    Cmd = 	case CR of	    #'CommandRequest'{command = Command} ->		Command;	    _ ->		Err2      = {invalid_command_request, CR},		ED2       = cre_ErrDesc(CR),		ErrReply2 = {discard_ack, ED2},		throw({error, Err2, ErrReply2})	end,    NR = 	case Cmd of	    {notifyReq, NotifReq} ->		NotifReq;	    _ ->		Err3      = {invalid_command, Cmd},		ED3       = cre_ErrDesc(Cmd),		ErrReply3 = {discard_ack, ED3},		throw({error, Err3, ErrReply3})	end,    {Tid, OED} = 	case NR of	    #'NotifyRequest'{terminationID            = [TermID],			     observedEventsDescriptor = ObsEvsDesc,			     errorDescriptor          = asn1_NOVALUE} ->		{TermID, ObsEvsDesc};	    _ ->		Err4      = {invalid_NR, NR},		ED4       = cre_ErrDesc(NR),

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?