%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2003-2016. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%
%%
%%
%%----------------------------------------------------------------------
%% Purpose: Used when performing testing appup tests
%%
%% {ok, P} = megaco_appup_mg:start().
%% megaco_appup_mg:stop(P).
%% megaco_appup_mg:verbosity(P,silence).
%% megaco_appup_mg:verbosity(P,debug).
%% megaco_appup_mg:timeout(P,100).
%% megaco_appup_mg:aam(P,10).
%% megaco_appup_mg:aam(P,15).
%% megaco_appup_mg:aat(P,2000).
%% megaco_appup_mg:aat(P,10000).
%%
%%----------------------------------------------------------------------
-module(megaco_appup_mg).
%% API
-export([start1/0, start2/0, start3/0, start4/0]).
-export([start/0, start/1, start/2]).
-export([verbosity/2, timeout/2]).
-export([aat/2, aam/2]).
%% Internal
-export([main/4]).
%% Constants:
-define(TIMEOUT,1000).
-define(MAXCOUNT,1).
%% Wrapper macros
-define(START(Mid, Enc, Transp, Conf, Verb),
megaco_test_mg:start(node(), Mid, Enc, Transp, Conf, Verb)).
-define(STOP(Pid), megaco_test_mg:stop(Pid)).
-define(SERV_CHANGE(Pid), megaco_test_mg:service_change(Pid)).
-define(NOTIF_RAR(Pid), megaco_test_mg:notify_request_and_reply(Pid)).
-define(GRP_REQ(Pid,N), megaco_test_mg:group_requests(Pid,N)).
-define(VERBOSITY(Pid,V), megaco_test_mg:verbosity(Pid,V)).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
start1() -> start(text, tcp).
start2() -> start(text, udp).
start3() -> start(binary, tcp).
start4() -> start(binary, udp).
start() ->
start(text, tcp).
start(tcp) ->
start(text, tcp);
start(udp) ->
start(text, udp).
start(Encoding, Transport) ->
proc_lib:start_link(?MODULE, main, [self(), Encoding, Transport, 1]).
stop(Pid) ->
Pid ! stop.
verbosity(Pid, V) ->
Pid ! {verbosity, V}.
timeout(Pid, T) ->
Pid ! {timeout, T}.
aat(Pid, Val) ->
uci(Pid, accu_ack_timer, Val).
aam(Pid, Val) ->
uci(Pid, accu_ack_maxcount, Val).
uci(Pid, Item, Val) ->
Pid ! {update_conn_info, Item, Val}.
%% -------------------------------------------------------------------------
%% - start function -
main(Parent, Encoding, Transport, MaxCount) ->
Mg = init(Encoding, Transport, MaxCount),
proc_lib:init_ack(Parent, {ok, self()}),
loop(Mg, ?TIMEOUT, ?TIMEOUT).
%% - init -
init(Encoding, Transport, MaxCount) ->
verify_encoding(Encoding),
verify_transport(Transport),
Mid = {deviceName, "mg"},
Config = [{auto_ack, true} %,
%{trans_timer, 2000},
%{trans_ack_maxcount, MaxCount}
],
d("start MG"),
{ok, Mg} = ?START(Mid, Encoding, Transport, Config, debug),
d("service change"),
ok = ?SERV_CHANGE(Mg),
?GRP_REQ(Mg, MaxCount),
Mg.
%% - main loop -
loop(Mg, Timeout, To) when To =< 0 ->
?NOTIF_RAR(Mg),
loop(Mg, Timeout, Timeout);
loop(Mg, Timeout, To) ->
Start = t(),
receive
stop ->
d("stop"),
megaco_test_mg:stop(Mg),
exit(normal);
{update_conn_info, Item, Val} ->
d("update_conn_info -> ~p:~p", [Item, Val]),
megaco_test_mg:update_conn_info(Mg, Item, Val),
loop(Mg, Timeout, To - (t() - Start));
{request_group_size, Size} when Size > 1 ->
d("request_group_size -> ~p", [Size]),
?GRP_REQ(Mg, Size),
loop(Mg, Timeout, To - (t() - Start));
{verbosity, V} ->
d("verbosity: ~p", [V]),
?VERBOSITY(Mg, V),
loop(Mg, Timeout, To - (t() - Start));
{timeout, T} ->
d("timeout: ~p", [T]),
T1 = T - Timeout,
loop(Mg, T, To - (t() - Start) + T1);
Any ->
error("received unknown request: ~n~p", [Any]),
loop(Mg, Timeout, To - (t() - Start))
after To ->
?NOTIF_RAR(Mg),
loop(Mg, Timeout, Timeout)
end.
%% -------------------------------------------------------------------------
verify_encoding(text) -> ok;
verify_encoding(binary) -> ok;
verify_encoding(Encoding) -> exit({invalid_encoding, Encoding}).
verify_transport(tcp) -> ok;
verify_transport(udp) -> ok;
verify_transport(Transport) -> exit({invalid_transport, Transport}).
%% -
sleep(X) -> receive after X -> ok end.
t() ->
{A,B,C} = erlang:now(),
A*1000000000+B*1000+(C div 1000).
%% -
error(F, A) ->
d("ERROR: " ++ F, A).
d(F) ->
d(F, []).
d(F, A) ->
io:format("~pAMG-" ++ F ++ "~n", [self()|A]).