aboutsummaryrefslogtreecommitdiffstats
path: root/lib/megaco/test/megaco_codec_flex_lib.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/megaco/test/megaco_codec_flex_lib.erl')
-rw-r--r--lib/megaco/test/megaco_codec_flex_lib.erl174
1 files changed, 174 insertions, 0 deletions
diff --git a/lib/megaco/test/megaco_codec_flex_lib.erl b/lib/megaco/test/megaco_codec_flex_lib.erl
new file mode 100644
index 0000000000..de76956711
--- /dev/null
+++ b/lib/megaco/test/megaco_codec_flex_lib.erl
@@ -0,0 +1,174 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2007-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: Utility module used by the codec suites when testing flex
+%% configured text codec(s).
+%%----------------------------------------------------------------------
+
+-module(megaco_codec_flex_lib).
+
+%% ----
+
+-include("megaco_test_lib.hrl").
+
+%% ----
+
+-export([
+ init/1,
+ finish/1,
+ scanner_conf/1,
+ start/0,
+ stop/1
+ ]).
+
+-export([
+ handler/1
+ ]).
+
+
+%% ----
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+init(Config) when is_list(Config) ->
+ Flag = process_flag(trap_exit, true),
+ Res = (catch start()),
+ process_flag(trap_exit, Flag),
+ case Res of
+ {error, Reason} ->
+ skip(Reason);
+ {ok, FlexConfig} ->
+ [{flex_scanner, FlexConfig} | Config]
+ end.
+
+
+finish(Config) when is_list(Config) ->
+ case lists:keysearch(flex_scanner, 1, Config) of
+ {value, {flex_scanner, {Pid, _Conf}}} ->
+ stop(Pid),
+ lists:keydelete(flex_scanner, 1, Config);
+ false ->
+ Config
+ end.
+
+
+start() ->
+ Pid = proc_lib:spawn(?MODULE, handler, [self()]),
+ receive
+ {flex_scanner_started, Pid, Conf} ->
+ {ok, {Pid, Conf}};
+ {flex_scanner_error, {failed_loading_flex_scanner_driver, Reason}} ->
+ ?LOG("start_flex_scanner -> failed loading flex scanner driver: "
+ "~n Reason: ~p~n", [Reason]),
+ {error, {failed_loading_flex_scanner_driver, Reason}};
+ {flex_scanner_error, Reason} ->
+ ?LOG("start_flex_scanner -> error: "
+ "~n Reason: ~p~n", [Reason]),
+ {error, {failed_loading_flex_scanner_driver, Reason}}
+ after 10000 ->
+ exit(Pid, kill),
+ {error, {failed_starting_flex_scanner, timeout}}
+ end.
+
+
+scanner_conf(Config) when is_list(Config) ->
+ case lists:keysearch(flex_scanner, 1, Config) of
+ {value, {flex_scanner, {Pid, Conf}}} ->
+ case ping_flex_scanner(Pid) of
+ ok ->
+ Conf;
+ Else ->
+ skip({no_response_from_flex_scanner_handler, Else})
+ end;
+ false ->
+ skip("Flex scanner driver not loaded")
+ end.
+
+
+ping_flex_scanner(Pid) ->
+ Pid ! {ping, self()},
+ receive
+ {pong, Pid} ->
+ ok
+ after 5000 ->
+ timeout
+ end.
+
+
+stop(Pid) ->
+ Pid ! stop.
+
+
+handler(Pid) ->
+ SMP = erlang:system_info(smp_support),
+ case (catch megaco_flex_scanner:start(SMP)) of
+ {ok, PortOrPorts} ->
+ Pid ! {flex_scanner_started, self(), {flex, PortOrPorts}},
+ handler(Pid, PortOrPorts);
+ {error, {load_driver, {open_error, Reason}}} ->
+ Error = {failed_loading_flex_scanner_driver, Reason},
+ Pid ! {flex_scanner_error, Error},
+ exit(Error);
+ {error, {load_driver, Reason}} ->
+ Error = {failed_loading_flex_scanner_driver, Reason},
+ Pid ! {flex_scanner_error, Error},
+ exit(Error);
+ Else ->
+ Error = {unknown_result_from_start_flex_scanner, Else},
+ Pid ! {flex_scanner_error, Error},
+ exit(Error)
+ end.
+
+handler(Pid, PortOrPorts) ->
+ receive
+ {ping, Pinger} ->
+ Pinger ! {pong, self()},
+ handler(Pid, PortOrPorts);
+ {'EXIT', Port, Reason} when (PortOrPorts =:= Port) ->
+ Pid ! {flex_scanner_exit, Reason},
+ exit({flex_scanner_exit, Reason});
+ {'EXIT', Port, Reason} when is_port(Port) ->
+ case megaco_flex_scanner:is_scanner_port(Port, PortOrPorts) of
+ true ->
+ Pid ! {flex_scanner_exit, Reason},
+ exit({flex_scanner_exit, Reason});
+ false ->
+ io:format("flex scanner handler got port exit "
+ "from unknown:"
+ "~n ~p: ~p", [Port, Reason]),
+ ok
+ end,
+ handler(Pid, PortOrPorts);
+ stop ->
+ megaco_flex_scanner:stop(PortOrPorts),
+ exit(normal);
+ Other ->
+ io:format("flex scanner handler got something:~n"
+ "~p", [Other]),
+ handler(Pid, PortOrPorts)
+ end.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+skip(Reason) ->
+ megaco_codec_test_lib:skip(Reason).
+