aboutsummaryrefslogtreecommitdiffstats
path: root/lib/megaco/test/megaco_tc_controller.erl
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/megaco/test/megaco_tc_controller.erl
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/megaco/test/megaco_tc_controller.erl')
-rw-r--r--lib/megaco/test/megaco_tc_controller.erl171
1 files changed, 171 insertions, 0 deletions
diff --git a/lib/megaco/test/megaco_tc_controller.erl b/lib/megaco/test/megaco_tc_controller.erl
new file mode 100644
index 0000000000..dedf45e321
--- /dev/null
+++ b/lib/megaco/test/megaco_tc_controller.erl
@@ -0,0 +1,171 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2006-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+%%----------------------------------------------------------------------
+%% Purpose:
+%%----------------------------------------------------------------------
+-module(megaco_tc_controller).
+
+-export([start_link/0, stop/0,
+ insert/2, lookup/1, delete/1]).
+-export([init/2]).
+
+-include("megaco_test_lib.hrl").
+
+-define(SERVER, ?MODULE).
+-define(TABLE, ?MODULE).
+
+start_link() ->
+ p("start_link -> entry"),
+ Pid = spawn_link(?MODULE, init, [self(),get(dbg)]),
+ receive
+ {tc_started, Pid, Reply} ->
+ p("start_link -> ~n ~p", [Reply]),
+ Reply
+ end.
+
+stop() ->
+ request(stop, undefined).
+
+insert(Key, Val) ->
+ request(insert, {Key, Val}).
+
+lookup(Key) ->
+ case request(lookup, Key) of
+ {value, _} = Value ->
+ Value;
+ _ ->
+ false
+ end.
+
+delete(Key) ->
+ request(delete, Key).
+
+request(Tag, Data) ->
+ p("request -> entry with"
+ "~n Tag: ~p"
+ "~n Data: ~p", [Tag, Data]),
+ case global:whereis_name(?SERVER) of
+ Pid when is_pid(Pid) ->
+ Pid ! {Tag, self(), Data},
+ receive
+ {Tag, Pid, Reply} ->
+ p("request -> response: "
+ "~n Reply: ~p", [Reply]),
+ Reply
+ end;
+ _ ->
+ {error, not_started}
+ end.
+
+init(Parent, true) ->
+ put(dbg,true),
+ init(Parent);
+init(Parent, _) ->
+ init(Parent).
+
+init(Parent) ->
+ p("init -> entry with"
+ "~n Parent: ~p", [Parent]),
+ ets:new(?TABLE, [named_table, protected, set]),
+ case global:register_name(?SERVER, self()) of
+ yes ->
+ p("init -> registration ok"),
+ Parent ! {tc_started, self(), ok},
+ loop(Parent);
+ no ->
+ p("init -> registration failed"),
+ Parent ! {tc_started, self(), {error, already_registered}},
+ exit(normal)
+ end.
+
+loop(Parent) ->
+ p("loop -> entry"),
+ receive
+ {insert, Parent, {Key, Val}} ->
+ p("loop -> received insert request when"
+ "~n Key: ~p"
+ "~n Val: ~p", [Key, Val]),
+ ets:insert(?TABLE, {Key, Val}),
+ Parent ! {insert, self(), ok};
+ {delete, Parent, Key} ->
+ p("loop -> received delete request when"
+ "~n Key: ~p", [Key]),
+ ets:delete(?TABLE, Key),
+ Parent ! {delete, self(), ok};
+ {lookup, From, Key} when is_pid(From) ->
+ p("loop -> received lookup request when"
+ "~n Key: ~p", [Key]),
+ case ets:lookup(?TABLE, Key) of
+ [{Key, Val}] ->
+ p("loop -> lookup: ~p", [Val]),
+ From ! {lookup, self(), {value, Val}};
+ _ ->
+ p("loop -> lookup unsuccessful"),
+ From ! {lookup, self(), false}
+ end;
+ {stop, Parent, _} ->
+ p("loop -> received stop request"),
+ ets:delete(?TABLE),
+ global:unregister_name(?SERVER),
+ Parent ! {stop, self(), ok},
+ exit(normal);
+
+ {'EXIT', Parent, Reason} when is_pid(Parent) ->
+ p("loop -> received exit signal from parent"
+ "~n Reason: ~p", [Reason]),
+ exit(Reason);
+
+ {UnknownRequest, Parent, UnknownData} when is_pid(Parent) ->
+ p("loop -> received unknown request when"
+ "~n UnknownRequest: ~p"
+ "~n UnknownData: ~p", [UnknownRequest, UnknownData]),
+ Error = {error, {unknown_request, {UnknownRequest, UnknownData}}},
+ Parent ! {UnknownRequest, self(), Error};
+
+ {Request, From, Data} when is_pid(From) ->
+ p("loop -> received request from unknown when"
+ "~n Request: ~p"
+ "~n From: ~p"
+ "~n Data: ~p", [Request, From, Data]),
+ Error = {error, {unknown_request, {Request, Data}}},
+ Parent ! {Request, self(), Error};
+
+ Crap ->
+ p("loop -> received crap: "
+ "~n Crap: ~p"
+ "~nwhen"
+ "~n Parent: ~p", [Crap, Parent]),
+ ok
+ end,
+ loop(Parent).
+
+
+p(F) ->
+ p(F, []).
+
+p(F, A) ->
+ p(get(dbg), F, A).
+
+p(true, F, A) ->
+ io:format("~w:~p:" ++ F ++ "~n", [?MODULE, self()|A]);
+p(_, _, _) ->
+ ok.
+