121
124
"~n Monitor ref: ~p"
122
125
"~n Process info: ~p",
124
Node, net_adm:ping(Node),
126
MonRef, (catch proc_info(Pid))]),
127
await_started(MonRef, Pid).
130
await_started(Node, MonRef, Pid).
129
132
proc_info(Pid) ->
130
133
rpc:call(node(Pid), erlang, process_info, [Pid]).
132
encoding_config({Encoding, EC}) when atom(Encoding), list(EC) ->
135
encoding_config({Encoding, EC}) when is_atom(Encoding) andalso is_list(EC) ->
133
136
{Mod, Port} = select_encoding(Encoding),
134
137
[{encoding_module, Mod},
135
138
{encoding_config, EC},
137
encoding_config(Encoding) when atom(Encoding) ->
140
encoding_config(Encoding) when is_atom(Encoding) ->
138
141
{Mod, Port} = select_encoding(Encoding),
139
142
[{encoding_module, Mod},
140
143
{encoding_config, []},
160
163
transport_config(udp) ->
161
164
[{transport_module, megaco_udp}].
163
await_started(MonRef, Pid) ->
166
await_started(Node, MonRef, Pid) ->
164
167
i("await_started -> entry with"
166
169
"~n Pid: ~p", [MonRef, Pid]),
168
171
{started, Pid} ->
169
d("await_started ~p: "
172
d("await_started ~p - started"
170
173
"~n Process info: ~p", [Pid, (catch proc_info(Pid))]),
174
true = erlang:monitor_node(Node, false),
171
175
erlang:demonitor(MonRef),
179
i("await_started ~p - received node down", [Pid]),
180
exit({node_down, Node});
174
182
{'DOWN', MonRef, process, Pid, Info} ->
175
i("await_started ~p: received down signal: ~p",
183
i("await_started ~p - received down signal: ~p",
185
true = erlang:monitor_node(Node, false),
177
186
exit({failed_starting, Pid, Info});
179
188
{'EXIT', Pid, Reason} ->
180
i("await_started ~p: received exit signal: ~p", [Pid, Reason]),
189
i("await_started ~p - received exit signal: ~p", [Pid, Reason]),
190
true = erlang:monitor_node(Node, false),
181
191
exit({failed_starting, Pid, Reason})
184
i("await_started ~p: timeout: "
185
"~n~p", [Pid, (catch process_info(Pid))]),
193
%% This timeout was originally 10 secs, but on some debug compiled
194
%% platforms, it was simply not long enough
196
NodePing = net_adm:ping(Node),
197
ProcInfo = (catch proc_info(Pid)),
198
FlushQ = megaco_test_lib:flush(),
199
i("await_started ~p - timeout: "
200
"~n net_adm:ping(~p): ~p"
201
"~n Process info: ~p"
202
"~n Messages in my queue: ~p",
203
[Pid, Node, NodePing, ProcInfo, FlushQ]),
204
true = erlang:monitor_node(Node, false),
186
205
exit({error, timeout})
227
246
enable_test_code(Pid, Module, Where, Fun)
228
when atom(Module), atom(Where), function(Fun) ->
247
when is_atom(Module) andalso is_atom(Where) andalso is_function(Fun) ->
229
248
Tag = {Module, Where},
230
249
server_request(Pid, {enable_test_code, Tag, Fun}, enable_test_code_reply).
232
encode_ar_first(Pid, New) when atom(New) ->
251
encode_ar_first(Pid, New) when is_atom(New) ->
233
252
server_request(Pid, {encode_ar_first, New}, encode_ar_first_reply).
235
254
service_change(Pid) ->
304
323
mg(Parent, Verbosity, Config) ->
305
324
process_flag(trap_exit, true),
306
put(verbosity, Verbosity),
307
%% put(verbosity, debug),
326
%% put(verbosity, Verbosity),
327
put(verbosity, debug), % Enable debug printouts during init
309
328
i("mg -> starting"),
310
329
%% megaco:enable_trace(max, io),
311
330
case (catch init(Config)) of
361
383
d("init -> update user info (user_args)"),
362
384
ok = megaco:update_user_info(Mid, user_args, [self(), Mid]),
364
% d("init -> start megaco user"),
365
% megaco:start_user(Mid, []),
366
% d("init -> update user info (user_mod)"),
367
% megaco:update_user_info(Mid, user_mod, ?MODULE),
368
% d("init -> update user info (user_args)"),
369
% megaco:update_user_info(Mid, user_args, [self()]),
371
386
d("init -> get user info (receive_handle)"),
372
387
RH = megaco:user_info(Mid,receive_handle),
373
388
d("init -> parse receive info"),
374
{MgcPort,RH1} = parse_receive_info(RI, RH),
389
{MgcPort, RH1} = parse_receive_info(RI, RH),
375
390
d("init -> start transport"),
376
391
{ok, _CH} = start_transport(MgcPort, RH1),
667
do_get_conn_info(CH, all = Tag) when record(CH, megaco_conn_handle) ->
682
do_get_conn_info(CH, all = Tag) when is_record(CH, megaco_conn_handle) ->
668
683
case (catch megaco:conn_info(CH, Tag)) of
669
684
L when is_list(L) ->
674
do_get_conn_info(CH, Tag) when record(CH, megaco_conn_handle) ->
689
do_get_conn_info(CH, Tag) when is_record(CH, megaco_conn_handle) ->
675
690
(catch megaco:conn_info(CH, Tag));
676
691
do_get_conn_info(Mid, Tag) ->
677
692
case megaco:user_info(Mid, connections) of
868
883
start_tcp(MgcPort, RH) ->
869
d("start tcp transport (~p)", [MgcPort]),
884
d("start tcp transport: "
886
"~n Receive handle: ~p", [MgcPort, RH]),
870
887
case megaco_tcp:start_transport() of
872
889
d("tcp transport started: ~p", [Sup]),
873
{ok, LocalHost} = inet:gethostname(),
874
Opts = [{host, LocalHost},{port, MgcPort}, {receive_handle, RH}],
875
d("tcp connect", []),
876
case megaco_tcp:connect(Sup, Opts) of
877
{ok, SendHandle, ControlPid} ->
878
d("tcp connected: ~p, ~p", [SendHandle, ControlPid]),
879
megaco_tcp_connect(RH, LocalHost, SendHandle, ControlPid);
881
throw({error, {megaco_tcp_connect, Reason}})
890
start_tcp_connect(RH, MgcPort, Sup);
883
891
{error, Reason} ->
884
892
throw({error, {megaco_tcp_start_transport, Reason}})
887
megaco_tcp_connect(RH, _LocalHost, SendHandle, ControlPid) ->
895
start_tcp_connect(RH, Port, Sup) ->
896
{ok, LocalHost} = inet:gethostname(),
897
Opts = [{host, LocalHost},
899
{receive_handle, RH},
900
{tcp_options, [{nodelay, true}]}],
901
try_start_tcp_connect(RH, Sup, Opts, 250, noError).
903
try_start_tcp_connect(RH, Sup, Opts, Timeout, Error0) when (Timeout < 5000) ->
904
Sleep = random(Timeout) + 100,
905
d("try tcp connect (~p,~p)", [Timeout, Sleep]),
906
case megaco_tcp:connect(Sup, Opts) of
907
{ok, SendHandle, ControlPid} ->
908
d("tcp connected: ~p, ~p", [SendHandle, ControlPid]),
909
megaco_tcp_connect(RH, SendHandle, ControlPid);
910
Error1 when Error0 =:= noError -> % Keep the first error
911
d("failed connecting [1]: ~p", [Error1]),
913
try_start_tcp_connect(RH, Sup, Opts, Timeout*2, Error1);
915
d("failed connecting [2]: ~p", [Error2]),
917
try_start_tcp_connect(RH, Sup, Opts, Timeout*2, Error0)
919
try_start_tcp_connect(_RH, Sup, _Opts, _Timeout, Error) ->
920
megaco_tcp:stop_transport(Sup),
921
throw({error, {megaco_tcp_connect, Error}}).
923
megaco_tcp_connect(RH, SendHandle, ControlPid) ->
888
924
PrelMgcMid = preliminary_mid,
889
925
d("megaco connect", []),
890
926
{ok, CH} = megaco:connect(RH, PrelMgcMid, SendHandle, ControlPid),
1013
1049
{N, Actions, _} = make_notify_request(N,N),
1014
1050
send_sync(EAF, CH, Actions, []).
1016
make_notify_request(N, Sz) when N >= Sz, Sz > 0 ->
1052
make_notify_request(N, Sz) when (N >= Sz) andalso (Sz > 0) ->
1017
1053
{Req, ReplyData} = make_notify_request(N, Sz, [], []),
1018
1054
{Sz, Req, ReplyData};
1019
1055
make_notify_request(N, _Sz) when N > 0 ->
1028
1064
TimeStamp = cre_timeNotation(),
1029
1065
Event = cre_observedEvent("al/of", TimeStamp),
1030
1066
Desc = cre_observedEventsDesc(2000 + N, [Event]),
1031
NotifyReq = cre_notifyReq([#megaco_term_id{id = tid(100+Offset-N)}],Desc),
1067
TidNum = 2#10000000 + Offset - N,
1068
NotifyReq = cre_notifyReq([#megaco_term_id{id = tid(TidNum)}],Desc),
1032
1069
CmdReq = cre_commandReq({notifyReq, NotifyReq}),
1033
1070
ActReq = cre_actionReq(?megaco_null_context_id, [CmdReq]),
1034
1071
make_notify_request(Offset, N-1, [[ActReq]|Actions], [Desc|ReplyDatas]).
1160
1197
{{discard_ack, ED}, MG};
1162
1199
handle_megaco_request(#mg{rep_info = P} = MG,
1163
{handle_trans_reply, CH, PV, AR, RD}) when pid(P) ->
1200
{handle_trans_reply, CH, PV, AR, RD}) when is_pid(P) ->
1164
1201
P ! {rep_received, self(), AR},
1165
1202
do_handle_trans_reply(MG, CH, PV, AR, RD);
1166
1203
handle_megaco_request(MG, {handle_trans_reply, CH, PV, AR, RD}) ->
1167
1204
do_handle_trans_reply(MG, CH, PV, AR, RD);
1169
1206
handle_megaco_request(#mg{ack_info = P} = MG,
1170
{handle_trans_ack, _CH, _PV, AS, _AD}) when pid(P) ->
1207
{handle_trans_ack, _CH, _PV, AS, _AD}) when is_pid(P) ->
1171
1208
d("handle_megaco_request(handle_trans_ack,~p) -> entry",[P]),
1172
1209
P ! {ack_received, self(), AS},