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 + -
显示快捷键?