From 84adefa331c4159d432d22840663c38f155cd4c1 Mon Sep 17 00:00:00 2001 From: Erlang/OTP Date: Fri, 20 Nov 2009 14:54:40 +0000 Subject: The R13B03 release. --- lib/megaco/test/megaco_codec_v1_test.erl | 7305 ++++++++++++++++++++++++++++++ 1 file changed, 7305 insertions(+) create mode 100644 lib/megaco/test/megaco_codec_v1_test.erl (limited to 'lib/megaco/test/megaco_codec_v1_test.erl') diff --git a/lib/megaco/test/megaco_codec_v1_test.erl b/lib/megaco/test/megaco_codec_v1_test.erl new file mode 100644 index 0000000000..7f2af37282 --- /dev/null +++ b/lib/megaco/test/megaco_codec_v1_test.erl @@ -0,0 +1,7305 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-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: Test encoding/decoding (codec) module of Megaco/H.248 v1 +%%---------------------------------------------------------------------- + +-module(megaco_codec_v1_test). + +%% ---- + +-include_lib("megaco/include/megaco.hrl"). +-include_lib("megaco/include/megaco_message_v1.hrl"). +-include("megaco_test_lib.hrl"). + +%% ---- + +%% -export([msg/0]). +-export([msgs/0]). +-export([rfc3525_msgs_display/0, rfc3525_msgs_test/0]). + +-export([t/0, t/1]). + +-export([all/1, + + text/1, + + pretty/1, + pretty_test_msgs/1, + + compact/1, + compact_test_msgs/1, + + flex_pretty/1, + flex_pretty_init/1, + flex_pretty_finish/1, + flex_pretty_test_msgs/1, + + flex_compact/1, + flex_compact_init/1, + flex_compact_finish/1, + flex_compact_test_msgs/1, + flex_compact_dm_timers1/1, + flex_compact_dm_timers2/1, + flex_compact_dm_timers3/1, + flex_compact_dm_timers4/1, + flex_compact_dm_timers5/1, + flex_compact_dm_timers6/1, + + binary/1, + + bin/1, + bin_test_msgs/1, + + ber/1, + ber_test_msgs/1, + + ber_bin/1, + ber_bin_test_msgs/1, + + per/1, + per_test_msgs/1, + + per_bin/1, + per_bin_test_msgs/1, + + erl_dist/1, + erl_dist_m/1, + erl_dist_m_test_msgs/1, + + tickets/0, + tickets/1, + + compact_tickets/1, + compact_otp4011_msg1/1, + compact_otp4011_msg2/1, + compact_otp4011_msg3/1, + compact_otp4013_msg1/1, + compact_otp4085_msg1/1, + compact_otp4085_msg2/1, + compact_otp4280_msg1/1, + compact_otp4299_msg1/1, + compact_otp4299_msg2/1, + compact_otp4359_msg1/1, + compact_otp4920_msg0/1, + compact_otp4920_msg1/1, + compact_otp4920_msg2/1, + compact_otp4920_msg3/1, + compact_otp4920_msg4/1, + compact_otp4920_msg5/1, + compact_otp4920_msg6/1, + compact_otp4920_msg7/1, + compact_otp4920_msg8/1, + compact_otp4920_msg9/1, + compact_otp4920_msg10/1, + compact_otp4920_msg11/1, + compact_otp4920_msg12/1, + compact_otp4920_msg20/1, + compact_otp4920_msg21/1, + compact_otp4920_msg22/1, + compact_otp4920_msg23/1, + compact_otp4920_msg24/1, + compact_otp4920_msg25/1, + compact_otp5186_msg01/1, + compact_otp5186_msg02/1, + compact_otp5186_msg03/1, + compact_otp5186_msg04/1, + compact_otp5186_msg05/1, + compact_otp5186_msg06/1, + compact_otp5793_msg01/1, + compact_otp5993_msg01/1, + compact_otp5993_msg02/1, + compact_otp5993_msg03/1, + compact_otp6017_msg01/1, + compact_otp6017_msg02/1, + compact_otp6017_msg03/1, + + flex_compact_tickets/1, + flex_compact_otp7431_msg01a/1, + flex_compact_otp7431_msg01b/1, + flex_compact_otp7431_msg02/1, + flex_compact_otp7431_msg03/1, + flex_compact_otp7431_msg04/1, + flex_compact_otp7431_msg05/1, + flex_compact_otp7431_msg06/1, + flex_compact_otp7431_msg07/1, + + pretty_tickets/1, + pretty_otp4632_msg1/1, + pretty_otp4632_msg2/1, + pretty_otp4632_msg3/1, + pretty_otp4632_msg4/1, + pretty_otp4710_msg1/1, + pretty_otp4710_msg2/1, + pretty_otp4945_msg1/1, + pretty_otp4945_msg2/1, + pretty_otp4945_msg3/1, + pretty_otp4945_msg4/1, + pretty_otp4945_msg5/1, + pretty_otp4945_msg6/1, + pretty_otp4949_msg1/1, + pretty_otp4949_msg2/1, + pretty_otp4949_msg3/1, + pretty_otp5042_msg1/1, + pretty_otp5068_msg1/1, + pretty_otp5085_msg1/1, + pretty_otp5085_msg2/1, + pretty_otp5085_msg3/1, + pretty_otp5085_msg4/1, + pretty_otp5085_msg5/1, + pretty_otp5085_msg6/1, + pretty_otp5085_msg7/1, + pretty_otp5600_msg1/1, + pretty_otp5600_msg2/1, + pretty_otp5601_msg1/1, + pretty_otp5793_msg01/1, + pretty_otp5882_msg01/1, + pretty_otp6490_msg01/1, + pretty_otp6490_msg02/1, + pretty_otp6490_msg03/1, + pretty_otp6490_msg04/1, + pretty_otp6490_msg05/1, + pretty_otp6490_msg06/1, + pretty_otp7671_msg01/1, + pretty_otp7671_msg02/1, + pretty_otp7671_msg03/1, + pretty_otp7671_msg04/1, + pretty_otp7671_msg05/1, + + flex_pretty_tickets/1, + flex_pretty_otp5042_msg1/1, + flex_pretty_otp5085_msg1/1, + flex_pretty_otp5085_msg2/1, + flex_pretty_otp5085_msg3/1, + flex_pretty_otp5085_msg4/1, + flex_pretty_otp5085_msg5/1, + flex_pretty_otp5085_msg6/1, + flex_pretty_otp5085_msg7/1, + flex_pretty_otp5600_msg1/1, + flex_pretty_otp5600_msg2/1, + flex_pretty_otp5601_msg1/1, + flex_pretty_otp5793_msg01/1, + flex_pretty_otp7431_msg01/1, + flex_pretty_otp7431_msg02/1, + flex_pretty_otp7431_msg03/1, + flex_pretty_otp7431_msg04/1, + flex_pretty_otp7431_msg05/1, + flex_pretty_otp7431_msg06/1, + flex_pretty_otp7431_msg07/1, + + init_per_testcase/2, fin_per_testcase/2]). + +-export([display_text_messages/0, generate_text_messages/0]). + + +-export([msg15b/0, msg22f/0]). + +-export([ + %% Decode + profile_decode_compact_text_message/1, + profile_decode_compact_text_messages/0, + prof1/0, prof2/0, + profile_decode_compact_flex_text_message/1, + profile_decode_compact_flex_text_messages/0, + profile_decode_pretty_text_message/1, + profile_decode_pretty_text_messages/0, + profile_decode_pretty_flex_text_message/1, + profile_decode_pretty_flex_text_messages/0, + + %% Encode + profile_encode_compact_text_messages/0, + profile_encode_pretty_text_messages/0 + ]). + + +%% ---- + +-define(V1, v1). +-define(EC, []). +-define(VERSION, 1). +-define(VERSION_STR, "1"). +-define(DEFAULT_PORT, 55555). +-define(MSG_LIB, megaco_test_msg_v1_lib). +-define(MG1_MID_NO_PORT, {ip4Address, + #'IP4Address'{address = [124, 124, 124, 222]}}). +-define(MG1_MID, {ip4Address, #'IP4Address'{address = [124, 124, 124, 222], + portNumber = ?DEFAULT_PORT}}). +-define(MG2_MID, {ip4Address, #'IP4Address'{address = [125, 125, 125, 111], + portNumber = ?DEFAULT_PORT}}). +-define(MG3_MID, {ip6Address, #'IP6Address'{address = [0,0,0,0, + 0,0,0,0, + 0,0,0,0, + 125, 125, 125, 111], + portNumber = ?DEFAULT_PORT}}). +-define(MGC_MID, {ip4Address, #'IP4Address'{address = [123, 123, 123, 4], + portNumber = ?DEFAULT_PORT}}). + +-define(A4444, ["11111111", "00000000", "00000000"]). +-define(A4445, ["11111111", "00000000", "11111111"]). +-define(A5555, ["11111111", "11111111", "00000000"]). +-define(A5556, ["11111111", "11111111", "11111111"]). + + +%% ---- + +display_text_messages() -> + Msgs = + msgs1() ++ + msgs3(), + megaco_codec_test_lib:display_text_messages(?VERSION, Msgs). + + +generate_text_messages() -> + Msgs = + msgs1(), + megaco_codec_test_lib:generate_text_messages(?V1, ?VERSION, ?EC, Msgs). + + +%% ---- + +prof1() -> + megaco_codec_v1_test:profile_decode_compact_text_message(msg10). + +prof2() -> + megaco_codec_v1_test:profile_decode_compact_flex_text_message(msg10). + +%% (catch megaco_codec_v1_test:profile_decode_compact_text_message(msg01a)). +%% (catch megaco_codec_v1_test:profile_decode_compact_text_message(msg01b)). +%% (catch megaco_codec_v1_test:profile_decode_compact_text_message(msg02)). +%% (catch megaco_codec_v1_test:profile_decode_compact_text_message(msg10)). +%% (catch megaco_codec_v1_test:profile_decode_compact_text_message(msg11)). +%% (catch megaco_codec_v1_test:profile_decode_compact_text_message(msg12)). +%% (catch megaco_codec_v1_test:profile_decode_compact_text_message(msg13)). +profile_decode_compact_text_message(MsgTag) when is_atom(MsgTag) -> + Config = [], + Slogan = list_to_atom("decode_compact_v1_" ++ atom_to_list(MsgTag)), + profile_decode_compact_text_message(Slogan, Config, MsgTag). + +profile_decode_compact_flex_text_message(MsgTag) when is_atom(MsgTag) -> + Conf = flex_init([]), + Config = flex_scanner_conf(Conf), + Slogan = list_to_atom("decode_compact_flex_v1_" ++ atom_to_list(MsgTag)), + Res = profile_decode_compact_text_message(Slogan, [Config], MsgTag), + flex_finish(Conf), + Res. + +profile_decode_compact_text_message(Slogan, Config, MsgTag) -> + Codec = megaco_compact_text_encoder, + profile_decode_text_message(Slogan, Codec, Config, MsgTag). + +%% (catch megaco_codec_v1_test:profile_decode_pretty_text_message(msg01a)). +%% (catch megaco_codec_v1_test:profile_decode_pretty_text_message(msg01b)). +%% (catch megaco_codec_v1_test:profile_decode_pretty_text_message(msg02)). +profile_decode_pretty_text_message(MsgTag) when is_atom(MsgTag) -> + Config = [], + Slogan = list_to_atom("decode_pretty_v1_" ++ atom_to_list(MsgTag)), + profile_decode_pretty_text_message(Slogan, Config, MsgTag). + +profile_decode_pretty_flex_text_message(MsgTag) when is_atom(MsgTag) -> + Conf = flex_init([]), + Config = flex_scanner_conf(Conf), + Slogan = list_to_atom("decode_pretty_flex_v1_" ++ atom_to_list(MsgTag)), + Res = profile_decode_pretty_text_message(Slogan, [Config], MsgTag), + flex_finish(Conf), + Res. + +profile_decode_pretty_text_message(Slogan, Config, MsgTag) -> + Codec = megaco_pretty_text_encoder, + profile_decode_text_message(Slogan, Codec, Config, MsgTag). + +profile_decode_text_message(Slogan, Codec, Config, MsgTag) -> + Msgs = msgs1(), + case lists:keysearch(MsgTag, 1, Msgs) of + {value, Msg} -> + [Res] = profile_decode_text_messages(Slogan, Codec, Config, [Msg]), + Res; + false -> + {error, {no_such_message, MsgTag}} + end. + + +%% (catch megaco_codec_v1_test:profile_decode_compact_text_messages()). +profile_decode_compact_text_messages() -> + Config = [], + Slogan = decode_compact_v1, + profile_decode_compact_text_messages(Slogan, Config). + +%% (catch megaco_codec_v1_test:profile_decode_compact_flex_text_messages()). +profile_decode_compact_flex_text_messages() -> + Conf = flex_init([]), + Config = flex_scanner_conf(Conf), + Slogan = decode_compact_flex_v1, + Res = profile_decode_compact_text_messages(Slogan, [Config]), + flex_finish(Conf), + Res. + +profile_decode_compact_text_messages(Slogan, Config) -> + Codec = megaco_compact_text_encoder, + profile_decode_text_messages(Slogan, Codec, Config). + +%% (catch megaco_codec_v1_test:profile_decode_pretty_text_messages()). +profile_decode_pretty_text_messages() -> + Config = [], + Slogan = decode_pretty_v1, + profile_decode_pretty_text_messages(Slogan, Config). + +%% (catch megaco_codec_v1_test:profile_decode_pretty_flex_text_messages()). +profile_decode_pretty_flex_text_messages() -> + Conf = flex_init([]), + Config = flex_scanner_conf(Conf), + Slogan = decode_pretty_flex_v1, + Res = profile_decode_pretty_text_messages(Slogan, [Config]), + flex_finish(Conf), + Res. + + +profile_decode_pretty_text_messages(Slogan, Config) -> + Codec = megaco_pretty_text_encoder, + profile_decode_text_messages(Slogan, Codec, Config). + +profile_decode_text_messages(Slogan, Codec, Config) -> + Msgs = msgs1(), + profile_decode_text_messages(Slogan, Codec, Config, Msgs). + +profile_decode_text_messages(Slogan, Codec, Config, Msgs0) -> + Msgs = [Msg || {_, Msg, _, _} <- Msgs0], + EncodeRes = encode_text_messages(Codec, Config, Msgs, []), + Bins = [Bin || {ok, Bin} <- EncodeRes], + Fun = fun() -> + decode_text_messages(Codec, Config, Bins, []) + end, + %% Make a dry run, just to make sure all modules are loaded: + io:format("make a dry run..~n", []), + (catch Fun()), + io:format("make the run..~n", []), + megaco_profile:profile(Slogan, Fun). + +%% (catch megaco_codec_v1_test:profile_encode_compact_text_messages()). +profile_encode_compact_text_messages() -> + Codec = megaco_compact_text_encoder, + Config = [], + Slogan = encode_compact_v1, + profile_encode_text_messages(Slogan, Codec, Config). + +%% (catch megaco_codec_v1_test:profile_encode_pretty_text_messages()). +profile_encode_pretty_text_messages() -> + Codec = megaco_pretty_text_encoder, + Config = [], + Slogan = encode_pretty_v1, + profile_encode_text_messages(Slogan, Codec, Config). + +profile_encode_text_messages(Slogan, Codec, Config) -> + Msgs = msgs1(), + profile_encode_text_messages(Slogan, Codec, Config, Msgs). + +profile_encode_text_messages(Slogan, Codec, Config, Msgs0) -> + Msgs = [Msg || {_, Msg, _, _} <- Msgs0], + Fun = fun() -> + encode_text_messages(Codec, Config, Msgs, []) + end, + %% Make a dry run, just to make sure all modules are loaded: + io:format("make a dry run...~n", []), + (catch Fun()), + io:format("make the run...~n", []), + megaco_profile:profile(Slogan, Fun). + +encode_text_messages(_Codec, _Config, [], Acc) -> + Acc; +encode_text_messages(Codec, Config, [Msg|Msgs], Acc) -> + Res = Codec:encode_message(Config, ?VERSION, Msg), + encode_text_messages(Codec, Config, Msgs, [Res | Acc]). + +decode_text_messages(_Codec, _Config, [], Acc) -> + Acc; +decode_text_messages(Codec, Config, [Msg|Msgs], Acc) -> + Res = Codec:decode_message(Config, dynamic, Msg), + decode_text_messages(Codec, Config, Msgs, [Res | Acc]). + + +%% ---- + +expand(RootCase) -> + expand([RootCase], []). + +expand([], Acc) -> + lists:flatten(lists:reverse(Acc)); +expand([Case|Cases], Acc) -> + case (catch apply(?MODULE,Case,[suite])) of + [] -> + expand(Cases, [Case|Acc]); + C when is_list(C) -> + expand(Cases, [expand(C, [])|Acc]); + _ -> + expand(Cases, [Case|Acc]) + end. + + +%% ---- + +tickets() -> + Flag = process_flag(trap_exit, true), + Cases = expand(tickets), + Fun = fun(Case) -> + C = init_per_testcase(Case, [{tc_timeout, + timer:minutes(10)}]), + io:format("Eval ~w~n", [Case]), + Result = + case (catch apply(?MODULE, Case, [C])) of + {'EXIT', Reason} -> + io:format("~n~p exited:~n ~p~n", + [Case, Reason]), + {error, {Case, Reason}}; + Res -> + Res + end, + fin_per_testcase(Case, C), + Result + end, + process_flag(trap_exit, Flag), + lists:map(Fun, Cases). + + +%% ---- + +t() -> megaco_test_lib:t(?MODULE). +t(Case) -> megaco_test_lib:t({?MODULE, Case}). + +init_per_testcase(Case, Config) -> + %% CaseString = io_lib:format("~p", [Case]), + C = + case lists:suffix("time_test", atom_to_list(Case)) of + true -> + [{tc_timeout, timer:minutes(10)}|Config]; + false -> + put(verbosity,trc), + Config + end, + megaco_test_lib:init_per_testcase(Case, C). + +fin_per_testcase(Case, Config) -> + erase(verbosity), + megaco_test_lib:fin_per_testcase(Case, Config). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Top test case + +all(suite) -> + [ + text, + binary, + erl_dist, + tickets + ]. + +text(suite) -> + [ + pretty, + flex_pretty, + compact, + flex_compact + ]. + +binary(suite) -> + [ + bin, + ber, + ber_bin, + per, + per_bin + ]. + +erl_dist(suite) -> + [ + erl_dist_m + ]. + +pretty(suite) -> + [ + pretty_test_msgs + ]. + + +compact(suite) -> + [ + compact_test_msgs + ]. + + +flex_pretty(suite) -> + {req, [], + {conf, flex_pretty_init, flex_pretty_cases(), flex_pretty_finish}}. + +flex_pretty_cases() -> + [ + flex_pretty_test_msgs + ]. + + +flex_compact(suite) -> + {req, [], + {conf, flex_compact_init, flex_compact_cases(), flex_compact_finish}}. + +flex_compact_cases() -> + [ + flex_compact_test_msgs, + + flex_compact_dm_timers1, + flex_compact_dm_timers2, + flex_compact_dm_timers3, + flex_compact_dm_timers4, + flex_compact_dm_timers5, + flex_compact_dm_timers6 + ]. + + +bin(suite) -> + [ + bin_test_msgs + ]. + + +ber(suite) -> + [ + ber_test_msgs + ]. + + +ber_bin(suite) -> + [ + ber_bin_test_msgs + ]. + + +per(suite) -> + [ + per_test_msgs + ]. + + +%% Support for per_bin was added to ASN.1 as of version +%% 1.3.2 (R8). And later merged into 1.3.1.3 (R7). These +%% releases are identical (as far as I know). +%% +per_bin(suite) -> + [ + per_bin_test_msgs + ]. + +erl_dist_m(suite) -> + [ + erl_dist_m_test_msgs + ]. + +tickets(suite) -> + [ + compact_tickets, + pretty_tickets, + flex_compact_tickets, + flex_pretty_tickets + ]. + + +compact_tickets(suite) -> + [ + compact_otp4011_msg1, + compact_otp4011_msg2, + compact_otp4011_msg3, + compact_otp4013_msg1, + compact_otp4085_msg1, + compact_otp4085_msg2, + compact_otp4280_msg1, + compact_otp4299_msg1, + compact_otp4299_msg2, + compact_otp4359_msg1, + compact_otp4920_msg0, + compact_otp4920_msg1, + compact_otp4920_msg2, + compact_otp4920_msg3, + compact_otp4920_msg4, + compact_otp4920_msg5, + compact_otp4920_msg6, + compact_otp4920_msg7, + compact_otp4920_msg8, + compact_otp4920_msg9, + compact_otp4920_msg10, + compact_otp4920_msg11, + compact_otp4920_msg12, + compact_otp4920_msg20, + compact_otp4920_msg21, + compact_otp4920_msg22, + compact_otp4920_msg23, + compact_otp4920_msg24, + compact_otp4920_msg25, + compact_otp5186_msg01, + compact_otp5186_msg02, + compact_otp5186_msg03, + compact_otp5186_msg04, + compact_otp5186_msg05, + compact_otp5186_msg06, + compact_otp5793_msg01, + compact_otp5993_msg01, + compact_otp5993_msg02, + compact_otp5993_msg03, + compact_otp6017_msg01, + compact_otp6017_msg02, + compact_otp6017_msg03 + ]. + +flex_compact_tickets(suite) -> + {req, [], + {conf, flex_compact_init, flex_compact_tickets_cases(), + flex_compact_finish}}. + +flex_compact_tickets_cases() -> + [ + flex_compact_otp7431_msg01a, + flex_compact_otp7431_msg01b, + flex_compact_otp7431_msg02, + flex_compact_otp7431_msg03, + flex_compact_otp7431_msg04, + flex_compact_otp7431_msg05, + flex_compact_otp7431_msg06, + flex_compact_otp7431_msg07 + ]. + + +pretty_tickets(suite) -> + [ + pretty_otp4632_msg1, + pretty_otp4632_msg2, + pretty_otp4632_msg3, + pretty_otp4632_msg4, + pretty_otp4710_msg1, + pretty_otp4710_msg2, + pretty_otp4945_msg1, + pretty_otp4945_msg2, + pretty_otp4945_msg3, + pretty_otp4945_msg4, + pretty_otp4945_msg5, + pretty_otp4945_msg6, + pretty_otp4949_msg1, + pretty_otp4949_msg2, + pretty_otp4949_msg3, + pretty_otp5042_msg1, + pretty_otp5068_msg1, + pretty_otp5085_msg1, + pretty_otp5085_msg2, + pretty_otp5085_msg3, + pretty_otp5085_msg4, + pretty_otp5085_msg5, + pretty_otp5085_msg6, + pretty_otp5085_msg7, + pretty_otp5600_msg1, + pretty_otp5600_msg2, + pretty_otp5601_msg1, + pretty_otp5793_msg01, + pretty_otp5882_msg01, + pretty_otp6490_msg01, + pretty_otp6490_msg02, + pretty_otp6490_msg03, + pretty_otp6490_msg04, + pretty_otp6490_msg05, + pretty_otp6490_msg06, + pretty_otp7671_msg01, + pretty_otp7671_msg02, + pretty_otp7671_msg03, + pretty_otp7671_msg04, + pretty_otp7671_msg05 + ]. + +flex_pretty_tickets(suite) -> + {req, [], + {conf, flex_pretty_init, flex_pretty_tickets_cases(), + flex_pretty_finish}}. + +flex_pretty_tickets_cases() -> + [ + flex_pretty_otp5042_msg1, + flex_pretty_otp5085_msg1, + flex_pretty_otp5085_msg2, + flex_pretty_otp5085_msg3, + flex_pretty_otp5085_msg4, + flex_pretty_otp5085_msg5, + flex_pretty_otp5085_msg6, + flex_pretty_otp5085_msg7, + flex_pretty_otp5600_msg1, + flex_pretty_otp5600_msg2, + flex_pretty_otp5601_msg1, + flex_pretty_otp5793_msg01, + flex_pretty_otp7431_msg01, + flex_pretty_otp7431_msg02, + flex_pretty_otp7431_msg03, + flex_pretty_otp7431_msg04, + flex_pretty_otp7431_msg05, + flex_pretty_otp7431_msg06, + flex_pretty_otp7431_msg07 + ]. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +pretty_test_msgs(suite) -> + []; +pretty_test_msgs(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + Msgs = msgs1() ++ msgs2() ++ msgs3(), + DynamicDecode = false, + test_msgs(megaco_pretty_text_encoder, DynamicDecode, [], Msgs). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +flex_pretty_init(Config) -> + flex_init(Config). + +flex_pretty_finish(Config) -> + flex_finish(Config). + + +flex_pretty_test_msgs(suite) -> + []; +flex_pretty_test_msgs(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + %% Msgs = msgs1(), + Msgs = msgs1() ++ msgs2() ++ msgs3(), + Conf = flex_scanner_conf(Config), + DynamicDecode = false, + test_msgs(megaco_pretty_text_encoder, DynamicDecode, [Conf], Msgs). + +flex_pretty_otp5042_msg1(suite) -> + []; +flex_pretty_otp5042_msg1(Config) when is_list(Config) -> + d("flex_pretty_otp5042_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp5042_msg1(), + Bin0 = list_to_binary(Msg0), + Conf = flex_scanner_conf(Config), + case decode_message(megaco_pretty_text_encoder, false, [Conf], Bin0) of + {error, [{reason, Reason}|_]} -> + case Reason of + {_, _Mod, {not_an_integer, PropertyParm}} -> + exit({not_an_integer, PropertyParm}); + _ -> + io:format("flex_pretty_otp5042_msg1 -> " + "~n Reason: ~w" + "~n", [Reason]), + exit({unexpected_decode_result, Reason}) + end; + {ok, M} -> + t("flex_pretty_otp5042_msg1 -> successfull decode:" + "~n~p", [M]), + ok + end. + + +flex_pretty_otp5085_msg1(suite) -> + []; +flex_pretty_otp5085_msg1(Config) when is_list(Config) -> + d("flex_pretty_otp5085_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + pretty_otp5085(ok, pretty_otp5085_msg1(), [Conf]). + +flex_pretty_otp5085_msg2(suite) -> + []; +flex_pretty_otp5085_msg2(Config) when is_list(Config) -> + d("flex_pretty_otp5085_msg2 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + pretty_otp5085(error, pretty_otp5085_msg2(), [Conf]). + +flex_pretty_otp5085_msg3(suite) -> + []; +flex_pretty_otp5085_msg3(Config) when is_list(Config) -> + d("flex_pretty_otp5085_msg3 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + pretty_otp5085(ok, pretty_otp5085_msg3(), [Conf]). + +flex_pretty_otp5085_msg4(suite) -> + []; +flex_pretty_otp5085_msg4(Config) when is_list(Config) -> + d("flex_pretty_otp5085_msg4 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + pretty_otp5085(ok, pretty_otp5085_msg4(), [Conf]). + +flex_pretty_otp5085_msg5(suite) -> + []; +flex_pretty_otp5085_msg5(Config) when is_list(Config) -> + d("flex_pretty_otp5085_msg5 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + pretty_otp5085(ok, pretty_otp5085_msg5(), [Conf]). + +flex_pretty_otp5085_msg6(suite) -> + []; +flex_pretty_otp5085_msg6(Config) when is_list(Config) -> + d("flex_pretty_otp5085_msg6 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + pretty_otp5085(ok, pretty_otp5085_msg6(), [Conf]). + +flex_pretty_otp5085_msg7(suite) -> + []; +flex_pretty_otp5085_msg7(Config) when is_list(Config) -> + d("flex_pretty_otp5085_msg7 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + pretty_otp5085(ok, pretty_otp5085_msg7(), [Conf]). + +flex_pretty_otp5600_msg1(suite) -> + []; +flex_pretty_otp5600_msg1(Config) when is_list(Config) -> + d("flex_pretty_otp5600_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + pretty_otp5600(ok, pretty_otp5600_msg1(), [Conf]). + +flex_pretty_otp5600_msg2(suite) -> + []; +flex_pretty_otp5600_msg2(Config) when is_list(Config) -> + d("flex_pretty_otp5600_msg2 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + pretty_otp5600(ok, pretty_otp5600_msg2(), [Conf]). + +flex_pretty_otp5601_msg1(suite) -> + []; +flex_pretty_otp5601_msg1(Config) when is_list(Config) -> + d("flex_pretty_otp5601_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + pretty_otp5601(ok, pretty_otp5601_msg1(), [Conf]). + +flex_pretty_otp5793_msg01(suite) -> + []; +flex_pretty_otp5793_msg01(Config) when is_list(Config) -> + d("flex_pretty_otp5793_msg01 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + pretty_otp5793(ok, pretty_otp5793_msg1(), [Conf]). + +flex_pretty_otp7431_msg01(suite) -> + []; +flex_pretty_otp7431_msg01(Config) when is_list(Config) -> + d("flex_pretty_otp7431_msg01 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + flex_pretty_otp7431(ok, flex_pretty_otp7431_msg1(), [Conf]). + +flex_pretty_otp7431_msg02(suite) -> + []; +flex_pretty_otp7431_msg02(Config) when is_list(Config) -> +%% put(severity,trc), +%% put(dbg,true), + d("flex_pretty_otp7431_msg02 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + flex_pretty_otp7431(error, flex_pretty_otp7431_msg2(), [Conf]). + +flex_pretty_otp7431_msg03(suite) -> + []; +flex_pretty_otp7431_msg03(Config) when is_list(Config) -> +%% put(severity,trc), +%% put(dbg,true), + d("flex_pretty_otp7431_msg03 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + flex_pretty_otp7431(error, flex_pretty_otp7431_msg3(), [Conf]). + +flex_pretty_otp7431_msg04(suite) -> + []; +flex_pretty_otp7431_msg04(Config) when is_list(Config) -> + d("flex_pretty_otp7431_msg04 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + flex_pretty_otp7431(error, flex_pretty_otp7431_msg4(), [Conf]). + +flex_pretty_otp7431_msg05(suite) -> + []; +flex_pretty_otp7431_msg05(Config) when is_list(Config) -> + d("flex_pretty_otp7431_msg05 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + flex_pretty_otp7431(error, flex_pretty_otp7431_msg5(), [Conf]). + +flex_pretty_otp7431_msg06(suite) -> + []; +flex_pretty_otp7431_msg06(Config) when is_list(Config) -> + d("flex_pretty_otp7431_msg06 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + flex_pretty_otp7431(error, flex_pretty_otp7431_msg6(), [Conf]). + +flex_pretty_otp7431_msg07(suite) -> + []; +flex_pretty_otp7431_msg07(Config) when is_list(Config) -> + d("flex_pretty_otp7431_msg07 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Conf = flex_scanner_conf(Config), + flex_pretty_otp7431(error, flex_pretty_otp7431_msg7(), [Conf]). + +flex_pretty_otp7431(Expected, Msg, Conf) -> + otp7431(Expected, megaco_pretty_text_encoder, Msg, Conf). + +otp7431(Expected, Codec, Msg0, Conf) -> + Bin0 = list_to_binary(Msg0), + case decode_message(Codec, false, Conf, Bin0) of + {ok, _Msg1} when Expected =:= ok -> + io:format(" decoded", []), + ok; + {error, {bad_property_parm, Reason}} when (Expected =:= error) andalso + is_list(Reason) -> + io:format("expected result: ~s", [Reason]), + ok; + Else -> + io:format("unexpected result", []), + exit({unexpected_decode_result, Else}) + end. + + +flex_pretty_otp7431_msg1() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222]:55555 Reply = 10003 { + Context = 2000 { + Add = A4444, + Add = A4445 { + Media { + Stream = 1 { + Local { +v=0 +o=- 2890844526 2890842807 IN IP4 124.124.124.222 +s=- +t= 0 0 +c=IN IP4 124.124.124.222 +m=audio 2222 RTP/AVP 4 +a=ptime:30 +a=recvonly + } ; RTP profile for G.723.1 is 4 + } + } + } + } +}". + +flex_pretty_otp7431_msg2() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222]:55555 Reply = 10003 { + Context = 2000 { + Add = A4444, + Add = A4445 { + Media { + Stream = 1 { + Local { +v=0 +o=- 2890844526 2890842807 IN IP4 124.124.124.222 +s=- +t= 0 0 +c=IN IP4 124.124.124.222 +m=audio 2222 RTP/AVP 4 +a=ptime:30 +a= } + } + } + } + } +}". + +flex_pretty_otp7431_msg3() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222]:55555 Reply = 10003 { + Context = 2000 { + Add = A4444, + Add = A4445 { + Media { + Stream = 1 { + Local { +v=0 +o=- 2890844526 2890842807 IN IP4 124.124.124.222 +s=- +t= 0 0 +c=IN IP4 124.124.124.222 +m=audio 2222 RTP/AVP 4 +a=ptime:30 +a } + } + } + } + } +}". + +flex_pretty_otp7431_msg4() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222]:55555 Reply = 10003 { + Context = 2000 { + Add = A4444, + Add = A4445 { + Media { + Stream = 1 { + Local { +v=0 +o=- 2890844526 2890842807 IN IP4 124.124.124.222 +s=- +t= 0 0 +c=IN IP4 124.124.124.222 +m=audio 2222 RTP/AVP 4 +a=ptime:30 +a} + } + } + } + } +}". + +flex_pretty_otp7431_msg5() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222]:55555 Reply = 10003 { + Context = 2000 { + Add = A4444, + Add = A4445 { + Media { + Stream = 1 { + Local { +v= } + } + } + } + } +}". + +flex_pretty_otp7431_msg6() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222]:55555 Reply = 10003 { + Context = 2000 { + Add = A4444, + Add = A4445 { + Media { + Stream = 1 { + Local { +v } + } + } + } + } +}". + +flex_pretty_otp7431_msg7() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222]:55555 Reply = 10003 { + Context = 2000 { + Add = A4444, + Add = A4445 { + Media { + Stream = 1 { + Local { +v} + } + } + } + } +}". + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +compact_test_msgs(suite) -> + []; +compact_test_msgs(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + Msgs = msgs1() ++ msgs2() ++ msgs3(), + DynamicDecode = false, + test_msgs(megaco_compact_text_encoder, DynamicDecode, [], Msgs). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +flex_compact_init(Config) -> + flex_init(Config). + + +flex_compact_finish(Config) -> + flex_finish(Config). + + +flex_compact_test_msgs(suite) -> + []; +flex_compact_test_msgs(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + Msgs = msgs1() ++ msgs2() ++ msgs3(), + %% Msgs = msgs1(), + Conf = flex_scanner_conf(Config), + DynamicDecode = true, + test_msgs(megaco_compact_text_encoder, DynamicDecode, [Conf], Msgs). + + +flex_compact_dm_timers1(suite) -> + []; +flex_compact_dm_timers1(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + M = build_dm_timers_message("1", "2", "3"), + B = list_to_binary(M), + Conf = flex_scanner_conf(Config), + case decode_message(megaco_compact_text_encoder, false, [Conf], B) of + {ok, M1} when is_record(M1,'MegacoMessage') -> + t("flex_compact_dm_timers1 -> " + "~n M: ~s" + "~n M1: ~p", [M, M1]), + verify_dm_timers(1,2,3, M1); + Else -> + exit({decode_failed, M, Else}) + end. + + +flex_compact_dm_timers2(suite) -> + []; +flex_compact_dm_timers2(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + M = build_dm_timers_message("02", "03", "04"), + B = list_to_binary(M), + Conf = flex_scanner_conf(Config), + case decode_message(megaco_compact_text_encoder, false, [Conf], B) of + {ok, M1} when is_record(M1,'MegacoMessage') -> + t("flex_compact_dm_timers2 -> " + "~n M: ~s" + "~n M1: ~p", [M, M1]), + verify_dm_timers(2,3,4, M1); + Else -> + exit({decode_failed, M, Else}) + end. + + +flex_compact_dm_timers3(suite) -> + []; +flex_compact_dm_timers3(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + M = build_dm_timers_message("1", "02", "31"), + B = list_to_binary(M), + Conf = flex_scanner_conf(Config), + case decode_message(megaco_compact_text_encoder, false, [Conf], B) of + {ok, M1} when is_record(M1,'MegacoMessage') -> + t("flex_compact_dm_timers3 -> " + "~n M: ~s" + "~n M1: ~p", [M, M1]), + verify_dm_timers(1,2,31, M1); + Else -> + exit({decode_failed, M, Else}) + end. + + +flex_compact_dm_timers4(suite) -> + []; +flex_compact_dm_timers4(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + M = build_dm_timers_message("10", "21", "99"), + B = list_to_binary(M), + Conf = flex_scanner_conf(Config), + case decode_message(megaco_compact_text_encoder, false, [Conf], B) of + {ok, M1} when is_record(M1,'MegacoMessage') -> + t("flex_compact_dm_timers4 -> " + "~n M: ~s" + "~n M1: ~p", [M, M1]), + verify_dm_timers(10,21,99, M1); + Else -> + exit({decode_failed, M, Else}) + end. + + +flex_compact_dm_timers5(suite) -> + []; +flex_compact_dm_timers5(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + M = build_dm_timers_message("99", "23", "11"), + B = list_to_binary(M), + Conf = flex_scanner_conf(Config), + case decode_message(megaco_compact_text_encoder, false, [Conf], B) of + {ok, M1} when is_record(M1,'MegacoMessage') -> + t("flex_compact_dm_timers5 -> " + "~n M: ~s" + "~n M1: ~p", [M, M1]), + verify_dm_timers(99,23,11, M1); + Else -> + exit({decode_failed, M, Else}) + end. + + +flex_compact_dm_timers6(suite) -> + []; +flex_compact_dm_timers6(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + M = build_dm_timers_message("77", "09", "1"), + B = list_to_binary(M), + Conf = flex_scanner_conf(Config), + case decode_message(megaco_compact_text_encoder, false, [Conf], B) of + {ok, M1} when is_record(M1,'MegacoMessage') -> + t("flex_compact_dm_timers6 -> " + "~n M: ~s" + "~n M1: ~p", [M, M1]), + verify_dm_timers(77,9,1, M1); + Else -> + exit({decode_failed, M, Else}) + end. + + +build_dm_timers_message(T, S, L) -> + M = io_lib:format("!/" ?VERSION_STR " [123.123.123.4]:55555\nT=10001{C=-{MF=11111111/00000000/00000000{E=2223{al/on,dd/ce{DM=dialplan00}},SG{cg/rt},DM=dialplan00{T:~s,S:~s,L:~s,(0s| 00s|[1-7]xlxx|8lxxxxxxx|#xxxxxxx|*xx|9l1xxxxxxxxxx|9l011x.s)}}}}", [T, S, L]), + lists:flatten(M). + + +verify_dm_timers(T,S,L, #'MegacoMessage'{mess = Mess}) -> + #'Message'{messageBody = Body} = Mess, + case get_dm_timers(Body) of + {T, S, L} -> + ok; + {T1, S1, L1} -> + exit({invalid_timer_values, {{T, S, L}, {T1, S1, L1}}}); + {error, Reason} -> + exit({invalid_timer, {T, S, L, Reason}}) + end. + +get_dm_timers({transactions, T}) when is_list(T) -> + get_dm_timers1(T); +get_dm_timers(Other) -> + {error, {invalid_transactions, Other}}. + +get_dm_timers1([{transactionRequest,T}|Ts]) when is_record(T,'TransactionRequest') -> + case get_dm_timers2(T) of + {ok, Timers} -> + Timers; + _ -> + get_dm_timers1(Ts) + end; +get_dm_timers1([_|Ts]) -> + get_dm_timers1(Ts); +get_dm_timers1([]) -> + {error, {no_timers, 'TransactionRequest'}}. + + +get_dm_timers2(#'TransactionRequest'{actions = Actions}) when is_list(Actions) -> + get_dm_timers3(Actions). + + +get_dm_timers3([#'ActionRequest'{commandRequests = Cmds}|Ars]) when is_list(Cmds) -> + case get_dm_timers4(Cmds) of + {ok, Timers} -> + {ok, Timers}; + _ -> + get_dm_timers3(Ars) + end; +get_dm_timers3([_|Ars]) -> + get_dm_timers3(Ars); +get_dm_timers3([]) -> + {error, {no_timers, 'ActionRequest'}}. + +get_dm_timers4([#'CommandRequest'{command = Cmd}|Cmds]) -> + case get_dm_timers5(Cmd) of + {ok, Timers} -> + {ok, Timers}; + _ -> + get_dm_timers4(Cmds) + end; +get_dm_timers4([_|Cmds]) -> + get_dm_timers4(Cmds); +get_dm_timers4([]) -> + {error, {no_timers, 'CommandRequest'}}. + + +get_dm_timers5({modReq, #'AmmRequest'{descriptors = Descriptors}}) -> + get_dm_timers6(Descriptors); +get_dm_timers5(R) -> + {error, {no_modReq, R}}. + + +get_dm_timers6([{digitMapDescriptor, #'DigitMapDescriptor'{digitMapValue = Val}}|_]) -> + case Val of + #'DigitMapValue'{startTimer = T, + shortTimer = S, + longTimer = L} -> + {ok, {T, S, L}}; + _ -> + {error, no_value_in_dm} + end; +get_dm_timers6([_|Descs]) -> + get_dm_timers6(Descs); +get_dm_timers6([]) -> + {error, {no_timers, descriptors}}. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +bin_test_msgs(suite) -> + []; +bin_test_msgs(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + Msgs = msgs1(), + DynamicDecode = false, + test_msgs(megaco_binary_encoder, DynamicDecode, [], Msgs). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +ber_test_msgs(suite) -> + []; +ber_test_msgs(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + Msgs = msgs1(), + DynamicDecode = false, + test_msgs(megaco_ber_encoder, DynamicDecode, [], Msgs). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +ber_bin_test_msgs(suite) -> + []; +ber_bin_test_msgs(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + Msgs = msgs1(), + DynamicDecode = true, + test_msgs(megaco_ber_bin_encoder, DynamicDecode, [], Msgs). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +per_test_msgs(suite) -> + []; +per_test_msgs(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + Msgs = msgs1(), + DynamicDecode = false, + test_msgs(megaco_per_encoder, DynamicDecode, [], Msgs). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +per_bin_test_msgs(suite) -> + []; +per_bin_test_msgs(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + Msgs = msgs1(), + DynamicDecode = false, + test_msgs(megaco_per_bin_encoder, DynamicDecode, [], Msgs). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +erl_dist_m_test_msgs(suite) -> + []; +erl_dist_m_test_msgs(Config) when is_list(Config) -> + ?ACQUIRE_NODES(1, Config), + Msgs = msgs1() ++ msgs2() ++ msgs3(), + DynamicDecode = false, + Conf = [megaco_compressed], + test_msgs(megaco_erl_dist_encoder, DynamicDecode, Conf, Msgs). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +%% Ticket test cases: + + +%% -------------------------------------------------------------- +%% Observe that this decode SHALL fail +compact_otp4011_msg1(suite) -> + []; +compact_otp4011_msg1(Config) when is_list(Config) -> +% put(severity,trc), +% put(dbg,true), + d("compact_otp4011_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + M = "!/" ?VERSION_STR + " ML T=233350{C=${A=stedevice/01{M{O{MO=SR,RV=OFF,RG=OFF,tdmc/ec=OFF,MO=SR}}}}}", + ok = compact_otp4011(M). + + +%% -------------------------------------------------------------- +%% Observe that this decode SHALL fail +compact_otp4011_msg2(suite) -> + []; +compact_otp4011_msg2(Config) when is_list(Config) -> + d("compact_otp4011_msg2 -> entry", []), + ?ACQUIRE_NODES(1, Config), + M = "!/" ?VERSION_STR + " ML T=233350{C=${A=stedevice/01{M{O{MO=SO,RV=OFF,RG=OFF,tdmc/ec=OFF,MO=SR}}}}}", +% put(severity,trc), +% put(dbg,true), + ok = compact_otp4011(M). + + +%% -------------------------------------------------------------- +%% Observe that this decode SHALL fail +compact_otp4011_msg3(suite) -> + []; +compact_otp4011_msg3(Config) when is_list(Config) -> + d("compact_otp4011_msg3 -> entry", []), + ?ACQUIRE_NODES(1, Config), + M = "!/" ?VERSION_STR + " ML T=233350{C=${A=stedevice/01{M{O{MO=SR,RV=OFF,RG=OFF,tdmc/ec=OFF,MO=SO}}}}}", + %% put(severity,trc), + %% put(dbg,true), + ok = compact_otp4011(M). + + +compact_otp4011(M) -> + d("compact_otp4011 -> entry with" + "~n M: '~s'", [M]), + Bin = list_to_binary(M), + case decode_message(megaco_compact_text_encoder, false, [], Bin) of + {ok, _} -> + exit({decoded_erroneous_message,M}); + {error, Error} when is_list(Error) -> % Expected result + d("compact_otp4011 -> expected error result (so far)", []), + case lists:keysearch(reason,1,Error) of + {value, {reason,Reason}} -> + d("compact_otp4011 -> expected error: " + "~n Reason: ~p", [Reason]), + case Reason of + {0, megaco_text_parser_v1, + {do_merge_control_streamParms, [A,B]}} + when is_list(A) andalso is_record(B, 'LocalControlDescriptor') -> + case lists:keysearch(mode,1,A) of + {value, {mode, _Mode}} + when B#'LocalControlDescriptor'.streamMode =/= asn1_NOVALUE -> + d("compact_otp4011 -> expected error",[]), + ok; + Other -> + exit({unexpected_mode_reason, {A,B,Other}}) + end; + Other -> + exit({unexpected_reason, Other}) + end; + + false -> + d("compact_otp4011 -> OUPS, wrong kind of error", []), + exit({unexpected_result, Error}) + end; + Else -> + d("compact_otp4011 -> unexpected decode result: ~p", [Else]), + exit({unexpected_decode_result, Else}) + end. + +%% -------------------------------------------------------------- +%% Note that this decode SHALL fail, because of the misspelled +%% MEGCAO instead of the correct MEGACO. +compact_otp4013_msg1(suite) -> + []; +compact_otp4013_msg1(Config) when is_list(Config) -> + %% put(severity,trc), + %% put(dbg,true), + d("compact_otp4013_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + M = "MEGCAO/1 MG1 T=12345678{C=-{SC=root{SV{MT=RS,RE=901}}}}", + Bin = list_to_binary(M), + case decode_message(megaco_compact_text_encoder, false, [], Bin) of + {ok, _} -> + exit({decoded_erroneous_message,M}); + {error, Reason} when is_list(Reason) -> + {value, {reason, no_version_found, _}} = + lists:keysearch(reason, 1, Reason), + {value, {token, [{'SafeChars',_,"megcao/1"}|_]}} = + lists:keysearch(token, 1, Reason), + ok; + Else -> + exit({unexpected_decode_result,Else}) + end. + + + +%% -------------------------------------------------------------- +%% +%% +compact_otp4085_msg1(suite) -> + []; +compact_otp4085_msg1(Config) when is_list(Config) -> + d("compact_otp4085_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + M = compact_otp4085_erroneous_msg(), + Bin = list_to_binary(M), + case decode_message(megaco_compact_text_encoder, false, [], Bin) of + {ok, M} -> + exit({decoded_erroneous_message,M}); + {error, Error} when is_list(Error) -> % Expected result + t("compact_otp4085_msg1 -> decode failed", []), + case lists:keysearch(reason, 1, Error) of + {value, {reason,{999999, Module, Crap}}} -> + t("compact_otp4085_msg1 -> THE ACTUAL ERROR: " + "~n LINE NUMBER: 999999" + "~n Module: ~p" + "~n Crap: ~p", [Module, Crap]), + %% ok; + exit({decode_failed_999999, Module, Crap}); + {value, {reason,{Line, Module, Crap}}} -> + t("compact_otp4085_msg1 -> Expected: " + "~n Line: ~p" + "~n Module: ~p" + "~n Crap: ~p", [Line, Module, Crap]), + ok; + false -> + exit({unexpected_result, Error}) + end; + Else -> + exit({unexpected_decode_result, Else}) + end. + + +%% -------------------------------------------------------------- +%% This test case is just to show that the message used in +%% compact_otp4085_msg1 is actually ok when you add '}' at the end. +compact_otp4085_msg2(suite) -> + []; +compact_otp4085_msg2(Config) when is_list(Config) -> + d("compact_otp4085_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + M1 = compact_otp4085_erroneous_msg() ++ "}", + Bin = list_to_binary(M1), + case decode_message(megaco_compact_text_encoder, false, [], Bin) of + {ok, M2} -> + l("compact_otp4085_msg1 -> successfull decode" + "~n M2: ~p", [M2]), + ok; + Else -> + e("compact_otp4085_msg1 -> decode error" + "~n Else: ~p", [Else]), + exit({unexpected_decode_result,Else}) + end. + + +%% This message lack the ending parentesis (}). +compact_otp4085_erroneous_msg() -> + M = "!/" + ?VERSION_STR + " ML T=11223342{C=${A=${M{O{MO=SR,RV=OFF,RG=OFF},L{v=0," + "c=ATM NSAP $ ," + "a=eecid:$ ," + "m=audio - AAL1/ATMF -," + "}}},A=stee1181/01{M{O{MO=SR,RV=OFF,RG=OFF,tdmc/ec=off}}}}", + M. + +%% -------------------------------------------------------------- +%% +%% +compact_otp4280_msg1(suite) -> + []; +compact_otp4280_msg1(Config) when is_list(Config) -> + d("compact_otp4280_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Bin = list_to_binary(compact_otp4280_msg()), + case decode_message(megaco_compact_text_encoder, false, [], Bin) of + {ok, _Msg} -> + ok; + {error, Error} when is_list(Error) -> + t("compact_otp4280_msg1 -> decode failed", []), + case lists:keysearch(reason, 1, Error) of + {value, {reason,{Line, Module, Reason} = R}} -> + t("compact_otp4280_msg1 -> " + "~n Line: ~w" + "~n Module: ~w" + "~n Reason: ~w", [Line, Module, Reason]), + exit({decode_failed, R}); + false -> + exit({unexpected_result, Error}) + end; + Else -> + exit({unexpected_decode_result, Else}) + end. + +compact_otp4280_msg() -> + M = "!/" + ?VERSION_STR + " mgw1 P=71853646{C=-{AV=root{M{TS{root/maxnumberofcontexts=49500," + "root/maxterminationspercontext=2,root/normalmgexecutiontime=200," + "root/normalmgcexecutiontime=150," + "root/provisionalresponsetimervalue=2000,BF=OFF,SI=IV}}}}}", + M. + + +%% -------------------------------------------------------------- +%% This ticket is about comments in a message +compact_otp4299_msg1(suite) -> + []; +compact_otp4299_msg1(Config) when is_list(Config) -> + d("compact_otp4299_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Bin = list_to_binary(compact_otp4299_msg()), + case decode_message(megaco_compact_text_encoder, false, [], Bin) of + {ok, _Msg} -> + ok; + + {error, Reason} -> + exit({decode_error, Reason}); + + Else -> + exit({unexpected_decode_result, Else}) + end. + + +%% Same message, but this time decoded using the flex scanner +compact_otp4299_msg2(suite) -> + []; +compact_otp4299_msg2(Config) when is_list(Config) -> + d("compact_otp4299_msg2 -> entry", []), + ?ACQUIRE_NODES(1, Config), + + {Pid, Conf} = compact_otp4299_msg2_init(), + + Bin = list_to_binary(compact_otp4299_msg()), + Res = decode_message(megaco_compact_text_encoder, false, [Conf], Bin), + compact_otp4299_msg2_finish(Pid), + + case Res of + {ok, _Msg} -> + ok; + + {error, Reason} -> + exit({decode_error, Reason}); + + Else -> + exit({unexpected_decode_result, Else}) + end. + + +compact_otp4299_msg2_init() -> + Flag = process_flag(trap_exit, true), + Res = (catch start_flex_scanner()), + process_flag(trap_exit, Flag), + case Res of + {error, Reason} -> + skip(Reason); + {ok, FlexConfig} -> + FlexConfig + end. + +compact_otp4299_msg2_finish(Pid) -> + stop_flex_scanner(Pid). + + +compact_otp4299_msg() -> + M = ";KALLE\n" + "!/" ?VERSION_STR " mg58_1 P=005197711{; YET ANOTHER COMMENT\n" + "C=035146207{A=mg58_1_1_4_1_23/19; BEFORE COMMA\n" + ",; AFTER COMMA\n" + "A=eph58_1/0xA4023371{M{L{\n" + "v=0\n" + "c=ATM NSAP 39.0102.0304.0506.0708.090a.0b58.0100.0000.0000.00\n" + "m=audio - AAL1/ATMF -\n" + "a=eecid:A4023371\n" + "}}; HOBBE\n}; KALLE \"HOBBE \n}}" + ";KALLE\n\n", + M. + + +%% -------------------------------------------------------------- +%% +%% +compact_otp4359_msg1(suite) -> + []; +compact_otp4359_msg1(Config) when is_list(Config) -> + d("compact_otp4359_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Bin = list_to_binary(compact_otp4359_msg()), + case decode_message(megaco_compact_text_encoder, false, [], Bin) of + {ok, #'MegacoMessage'{mess = Mess}} -> + {transactions, Trans} = Mess#'Message'.messageBody, + case Trans of + [{transactionRequest,#'TransactionRequest'{transactionId = asn1_NOVALUE}}] -> + ok; + _ -> + exit({unexpected_transactions, Trans}) + end; + Else -> + t("compact_otp4359_msg1 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end. + +compact_otp4359_msg() -> + M = "!/" ?VERSION_STR " ml2 T={C=${A=${M{O {MO=SR,RG=OFF,RV=OFF}}}}}", + M. + + +%% -------------------------------------------------------------- +%% +%% +compact_otp4920_msg0(suite) -> + []; +compact_otp4920_msg0(Config) when is_list(Config) -> + d("compact_otp4920_msg0 -> entry", []), + ?ACQUIRE_NODES(1, Config), +% put(dbg,true), + compact_otp4920_msg_1(compact_otp4920_msg0(), true). + +compact_otp4920_msg1(suite) -> + []; +compact_otp4920_msg1(Config) when is_list(Config) -> + d("compact_otp4920_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), +% put(dbg,true), + compact_otp4920_msg_1(compact_otp4920_msg1(), false). + +compact_otp4920_msg2(suite) -> + []; +compact_otp4920_msg2(Config) when is_list(Config) -> + d("compact_otp4920_msg2 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp4920_msg_1(compact_otp4920_msg2(), false). + +compact_otp4920_msg3(suite) -> + []; +compact_otp4920_msg3(Config) when is_list(Config) -> + d("compact_otp4920_msg3 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp4920_msg_1(compact_otp4920_msg3(), true). + +compact_otp4920_msg4(suite) -> + []; +compact_otp4920_msg4(Config) when is_list(Config) -> + d("compact_otp4920_msg4 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp4920_msg_1(compact_otp4920_msg4(), true). + +compact_otp4920_msg5(suite) -> + []; +compact_otp4920_msg5(Config) when is_list(Config) -> + d("compact_otp4920_msg5 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp4920_msg_1(compact_otp4920_msg5(), true). + +compact_otp4920_msg6(suite) -> + []; +compact_otp4920_msg6(Config) when is_list(Config) -> + d("compact_otp4920_msg6 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp4920_msg_1(compact_otp4920_msg6(), true). + +compact_otp4920_msg7(suite) -> + []; +compact_otp4920_msg7(Config) when is_list(Config) -> + d("compact_otp4920_msg7 -> entry", []), + ?ACQUIRE_NODES(1, Config), +% put(dbg,true), + compact_otp4920_msg_1(compact_otp4920_msg7(), true). + +compact_otp4920_msg8(suite) -> + []; +compact_otp4920_msg8(Config) when is_list(Config) -> + d("compact_otp4920_msg8 -> entry", []), + ?ACQUIRE_NODES(1, Config), +% put(dbg,true), + compact_otp4920_msg_1(compact_otp4920_msg8(), false). + +compact_otp4920_msg9(suite) -> + []; +compact_otp4920_msg9(Config) when is_list(Config) -> + d("compact_otp4920_msg9 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp4920_msg_1(compact_otp4920_msg9(), false). + +compact_otp4920_msg10(suite) -> + []; +compact_otp4920_msg10(Config) when is_list(Config) -> + d("compact_otp4920_msg10 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp4920_msg_1(compact_otp4920_msg10(), false). + +compact_otp4920_msg11(suite) -> + []; +compact_otp4920_msg11(Config) when is_list(Config) -> + d("compact_otp4920_msg11 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp4920_msg_1(compact_otp4920_msg11(), false). + +compact_otp4920_msg12(suite) -> + []; +compact_otp4920_msg12(Config) when is_list(Config) -> + d("compact_otp4920_msg12 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp4920_msg_1(compact_otp4920_msg12(), true). + +%% Duplicate padding +compact_otp4920_msg20(suite) -> + []; +compact_otp4920_msg20(Config) when is_list(Config) -> + d("compact_otp4920_msg20 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp4920_msg_2(compact_otp4920_msg20(), bad_mid_duplicate_padding). + +%% Length +compact_otp4920_msg21(suite) -> + []; +compact_otp4920_msg21(Config) when is_list(Config) -> + d("compact_otp4920_msg21 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp4920_msg_2(compact_otp4920_msg21(), bad_mid_ip6addr_length). + +%% Length +compact_otp4920_msg22(suite) -> + []; +compact_otp4920_msg22(Config) when is_list(Config) -> + d("compact_otp4920_msg22 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp4920_msg_2(compact_otp4920_msg22(), bad_mid_ip6addr_length). + +%% Length +compact_otp4920_msg23(suite) -> + []; +compact_otp4920_msg23(Config) when is_list(Config) -> + d("compact_otp4920_msg23 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp4920_msg_2(compact_otp4920_msg23(), bad_mid_ip6addr_length). + +%% Length +compact_otp4920_msg24(suite) -> + []; +compact_otp4920_msg24(Config) when is_list(Config) -> + d("compact_otp4920_msg24 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp4920_msg_2(compact_otp4920_msg24(), bad_mid_ip6addr_length). + +%% Length +compact_otp4920_msg25(suite) -> + []; +compact_otp4920_msg25(Config) when is_list(Config) -> + d("compact_otp4920_msg25 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp4920_msg_2(compact_otp4920_msg25(), bad_mid_ip6addr_length). + +compact_otp4920_msg_1(M1, CheckEqual) -> + Bin1 = list_to_binary(M1), + case decode_message(megaco_compact_text_encoder, false, [], Bin1) of + {ok, Msg} -> + io:format(" decoded", []), + case encode_message(megaco_compact_text_encoder, [], Msg) of + {ok, Bin1} -> + io:format(", encoded - equal:", []), + ok; + {ok, Bin2} when CheckEqual =:= true -> + M2 = binary_to_list(Bin2), + io:format(", encoded - not equal:", []), + exit({messages_not_equal, M1, M2}); + {ok, _Bin2} -> + io:format(", encoded:", []), + ok; + Else -> + io:format(", encode failed:", []), + exit({unexpected_encode_result, Else}) + end; + Else -> + io:format("decode failed:", []), + exit({unexpected_decode_result, Else}) + end. + +compact_otp4920_msg_2(M1, ExpectedReason) -> + Bin = list_to_binary(M1), + case decode_message(megaco_compact_text_encoder, false, [], Bin) of + {ok, Msg} -> + io:format("unexpected successfull decode", []), + exit({unexpected_encode_ok, Msg}); + {error, [{reason, {__Line, _Mod, Reason}}|_]} -> + case element(1, Reason) of + ExpectedReason -> + ok; + _ -> + exit({unexpected_decode_error_reason, + ExpectedReason, Reason}) + end; + {error, [{reason, {_Mod, Reason}}|_]} -> + case element(1, Reason) of + ExpectedReason -> + ok; + _ -> + exit({unexpected_decode_error_reason, + ExpectedReason, Reason}) + end; + Else -> + io:format("unexpected decode result", []), + exit({unexpected_decode_result, Else}) + + end. + +compact_otp4920_msg0() -> + M = "!/" ?VERSION_STR " [192.168.30.1]\nT=100{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +compact_otp4920_msg1() -> + M = "!/" ?VERSION_STR " [2031:0000:130F:0000:0000:09C0:876A:130B]\nT=101{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +compact_otp4920_msg2() -> + M = "!/" ?VERSION_STR " [2031:0:130F:0:0:9C0:876A:130B]\nT=102{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +compact_otp4920_msg3() -> + M = "!/" ?VERSION_STR " [2031:0:130F::9C0:876A:130B]\nT=103{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +compact_otp4920_msg4() -> + M = "!/" ?VERSION_STR " [::1]\nT=104{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +compact_otp4920_msg5() -> + M = "!/" ?VERSION_STR " [::]\nT=105{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +compact_otp4920_msg6() -> + M = "!/" ?VERSION_STR " [1::]\nT=106{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +compact_otp4920_msg7() -> + M = "!/" ?VERSION_STR " [FEDC:1::]\nT=107{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +compact_otp4920_msg8() -> + M = "!/" ?VERSION_STR " [2031:0:130F:0:0:9C0:135.106.19.11]\nT=108{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +compact_otp4920_msg9() -> + M = "!/" ?VERSION_STR " [2031:0:130F::9C0:135.106.19.11]\nT=109{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +compact_otp4920_msg10() -> + M = "!/" ?VERSION_STR " [::FFFF:192.168.30.1]\nT=110{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +compact_otp4920_msg11() -> + M = "!/" ?VERSION_STR " [::192.168.30.1]\nT=111{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +compact_otp4920_msg12() -> + M = "!/" ?VERSION_STR " [::C0A8:1E01]\nT=112{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +%% Illegal: only one :: allowed +compact_otp4920_msg20() -> + M = "!/" ?VERSION_STR " [2031::130F::9C0]\nT=120{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +%% Illegal: length +compact_otp4920_msg21() -> + M = "!/" ?VERSION_STR " [2031:FFEE:0000:130F:0000:0000:09C0:876A:130B]\nT=121{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +%% Illegal: length +compact_otp4920_msg22() -> + M = "!/" ?VERSION_STR " [2031:FFEE:0:130F:0:0:9C0:135.106.19.11]\nT=122{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +%% Illegal: length +compact_otp4920_msg23() -> + M = "!/" ?VERSION_STR " [2031:FFEE:0000:130F:2132:4354::09C0:876A:130B]\nT=123{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +%% Illegal: length +compact_otp4920_msg24() -> + M = "!/" ?VERSION_STR " [::2031:FFEE:0000:130F:2132:4354:09C0:876A:130B]\nT=124{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + +%% Illegal: length +compact_otp4920_msg25() -> + M = "!/" ?VERSION_STR " [2031:FFEE:0000:130F:2132:4354:09C0:876A:130B::]\nT=125{C=${A=${M{O{MO=SR,RG=OFF,RV=OFF}}}}}", + M. + + +compact_otp5186_msg01(suite) -> + []; +compact_otp5186_msg01(Config) when is_list(Config) -> + d("compact_otp5186_msg01 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp5186_msg_1(compact_otp5186_msg01(), error, ignore). + +compact_otp5186_msg02(suite) -> + []; +compact_otp5186_msg02(Config) when is_list(Config) -> + d("compact_otp5186_msg02 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp5186_msg_1(compact_otp5186_msg02(), ok, ok). + +compact_otp5186_msg03(suite) -> + []; +compact_otp5186_msg03(Config) when is_list(Config) -> + d("compact_otp5186_msg03 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp5186_msg_2(compact_otp5186_msg03(), ok, ok). + +compact_otp5186_msg04(suite) -> + []; +compact_otp5186_msg04(Config) when is_list(Config) -> + d("compact_otp5186_msg04 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp5186_msg_2(compact_otp5186_msg04(), ok, ok). + +compact_otp5186_msg05(suite) -> + []; +compact_otp5186_msg05(Config) when is_list(Config) -> + d("compact_otp5186_msg05 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp5186_msg_2(compact_otp5186_msg05(), ok, ok). + +compact_otp5186_msg06(suite) -> + []; +compact_otp5186_msg06(Config) when is_list(Config) -> + d("compact_otp5186_msg06 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp5186_msg_2(compact_otp5186_msg06(), ok, ok). + +compact_otp5186_msg_1(M1, DecodeExpect, EncodeExpect) -> + Bin1 = list_to_binary(M1), + case decode_message(megaco_compact_text_encoder, false, [], Bin1) of + {ok, Msg} when DecodeExpect =:= ok -> + io:format(" decoded", []), + case encode_message(megaco_compact_text_encoder, [], Msg) of + {ok, Bin1} when EncodeExpect =:= ok -> + io:format(", encoded - equal:", []), + ok; + {ok, Bin2} when EncodeExpect =:= ok -> + M2 = binary_to_list(Bin2), + io:format(", encoded - not equal:", []), + exit({messages_not_equal, Msg, M1, M2}); + {ok, Bin3} when EncodeExpect =:= error -> + M3 = binary_to_list(Bin3), + io:format(", unexpected encode:", []), + exit({unexpected_encode_success, Msg, M1, M3}); + _Else when EncodeExpect =:= error -> + io:format(", encode failed ", []), + ok + end; + {ok, Msg} when DecodeExpect =:= error -> + io:format(" decoded", []), + exit({unexpected_decode_success, Msg}); + _Else when DecodeExpect =:= error -> + io:format(" decode failed ", []), + ok; + Else when DecodeExpect =:= ok -> + io:format(" decode failed ", []), + exit({unexpected_decode_result, Else}) + end. + +compact_otp5186_msg_2(Msg1, EncodeExpect, DecodeExpect) -> + case encode_message(megaco_compact_text_encoder, [], Msg1) of + {ok, Bin} when EncodeExpect =:= ok -> + io:format(" encoded", []), + case decode_message(megaco_compact_text_encoder, false, [], Bin) of + {ok, Msg1} when DecodeExpect =:= ok -> + io:format(", decoded - equal:", []), + ok; + {ok, Msg2} when DecodeExpect =:= ok -> + M = binary_to_list(Bin), + case (catch compact_otp5186_check_megamsg(Msg1, Msg2)) of + ok -> + io:format(", decoded - not equal - ok:", []), + ok; + {'EXIT', Reason} -> + io:format(", decoded - not equal:", []), + exit({messages_not_equal, M, Reason, Msg1, Msg2}) + end; + {ok, Msg3} when DecodeExpect =:= error -> + M = binary_to_list(Bin), + io:format(", decoded:", []), + exit({unexpected_decode_success, M, Msg1, Msg3}); + Else when DecodeExpect =:= ok -> + M = binary_to_list(Bin), + io:format(", decode failed ", []), + exit({unexpected_decode_success, Msg1, M, Else}); + _Else when DecodeExpect =:= error -> + io:format(", decode failed ", []), + ok + end; + {ok, Bin} when EncodeExpect =:= error -> + M = binary_to_list(Bin), + io:format(" encoded", []), + exit({unexpected_encode_success, Msg1, M}); + _Else when EncodeExpect =:= error -> + io:format(" encode failed ", []), + ok; + Else when EncodeExpect =:= ok -> + io:format(" encode failed ", []), + exit({unexpected_encode_result, Else}) + end. + + +%% -- + +compact_otp5186_msg01() -> + "!/1 \nP=67111298{C=2699{AV=mg5_ipeph/0x0f0001{}}}". + +compact_otp5186_msg02() -> + "!/1 \nP=67111298{C=2699{AV=mg5_ipeph/0x0f0001}}". + +compact_otp5186_msg03() -> + {'MegacoMessage', + asn1_NOVALUE, + {'Message', + 1, + {domainName,{'DomainName',"mg5",asn1_NOVALUE}}, + {transactions, + [{transactionReply, + {'TransactionReply',67111298,asn1_NOVALUE, + {actionReplies,[ + {'ActionReply',2699,asn1_NOVALUE,asn1_NOVALUE, + [ + {auditValueReply, + {auditResult, + {'AuditResult', + {megaco_term_id,false,["mg5_ipeph","0x0f0001"]}, + [ + ] + } + } + } + ] + } + ] + } + } + } + ] + } + } + }. + +compact_otp5186_msg04() -> + {'MegacoMessage',asn1_NOVALUE, + {'Message',1,{domainName,{'DomainName',"mg5",asn1_NOVALUE}}, + {transactions, + [{transactionReply, + {'TransactionReply',67111298,asn1_NOVALUE, + {actionReplies,[ + {'ActionReply',2699,asn1_NOVALUE,asn1_NOVALUE, + [ + {auditValueReply, + {auditResult, + {'AuditResult', + {megaco_term_id,false,["mg5_ipeph","0x0f0001"]}, + [ + {emptyDescriptors, + {'AuditDescriptor',asn1_NOVALUE} + } + ] + } + } + } + ] + } + ] + } + } + } + ] + } + } + }. + +compact_otp5186_msg05() -> + {'MegacoMessage', + asn1_NOVALUE, + {'Message', + 1, + {domainName,{'DomainName',"mg5",asn1_NOVALUE}}, + {transactions, + [{transactionReply, + {'TransactionReply',67111298,asn1_NOVALUE, + {actionReplies,[ + {'ActionReply',2699,asn1_NOVALUE,asn1_NOVALUE, + [ + {addReply, + {'AmmsReply', + [ + {megaco_term_id,false,["mg5_ipeph","0x0f0001"]} + ], + [ + ] + } + } + ] + } + ] + } + } + } + ] + } + } + }. + +compact_otp5186_msg06() -> + {'MegacoMessage',asn1_NOVALUE, + {'Message',1,{domainName,{'DomainName',"mg5",asn1_NOVALUE}}, + {transactions, + [{transactionReply, + {'TransactionReply',67111298,asn1_NOVALUE, + {actionReplies,[ + {'ActionReply',2699,asn1_NOVALUE,asn1_NOVALUE, + [ + {addReply, + {'AmmsReply', + [ + {megaco_term_id,false,["mg5_ipeph","0x0f0001"]} + ], + [ + {emptyDescriptors, + {'AuditDescriptor',asn1_NOVALUE} + } + ] + } + } + ] + } + ] + } + } + } + ] + } + } + }. + +%% -- + +compact_otp5186_check_megamsg(M1, M1) -> + ok; +compact_otp5186_check_megamsg(#'MegacoMessage'{authHeader = AH, + mess = M1}, + #'MegacoMessage'{authHeader = AH, + mess = M2}) -> + compact_otp5186_check_mess(M1, M2); +compact_otp5186_check_megamsg(#'MegacoMessage'{authHeader = AH1}, + #'MegacoMessage'{authHeader = AH2}) -> + exit({not_equal, authHeader, AH1, AH2}). + +compact_otp5186_check_mess(M, M) -> + ok; +compact_otp5186_check_mess(#'Message'{version = V, + mId = MId, + messageBody = B1}, + #'Message'{version = V, + mId = MId, + messageBody = B2}) -> + compact_otp5186_check_body(B1, B2); +compact_otp5186_check_mess(#'Message'{version = V, + mId = MId1}, + #'Message'{version = V, + mId = MId2}) -> + exit({not_equal, mId, MId1, MId2}); +compact_otp5186_check_mess(#'Message'{version = V1, + mId = MId}, + #'Message'{version = V2, + mId = MId}) -> + exit({not_equal, version, V1, V2}). + +compact_otp5186_check_body(B, B) -> + ok; +compact_otp5186_check_body({transactions, T1}, {transactions, T2}) -> + compact_otp5186_check_trans(T1, T2); +compact_otp5186_check_body({messageError, E1}, {messageError, E2}) -> + compact_otp5186_check_merr(E1, E2); +compact_otp5186_check_body(B1, B2) -> + exit({not_equal, messageBody, B1, B2}). + +compact_otp5186_check_trans([], []) -> + ok; +compact_otp5186_check_trans([], T2) -> + exit({not_equal, transactions, [], T2}); +compact_otp5186_check_trans(T1, []) -> + exit({not_equal, transactions, T1, []}); +compact_otp5186_check_trans([Tran1|Trans1], [Tran2|Trans2]) -> + compact_otp5186_check_trans(Trans1, Trans2), + compact_otp5186_check_transaction(Tran1, Tran2). + +compact_otp5186_check_merr(ME, ME) -> + ok; +compact_otp5186_check_merr(#'ErrorDescriptor'{errorCode = EC, + errorText = ET1}, + #'ErrorDescriptor'{errorCode = EC, + errorText = ET2}) -> + exit({not_equal, errorText, ET1, ET2}); +compact_otp5186_check_merr(#'ErrorDescriptor'{errorCode = EC1, + errorText = ET}, + #'ErrorDescriptor'{errorCode = EC2, + errorText = ET}) -> + exit({not_equal, errorCode, EC1, EC2}). + +compact_otp5186_check_transaction(T, T) -> + ok; +compact_otp5186_check_transaction({transactionReply, TR1}, + {transactionReply, TR2}) -> + compact_otp5186_check_transRep(TR1, TR2); +compact_otp5186_check_transaction(T1, T2) -> + exit({unexpected_transactions, T1, T2}). + +compact_otp5186_check_transRep(T, T) -> + ok; +compact_otp5186_check_transRep(#'TransactionReply'{transactionId = TId, + immAckRequired = IAR, + transactionResult = TR1}, + #'TransactionReply'{transactionId = TId, + immAckRequired = IAR, + transactionResult = TR2}) -> + compact_otp5186_check_transRes(TR1, TR2); +compact_otp5186_check_transRep(T1, T2) -> + exit({unexpected_transaction_reply, T1, T2}). + +compact_otp5186_check_transRes(TR, TR) -> + ok; +compact_otp5186_check_transRes({actionReplies, AR1}, + {actionReplies, AR2}) -> + compact_otp5186_check_actReps(AR1, AR2); +compact_otp5186_check_transRes(TR1, TR2) -> + exit({unexpected_transaction_result, TR1, TR2}). + +compact_otp5186_check_actReps([], []) -> + ok; +compact_otp5186_check_actReps(AR1, []) -> + exit({not_equal, actionReplies, AR1, []}); +compact_otp5186_check_actReps([], AR2) -> + exit({not_equal, actionReplies, [], AR2}); +compact_otp5186_check_actReps([AR1|ARs1], [AR2|ARs2]) -> + compact_otp5186_check_actRep(AR1, AR2), + compact_otp5186_check_actReps(ARs1, ARs2). + +compact_otp5186_check_actRep(AR, AR) -> + ok; +compact_otp5186_check_actRep(#'ActionReply'{contextId = ID, + errorDescriptor = ED, + contextReply = CtxRep, + commandReply = CmdRep1}, + #'ActionReply'{contextId = ID, + errorDescriptor = ED, + contextReply = CtxRep, + commandReply = CmdRep2}) -> + compact_otp5186_check_cmdReps(CmdRep1, CmdRep2); +compact_otp5186_check_actRep(AR1, AR2) -> + exit({unexpected_actionReply, AR1, AR2}). + +compact_otp5186_check_cmdReps([], []) -> + ok; +compact_otp5186_check_cmdReps(CR1, []) -> + exit({not_equal, commandReplies, CR1, []}); +compact_otp5186_check_cmdReps([], CR2) -> + exit({not_equal, commandReplies, [], CR2}); +compact_otp5186_check_cmdReps([CR1|CRs1], [CR2|CRs2]) -> + compact_otp5186_check_cmdRep(CR1, CR2), + compact_otp5186_check_cmdReps(CRs1, CRs2). + +compact_otp5186_check_cmdRep(CR, CR) -> + ok; +compact_otp5186_check_cmdRep({auditValueReply, AVR1}, + {auditValueReply, AVR2}) -> + compact_otp5186_check_auditReply(AVR1, AVR2); +compact_otp5186_check_cmdRep({addReply, AVR1}, + {addReply, AVR2}) -> + compact_otp5186_check_ammsReply(AVR1, AVR2); +compact_otp5186_check_cmdRep(CR1, CR2) -> + exit({unexpected_commandReply, CR1, CR2}). + +compact_otp5186_check_auditReply(AR, AR) -> + ok; +compact_otp5186_check_auditReply({auditResult, AR1}, + {auditResult, AR2}) -> + compact_otp5186_check_auditRes(AR1, AR2); +compact_otp5186_check_auditReply(AR1, AR2) -> + exit({unexpected_auditReply, AR1, AR2}). + +compact_otp5186_check_ammsReply(AR, AR) -> + ok; +compact_otp5186_check_ammsReply(#'AmmsReply'{terminationID = ID, + terminationAudit = TA1}, + #'AmmsReply'{terminationID = ID, + terminationAudit = TA2}) -> + %% This is just to simplify the test + F = fun(asn1_NOVALUE) -> []; + (E) -> E + end, + compact_otp5186_check_termAudit(F(TA1), F(TA2)); +compact_otp5186_check_ammsReply(AR1, AR2) -> + exit({unexpected_ammsReply, AR1, AR2}). + +compact_otp5186_check_auditRes(AR, AR) -> + ok; +compact_otp5186_check_auditRes(#'AuditResult'{terminationID = ID, + terminationAuditResult = TAR1}, + #'AuditResult'{terminationID = ID, + terminationAuditResult = TAR2}) -> + compact_otp5186_check_termAuditRes(TAR1, TAR2); +compact_otp5186_check_auditRes(AR1, AR2) -> + exit({unexpected_auditResult, AR1, AR2}). + +compact_otp5186_check_termAuditRes([], []) -> + ok; +%% An empty empty descriptor is removed +compact_otp5186_check_termAuditRes([{emptyDescriptors, + #'AuditDescriptor'{auditToken = asn1_NOVALUE}}|TAR1], []) -> + compact_otp5186_check_termAuditRes(TAR1, []); +compact_otp5186_check_termAuditRes(TAR1, []) -> + exit({not_equal, termAuditRes, TAR1, []}); +%% An empty empty descriptor is removed +compact_otp5186_check_termAuditRes([], [{emptyDescriptors, + #'AuditDescriptor'{auditToken = asn1_NOVALUE}}|TAR2]) -> + compact_otp5186_check_termAuditRes([], TAR2); +compact_otp5186_check_termAuditRes([], TAR2) -> + exit({not_equal, termAuditRes, [], TAR2}); +compact_otp5186_check_termAuditRes([ARP1|TAR1], [ARP2|TAR2]) -> + compact_otp5186_check_auditRetParm(ARP1, ARP2), + compact_otp5186_check_termAuditRes(TAR1, TAR2). + +compact_otp5186_check_termAudit([], []) -> + ok; +%% An empty empty descriptor is removed +compact_otp5186_check_termAudit([{emptyDescriptors, + #'AuditDescriptor'{auditToken = asn1_NOVALUE}}|TAR1], []) -> + compact_otp5186_check_termAudit(TAR1, []); +compact_otp5186_check_termAudit(TAR1, []) -> + exit({not_equal, termAudit, TAR1, []}); +%% An empty empty descriptor is removed +compact_otp5186_check_termAudit([], + [{emptyDescriptors, + #'AuditDescriptor'{auditToken = asn1_NOVALUE}}|TAR2]) -> + compact_otp5186_check_termAudit([], TAR2); +compact_otp5186_check_termAudit([], TAR2) -> + exit({not_equal, termAudit, [], TAR2}); +compact_otp5186_check_termAudit([ARP1|TAR1], [ARP2|TAR2]) -> + compact_otp5186_check_auditRetParm(ARP1, ARP2), + compact_otp5186_check_termAudit(TAR1, TAR2). + +compact_otp5186_check_auditRetParm(ARP, ARP) -> + ok; +compact_otp5186_check_auditRetParm({emptyDescriptors, AD1}, + {emptyDescriptors, AD2}) -> + compact_otp5186_check_auditDesc(AD1, AD2); +compact_otp5186_check_auditRetParm(ARP1, ARP2) -> + exit({unexpected_auditRetParm, ARP1, ARP2}). + +compact_otp5186_check_auditDesc(AD, AD) -> + ok; +compact_otp5186_check_auditDesc(#'AuditDescriptor'{auditToken = L1}, + #'AuditDescriptor'{auditToken = L2}) -> + compact_otp5186_check_auditDesc_auditItems(L1, L2); +compact_otp5186_check_auditDesc(AD1, AD2) -> + exit({unexpected_auditDesc, AD1, AD2}). + +compact_otp5186_check_auditDesc_auditItems([], []) -> + ok; +compact_otp5186_check_auditDesc_auditItems(AI1, []) -> + exit({not_equal, auditItems, AI1, []}); +compact_otp5186_check_auditDesc_auditItems([], AI2) -> + exit({not_equal, auditItems, [], AI2}); +compact_otp5186_check_auditDesc_auditItems([AI1|AIs1], [AI2|AIs2]) -> + compact_otp5186_check_auditDesc_auditItem(AI1, AI2), + compact_otp5186_check_auditDesc_auditItems(AIs1, AIs2). + +compact_otp5186_check_auditDesc_auditItem(AI, AI) -> + ok; +compact_otp5186_check_auditDesc_auditItem(AI1, AI2) -> + exit({not_equal, auditItem, AI1, AI2}). + +compact_otp5793_msg01(suite) -> + []; +compact_otp5793_msg01(Config) when is_list(Config) -> + d("compact_otp5793_msg01 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp5793(ok, pretty_otp5793_msg1()). + +compact_otp5793(Expected, Msg) -> + expect_codec(Expected, megaco_compact_text_encoder, Msg, []). + + +%% -------------------------------------------------------------- + +compact_otp5993_msg01(suite) -> + []; +compact_otp5993_msg01(Config) when is_list(Config) -> + d("compact_otp5993_msg01 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp5993_msg_1(compact_otp5993_msg01(), ok, ok). + +compact_otp5993_msg02(suite) -> + []; +compact_otp5993_msg02(Config) when is_list(Config) -> + d("compact_otp5993_msg02 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp5993_msg_1(compact_otp5993_msg02(), ok, ok). + +compact_otp5993_msg03(suite) -> + []; +compact_otp5993_msg03(Config) when is_list(Config) -> + d("compact_otp5993_msg03 -> entry", []), + ?ACQUIRE_NODES(1, Config), + compact_otp5993_msg_1(compact_otp5993_msg03(), ok, ok). + +compact_otp5993_msg_1(Msg1, EncodeExpect, DecodeExpect) -> + case encode_message(megaco_compact_text_encoder, [], Msg1) of + {ok, Bin} when EncodeExpect =:= ok -> + io:format(" encoded", []), + %% io:format(" encoded:~n~s~n", [binary_to_list(Bin)]), + case decode_message(megaco_compact_text_encoder, false, [], Bin) of + {ok, Msg1} when DecodeExpect =:= ok -> + io:format(", decoded - equal:", []), + ok; + {ok, Msg3} when DecodeExpect =:= error -> + M = binary_to_list(Bin), + io:format(", decoded:", []), + exit({unexpected_decode_success, M, Msg1, Msg3}); + Else when DecodeExpect =:= ok -> + M = binary_to_list(Bin), + io:format(", decode failed ", []), + exit({unexpected_decode_failure, Msg1, M, Else}); + _Else when DecodeExpect =:= error -> + io:format(", decode failed ", []), + ok + end; + {ok, Bin} when EncodeExpect =:= error -> + M = binary_to_list(Bin), + io:format(" encoded", []), + exit({unexpected_encode_success, Msg1, M}); + _Else when EncodeExpect =:= error -> + io:format(" encode failed ", []), + ok; + Else when EncodeExpect =:= ok -> + io:format(" encode failed ", []), + exit({unexpected_encode_result, Else}) + end. + +compact_otp5993_msg01() -> + MT = h221, + T = #megaco_term_id{id = ?A4444}, + TL = [T], + MD = #'MuxDescriptor'{muxType = MT, + termList = TL}, + compact_otp5993_msg(MD). + +compact_otp5993_msg02() -> + MT = h223, + T1 = #megaco_term_id{id = ?A4445}, + T2 = #megaco_term_id{id = ?A5556}, + TL = [T1, T2], + MD = #'MuxDescriptor'{muxType = MT, + termList = TL}, + compact_otp5993_msg(MD). + +compact_otp5993_msg(MD) when is_record(MD, 'MuxDescriptor') -> + AmmDesc = {muxDescriptor, MD}, + AmmReq = #'AmmRequest'{terminationID = [hd(MD#'MuxDescriptor'.termList)], + descriptors = [AmmDesc]}, + Cmd = {addReq, AmmReq}, + CmdReq = #'CommandRequest'{command = Cmd}, + ActReq = #'ActionRequest'{contextId = 5993, + commandRequests = [CmdReq]}, + TransReq = #'TransactionRequest'{transactionId = 3995, + actions = [ActReq]}, + Trans = {transactionRequest, TransReq}, + Body = {transactions, [Trans]}, + Msg = #'Message'{version = ?VERSION, + mId = ?MG1_MID, + messageBody = Body}, + #'MegacoMessage'{mess = Msg}. + +compact_otp5993_msg03() -> + T1 = #megaco_term_id{id = ?A4445}, + T2 = #megaco_term_id{id = ?A5556}, + TIDs = [T1, T2], + AudRep = {contextAuditResult, TIDs}, + CmdRep = {auditValueReply, AudRep}, + ActRep = #'ActionReply'{contextId = 5993, + commandReply = [CmdRep]}, + TransRes = {actionReplies, [ActRep]}, + TransRep = #'TransactionReply'{transactionId = 3995, + transactionResult = TransRes}, + Trans = {transactionReply, TransRep}, + Body = {transactions, [Trans]}, + Msg = #'Message'{version = ?VERSION, + mId = ?MG1_MID, + messageBody = Body}, + #'MegacoMessage'{mess = Msg}. + + +%% -------------------------------------------------------------- + +compact_otp6017_msg01(suite) -> + []; +compact_otp6017_msg01(Config) when is_list(Config) -> + d("compact_otp6017_msg01 -> entry", []), + ?ACQUIRE_NODES(1, Config), + ok = compact_otp6017(0), + ok. + +compact_otp6017_msg02(suite) -> + []; +compact_otp6017_msg02(Config) when is_list(Config) -> + d("compact_otp6017_msg02 -> entry", []), + ?ACQUIRE_NODES(1, Config), + ok = compact_otp6017(16#FFFFFFFE), + ok. + +compact_otp6017_msg03(suite) -> + []; +compact_otp6017_msg03(Config) when is_list(Config) -> + d("compact_otp6017_msg03 -> entry", []), + ?ACQUIRE_NODES(1, Config), + ok = compact_otp6017(16#FFFFFFFF), + ok. + +compact_otp6017(BadCID) -> + M = compact_otp6017_msg(BadCID), + Bin = list_to_binary(M), + case decode_message(megaco_compact_text_encoder, false, [], Bin) of + {ok, Msg} -> + exit({unexpected_decode_success, {Msg, M}}); + {error, Reason} when is_list(Reason) -> % Expected result + case lists:keysearch(reason, 1, Reason) of + {value, {reason, {_Line, _Mod, {bad_ContextID, BadCID}}}} -> + io:format(" ~w", [BadCID]), + ok; + {value, {reason, ActualReason}} -> + exit({unexpected_reason, ActualReason}); + false -> + exit({reason_not_found, Reason}) + end; + Crap -> + exit({unexpected_decode_result, Crap}) + end. + + +compact_otp6017_msg(CID) when is_integer(CID) -> + "MEGACO/" ?VERSION_STR " MG1 T=12345678{C=" ++ + integer_to_list(CID) ++ + "{SC=root{SV{MT=RS,RE=901}}}}". + + +%% ============================================================== +%% +%% F l e x C o m p a c t T e s t c a s e s +%% + +flex_compact_otp7431_msg01a(suite) -> + []; +flex_compact_otp7431_msg01a(Config) when is_list(Config) -> + %% put(severity,trc), + %% put(dbg,true), + d("flex_comppact_otp7431_msg01a -> entry", []), + Conf = flex_scanner_conf(Config), + flex_compact_otp7431(ok, flex_compact_otp7431_msg1a(), [Conf]). + +flex_compact_otp7431_msg01b(suite) -> + []; +flex_compact_otp7431_msg01b(Config) when is_list(Config) -> + %% put(severity,trc), + %% put(dbg,true), + d("flex_comppact_otp7431_msg01b -> entry", []), + Conf = flex_scanner_conf(Config), + flex_compact_otp7431(ok, flex_compact_otp7431_msg1b(), [Conf]). + +flex_compact_otp7431_msg02(suite) -> + []; +flex_compact_otp7431_msg02(Config) when is_list(Config) -> + %% put(severity,trc), + %% put(dbg,true), + d("flex_comppact_otp7431_msg02 -> entry", []), + Conf = flex_scanner_conf(Config), + flex_compact_otp7431(error, flex_compact_otp7431_msg2(), [Conf]). + +flex_compact_otp7431_msg03(suite) -> + []; +flex_compact_otp7431_msg03(Config) when is_list(Config) -> + %% put(severity,trc), + %% put(dbg,true), + d("flex_comppact_otp7431_msg03 -> entry", []), + Conf = flex_scanner_conf(Config), + flex_compact_otp7431(error, flex_compact_otp7431_msg3(), [Conf]). + +flex_compact_otp7431_msg04(suite) -> + []; +flex_compact_otp7431_msg04(Config) when is_list(Config) -> + %% put(severity,trc), + %% put(dbg,true), + d("flex_comppact_otp7431_msg04 -> entry", []), + Conf = flex_scanner_conf(Config), + flex_compact_otp7431(error, flex_compact_otp7431_msg4(), [Conf]). + +flex_compact_otp7431_msg05(suite) -> + []; +flex_compact_otp7431_msg05(Config) when is_list(Config) -> + %% put(severity,trc), + %% put(dbg,true), + d("flex_comppact_otp7431_msg05 -> entry", []), + Conf = flex_scanner_conf(Config), + flex_compact_otp7431(error, flex_compact_otp7431_msg5(), [Conf]). + +flex_compact_otp7431_msg06(suite) -> + []; +flex_compact_otp7431_msg06(Config) when is_list(Config) -> + %% put(severity,trc), + %% put(dbg,true), + d("flex_comppact_otp7431_msg06 -> entry", []), + Conf = flex_scanner_conf(Config), + flex_compact_otp7431(error, flex_compact_otp7431_msg6(), [Conf]). + +flex_compact_otp7431_msg07(suite) -> + []; +flex_compact_otp7431_msg07(Config) when is_list(Config) -> + %% put(severity,trc), + %% put(dbg,true), + d("flex_comppact_otp7431_msg07 -> entry", []), + Conf = flex_scanner_conf(Config), + flex_compact_otp7431(error, flex_compact_otp7431_msg7(), [Conf]). + + +flex_compact_otp7431(Expected, Msg, Conf) -> + otp7431(Expected, megaco_compact_text_encoder, Msg, Conf). + +flex_compact_otp7431_msg1a() -> + "!/1 [124.124.124.222]:55555 +P=10003{C=2000{A=a4444,A=a4445{M{ST=1{L{ +v=0 +o=- 2890844526 2890842807 IN IP4 124.124.124.222 +s=- +t= 0 0 +c=IN IP4 124.124.124.222 +m=audio 2222 RTP/AVP 4 +a=ptime:30 +a=recvonly +}}}}}}". + +flex_compact_otp7431_msg1b() -> + "!/1 [124.124.124.222]:55555 +P=10003{C=2000{A=a4444,A=a4445{M{ST=1{L{ +v=0 +o=- 2890844526 2890842807 IN IP4 124.124.124.222 +s=- +t= 0 0 +c=IN IP4 124.124.124.222 +m=audio 2222 RTP/AVP 4 +a=ptime:30 +a=recvonly + + + +}}}}}}". + +flex_compact_otp7431_msg2() -> + "!/1 [124.124.124.222]:55555 +P=10003{C=2000{A=a4444,A=a4445{M{ST=1{L{ +v=0 +o=- 2890844526 2890842807 IN IP4 124.124.124.222 +s=- +t= 0 0 +c=IN IP4 124.124.124.222 +m=audio 2222 RTP/AVP 4 +a=ptime:30 +a= } +}}}}}". + + +flex_compact_otp7431_msg3() -> + "!/1 [124.124.124.222]:55555 +P=10003{C=2000{A=a4444,A=a4445{M{ST=1{L{ +v=0 +o=- 2890844526 2890842807 IN IP4 124.124.124.222 +s=- +t= 0 0 +c=IN IP4 124.124.124.222 +m=audio 2222 RTP/AVP 4 +a=ptime:30 +a } +}}}}}". + + +flex_compact_otp7431_msg4() -> + "!/1 [124.124.124.222]:55555 +P=10003{C=2000{A=a4444,A=a4445{M{ST=1{L{ +v=0 +o=- 2890844526 2890842807 IN IP4 124.124.124.222 +s=- +t= 0 0 +c=IN IP4 124.124.124.222 +m=audio 2222 RTP/AVP 4 +a=ptime:30 +a} +}}}}}". + + +flex_compact_otp7431_msg5() -> + "!/1 [124.124.124.222]:55555 +P=10003{C=2000{A=a4444,A=a4445{M{ST=1{L{ +v= } +}}}}}". + + +flex_compact_otp7431_msg6() -> + "!/1 [124.124.124.222]:55555 +P=10003{C=2000{A=a4444,A=a4445{M{ST=1{L{ +v } +}}}}}". + +flex_compact_otp7431_msg7() -> + "!/1 [124.124.124.222]:55555 +P=10003{C=2000{A=a4444,A=a4445{M{ST=1{L{ +v} +}}}}}". + + +%% ============================================================== +%% +%% P r e t t y T e s t c a s e s +%% + +pretty_otp4632_msg1(suite) -> + []; +pretty_otp4632_msg1(Config) when is_list(Config) -> + d("pretty_otp4632_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp4632_msg1(), + case encode_message(megaco_pretty_text_encoder, [], Msg0) of + {ok, BinMsg} when is_binary(BinMsg) -> + {ok, Msg1} = decode_message(megaco_pretty_text_encoder, false, + [], BinMsg), + ok = chk_MegacoMessage(Msg0,Msg1); + Else -> + t("pretty_otp4632_msg1 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end. + +pretty_otp4632_msg1() -> + msg4(?MG1_MID_NO_PORT, "901 mg col boot"). + +pretty_otp4632_msg2(suite) -> + []; +pretty_otp4632_msg2(Config) when is_list(Config) -> + d("pretty_otp4632_msg2 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp4632_msg2(), + case encode_message(megaco_pretty_text_encoder, [], Msg0) of + {ok, BinMsg} when is_binary(BinMsg) -> + {ok, Msg1} = decode_message(megaco_pretty_text_encoder, false, + [], BinMsg), + ok = chk_MegacoMessage(Msg0,Msg1); + Else -> + t("pretty_otp4632_msg2 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end. + +pretty_otp4632_msg2() -> + msg4(?MG1_MID_NO_PORT, "901"). + + +pretty_otp4632_msg3(suite) -> + []; +pretty_otp4632_msg3(Config) when is_list(Config) -> + d("pretty_otp4632_msg3 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp4632_msg3(), + Bin0 = list_to_binary(Msg0), + case decode_message(megaco_pretty_text_encoder, + false, [], Bin0) of + {ok, Msg} when is_record(Msg, 'MegacoMessage') -> + {ok, Bin1} = encode_message(megaco_pretty_text_encoder, [], Msg), + Msg1 = binary_to_list(Bin1), + %% io:format("Msg1:~n~s~n", [Msg1]), + Msg0 = Msg1, + ok; + Else -> + t("pretty_otp4632_msg3 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end. + +pretty_otp4632_msg3() -> + M = "MEGACO/" ?VERSION_STR " [124.124.124.222]\nTransaction = 9998 {\n\tContext = - {\n\t\tServiceChange = root {\n\t\t\tServices {\n\t\t\t\tMethod = Restart,\n\t\t\t\tServiceChangeAddress = 55555,\n\t\t\t\tProfile = resgw/1,\n\t\t\t\tReason = \"901\"\n\t\t\t}\n\t\t}\n\t}\n}", + M. + + +pretty_otp4632_msg4(suite) -> + []; +pretty_otp4632_msg4(Config) when is_list(Config) -> + d("pretty_otp4632_msg4 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp4632_msg4(), + Bin0 = list_to_binary(Msg0), + case decode_message(megaco_pretty_text_encoder, false, [], Bin0) of + {ok, Msg} when is_record(Msg, 'MegacoMessage') -> + {ok, Bin1} = encode_message(megaco_pretty_text_encoder, [], Msg), + Msg1 = binary_to_list(Bin1), + %% io:format("Msg1:~n~s~n", [Msg1]), + pretty_otp4632_msg4_chk(Msg0,Msg1); + Else -> + t("pretty_otp4632_msg4 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end. + + +pretty_otp4632_msg4() -> + M = "MEGACO/" ?VERSION_STR " [124.124.124.222]\nTransaction = 9998 {\n\tContext = - {\n\t\tServiceChange = root {\n\t\t\tServices {\n\t\t\t\tMethod = Restart,\n\t\t\t\tServiceChangeAddress = 55555,\n\t\t\t\tProfile = resgw/1,\n\t\t\t\tReason = 901\n\t\t\t}\n\t\t}\n\t}\n}", + M. + + +pretty_otp4632_msg4_chk([], []) -> + exit(messages_not_eq); +pretty_otp4632_msg4_chk([], Rest1) -> + exit({messages_not_eq1, Rest1}); +pretty_otp4632_msg4_chk(Rest0, []) -> + exit({messages_not_eq0, Rest0}); +pretty_otp4632_msg4_chk([$R,$e,$a,$s,$o,$n,$ ,$=,$ ,$9,$0,$1|_Rest0], + [$R,$e,$a,$s,$o,$n,$ ,$=,$ ,$",$9,$0,$1,$"|_Rest1]) -> + ok; +pretty_otp4632_msg4_chk([_|Rest0], [_|Rest1]) -> + pretty_otp4632_msg4_chk(Rest0,Rest1). + + +pretty_otp4710_msg1(suite) -> + []; +pretty_otp4710_msg1(Config) when is_list(Config) -> + d("pretty_otp4710_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp4710_msg1(), + case encode_message(megaco_pretty_text_encoder, [], Msg0) of + {ok, Bin} when is_binary(Bin) -> + {ok, Msg1} = decode_message(megaco_pretty_text_encoder, false, + [], Bin), + ok = chk_MegacoMessage(Msg0,Msg1); + Else -> + t("pretty_otp4710_msg1 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end. + +pretty_otp4710_msg1() -> + msg40(). + + +pretty_otp4710_msg2(suite) -> + []; +pretty_otp4710_msg2(Config) when is_list(Config) -> + d("pretty_otp4710_msg2 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp4710_msg2(), + Bin0 = list_to_binary(Msg0), + case decode_message(megaco_pretty_text_encoder, false, [], Bin0) of + {ok, Msg} when is_record(Msg, 'MegacoMessage') -> + {ok, Bin1} = encode_message(megaco_pretty_text_encoder, [], Msg), + Msg1 = binary_to_list(Bin1), + %% io:format("Msg1:~n~s~n", [Msg1]), + pretty_otp4710_msg2_chk(Msg0,Msg1); + Else -> + t("pretty_otp4710_msg2 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end. + +pretty_otp4710_msg2() -> + "Authentication = 0xEFCDAB89:0x12345678:0x1234567889ABCDEF76543210\nMEGACO/" ?VERSION_STR " [124.124.124.222]\nTransaction = 9998 {\n\tContext = - {\n\t\tServiceChange = root {\n\t\t\tServices {\n\t\t\t\tMethod = Restart,\n\t\t\t\tServiceChangeAddress = 55555,\n\t\t\t\tProfile = resgw/1,\n\t\t\t\tReason = \"901 mg col boot\"\n\t\t\t}\n\t\t}\n\t}\n}". + +pretty_otp4710_msg2_chk(Msg,Msg) -> + ok; +pretty_otp4710_msg2_chk( + [$A,$u,$t,$h,$e,$n,$t,$i,$c,$a,$t,$i,$o,$n,$=,$ |Msg0], + [$A,$u,$t,$h,$e,$n,$t,$i,$c,$a,$t,$i,$o,$n,$=,$ |Msg1]) -> + {AH0, Rest0} = pretty_otp4710_msg2_chk_ah(Msg0, []), + {AH1, Rest1} = pretty_otp4710_msg2_chk_ah(Msg1, []), + case AH0 == AH1 of + true -> + exit({message_not_equal, Rest0, Rest1}); + false -> + exit({auth_header_not_equal, AH0, AH1}) + end. + +pretty_otp4710_msg2_chk_ah([], _Acc) -> + exit(no_auth_header_found); +pretty_otp4710_msg2_chk_ah([$M,$E,$G,$A,$C,$O,$/,_|Rest], Acc) -> + {lists:reverse(Acc), Rest}; +pretty_otp4710_msg2_chk_ah([C|R], Acc) -> + pretty_otp4710_msg2_chk_ah(R, [C|Acc]). + + +pretty_otp4945_msg1(suite) -> + []; +pretty_otp4945_msg1(Config) when is_list(Config) -> + d("pretty_otp4945_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp4945_msg1(), + Bin0 = list_to_binary(Msg0), + case decode_message(megaco_pretty_text_encoder, false, [], Bin0) of + {error, [{reason, Reason}|_]} -> + case Reason of + {missing_required_serviceChangeParm, [serviceChangeReason]} -> + ok; + Else -> + t("pretty_otp4945_msg1 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end; + Else -> + io:format("pretty_otp4945_msg1 -> " + "~n Else: ~w" + "~n", [Else]), + exit({unexpected_decode_result, Else}) + end. + +pretty_otp4945_msg1() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222] Transaction = 9998 { + Context = - { + ServiceChange = ROOT { + Services { + Method = Restart, + ServiceChangeAddress = 55555, + Profile = ResGW/1 + } + } + } +}". + + +pretty_otp4945_msg2(suite) -> + []; +pretty_otp4945_msg2(Config) when is_list(Config) -> + d("pretty_otp4945_msg2 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp4945_msg2(), + Bin0 = list_to_binary(Msg0), + case decode_message(megaco_pretty_text_encoder, false, [], Bin0) of + {error, [{reason, Reason}|_]} -> + case Reason of + {missing_required_serviceChangeParm, [serviceChangeMethod]} -> + ok; + Else -> + t("pretty_otp4945_msg2 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end; + Else -> + t("pretty_otp4945_msg2 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end. + +pretty_otp4945_msg2() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222] Transaction = 9998 { + Context = - { + ServiceChange = ROOT { + Services { + Reason = 901, + ServiceChangeAddress = 55555, + Profile = ResGW/1 + } + } + } +}". + + +pretty_otp4945_msg3(suite) -> + []; +pretty_otp4945_msg3(Config) when is_list(Config) -> + d("pretty_otp4945_msg3 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp4945_msg3(), + Bin0 = list_to_binary(Msg0), + case decode_message(megaco_pretty_text_encoder, false, [], Bin0) of + {error, [{reason, Reason}|_]} -> + case Reason of + {missing_required_serviceChangeParm, [serviceChangeReason, serviceChangeMethod]} -> + ok; + {missing_required_serviceChangeParm, [serviceChangeMethod, serviceChangeReason]} -> + ok; + Else -> + t("pretty_otp4945_msg3 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end; + Else -> + t("pretty_otp4945_msg3 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end. + +pretty_otp4945_msg3() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222] Transaction = 9998 { + Context = - { + ServiceChange = ROOT { + Services { + ServiceChangeAddress = 55555, + Profile = ResGW/1 + } + } + } +}". + + +pretty_otp4945_msg4(suite) -> + []; +pretty_otp4945_msg4(Config) when is_list(Config) -> + d("pretty_otp4945_msg4 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp4945_msg4(), + Bin0 = list_to_binary(Msg0), + case decode_message(megaco_pretty_text_encoder, false, [], Bin0) of + {ok, _} -> + ok; + Else -> + t("pretty_otp4945_msg4 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end. + +pretty_otp4945_msg4() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222] Transaction = 9998 { + Context = - { + ServiceChange = ROOT { + Services { + Method = Restart, + Reason = 901, + ServiceChangeAddress = 55555, + Profile = ResGW/1 + } + } + } +}". + + +pretty_otp4945_msg5(suite) -> + []; +pretty_otp4945_msg5(Config) when is_list(Config) -> + d("pretty_otp4945_msg5 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp4945_msg5(), + Bin0 = list_to_binary(Msg0), + case decode_message(megaco_pretty_text_encoder, false, [], Bin0) of + {error, [{reason, Reason}|_]} -> + case Reason of + {at_most_once_serviceChangeParm, {profile, _Val1, _Val2}} -> + ok; + Else -> + io:format("pretty_otp4945_msg6 -> " + "~n Else: ~w" + "~n", [Else]), + exit({unexpected_decode_result, Else}) + end; + Else -> + t("pretty_otp4945_msg5 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end. + +pretty_otp4945_msg5() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222] Transaction = 9998 { + Context = - { + ServiceChange = ROOT { + Services { + Method = Restart, + Reason = 901, + Profile = ResGW/1, + ServiceChangeAddress = 55555, + Profile = ResGW/2 + } + } + } +}". + + +pretty_otp4945_msg6(suite) -> + []; +pretty_otp4945_msg6(Config) when is_list(Config) -> + d("pretty_otp4945_msg6 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp4945_msg6(), + Bin0 = list_to_binary(Msg0), + case decode_message(megaco_pretty_text_encoder, false, [], Bin0) of + {error, [{reason, Reason}|_]} -> + case Reason of + {not_both_address_mgcid_serviceChangeParm, _Val1, _Val2} -> + ok; + Else -> + io:format("pretty_otp4945_msg6 -> " + "~n Else: ~w" + "~n", [Else]), + exit({unexpected_decode_result, Else}) + end; + Else -> + t("pretty_otp4945_msg6 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end. + +pretty_otp4945_msg6() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222] Transaction = 9998 { + Context = - { + ServiceChange = ROOT { + Services { + Method = Restart, + Reason = 901, + ServiceChangeAddress = 55555, + MgcIdToTry = kalle, + Profile = ResGW/1 + } + } + } +}". + + +pretty_otp4949_msg1(suite) -> + []; +pretty_otp4949_msg1(Config) when is_list(Config) -> + d("pretty_otp4949_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp4949_msg1(), + Bin0 = list_to_binary(Msg0), + case decode_message(megaco_pretty_text_encoder, false, [], Bin0) of + {ok, _} -> + ok; + Else -> + t("pretty_otp4949_msg1 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end. + +pretty_otp4949_msg1() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222] Reply = 9998 { + Context = - { + ServiceChange = ROOT { + Services { + ServiceChangeAddress = 55555, + Profile = ResGW/1 + } + } + } +}". + + +pretty_otp4949_msg2(suite) -> + []; +pretty_otp4949_msg2(Config) when is_list(Config) -> + d("pretty_otp4949_msg2 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp4949_msg2(), + Bin0 = list_to_binary(Msg0), + case decode_message(megaco_pretty_text_encoder, false, [], Bin0) of + {error, [{reason, Reason}|_]} -> + case Reason of + {at_most_once_servChgReplyParm, {profile, _Val1, _Val2}} -> + ok; + Else -> + io:format("pretty_otp4949_msg2 -> " + "~n Else: ~w" + "~n", [Else]), + exit({unexpected_decode_result, Else}) + end; + Else -> + t("pretty_otp4949_msg2 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end. + +pretty_otp4949_msg2() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222] Reply = 9998 { + Context = - { + ServiceChange = ROOT { + Services { + Profile = ResGW/1, + ServiceChangeAddress = 55555, + Profile = ResGW/2 + } + } + } +}". + + +pretty_otp4949_msg3(suite) -> + []; +pretty_otp4949_msg3(Config) when is_list(Config) -> + d("pretty_otp4949_msg3 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp4949_msg3(), + Bin0 = list_to_binary(Msg0), + case decode_message(megaco_pretty_text_encoder, false, [], Bin0) of + {error, [{reason, Reason}|_]} -> + case Reason of + {not_both_address_mgcid_servChgReplyParm, _Val1, _Val2} -> + ok; + Else -> + io:format("pretty_otp4949_msg3 -> " + "~n Else: ~w" + "~n", [Else]), + exit({unexpected_decode_result, Else}) + end; + Else -> + t("pretty_otp4949_msg3 -> " + "~n Else: ~w", [Else]), + exit({unexpected_decode_result, Else}) + end. + +pretty_otp4949_msg3() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222] Reply = 9998 { + Context = - { + ServiceChange = ROOT { + Services { + ServiceChangeAddress = 55555, + MgcIdToTry = kalle, + Profile = ResGW/1 + } + } + } +}". + + +pretty_otp5042_msg1(suite) -> + []; +pretty_otp5042_msg1(Config) when is_list(Config) -> + d("pretty_otp5042_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg0 = pretty_otp5042_msg1(), + Bin0 = list_to_binary(Msg0), + case decode_message(megaco_pretty_text_encoder, false, [], Bin0) of + {error, [{reason, Reason}|_]} -> + case Reason of + {_, _Mod, {not_an_integer, PropertyParm}} -> + exit({not_an_integer, PropertyParm}); + _ -> + io:format("pretty_otp5042_msg1 -> " + "~n Reason: ~w" + "~n", [Reason]), + exit({unexpected_decode_result, Reason}) + end; + {ok, M} -> + t("pretty_otp5042_msg1 -> successfull decode:" + "~n~p", [M]), + ok + end. + +pretty_otp5042_msg1() -> +"MEGACO/" ?VERSION_STR " :2944 +Transaction = 102 { +Context = 5 { Notify = MUX/1 { ObservedEvents = 1 { +h245bh/h245msgin { Stream = 1 +, h245enc = +0270020600088175000653401004100403E802E00180018001780680000034301160000700088175010101007A0100020001800001320000C0000219D005027F0070500100040100021080000319D005027F00504001008000041C001250000700088175010000400280010003000880000518AA027F400006850130008011020100000001030002000300040005000006 + } } + } } }". + + +pretty_otp5068_msg1(suite) -> + []; +pretty_otp5068_msg1(Config) when is_list(Config) -> + d("pretty_otp5068_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + Msg = pretty_otp5068_msg1(), + case encode_message(megaco_pretty_text_encoder, [], Msg) of + {error, Reason} -> +% io:format("pretty_otp5068_msg1 -> " +% "~n Reason: ~w" +% "~n", [Reason]), + exit({unexpected_encode_result, Reason}); + {ok, Bin} -> +% io:format("pretty_otp5068_msg1 -> successfull encode:" +% "~n~s~n", [binary_to_list(Bin)]), + case decode_message(megaco_pretty_text_encoder, false, [], Bin) of + {ok, _} -> +% io:format("pretty_otp5068_msg1 -> ok~n", []), + ok; + Else -> + %% io:format("~npretty_otp5068_msg1 -> ~n~p~n", [Else]), + exit({unexpected_decode_result, Else}) + end + end. + +pretty_otp5068_msg1() -> +{'MegacoMessage', + asn1_NOVALUE, + {'Message', + 2, + {deviceName,[109,103,51,51]}, + {transactions, + [{transactionReply, + {'TransactionReply', + 190, + asn1_NOVALUE, + {actionReplies, + [{'ActionReply', %% Comments: Detta upprepas många gånger + 0, + asn1_NOVALUE, + asn1_NOVALUE, + [{auditValueReply, + {auditResult, + {'AuditResult', + {megaco_term_id,false, + [[99,101,100,101,118,49,47,52,47,49,47,49],[51,49]]}, + [{mediaDescriptor, + {'MediaDescriptor', + {'TerminationStateDescriptor', + [], + asn1_NOVALUE, + inSvc}, + asn1_NOVALUE}}]}}}]}]}}}]}}}. + + +pretty_otp5085_msg1(suite) -> + []; +pretty_otp5085_msg1(Config) when is_list(Config) -> + d("pretty_otp5085_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + pretty_otp5085(ok, pretty_otp5085_msg1()). + +pretty_otp5085_msg2(suite) -> + []; +pretty_otp5085_msg2(Config) when is_list(Config) -> + d("pretty_otp5085_msg2 -> entry", []), + ?ACQUIRE_NODES(1, Config), + pretty_otp5085(error, pretty_otp5085_msg2()). + +pretty_otp5085_msg3(suite) -> + []; +pretty_otp5085_msg3(Config) when is_list(Config) -> + d("pretty_otp5085_msg3 -> entry", []), + ?ACQUIRE_NODES(1, Config), + pretty_otp5085(ok, pretty_otp5085_msg3()). + +pretty_otp5085_msg4(suite) -> + []; +pretty_otp5085_msg4(Config) when is_list(Config) -> + d("pretty_otp5085_msg4 -> entry", []), + ?ACQUIRE_NODES(1, Config), + pretty_otp5085(ok, pretty_otp5085_msg4()). + +pretty_otp5085_msg5(suite) -> + []; +pretty_otp5085_msg5(Config) when is_list(Config) -> + d("pretty_otp5085_msg5 -> entry", []), + ?ACQUIRE_NODES(1, Config), + pretty_otp5085(ok, pretty_otp5085_msg5()). + +pretty_otp5085_msg6(suite) -> + []; +pretty_otp5085_msg6(Config) when is_list(Config) -> + d("pretty_otp5085_msg6 -> entry", []), + ?ACQUIRE_NODES(1, Config), + pretty_otp5085(ok, pretty_otp5085_msg6()). + +pretty_otp5085_msg7(suite) -> + []; +pretty_otp5085_msg7(Config) when is_list(Config) -> + d("pretty_otp5085_msg7 -> entry", []), + ?ACQUIRE_NODES(1, Config), + pretty_otp5085(ok, pretty_otp5085_msg7()). + +pretty_otp5085(Expected, Msg) -> + pretty_otp5085(Expected, Msg, []). + +pretty_otp5085(Expected, Msg, Conf) -> + t("pretty_otp5085 -> entry with" + "~n Expected: ~p" + "~n Msg: ~p", [Expected, Msg]), + case (catch encode_message(megaco_pretty_text_encoder, Conf, Msg)) of + {error, Reason} when Expected =:= error -> + d("pretty_otp5085 -> encode failed as expected" + "~n Reason: ~w", [Reason]), + ok; + {error, Reason} -> + e("pretty_otp5085 -> encode failed unexpectedly: " + "~n Reason: ~w", [Reason]), + exit({unexpected_encode_result, Reason}); + {ok, Bin} when Expected =:= error -> + e("pretty_otp5085 -> encode succeded unexpectedly: " + "~n ~w", [binary_to_list(Bin)]), + exit({unexpected_encode_result, binary_to_list(Bin)}); + {ok, Bin} -> + d("pretty_otp5085 -> successfull encode as expected:" + "~n~s", [binary_to_list(Bin)]), + case decode_message(megaco_pretty_text_encoder, false, Conf, Bin) of + {ok, Msg} -> + d("pretty_otp5085 -> successfull decode~n", []), + ok; + {ok, Msg2} -> + e("pretty_otp5085 -> successfull decode" + " - but not equal", []), + exit({unexpected_decode_result, Msg, Msg2}); + Else -> + e("pretty_otp5085 -> decode failed:~n~p", [Else]), + exit({unexpected_decode_result, Else}) + end + end. + +pretty_otp5085_msg1() -> + {'MegacoMessage', + asn1_NOVALUE, + {'Message', + ?VERSION, + {deviceName,"mg36"}, + {transactions, + [{transactionReply, + {'TransactionReply', + 230, + asn1_NOVALUE, + {actionReplies, + [{'ActionReply', + 400, + {'ErrorDescriptor',504,asn1_NOVALUE}, + asn1_NOVALUE, + [] + } + ] + } + } + } + ] + } + } + }. + +pretty_otp5085_msg2() -> + {'MegacoMessage', + asn1_NOVALUE, + {'Message', + ?VERSION, + {deviceName,"mg36"}, + {transactions, + [{transactionReply, + {'TransactionReply', + 230, + asn1_NOVALUE, + {actionReplies, + [{'ActionReply', + 400, + asn1_NOVALUE, + asn1_NOVALUE, + [] + } + ] + } + } + } + ] + } + } + }. + +pretty_otp5085_msg3() -> + {'MegacoMessage', + asn1_NOVALUE, + {'Message', + ?VERSION, + {deviceName,"mg36"}, + {transactions, + [{transactionReply, + {'TransactionReply', + 230, + asn1_NOVALUE, + {actionReplies, + [{'ActionReply', + 400, + asn1_NOVALUE, + #'ContextRequest'{priority = 3}, + [] + } + ] + } + } + } + ] + } + } + }. + +pretty_otp5085_msg4() -> + {'MegacoMessage', + asn1_NOVALUE, + {'Message', + ?VERSION, + {deviceName,"mg36"}, + {transactions, + [{transactionReply, + {'TransactionReply', + 230, + asn1_NOVALUE, + {actionReplies, + [{'ActionReply', + 400, + asn1_NOVALUE, + asn1_NOVALUE, + [{addReply, cre_ammsReply([#megaco_term_id{id = ?A4444}])}, + {notifyReply, cre_notifyReply([#megaco_term_id{id = ?A5555}])}] + } + ] + } + } + } + ] + } + } + }. + +pretty_otp5085_msg5() -> + {'MegacoMessage', + asn1_NOVALUE, + {'Message', + ?VERSION, + {deviceName,"mg36"}, + {transactions, + [{transactionReply, + {'TransactionReply', + 230, + asn1_NOVALUE, + {actionReplies, + [{'ActionReply', + 400, + asn1_NOVALUE, + #'ContextRequest'{priority = 5}, + [{addReply, cre_ammsReply([#megaco_term_id{id = ?A4444}])}, + {notifyReply, cre_notifyReply([#megaco_term_id{id = ?A5555}])}] + } + ] + } + } + } + ] + } + } + }. + +pretty_otp5085_msg6() -> + {'MegacoMessage', + asn1_NOVALUE, + {'Message', + ?VERSION, + {deviceName,"msg36"}, + {transactions, + [{transactionReply, + {'TransactionReply', + 230, + asn1_NOVALUE, + {actionReplies, + [{'ActionReply', + 400, + {'ErrorDescriptor',504,asn1_NOVALUE}, + #'ContextRequest'{priority = 6}, + [{addReply, cre_ammsReply([#megaco_term_id{id = ?A4444}])}, + {notifyReply, cre_notifyReply([#megaco_term_id{id = ?A5555}])}] + } + ] + } + } + } + ] + } + } + }. + +pretty_otp5085_msg7() -> + {'MegacoMessage', + asn1_NOVALUE, + {'Message', + ?VERSION, + {deviceName,"msg36"}, + {transactions, + [{transactionReply, + {'TransactionReply', + 230, + asn1_NOVALUE, + {actionReplies, + [{'ActionReply', + 400, + {'ErrorDescriptor',504,asn1_NOVALUE}, + #'ContextRequest'{priority = 7}, + [{notifyReply, cre_notifyReply([#megaco_term_id{id = ?A5555}])}] + } + ] + } + } + } + ] + } + } + }. + + +pretty_otp5600_msg1(suite) -> + []; +pretty_otp5600_msg1(Config) when is_list(Config) -> + d("pretty_otp5600_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + %% put(severity,trc), + %% put(dbg,true), + pretty_otp5600(ok, pretty_otp5600_msg1()). + +pretty_otp5600_msg2(suite) -> + []; +pretty_otp5600_msg2(Config) when is_list(Config) -> + d("pretty_otp5600_msg2 -> entry", []), + ?ACQUIRE_NODES(1, Config), +%% put(severity,trc), +%% put(dbg,true), + pretty_otp5600(ok, pretty_otp5600_msg2()). + +pretty_otp5600(Expected, Msg) -> + pretty_otp5600(Expected, Msg, []). + +pretty_otp5600(Expected, Msg, Conf) -> + t("pretty_otp5600 -> entry with" + "~n Expected: ~p" + "~n Msg: ~p", [Expected, Msg]), + case (catch encode_message(megaco_pretty_text_encoder, Conf, Msg)) of + {error, Reason} when Expected =:= error -> + d("pretty_otp5600 -> encode failed as expected" + "~n Reason: ~w", [Reason]), + ok; + {error, Reason} -> + e("pretty_otp5600 -> encode failed unexpectedly: " + "~n Reason: ~w", [Reason]), + exit({unexpected_encode_result, Reason}); + {ok, Bin} when Expected =:= error -> + e("pretty_otp5600 -> encode succeded unexpectedly: " + "~n ~w", [binary_to_list(Bin)]), + exit({unexpected_encode_result, binary_to_list(Bin)}); + {ok, Bin} -> + d("pretty_otp5600 -> successfull encode as expected:" + "~n~s", [binary_to_list(Bin)]), + case decode_message(megaco_pretty_text_encoder, false, Conf, Bin) of + {ok, Msg} -> + d("pretty_otp5600 -> successfull decode~n", []), + ok; + {ok, Msg2} -> + e("pretty_otp5600 -> successfull decode" + " - but not equal", []), + exit({unexpected_decode_result, Msg, Msg2}); + Else -> + e("pretty_otp5600 -> decode failed:~n~p", [Else]), + exit({unexpected_decode_result, Else}) + end + end. + +pretty_otp5600_msg1() -> + SRE = #'SecondRequestedEvent'{ pkgdName = "al/on", + evParList = [] }, + + SED = #'SecondEventsDescriptor'{ requestID = 2, + eventList = [ SRE ] }, + + SIG = { signal, #'Signal'{ signalName = "cg/dt", + sigParList = [] } }, + + RA = #'RequestedActions'{ secondEvent = SED, + signalsDescriptor = [ SIG ] }, + + RE = #'RequestedEvent'{ pkgdName = "al/of", + eventAction = RA, + evParList = [] }, + + EV = #'EventsDescriptor'{ requestID = 1, eventList = [ RE ] }, + + TermID = {megaco_term_id, true, [[$*]] }, + + AMMR = #'AmmRequest'{ terminationID = [ TermID ], + descriptors = [ { eventsDescriptor, EV } ] }, + + CR = #'CommandRequest'{command = {modReq, AMMR}}, + + AR = #'ActionRequest'{contextId = ?megaco_null_context_id, + commandRequests = [CR]}, + ARs = [AR], + TR = #'TransactionRequest'{transactionId = 5600, actions = ARs}, + TRs = [{transactionRequest, TR}], + Mess = #'Message'{version = ?VERSION, + mId = ?MGC_MID, + messageBody = {transactions, TRs}}, + #'MegacoMessage'{mess = Mess}. + +pretty_otp5600_msg2() -> + SIG = { signal, #'Signal'{ signalName = "cg/dt", + sigParList = [] } }, + + SRA = #'SecondRequestedActions'{ signalsDescriptor = [ SIG ] }, + + SRE = #'SecondRequestedEvent'{ pkgdName = "al/on", + eventAction = SRA, + evParList = [] }, + + SED = #'SecondEventsDescriptor'{ requestID = 2, + eventList = [ SRE ] }, + + RA = #'RequestedActions'{ secondEvent = SED }, + + RE = #'RequestedEvent'{ pkgdName = "al/of", + eventAction = RA, + evParList = [] }, + + EV = #'EventsDescriptor'{ requestID = 1, eventList = [ RE ] }, + + TermID = {megaco_term_id, true, [[$*]] }, + + AMMR = #'AmmRequest'{ terminationID = [ TermID ], + descriptors = [ { eventsDescriptor, EV } ] }, + + CR = #'CommandRequest'{command = {modReq, AMMR}}, + + AR = #'ActionRequest'{contextId = ?megaco_null_context_id, + commandRequests = [CR]}, + ARs = [AR], + TR = #'TransactionRequest'{transactionId = 5600, actions = ARs}, + TRs = [{transactionRequest, TR}], + Mess = #'Message'{version = ?VERSION, + mId = ?MGC_MID, + messageBody = {transactions, TRs}}, + #'MegacoMessage'{mess = Mess}. + + +pretty_otp5601_msg1(suite) -> + []; +pretty_otp5601_msg1(Config) when is_list(Config) -> + d("pretty_otp5601_msg1 -> entry", []), + ?ACQUIRE_NODES(1, Config), + %% put(severity,trc), + %% put(dbg,true), + pretty_otp5601(ok, pretty_otp5601_msg1()). + +pretty_otp5601(Expected, Msg) -> + pretty_otp5601(Expected, Msg, []). + +pretty_otp5601(Expected, Msg, Conf) -> + t("pretty_otp5601 -> entry with" + "~n Expected: ~p" + "~n Msg: ~p", [Expected, Msg]), + case (catch encode_message(megaco_pretty_text_encoder, Conf, Msg)) of + {error, Reason} when Expected =:= error -> + d("pretty_otp5601 -> encode failed as expected" + "~n Reason: ~w", [Reason]), + ok; + {error, Reason} -> + e("pretty_otp5601 -> encode failed unexpectedly: " + "~n Reason: ~w", [Reason]), + exit({unexpected_encode_result, Reason}); + {ok, Bin} when Expected =:= error -> + e("pretty_otp5601 -> encode succeded unexpectedly: " + "~n ~w", [binary_to_list(Bin)]), + exit({unexpected_encode_result, binary_to_list(Bin)}); + {ok, Bin} -> + d("pretty_otp5601 -> successfull encode as expected:" + "~n~s", [binary_to_list(Bin)]), + case decode_message(megaco_pretty_text_encoder, false, Conf, Bin) of + {ok, Msg} -> + d("pretty_otp5601 -> successfull decode~n", []), + ok; + {ok, Msg2} -> + e("pretty_otp5601 -> successfull decode" + " - but not equal", []), + exit({unexpected_decode_result, Msg, Msg2}); + Else -> + e("pretty_otp5601 -> decode failed:~n~p", [Else]), + exit({unexpected_decode_result, Else}) + end + end. + +pretty_otp5601_msg1() -> + SRE1 = #'SecondRequestedEvent'{ pkgdName = "al/on", + evParList = [] }, + + SRA = #'SecondRequestedActions'{ eventDM = { digitMapName, "dialllan0" }}, + + SRE2 = #'SecondRequestedEvent'{ pkgdName = "dd/ce", + eventAction = SRA, + evParList = [] }, + + SED = #'SecondEventsDescriptor'{ requestID = 2, + eventList = [ SRE1, SRE2 ] }, + + RA = #'RequestedActions'{ secondEvent = SED }, + + RE = #'RequestedEvent'{ pkgdName = "al/of", + eventAction = RA, + evParList = [] }, + + EV = #'EventsDescriptor'{ requestID = 1, eventList = [ RE ] }, + + TermID = {megaco_term_id, true, [[$*]] }, + + AMMR = #'AmmRequest'{ terminationID = [ TermID ], + descriptors = [ { eventsDescriptor, EV } ] }, + + CR = #'CommandRequest'{command = {modReq, AMMR}}, + + AR = #'ActionRequest'{contextId = ?megaco_null_context_id, + commandRequests = [CR]}, + ARs = [AR], + TR = #'TransactionRequest'{transactionId = 5600, actions = ARs}, + TRs = [{transactionRequest, TR}], + Mess = #'Message'{version = ?VERSION, + mId = ?MGC_MID, + messageBody = {transactions, TRs}}, + #'MegacoMessage'{mess = Mess}. + +pretty_otp5793_msg01(suite) -> + []; +pretty_otp5793_msg01(Config) when is_list(Config) -> + d("pretty_otp5793_msg01 -> entry", []), + ?ACQUIRE_NODES(1, Config), +% put(severity,trc), +% put(dbg,true), + pretty_otp5793(ok, pretty_otp5793_msg1()). + +pretty_otp5793(Expected, Msg) -> + expect_codec(Expected, megaco_pretty_text_encoder, Msg, []). + +pretty_otp5793(Expected, Msg, Conf) -> + expect_codec(Expected, megaco_pretty_text_encoder, Msg, Conf). + + +pretty_otp5793_msg1() -> + {'MegacoMessage',asn1_NOVALUE, + {'Message',2, + {deviceName,"bs_sbg_4/99"}, + {transactions, + [{transactionReply, + {'TransactionReply', + 370, + asn1_NOVALUE, + {actionReplies, + [{'ActionReply', + 3, + asn1_NOVALUE, + asn1_NOVALUE, + [{auditValueReply, + {contextAuditResult, + [{megaco_term_id, + false, + ["ip", + "104", + "1", + "18"]}]}}, + {auditValueReply, + {contextAuditResult, + [{megaco_term_id, + false, + ["ip", + "104", + "2", + "19"]}]}}]}]}}}]}}}. + + +pretty_otp5882_msg01(suite) -> + []; +pretty_otp5882_msg01(Config) when is_list(Config) -> + d("pretty_otp5882_msg01 -> entry", []), + ?ACQUIRE_NODES(1, Config), + %% put(severity,trc), + %% put(dbg,true), + pretty_otp5882(). + +pretty_otp5882() -> + otp5882(megaco_pretty_text_encoder, []). + +otp5882(Codec, Conf) -> + Msg = pretty_otp5882_msg01(), + case (catch encode_message(Codec, Conf, Msg)) of + {error, {message_encode_failed, {error, {ActualReason, _}}, _}} -> + case ActualReason of + {invalid_LocalControlDescriptor, empty} -> + ok; + _ -> + exit({unexpected_error_actual_reason, ActualReason}) + end; + {error, Reason} -> + exit({unexpected_error_reason, Reason}); + {ok, Bin} -> + exit({unexpected_encode_sucess, binary_to_list(Bin)}) + end. + +pretty_otp5882_msg01() -> + LCD = #'LocalControlDescriptor'{}, % Create illegal LCD + Parms = cre_streamParms(LCD), + StreamDesc = cre_streamDesc(1, Parms), + MediaDesc = cre_mediaDesc(StreamDesc), + AmmReq = cre_ammReq([#megaco_term_id{id = ?A4445}], + [{mediaDescriptor, MediaDesc}]), + CmdReq = cre_commandReq({modReq, AmmReq}), + ActReq = #'ActionRequest'{contextId = 5882, + commandRequests = [CmdReq]}, + Actions = [ActReq], + TransReq = #'TransactionRequest'{transactionId = 5882, + actions = Actions}, + Trans = {transactionRequest, TransReq}, + Body = {transactions, [Trans]}, + Mid = ?MG1_MID, + megaco_message(?VERSION, Mid, Body). + + +%% -------------------------------------------------------------- +%% +pretty_otp6490_msg01(suite) -> + []; +pretty_otp6490_msg01(Config) when is_list(Config) -> + %% put(severity, trc), + %% put(dbg, true), + d("pretty_otp6490_msg01 -> entry", []), + %% ?ACQUIRE_NODES(1, Config), + ok = pretty_otp6490( pretty_otp6490_msg01(), [] ), + %% erase(dbg), + %% erase(severity), + ok. + +pretty_otp6490_msg02(suite) -> + []; +pretty_otp6490_msg02(Config) when is_list(Config) -> + %% put(severity, trc), + %% put(dbg, true), + d("pretty_otp6490_msg02 -> entry", []), + %% ?ACQUIRE_NODES(1, Config), + ok = pretty_otp6490( pretty_otp6490_msg02(), [] ), + %% erase(severity), + %% erase(dbg), + ok. + +pretty_otp6490_msg03(suite) -> + []; +pretty_otp6490_msg03(Config) when is_list(Config) -> + %% put(severity, trc), + %% put(dbg, true), + d("pretty_otp6490_msg03 -> entry", []), + %% ?ACQUIRE_NODES(1, Config), + ok = pretty_otp6490( pretty_otp6490_msg03(), [] ), + %% erase(severity), + %% erase(dbg), + ok. + +pretty_otp6490_msg04(suite) -> + []; +pretty_otp6490_msg04(Config) when is_list(Config) -> + %% put(severity, trc), + %% put(dbg, true), + d("pretty_otp6490_msg04 -> entry", []), + %% ?ACQUIRE_NODES(1, Config), + ok = pretty_otp6490( pretty_otp6490_msg04(), [] ), + %% erase(severity), + %% erase(dbg), + ok. + +pretty_otp6490_msg05(suite) -> + []; +pretty_otp6490_msg05(Config) when is_list(Config) -> + %% put(severity, trc), + %% put(dbg, true), + d("pretty_otp6490_msg05 -> entry", []), + %% ?ACQUIRE_NODES(1, Config), + ok = pretty_otp6490( pretty_otp6490_msg05(), [] ), + %% erase(severity), + %% erase(dbg), + ok. + +pretty_otp6490_msg06(suite) -> + []; +pretty_otp6490_msg06(Config) when is_list(Config) -> + %% put(severity, trc), + %% put(dbg, true), + d("pretty_otp6490_msg06 -> entry", []), + %% ?ACQUIRE_NODES(1, Config), + ok = pretty_otp6490( pretty_otp6490_msg06(), [] ), + %% erase(severity), + %% erase(dbg), + ok. + +pretty_otp6490(Msg, Conf) -> + pretty_otp6490(Msg, Conf, ok). + +pretty_otp6490(Msg, Conf, ExpectedEncode) -> + pretty_otp6490(Msg, Conf, ExpectedEncode, ok). + +pretty_otp6490(Msg, Conf, ExpectedEncode, ExpectedDecode) -> + otp6490(Msg, megaco_pretty_text_encoder, Conf, + ExpectedEncode, ExpectedDecode). + +otp6490(Msg, Codec, Conf, ExpectedEncode, ExpectedDecode) -> + case (catch encode_message(Codec, Conf, Msg)) of + {error, _Reason} when ExpectedEncode =:= error -> + ok; + {error, Reason} when ExpectedEncode =:= ok -> + exit({unexpected_encode_failure, Reason}); + {ok, Bin} when ExpectedEncode =:= error -> + exit({unexpected_encode_success, Msg, binary_to_list(Bin)}); + {ok, Bin} when ExpectedEncode =:= ok -> + case decode_message(Codec, false, Conf, Bin) of + {ok, Msg} when ExpectedDecode == ok -> + ok; + {ok, Msg} when ExpectedDecode =:= error -> + exit({unexpected_decode_success, Msg}); + {ok, Msg2} when ExpectedDecode =:= ok -> + exit({unexpected_decode_result, Msg, Msg2}); + {ok, Msg2} when ExpectedDecode =:= error -> + exit({unexpected_decode_success, Msg, Msg2}); + {error, _Reason} when ExpectedDecode =:= error -> + ok; + {error, Reason} when ExpectedDecode =:= ok -> + exit({unexpected_decode_failure, Msg, Reason}) + end + end. + + +pretty_otp6490_msg(EBD) -> + AmmDesc = ?MSG_LIB:cre_AmmDescriptor(EBD), + AmmReq = cre_ammReq([#megaco_term_id{id = ?A4445}], [AmmDesc]), + CmdReq = cre_commandReq({modReq, AmmReq}), + CID = cre_CtxID(64901), + ActReq = cre_ActReq(CID, [CmdReq]), + Actions = [ActReq], + TransId = cre_TransId(64902), + TransReq = cre_TransReq(TransId, Actions), + Trans = cre_Trans(TransReq), + Mid = ?MG1_MID, + Mess = cre_Msg(Mid, [Trans]), + cre_MegacoMessage(Mess). + +pretty_otp6490_msg01() -> + EvSpecs = [], % This will result in an error + EBD = EvSpecs, % This is because the lib checks that the size is valid + pretty_otp6490_msg(EBD). + +pretty_otp6490_msg02() -> + EvPar = ?MSG_LIB:cre_EventParameter("sune", ["mangs"]), + PkgdName = ?MSG_LIB:cre_PkgdName("foo", "a"), + EvName = ?MSG_LIB:cre_EventName(PkgdName), + EvSpec = ?MSG_LIB:cre_EventSpec(EvName, [EvPar]), + EvSpecs = [EvSpec], + EBD = ?MSG_LIB:cre_EventBufferDescriptor(EvSpecs), + pretty_otp6490_msg(EBD). + +pretty_otp6490_msg03() -> + EvPar1 = ?MSG_LIB:cre_EventParameter("sune", ["mangs"]), + EvPar2 = ?MSG_LIB:cre_EventParameter("kalle", ["anka"]), + EvPar3 = ?MSG_LIB:cre_EventParameter("flippa", ["ur"]), + PkgdName = ?MSG_LIB:cre_PkgdName("foo", "a"), + EvName = ?MSG_LIB:cre_EventName(PkgdName), + EvSpec = ?MSG_LIB:cre_EventSpec(EvName, [EvPar1,EvPar2,EvPar3]), + EvSpecs = [EvSpec], + EBD = ?MSG_LIB:cre_EventBufferDescriptor(EvSpecs), + pretty_otp6490_msg(EBD). + +pretty_otp6490_msg04() -> + EvPar1 = ?MSG_LIB:cre_EventParameter("sune", ["mangs"]), + EvPar2 = ?MSG_LIB:cre_EventParameter("kalle", ["anka"]), + EvPar3 = ?MSG_LIB:cre_EventParameter("flippa", ["ur"]), + PkgdName1 = ?MSG_LIB:cre_PkgdName("foo", "a"), + EvName1 = ?MSG_LIB:cre_EventName(PkgdName1), + EvSpec1 = ?MSG_LIB:cre_EventSpec(EvName1, [EvPar1,EvPar2,EvPar3]), + EvPar4 = ?MSG_LIB:cre_EventParameter("hej", ["hopp"]), + PkgdName2 = ?MSG_LIB:cre_PkgdName("bar", "b"), + EvName2 = ?MSG_LIB:cre_EventName(PkgdName2), + EvSpec2 = ?MSG_LIB:cre_EventSpec(EvName2, [EvPar4]), + EvSpecs = [EvSpec1,EvSpec2], + EBD = ?MSG_LIB:cre_EventBufferDescriptor(EvSpecs), + pretty_otp6490_msg(EBD). + +pretty_otp6490_msg05() -> + EvPar = ?MSG_LIB:cre_EventParameter("sune", ["mangs"]), + PkgdName = ?MSG_LIB:cre_PkgdName("foo", root), + EvName = ?MSG_LIB:cre_EventName(PkgdName), + EvSpec = ?MSG_LIB:cre_EventSpec(EvName, [EvPar]), + EvSpecs = [EvSpec], + EBD = ?MSG_LIB:cre_EventBufferDescriptor(EvSpecs), + pretty_otp6490_msg(EBD). + +pretty_otp6490_msg06() -> + EvPar = ?MSG_LIB:cre_EventParameter("sune", ["mangs"]), + PkgdName = ?MSG_LIB:cre_PkgdName(root, root), + EvName = ?MSG_LIB:cre_EventName(PkgdName), + EvSpec = ?MSG_LIB:cre_EventSpec(EvName, [EvPar]), + EvSpecs = [EvSpec], + EBD = ?MSG_LIB:cre_EventBufferDescriptor(EvSpecs), + pretty_otp6490_msg(EBD). + + +%% -------------------------------------------------------------- +%% + +pretty_otp7671_msg01(suite) -> + []; +pretty_otp7671_msg01(Config) when is_list(Config) -> +%% put(severity, trc), +%% put(dbg, true), + d("pretty_otp7671_msg01 -> entry", []), + %% ?ACQUIRE_NODES(1, Config), + ok = pretty_otp7671( pretty_otp7671_msg01(), [] ), +%% erase(dbg), +%% erase(severity), + ok. + +pretty_otp7671_msg02(suite) -> + []; +pretty_otp7671_msg02(Config) when is_list(Config) -> +%% put(severity, trc), +%% put(dbg, true), + d("pretty_otp7671_msg02 -> entry", []), + %% ?ACQUIRE_NODES(1, Config), + ok = pretty_otp7671( pretty_otp7671_msg02(), [] ), +%% erase(dbg), +%% erase(severity), + ok. + +pretty_otp7671_msg03(suite) -> + []; +pretty_otp7671_msg03(Config) when is_list(Config) -> +%% put(severity, trc), +%% put(dbg, true), + d("pretty_otp7671_msg03 -> entry", []), + %% ?ACQUIRE_NODES(1, Config), + ok = pretty_otp7671( pretty_otp7671_msg03(), [] ), +%% erase(dbg), +%% erase(severity), + ok. + +pretty_otp7671_msg04(suite) -> + []; +pretty_otp7671_msg04(Config) when is_list(Config) -> +%% put(severity, trc), +%% put(dbg, true), + d("pretty_otp7671_msg04 -> entry", []), + %% ?ACQUIRE_NODES(1, Config), + ok = pretty_otp7671( pretty_otp7671_msg04(), [] , error, ignore), +%% erase(dbg), +%% erase(severity), + ok. + +pretty_otp7671_msg05(suite) -> + []; +pretty_otp7671_msg05(Config) when is_list(Config) -> +%% put(severity, trc), +%% put(dbg, true), + d("pretty_otp7671_msg05 -> entry", []), + Check = fun(M1, M2) -> cmp_otp7671_msg05(M1, M2) end, + ok = pretty_otp7671( pretty_otp7671_msg05(), [] , ok, ok, Check), +%% erase(dbg), +%% erase(severity), + ok. + + +pretty_otp7671(Msg, Conf) -> + pretty_otp7671(Msg, Conf, ok). + +pretty_otp7671(Msg, Conf, ExpectedEncode) -> + pretty_otp7671(Msg, Conf, ExpectedEncode, ok). + +pretty_otp7671(Msg, Conf, ExpectedEncode, ExpectedDecode) -> + otp7671(Msg, megaco_pretty_text_encoder, Conf, + ExpectedEncode, ExpectedDecode). + +pretty_otp7671(Msg, Conf, ExpectedEncode, ExpectedDecode, Check) -> + otp7671(Msg, megaco_pretty_text_encoder, Conf, + ExpectedEncode, ExpectedDecode, Check). + +otp7671(Msg, Codec, Conf, ExpectedEncode, ExpectedDecode) -> + Check = fun(M1, M2) -> + exit({unexpected_decode_result, M1, M2}) + end, + otp7671(Msg, Codec, Conf, ExpectedEncode, ExpectedDecode, Check). + +otp7671(Msg, Codec, Conf, ExpectedEncode, ExpectedDecode, Check) -> + case (catch encode_message(Codec, Conf, Msg)) of + {error, _Reason} when ExpectedEncode =:= error -> + ok; + {error, Reason} when ExpectedEncode =:= ok -> + exit({unexpected_encode_failure, Reason}); + {ok, Bin} when ExpectedEncode =:= error -> + exit({unexpected_encode_success, Msg, binary_to_list(Bin)}); + {ok, Bin} when ExpectedEncode =:= ok -> + case decode_message(Codec, false, Conf, Bin) of + {ok, Msg} when ExpectedDecode =:= ok -> + io:format("otp7671 -> decoded:identical~n", []), + ok; + {ok, Msg2} when ExpectedDecode =:= ok -> + Check(Msg, Msg2); + {ok, Msg} when ExpectedDecode =:= error -> + exit({unexpected_decode_success, Msg}); + {ok, Msg2} when ExpectedDecode =:= error -> + exit({unexpected_decode_success, Msg, Msg2}); + {error, _Reason} when ExpectedDecode =:= error -> + ok; + {error, Reason} when ExpectedDecode == ok -> + exit({unexpected_decode_failure, Msg, Reason}) + end + end. + + +pretty_otp7671_msg(DigitMapDesc) -> + AmmReq = cre_ammReq([#megaco_term_id{id = ?A4444}], + [{digitMapDescriptor, DigitMapDesc}]), + CmdReq = cre_commandReq({modReq, AmmReq}), + msg_request(?MGC_MID, 10001, ?megaco_null_context_id, [CmdReq]). + +pretty_otp7671_msg01() -> + Name = "dialplan01", + DigitMapDesc = cre_digitMapDesc(Name), + pretty_otp7671_msg(DigitMapDesc). + +pretty_otp7671_msg02() -> + Name = "dialplan02", + Body = "(0s| 00s|[1-7]xlxx|8lxxxxxxx|#xxxxxxx|*xx|9l1xxxxxxxxxx|9l011x.s)", + Value = cre_digitMapValue(Body), + DigitMapDesc = cre_digitMapDesc(Name, Value), + pretty_otp7671_msg(DigitMapDesc). + +pretty_otp7671_msg03() -> + Body = "(0s| 00s|[1-7]xlxx|8lxxxxxxx|#xxxxxxx|*xx|9l1xxxxxxxxxx|9l011x.s)", + Value = cre_digitMapValue(Body), + DigitMapDesc = cre_digitMapDesc(Value), + pretty_otp7671_msg(DigitMapDesc). + +pretty_otp7671_msg04() -> + DigitMapDesc = cre_digitMapDesc(asn1_NOVALUE, asn1_NOVALUE), + pretty_otp7671_msg(DigitMapDesc). + +pretty_otp7671_msg05() -> + {'MegacoMessage',asn1_NOVALUE, + {'Message',?VERSION, + {domainName,{'DomainName',"tgc",asn1_NOVALUE}}, + {transactions, + [{transactionRequest, + {'TransactionRequest',12582952, + [{'ActionRequest',0,asn1_NOVALUE,asn1_NOVALUE, + [{'CommandRequest', + {modReq, + {'AmmRequest', + [{megaco_term_id,false,["root"]}], + [{digitMapDescriptor, + {'DigitMapDescriptor',"dialplan1", + {'DigitMapValue',asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,[]}}}]}}, + asn1_NOVALUE,asn1_NOVALUE}]}]}}]}}}. + +cmp_otp7671_msg05(#'MegacoMessage'{authHeader = asn1_NOVALUE, + mess = M1}, + #'MegacoMessage'{authHeader = asn1_NOVALUE, + mess = M2}) -> + #'Message'{messageBody = Body1} = M1, + #'Message'{messageBody = Body2} = M2, + {transactions, Trans1} = Body1, + {transactions, Trans2} = Body2, + [{transactionRequest, TR1}] = Trans1, + [{transactionRequest, TR2}] = Trans2, + #'TransactionRequest'{actions = Acts1} = TR1, + #'TransactionRequest'{actions = Acts2} = TR2, + [#'ActionRequest'{commandRequests = CR1}] = Acts1, + [#'ActionRequest'{commandRequests = CR2}] = Acts2, + [#'CommandRequest'{command = Cmd1}] = CR1, + [#'CommandRequest'{command = Cmd2}] = CR2, + {modReq, #'AmmRequest'{descriptors = Descs1}} = Cmd1, + {modReq, #'AmmRequest'{descriptors = Descs2}} = Cmd2, + [{digitMapDescriptor, + #'DigitMapDescriptor'{digitMapName = Name, + digitMapValue = Value1}}] = Descs1, + [{digitMapDescriptor, + #'DigitMapDescriptor'{digitMapName = Name, + digitMapValue = Value2}}] = Descs2, + #'DigitMapValue'{startTimer = asn1_NOVALUE, + shortTimer = asn1_NOVALUE, + longTimer = asn1_NOVALUE, + digitMapBody = []} = Value1, + asn1_NOVALUE = Value2, + ok. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +expect_codec(Expect, Codec, Msg, Conf) -> + t("expect_codec -> entry with" + "~n Expect: ~p" + "~n Msg: ~p", [Expect, Msg]), + case (catch encode_message(Codec, Conf, Msg)) of + {error, _Reason} when Expect =:= error -> + d("expect_codec -> encode failed as expected" + "~n _Reason: ~w", [_Reason]), + ok; + {error, Reason} -> + e("expect_codec -> encode failed unexpectedly: " + "~n Reason: ~w", [Reason]), + exit({unexpected_encode_result, Reason}); + {ok, Bin} when Expect =:= error -> + e("expect_codec -> encode succeded unexpectedly: " + "~n ~w", [binary_to_list(Bin)]), + exit({unexpected_encode_result, binary_to_list(Bin)}); + {ok, Bin} -> + d("expect_codec -> successfull encode as expected:" + "~n~s", [binary_to_list(Bin)]), + case (catch decode_message(Codec, false, Conf, Bin)) of + {ok, Msg} -> + d("expect_codec -> successfull decode~n", []), + ok; + {ok, Msg2} -> + e("expect_codec -> successfull decode" + " - but not equal", []), + chk_MegacoMessage(Msg, Msg2); + %% exit({unexpected_decode_result, Msg, Msg2}); + Else -> + e("expect_codec -> decode failed:~n~p", [Else]), + exit({unexpected_decode_result, Else}) + end; + Else -> + e("expect_codec -> encode failed:~n~p", [Else]), + exit({unexpected_encode_result, Else}) + end. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +msgs() -> + Msgs = msgs1() ++ msgs2() ++ msgs3(), + [M || {_, M, _, _} <- Msgs]. + +msgs1() -> + Plain = + fun(Codec, DD, Ver, EC, M) -> + megaco_codec_test_lib:plain_encode_decode(Codec, DD, Ver, + EC, M) + end, + [ + {msg01a, msg1a(), Plain, [{dbg,false}]}, + {msg01b, msg1b(), Plain, [{dbg,false}]}, + {msg02, msg2(), Plain, [{dbg,false}]}, + {msg03, msg3(), Plain, [{dbg,false}]}, + {msg04, msg4(), Plain, [{dbg,false}]}, + {msg05, msg5(), Plain, [{dbg,false}]}, + {msg06a, msg6a(), Plain, [{dbg,false}]}, + {msg06b, msg6b(), Plain, [{dbg,false}]}, + {msg07, msg7(), Plain, [{dbg,false}]}, + {msg08a, msg8a(), Plain, [{dbg,false}]}, + {msg08b, msg8b(), Plain, [{dbg,false}]}, + {msg09, msg9(), Plain, [{dbg,false}]}, + {msg10, msg10(), Plain, [{dbg,false}]}, + {msg11, msg11(), Plain, [{dbg,false}]}, + {msg12, msg12(), Plain, [{dbg,false}]}, + {msg13, msg13(), Plain, [{dbg,false}]}, + {msg14, msg14(), Plain, [{dbg,false}]}, + {msg15, msg15(), Plain, [{dbg,false}]}, + {msg16, msg16(), Plain, [{dbg,false}]}, + {msg17, msg17(), Plain, [{dbg,false}]}, + {msg18, msg18(), Plain, [{dbg,false}]}, + {msg19, msg19(), Plain, [{dbg,false}]}, + {msg20, msg20(), Plain, [{dbg,false}]}, + {msg21, msg21(), Plain, [{dbg,false}]}, + {msg22a, msg22a(), Plain, [{dbg,false}]}, + {msg22b, msg22b(), Plain, [{dbg,false}]}, + {msg22c, msg22c(), Plain, [{dbg,false}]}, + {msg22d, msg22d(), Plain, [{dbg,false}]}, + {msg22e, msg22e(), Plain, [{dbg,false}]}, + {msg22f, msg22f(), Plain, [{dbg,false}]}, + {msg23a, msg23a(), Plain, [{dbg,false}]}, + {msg23b, msg23b(), Plain, [{dbg,false}]}, + {msg23c, msg23c(), Plain, [{dbg,false}]}, + {msg23d, msg23d(), Plain, [{dbg,false}]}, + {msg24, msg24(), Plain, [{dbg,false}]}, + {msg25, msg25(), Plain, [{dbg,false}]}, + {msg30a, msg30a(), Plain, [{dbg,false}]}, + {msg30b, msg30b(), Plain, [{dbg,false}]}, + {msg30c, msg30c(), Plain, [{dbg,false}]}, + {msg30d, msg30d(), Plain, [{dbg,false}]} + ]. + +msgs2() -> + TransFirst = + fun(Codec, DD, Ver, EC, M) -> + megaco_codec_test_lib:trans_first_encode_decode(Codec, DD, + Ver, EC, M) + end, + ActionsFirst = + fun(Codec, DD, Ver, EC, M) -> + megaco_codec_test_lib:actions_first_encode_decode(Codec, DD, + Ver, EC, M) + end, + ActionFirst = + fun(Codec, DD, Ver, EC, M) -> + megaco_codec_test_lib:action_first_encode_decode(Codec, DD, + Ver, EC, M) + end, + [ + {msg01a_tf, msg1a(), TransFirst, [{dbg,false}]}, + {msg02_tf, msg2(), TransFirst, [{dbg,false}]}, + {msg10_tf, msg10(), TransFirst, [{dbg,false}]}, + {msg11_tf, msg11(), TransFirst, [{dbg,false}]}, + {msg23d_tf, msg23d(), TransFirst, [{dbg,false}]}, + {msg30b_tf, msg30b(), TransFirst, [{dbg,false}]}, + {msg30c_tf, msg30c(), TransFirst, [{dbg,false}]}, + {msg01a_asf, msg1a(), ActionsFirst, [{dbg,false}]}, + {msg02_asf, msg2(), ActionsFirst, [{dbg,false}]}, + {msg10_asf, msg10(), ActionsFirst, [{dbg,false}]}, + {msg23d_asf, msg23d(), ActionsFirst, [{dbg,false}]}, + {msg01a_af, msg1a(), ActionFirst, [{dbg,false}]}, + {msg02_af, msg2(), ActionFirst, [{dbg,false}]}, + {msg10_af, msg10(), ActionFirst, [{dbg,false}]}, + {msg23d_af, msg23d(), ActionFirst, [{dbg,false}]} + ]. + + +msgs3() -> + Plain = + fun(Codec, DD, Ver, EC, M) -> + megaco_codec_test_lib:plain_encode_decode(Codec, DD, Ver, + EC, M) + end, + [{msgs3_name(Name), rfc3525_decode(M), Plain, [{dbg, false}]} || + {Name, M} <- rfc3525_msgs()]. + +msgs3_name(N) -> + list_to_atom("rfc3525_" ++ atom_to_list(N)). + +rfc3525_decode(M) when is_list(M) -> + rfc3525_decode(list_to_binary(M)); +rfc3525_decode(M) when is_binary(M) -> + case (catch decode_message(megaco_pretty_text_encoder, false, [], M)) of + {ok, Msg} -> + Msg; + Error -> + {error, {rfc3525_decode_error, Error}} + end. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +msg_actions([], Actions) -> + lists:reverse(Actions); +msg_actions([{CtxId, CmdReqs}|ActionInfo], Actions) -> + Action = #'ActionRequest'{contextId = CtxId, + commandRequests = CmdReqs}, + msg_actions(ActionInfo, [Action|Actions]). + +megaco_trans_req([], Transactions) -> + {transactions, lists:reverse(Transactions)}; +megaco_trans_req([{TransId, ActionInfo}|TransInfo], Transactions) -> + Actions = msg_actions(ActionInfo, []), + TransReq = {transactionRequest, + #'TransactionRequest'{transactionId = TransId, + actions = Actions}}, + megaco_trans_req(TransInfo, [TransReq|Transactions]). + +megaco_message(Version, Mid, Body) -> + #'MegacoMessage'{mess = #'Message'{version = Version, + mId = Mid, + messageBody = Body}}. + +megaco_message(Auth, Version, Mid, Body) -> + #'MegacoMessage'{authHeader = Auth, + mess = #'Message'{version = Version, + mId = Mid, + messageBody = Body}}. + +msg_request(Mid, TransInfo) -> + TransReq = megaco_trans_req(TransInfo, []), + megaco_message(1, Mid, TransReq). + +msg_request(Mid, TransId, ContextId, CmdReq) when is_list(CmdReq) -> + Actions = [#'ActionRequest'{contextId = ContextId, + commandRequests = CmdReq}], + Req = {transactions, + [{transactionRequest, + #'TransactionRequest'{transactionId = TransId, + actions = Actions}}]}, + megaco_message(?VERSION, Mid, Req). + +msg_request(Auth, Mid, TransId, ContextId, CmdReq) when is_list(CmdReq) -> + Actions = [#'ActionRequest'{contextId = ContextId, + commandRequests = CmdReq}], + Req = {transactions, + [{transactionRequest, + #'TransactionRequest'{transactionId = TransId, + actions = Actions}}]}, + megaco_message(Auth, ?VERSION, Mid, Req). + +msg_reply(Mid, TransId, ContextId, CmdReply) when is_list(CmdReply) -> + ReplyData = [{ContextId, CmdReply}], + msg_replies(Mid, TransId, ReplyData). + +msg_replies(Mid, TransId, ReplyData) when is_list(ReplyData) -> + Actions = [cre_actionReply(ContextId, CmdReply) || + {ContextId, CmdReply} <- ReplyData], + Req = {transactions, + [{transactionReply, cre_transactionReply(TransId, Actions)}]}, + cre_megacoMessage(?VERSION, Mid, Req). + + +msg_ack(Mid, [Range|_] = Ranges) when is_tuple(Range) -> + msg_ack(Mid, [Ranges]); + +msg_ack(Mid, Ranges) -> + %% TRAs = make_tras(Ranges, []), + TRAs = make_tras(Ranges), + Req = {transactions, TRAs}, + cre_megacoMessage(?VERSION, Mid, Req). + +make_tras(TRARanges) -> + F = fun(R) -> {transactionResponseAck, make_tra(R)} end, + lists:map(F, TRARanges). + +make_tra(Ranges) -> + F = fun({F,L}) -> cre_transactionAck(F,L) end, + lists:map(F, Ranges). + + +%% ------------------------------------------------------------------------- + + +msg1(Mid, Tid) -> + Gain = cre_propertyParm("tdmc/gain", "2"), + Ec = cre_propertyParm("tdmc/ec", "g165"), + LCD = cre_localControlDesc(sendRecv,[Gain, Ec]), + V = cre_propertyParm("v", "0"), + %% C = cre_propertyParm("c", "IN IP4 $ "), + C = cre_propertyParm("c", [$I,$N,$ ,$I,$P,$4,$ ,$$,$ ]), + M = cre_propertyParm("m", "audio $ RTP/AVP 0"), + A = cre_propertyParm("a", "fmtp:PCMU VAD=X-NNVAD"), + LD = cre_localRemoteDesc([[V, C, M, A]]), + Parms = cre_streamParms(LCD,LD), + StreamDesc = cre_streamDesc(1,Parms), + MediaDesc = cre_mediaDesc(StreamDesc), + ReqEvent = cre_requestedEvent("al/of"), + EventsDesc = cre_eventsDesc(2222,[ReqEvent]), + AmmReq = cre_ammReq([#megaco_term_id{id = Tid}], + [{mediaDescriptor, MediaDesc}, + {eventsDescriptor, EventsDesc}]), + CmdReq = cre_commandReq({modReq, AmmReq}), + msg_request(Mid, 9999, ?megaco_null_context_id, [CmdReq]). + + +msg1a() -> + msg1a(?MGC_MID). +msg1a(Mid) -> + msg1(Mid, ?A4444). + +msg1b() -> + msg1b(?MGC_MID). +msg1b(Mid) -> + msg1(Mid, ?A4445). + + +%% -------------------------- + + +msg2() -> + msg2(?MGC_MID). +msg2(Mid) -> + msg2(Mid, ?A4444). +msg2(Mid, Tid) -> + Gain = cre_propertyParm("tdmc/gain", "2"), + Ec = cre_propertyParm("tdmc/ec", "g165"), + LCD = cre_localControlDesc(sendRecv,[Gain, Ec]), + V = cre_propertyParm("v", "0"), + %% C = cre_propertyParm("c", "IN IP4 $ "), + C = cre_propertyParm("c", [$I,$N,$ ,$I,$P,$4,$ ,$$,$ ]), + M = cre_propertyParm("m", "audio $ RTP/AVP 0"), + A = cre_propertyParm("a", "fmtp:PCMU VAD=X-NNVAD"), + LD = cre_localRemoteDesc([[V, C, M, A]]), + Parms = cre_streamParms(LCD,LD), + StreamDesc = cre_streamDesc(1,Parms), + MediaDesc = cre_mediaDesc(StreamDesc), + EventParm = cre_eventParm("strict",["exact"]), + ReqEvent = cre_requestedEvent("al/of", [EventParm]), + EventsDesc = cre_eventsDesc(2222,[ReqEvent]), + AmmReq = cre_ammReq([#megaco_term_id{id = Tid}], + [{mediaDescriptor, MediaDesc}, + {eventsDescriptor, EventsDesc}]), + CmdReq = cre_commandReq({modReq, AmmReq}), + msg_request(Mid, 9999, ?megaco_null_context_id, [CmdReq]). + + +%% -------------------------- + +msg3() -> + msg3(?MG1_MID). +msg3(Mid) -> + TimeStamp = cre_timeNotation("19990729", "22000000"), + Event = cre_observedEvent("al/of",TimeStamp), + Desc = cre_observedEventsDesc(2222,[Event]), + NotifyReq = cre_notifyReq([#megaco_term_id{id = ?A4444}],Desc), + CmdReq = cre_commandReq({notifyReq, NotifyReq}), + msg_request(Mid, 10000, ?megaco_null_context_id, [CmdReq]). + + +%% -------------------------- + +msg4() -> + msg4(?MG1_MID_NO_PORT, "901 mg col boot"). +msg4(Mid, Reason) when is_list(Reason) -> + Address = {portNumber, ?DEFAULT_PORT}, + Profile = cre_serviceChangeProf("resgw",1), + Parm = cre_serviceChangeParm(restart,Address,[Reason],Profile), + Req = cre_serviceChangeReq([?megaco_root_termination_id],Parm), + CmdReq = cre_commandReq({serviceChangeReq, Req}), + msg_request(Mid, 9998, ?megaco_null_context_id, [CmdReq]). + + +%% -------------------------- + +msg5() -> + msg5(?MGC_MID). +msg5(Mid) -> + Address = {portNumber, ?DEFAULT_PORT}, + Profile = cre_serviceChangeProf("resgw",1), + Parm = cre_serviceChangeResParm(Address,Profile), + Reply = cre_serviceChangeReply([?megaco_root_termination_id], + {serviceChangeResParms,Parm}), + msg_reply(Mid, 9998, ?megaco_null_context_id, + [{serviceChangeReply, Reply}]). + + +%% -------------------------- + +msg6(Mid, Tid) -> + Reply = cre_ammsReply([#megaco_term_id{id = Tid}]), + msg_reply(Mid, 9999, ?megaco_null_context_id, [{modReply, Reply}]). + +msg6a() -> + msg6a(?MG1_MID). +msg6a(Mid) -> + msg6(Mid, ?A4444). + +msg6b() -> + msg6b(?MG2_MID). +msg6b(Mid) -> + msg6(Mid, ?A5555). + + +%% -------------------------- + +msg7() -> + msg7(?MGC_MID). +msg7(Mid) -> + Reply = cre_notifyReply([#megaco_term_id{id = ?A4444}]), + msg_reply(Mid, 10000, ?megaco_null_context_id, [{notifyReply, Reply}]). + + +%% -------------------------- + +msg8(Mid, DigitMapValue) -> + Strict = cre_eventParm("strict",["state"]), + On = cre_requestedEvent("al/on", [Strict]), + Name = "dialplan00", + Action = cre_requestedActions(Name), + Ce = cre_requestedEvent("dd/ce", Action), + EventsDesc = cre_eventsDesc(2223,[On, Ce]), + Signal = cre_signal("cg/rt"), + DigMapDesc = cre_digitMapDesc(Name, DigitMapValue), + AmmReq = cre_ammReq([#megaco_term_id{id = ?A4444}], + [{eventsDescriptor, EventsDesc}, + {signalsDescriptor, [{signal, Signal}]}, + {digitMapDescriptor, DigMapDesc}]), + CmdReq = cre_commandReq({modReq, AmmReq}), + msg_request(Mid, 10001, ?megaco_null_context_id, [CmdReq]). + +msg8a() -> + msg8a(?MGC_MID). +msg8a(Mid) -> + Body = "(0s| 00s|[1-7]xlxx|8lxxxxxxx|#xxxxxxx|*xx|9l1xxxxxxxxxx|9l011x.s)", + Value = cre_digitMapValue(Body), + msg8(Mid, Value). + +msg8b() -> + msg8b(?MGC_MID). +msg8b(Mid) -> + Body = "(0s| 00s|[1-7]xlxx|8lxxxxxxx|#xxxxxxx|*xx|9l1xxxxxxxxxx|9l011x.s)", + Value = cre_digitMapValue(Body, 1, 23, 99), + msg8(Mid, Value). + + +%% -------------------------- + +msg9() -> + msg9(?MG1_MID). +msg9(Mid) -> + TimeStamp = cre_timeNotation("19990729","22010001"), + Parm = cre_eventParm("ds",["916135551212"]), + Event = cre_observedEvent("dd/ce",TimeStamp,[Parm]), + Desc = cre_observedEventsDesc(2223,[Event]), + NotifyReq = cre_notifyReq([#megaco_term_id{id = ?A4444}], Desc), + CmdReq = cre_commandReq({notifyReq, NotifyReq}), + msg_request(Mid, 10002, ?megaco_null_context_id, [CmdReq]). + + +%% -------------------------- + +msg10() -> + msg10(?MGC_MID). +msg10(Mid) -> + AmmReq = cre_ammReq([#megaco_term_id{id = ?A4444}],[]), + CmdReq = cre_commandReq({addReq, AmmReq}), + Jit = cre_propertyParm("nt/jit", "40"), + LCD = cre_localControlDesc(recvOnly,[Jit]), + V = cre_propertyParm("v", "0"), + C = cre_propertyParm("c", "IN IP4 $ "), + M = cre_propertyParm("m", "audio $ RTP/AVP 4"), + A = cre_propertyParm("a", "ptime:30"), + V2 = cre_propertyParm("v", "0"), + C2 = cre_propertyParm("c", "IN IP4 $ "), + M2 = cre_propertyParm("m", "audio $ RTP/AVP 0"), + LD = cre_localRemoteDesc([[V, C, M, A], [V2, C2, M2]]), + Parms = cre_streamParms(LCD, LD), + StreamDesc = cre_streamDesc(1,Parms), + MediaDesc = cre_mediaDesc(StreamDesc), + ChooseTid = #megaco_term_id{contains_wildcards = true, + id = [[?megaco_choose]]}, + AmmReq2 = cre_ammReq([ChooseTid],[{mediaDescriptor, MediaDesc}]), + CmdReq2 = cre_commandReq({addReq, AmmReq2}), + msg_request(Mid, 10003, ?megaco_choose_context_id, [CmdReq, CmdReq2]). + + +msg11() -> + msg11(?MG1_MID). +msg11(Mid) -> + V = cre_propertyParm("v", "0"), + C = cre_propertyParm("c", "IN IP4 124.124.124.222"), + M = cre_propertyParm("m", "audio 2222 RTP/AVP 4"), + A = cre_propertyParm("a", "ptime:30"), + A2 = cre_propertyParm("a", "recvonly"), + LD = cre_localRemoteDesc([[V, C, M, A, A2]]), + Parms = cre_streamParmsL(LD), + StreamDesc = cre_streamDesc(1, Parms), + MediaDesc = cre_mediaDesc(StreamDesc), + Reply = cre_ammsReply([#megaco_term_id{id = ?A4444}]), + Reply2 = cre_ammsReply([#megaco_term_id{id = ?A4445}], + [{mediaDescriptor, MediaDesc}]), + msg_reply(Mid, 10003, 2000, [{addReply, Reply}, {addReply, Reply2}]). + + +%% -------------------------- + +msg12() -> + msg12(?MGC_MID). +msg12(Mid) -> + LCD = cre_localControlDesc(sendRecv), + Parms = cre_streamParms(LCD), + StreamDesc = cre_streamDesc(1,Parms), + MediaDesc = cre_mediaDesc(StreamDesc), + Signal = cre_signal("al/ri"), + Descs = [{mediaDescriptor, MediaDesc}, + {signalsDescriptor, [{signal, Signal}]}], + AmmReq = cre_ammReq([#megaco_term_id{id = ?A5555}], Descs), + CmdReq = cre_commandReq({addReq, AmmReq}), + Jit = cre_propertyParm("nt/jit", "40"), + LCD2 = cre_localControlDesc(sendRecv, [Jit]), + V = cre_propertyParm("v", "0"), + C = cre_propertyParm("c", "IN IP4 $ "), + M = cre_propertyParm("m", "audio $ RTP/AVP 4"), + A = cre_propertyParm("a", "ptime:30"), + LD2 = cre_localRemoteDesc([[V, C, M, A]]), + V2 = cre_propertyParm("v", "0"), + C2 = cre_propertyParm("c", "IN IP4 124.124.124.222"), + M2 = cre_propertyParm("m", "audio 2222 RTP/AVP 4"), + RD2 = cre_localRemoteDesc([[V2, C2, M2]]), + Parms2 = cre_streamParms(LCD2,LD2,RD2), + StreamDesc2 = cre_streamDesc(1,Parms2), + MediaDesc2 = cre_mediaDesc(StreamDesc2), + ChooseTid = #megaco_term_id{contains_wildcards = true, + id = [[?megaco_choose]]}, + AmmReq2 = cre_ammReq([ChooseTid],[{mediaDescriptor, MediaDesc2}]), + CmdReq2 = cre_commandReq({addReq, AmmReq2}), + msg_request(Mid, 50003, ?megaco_choose_context_id, [CmdReq, CmdReq2]). + + +%% -------------------------- + +msg13() -> + msg13(?MG2_MID). +msg13(Mid) -> + V = cre_propertyParm("v", "0"), + C = cre_propertyParm("c", "IN IP4 125.125.125.111"), + M = cre_propertyParm("m", "audio 1111 RTP/AVP 4"), + LD = cre_localRemoteDesc([[V, C, M]]), + Parms = cre_streamParmsL(LD), + StreamDesc = cre_streamDesc(1,Parms), + MediaDesc = cre_mediaDesc(StreamDesc), + Reply = cre_ammsReply([#megaco_term_id{id = ?A5556}], + [{mediaDescriptor, MediaDesc}]), + msg_reply(Mid, 50003, 5000, [{addReply, Reply}]). + + +%% -------------------------- + +msg14() -> + msg14(?MGC_MID). +msg14(Mid) -> + Signal = cre_signal("cg/rt"), + AmmReq1 = cre_ammReq([#megaco_term_id{id = ?A4444}], + [{signalsDescriptor, [{signal, Signal}]}]), + CmdReq1 = cre_commandReq({modReq, AmmReq1}), + + Gain = cre_propertyParm("tdmc/gain", "2"), + Ec = cre_propertyParm("tdmc/ec", "g165"), + LCD = cre_localControlDesc(sendRecv, [Gain, Ec]), + Parms2 = cre_streamParms(LCD), + StreamDesc2 = cre_streamDesc(1,Parms2), + MediaDesc2 = cre_mediaDesc(StreamDesc2), + AmmReq2 = cre_ammReq([#megaco_term_id{id = ?A4445}], + [{mediaDescriptor, MediaDesc2}]), + CmdReq2 = cre_commandReq({modReq, AmmReq2}), + + V = cre_propertyParm("v", "0"), + C = cre_propertyParm("c", "IN IP4 125.125.125.111"), + M = cre_propertyParm("m", "audio 1111 RTP/AVP 4"), + RD = cre_localRemoteDesc([[V, C, M]]), + Parms3 = cre_streamParmsR(RD), + StreamDesc3 = cre_streamDesc(1,Parms3), + MediaDesc3 = cre_mediaDesc(StreamDesc3), + AmmReq3 = cre_ammReq([#megaco_term_id{id = ?A4445}], + [{mediaDescriptor, MediaDesc3}]), + CmdReq3 = cre_commandReq({modReq, AmmReq3}), + msg_request(Mid, 10005, 2000, [CmdReq1, CmdReq2, CmdReq3]). + + +%% -------------------------- + +msg15() -> + msg15(?MG1_MID). +msg15(Mid) -> + Reply = cre_ammsReply([#megaco_term_id{id = ?A4444}]), + Reply2 = cre_ammsReply([#megaco_term_id{id = ?A4445}]), + msg_reply(Mid, 10005, 2000, [{modReply, Reply}, {modReply, Reply2}]). + + +msg15b() -> + msg15b(?MG1_MID). + +msg15b(Mid) -> + %% We reuse the amms reply stuff + Reply1 = cre_ammsReply([#megaco_term_id{id = ?A4444}]), + Reply2 = cre_ammsReply([#megaco_term_id{id = ?A4445}]), + ActionReplyData = + [{modReply, Reply1}, {modReply, Reply2}], + ReplyData = + [{2001, ActionReplyData}, + {2002, ActionReplyData}, + {2003, ActionReplyData}, + {2004, ActionReplyData}, + {2005, ActionReplyData}, + {2006, ActionReplyData}, + {2007, ActionReplyData}, + {2008, ActionReplyData}, + {2009, ActionReplyData}, + {2010, ActionReplyData}, + {2011, ActionReplyData}, + {2012, ActionReplyData}, + {2013, ActionReplyData}, + {2014, ActionReplyData}, + {2015, ActionReplyData}, + {2016, ActionReplyData}, + {2017, ActionReplyData}, + {2018, ActionReplyData}, + {2019, ActionReplyData}, + {2020, ActionReplyData}, + {2021, ActionReplyData}, + {2022, ActionReplyData}, + {2023, ActionReplyData}, + {2024, ActionReplyData}, + {2025, ActionReplyData}, + {2026, ActionReplyData}, + {2027, ActionReplyData}, + {2028, ActionReplyData}, + {2029, ActionReplyData}, + {2030, ActionReplyData}, + {2031, ActionReplyData}], + msg_replies(Mid, 10005, ReplyData). + + +%% -------------------------- + +msg16() -> + msg16(?MG2_MID). +msg16(Mid) -> + TimeStamp = cre_timeNotation("19990729","22020002"), + Event = cre_observedEvent("al/of",TimeStamp), + Desc = cre_observedEventsDesc(1234,[Event]), + NotifyReq = cre_notifyReq([#megaco_term_id{id = ?A5555}],Desc), + CmdReq = cre_commandReq({notifyReq, NotifyReq}), + msg_request(Mid, 50005, 5000, [CmdReq]). + + +%% -------------------------- + +msg17() -> + msg17(?MGC_MID). +msg17(Mid) -> + Reply = cre_notifyReply([#megaco_term_id{id = ?A5555}]), + msg_reply(Mid, 50005, ?megaco_null_context_id, [{notifyReply, Reply}]). + + +%% -------------------------- + +msg18() -> + msg18(?MGC_MID). +msg18(Mid) -> + On = cre_requestedEvent("al/on"), + EventsDesc = cre_eventsDesc(1235,[On]), + AmmReq = cre_ammReq([#megaco_term_id{id = ?A5555}], + [{eventsDescriptor, EventsDesc}, + {signalsDescriptor, []}]), + CmdReq = cre_commandReq({modReq, AmmReq}), + msg_request(Mid, 50006, 5000, [CmdReq]). + + +%% -------------------------- + +msg19() -> + msg19(?MG2_MID). +msg19(Mid) -> + Reply = cre_ammsReply([#megaco_term_id{id = ?A4445}]), + msg_reply(Mid, 50006, 5000, [{modReply, Reply}]). + + +%% -------------------------- + +msg20() -> + msg20(?MGC_MID). +msg20(Mid) -> + LCD = cre_localControlDesc(sendRecv), + Parms = cre_streamParms(LCD), + StreamDesc = cre_streamDesc(1,Parms), + MediaDesc = cre_mediaDesc(StreamDesc), + AmmReq = cre_ammReq([#megaco_term_id{id = ?A4445}], + [{mediaDescriptor, MediaDesc}]), + CmdReq = cre_commandReq({modReq, AmmReq}), + AmmReq2 = cre_ammReq([#megaco_term_id{id = ?A4444}], + [{signalsDescriptor, []}]), + CmdReq2 = cre_commandReq({modReq, AmmReq2}), + msg_request(Mid, 10006, 2000, [CmdReq, CmdReq2]). + + +%% -------------------------- + +msg21() -> + msg21(?MGC_MID). +msg21(Mid) -> + Tokens = [mediaToken, eventsToken, signalsToken, + digitMapToken, statsToken, packagesToken], + AuditDesc = cre_auditDesc(Tokens), + Req = cre_auditReq(#megaco_term_id{id = ?A5556},AuditDesc), + CmdReq = cre_commandReq({auditValueRequest, Req}), + msg_request(Mid, 50007, ?megaco_null_context_id, [CmdReq]). + + +%% -------------------------- + +msg22a() -> + msg22(1). + +msg22b() -> + msg22(10). + +msg22c() -> + msg22(25). + +msg22d() -> + msg22(50). + +msg22e() -> + msg22(75). + +msg22f() -> + msg22(100). + +msg22(N) -> + msg22(?MG2_MID, N). +msg22(Mid, N) -> + Jit = cre_propertyParm("nt/jit", "40"), + LCD = cre_localControlDesc(sendRecv,[Jit]), + LDV = cre_propertyParm("v", "0"), + LDC = cre_propertyParm("c", "IN IP4 125.125.125.111"), + LDM = cre_propertyParm("m", "audio 1111 RTP/AVP 4"), + LDA = cre_propertyParm("a", "ptime:30"), + LD = cre_localRemoteDesc([[LDV, LDC, LDM, LDA]]), + RDV = cre_propertyParm("v", "0"), + RDC = cre_propertyParm("c", "IN IP4 124.124.124.222"), + RDM = cre_propertyParm("m", "audio 2222 RTP/AVP 4"), + RDA = cre_propertyParm("a", "ptime:30"), + RD = cre_localRemoteDesc([[RDV, RDC, RDM, RDA]]), + StreamParms = cre_streamParms(LCD,LD,RD), + StreamDesc = cre_streamDesc(1,StreamParms), + Media = cre_mediaDesc(StreamDesc), + PackagesItem = cre_packagesItem("nt",1), + PackagesItem2 = cre_packagesItem("rtp",1), + Stat = cre_statisticsParm("rtp/ps","1200"), + Stat2 = cre_statisticsParm("nt/os","62300"), + Stat3 = cre_statisticsParm("rtp/pr","700"), + Stat4 = cre_statisticsParm("nt/or","45100"), + Stat5 = cre_statisticsParm("rtp/pl","0.2"), + Stat6 = cre_statisticsParm("rtp/jit","20"), + Stat7 = cre_statisticsParm("rtp/delay","40"), + Statistics = [Stat, Stat2, Stat3, Stat4, Stat5, Stat6, Stat7], + Audits = [{mediaDescriptor, Media}, + {packagesDescriptor, [PackagesItem, PackagesItem2]}, + {statisticsDescriptor, Statistics}], + Reply = {auditResult, + cre_auditRes(#megaco_term_id{id = ?A5556},Audits)}, + msg_reply(Mid, 50007, ?megaco_null_context_id, + lists:duplicate(N,{auditValueReply, Reply})). +%% msg_reply(Mid, 50007, ?megaco_null_context_id, +%% lists.duplicate([{auditValueReply, Reply}]). + + +%% -------------------------- + +msg23a() -> + msg23a(?MG2_MID). +msg23a(Mid) -> + TimeStamp = cre_timeNotation("19990729","24020002"), + Event = cre_observedEvent("al/on",TimeStamp), + Desc = cre_observedEventsDesc(1235,[Event]), + NotifyReq = cre_notifyReq([#megaco_term_id{id = ?A5555}],Desc), + CmdReq = cre_commandReq({notifyReq, NotifyReq}), + msg_request(Mid, 50008, 5000, [CmdReq]). + + +msg23b() -> + msg23b(?MG2_MID). +msg23b(Mid) -> + TimeStamp = cre_timeNotation("19990729","24020002"), + Event = cre_observedEvent("al/on",TimeStamp), + Desc = cre_observedEventsDesc(1235,[Event]), + NotifyReq1 = cre_notifyReq([#megaco_term_id{id = ?A5555}],Desc), + CmdReq1 = cre_commandReq({notifyReq, NotifyReq1}), + NotifyReq2 = cre_notifyReq([#megaco_term_id{id = ?A5556}],Desc), + CmdReq2 = cre_commandReq({notifyReq, NotifyReq2}), + ActionInfo = [{5000, [CmdReq1]}, {5001, [CmdReq2]}], + TransInfo = [{50008, ActionInfo}], + msg_request(Mid, TransInfo). + + +msg23c() -> + msg23c(?MG2_MID). +msg23c(Mid) -> + TimeStamp = cre_timeNotation("19990729","24020002"), + Event = cre_observedEvent("al/on",TimeStamp), + Desc = cre_observedEventsDesc(1235,[Event]), + NotifyReq1 = cre_notifyReq([#megaco_term_id{id = ?A5555}],Desc), + CmdReq1 = cre_commandReq({notifyReq, NotifyReq1}), + NotifyReq2 = cre_notifyReq([#megaco_term_id{id = ?A5556}],Desc), + CmdReq2 = cre_commandReq({notifyReq, NotifyReq2}), + ActionInfo1 = [{5000, [CmdReq1]}], + ActionInfo2 = [{5001, [CmdReq2]}], + TransInfo = [{50008, ActionInfo1}, {50009, ActionInfo2}], + msg_request(Mid, TransInfo). + + +msg23d() -> + msg23d(?MG2_MID). +msg23d(Mid) -> + TimeStamp = cre_timeNotation("19990729","24020002"), + Event = cre_observedEvent("al/on",TimeStamp), + Desc = cre_observedEventsDesc(1235,[Event]), + NotifyReq1 = cre_notifyReq([#megaco_term_id{id = ?A5555}],Desc), + CmdReq1 = cre_commandReq({notifyReq, NotifyReq1}), + NotifyReq2 = cre_notifyReq([#megaco_term_id{id = ?A5556}],Desc), + CmdReq2 = cre_commandReq({notifyReq, NotifyReq2}), + NotifyReq3 = cre_notifyReq([#megaco_term_id{id = ?A4444}],Desc), + CmdReq3 = cre_commandReq({notifyReq, NotifyReq3}), + NotifyReq4 = cre_notifyReq([#megaco_term_id{id = ?A4445}],Desc), + CmdReq4 = cre_commandReq({notifyReq, NotifyReq4}), + ActionInfo1 = [{5000, [CmdReq1]}, {5001, [CmdReq2]}], + ActionInfo2 = [{5003, [CmdReq3]}, {5004, [CmdReq4]}], + TransInfo = [{50008, ActionInfo1}, {50009, ActionInfo2}], + msg_request(Mid, TransInfo). + + +%% -------------------------- + +msg24() -> + msg24(?MGC_MID). +msg24(Mid) -> + AuditDesc = cre_auditDesc([statsToken]), + SubReq = cre_subtractReq([#megaco_term_id{id = ?A5555}], AuditDesc), + SubReq2 = cre_subtractReq([#megaco_term_id{id = ?A5556}], AuditDesc), + CmdReq = cre_commandReq({subtractReq, SubReq}), + CmdReq2 = cre_commandReq({subtractReq, SubReq2}), + msg_request(Mid, 50009, 5000, [CmdReq, CmdReq2]). + + +%% -------------------------- + +msg25() -> + msg25(?MG2_MID). +msg25(Mid) -> + Stat11 = cre_statisticsParm("nt/os","45123"), + Stat12 = cre_statisticsParm("nt/dur", "40"), + Stats1 = [Stat11, Stat12], + Reply1 = cre_ammsReply([#megaco_term_id{id = ?A5555}], + [{statisticsDescriptor, Stats1}]), + Stat21 = cre_statisticsParm("rtp/ps","1245"), + Stat22 = cre_statisticsParm("nt/os", "62345"), + Stat23 = cre_statisticsParm("rtp/pr", "780"), + Stat24 = cre_statisticsParm("nt/or", "45123"), + Stat25 = cre_statisticsParm("rtp/pl", "10"), + Stat26 = cre_statisticsParm("rtp/jit", "27"), + Stat27 = cre_statisticsParm("rtp/delay","48"), + Stats2 = [Stat21, Stat22, Stat23, Stat24, Stat25, Stat26, Stat27], + Reply2 = cre_ammsReply([#megaco_term_id{id = ?A5556}], + [{statisticsDescriptor, Stats2}]), + msg_reply(Mid, 50009, 5000, + [{subtractReply, Reply1}, {subtractReply, Reply2}]). + + +msg30a() -> + msg_ack(?MG2_MID, [{9,9}]). + +msg30b() -> + msg_ack(?MG2_MID, [{9,13}]). + +msg30c() -> + msg_ack(?MG2_MID, + [{9,13}, {15,15}, {33,40}, {50,60}, {70,80}, {85,90}, + {101,105},{109,119},{121,130},{140,160},{170,175},{180,189}, + {201,205},{209,219},{221,230},{240,260},{270,275},{280,289}, + {301,305},{309,319},{321,330},{340,360},{370,375},{380,389}, + {401,405},{409,419},{421,430},{440,460},{470,475},{480,489}, + {501,505},{509,519},{521,530},{540,560},{570,575},{580,589} + ]). + +%% Don't think this will be used by the megaco stack, but since it +%% seem's to be a valid construction... +msg30d() -> + msg_ack(?MG2_MID, + [[{9,13}, {15,15}, {33,40}, {50,60}, {70,80}, {85,90}], + [{101,105},{109,119},{121,130},{140,160},{170,175},{180,189}], + [{201,205},{209,219},{221,230},{240,260},{270,275},{280,289}], + [{301,305},{309,319},{321,330},{340,360},{370,375},{380,389}], + [{401,405},{409,419},{421,430},{440,460},{470,475},{480,489}], + [{501,505},{509,519},{521,530},{540,560},{570,575},{580,589}] + ]). + + + +msg40() -> + msg40(?MG1_MID_NO_PORT, "901 mg col boot"). +msg40(Mid, Reason) when is_list(Reason) -> + Address = {portNumber, ?DEFAULT_PORT}, + Profile = cre_serviceChangeProf("resgw",1), + Parm = cre_serviceChangeParm(restart,Address,[Reason],Profile), + Req = cre_serviceChangeReq([?megaco_root_termination_id],Parm), + CmdReq = cre_commandReq({serviceChangeReq, Req}), + Auth = cre_authHeader(), + msg_request(Auth, Mid, 9998, ?megaco_null_context_id, [CmdReq]). + + +%% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%% Pretty RFC 3525 messages: + +%% Added Reason +rfc3525_msg1() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222] Transaction = 9998 { + Context = - { + ServiceChange = ROOT { + Services { + Method = Restart, + Reason = 901, + ServiceChangeAddress = 55555, + Profile = ResGW/1 + } + } + } +}". + +rfc3525_msg2() -> +"MEGACO/" ?VERSION_STR " [123.123.123.4]:55555 Reply = 9998 { + Context = - { + ServiceChange = ROOT { + Services { + ServiceChangeAddress = 55555, + Profile = ResGW/1 + } + } + } +}". + + +%% Removed "," after LocalControl ending "}" +rfc3525_msg3() -> +"MEGACO/" ?VERSION_STR " [123.123.123.4]:55555 Transaction = 9999 { + Context = - { + Modify = A4444 { + Media { + Stream = 1 { + LocalControl { + Mode = SendReceive, + tdmc/gain=2, ; in dB, + tdmc/ec=on + } + } + }, + Events = 2222 { + al/of {strict=state} + } + } + } +}". + +%% Removed the outermost "{}" pair (before the Reply token) +rfc3525_msg4() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222]:55555 Reply = 9999 { + Context = - { + Modify = A4444 + } +}". + +rfc3525_msg6() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222]:55555 Transaction = 10000 { + Context = - { + Notify = A4444 { + ObservedEvents =2222 { + 19990729T22000000:al/of{init=false} + } + } + } +}". + + +rfc3525_msg7() -> +"MEGACO/" ?VERSION_STR " [123.123.123.4]:55555 Reply = 10000 { + Context = - { + Notify = A4444 + } +}". + +rfc3525_msg8() -> +"MEGACO/" ?VERSION_STR " [123.123.123.4]:55555 Transaction = 10001 { + Context = - { + Modify = A4444 { + Events = 2223 { + al/on {strict=state}, + dd/ce {DigitMap=Dialplan0} + }, + Signals {cg/dt}, + DigitMap = Dialplan0 { + (0| 00|[1-7]xxx|8xxxxxxx|fxxxxxxx|exx|91xxxxxxxxxx|9011x.) + } + } + } +}". + +rfc3525_msg9() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222]:55555 Reply = 10001 { + Context = - { + Modify = A4444 + } +}". + +rfc3525_msg10() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222]:55555 Transaction = 10002 { + Context = - { + Notify = A4444 { + ObservedEvents =2223 { + 19990729T22010001:dd/ce { + ds=\"916135551212\", + Meth=UM + } + } + } + } +}". + + +rfc3525_msg11() -> +"MEGACO/" ?VERSION_STR " [123.123.123.4]:55555 Reply = 10002 { + Context = - { + Notify = A4444 + } +}". + +%% Added ? +rfc3525_msg12() -> +"MEGACO/" ?VERSION_STR " [123.123.123.4]:55555 Transaction = 10003 { + Context = $ { + Add = A4444, + Add = $ { + Media { + Stream = 1 { + LocalControl { + Mode = ReceiveOnly, + nt/jit=40 ; in ms + }, + Local { + v=0 c=IN IP4 $ m=audio $ RTP/AVP 4 a=ptime:30 v=0 c=IN IP4 $ m=audio $ RTP/AVP 0 + } + } + } + } + } +}". + +%% Added ? +rfc3525_msg13() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222]:55555 Reply = 10003 { + Context = 2000 { + Add = A4444, + Add = A4445 { + Media { + Stream = 1 { + Local { +v=0 +o=- 2890844526 2890842807 IN IP4 124.124.124.222 +s=- +t= 0 0 +c=IN IP4 124.124.124.222 +m=audio 2222 RTP/AVP 4 +a=ptime:30 +a=recvonly + } ; RTP profile for G.723.1 is 4 + } + } + } + } +}". + +%% +%% Added ? +rfc3525_msg14() -> +"MEGACO/" ?VERSION_STR " [123.123.123.4]:55555 Transaction = 50003 { + Context = $ { + Add = A5555 { + Media { + Stream = 1 { + LocalControl { + Mode = SendReceive + } + } + }, + Events = 1234 { + al/of {strict=state} + }, + Signals {al/ri} + }, + Add = $ { + Media { + Stream = 1 { + LocalControl { + Mode = SendReceive, + nt/jit=40 ; in ms + }, + Local { + v=0 c=IN IP4 $ m=audio $ RTP/AVP 4 a=ptime:30 + }, + Remote { + v=0 c=IN IP4 124.124.124.222 m=audio 2222 RTP/AVP 4 a=ptime:30 + } ; RTP profile for G.723.1 is 4 + } + } + } + } +}". + +%% Added ? +rfc3525_msg15() -> +"MEGACO/" ?VERSION_STR " [125.125.125.111]:55555 Reply = 50003 { + Context = 5000 { + Add = A5555, + Add = A5556 { + Media { + Stream = 1 { + Local { + v=0 o=- 7736844526 7736842807 IN IP4 125.125.125.111 s=- t= 0 0 c=IN IP4 125.125.125.111 m=audio 1111 RTP/AVP 4 + } ; RTP profile for G723.1 is 4 + } + } + } + } +}". + +%% Added ? +rfc3525_msg16a() -> +"MEGACO/" ?VERSION_STR " [123.123.123.4]:55555 Transaction = 10005 { + Context = 2000 { + Modify = A4444 { + Signals {cg/rt} + }, + Modify = A4445 { + Media { + Stream = 1 { + Remote { + v=0 o=- 7736844526 7736842807 IN IP4 125.125.125.111 s=- t= 0 0 c=IN IP4 125.125.125.111 m=audio 1111 RTP/AVP 4 + } ; RTP profile for G723.1 is 4 + } + } + } + } +}". + +rfc3525_msg16b() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222]:55555 Reply = 10005 { + Context = 2000 { + Modify = A4444, + Modify = A4445 + } +}". + +rfc3525_msg17a() -> +"MEGACO/" ?VERSION_STR " [125.125.125.111]:55555 Transaction = 50005 { + Context = 5000 { + Notify = A5555 { + ObservedEvents = 1234 { + 19990729T22020002:al/of{init=false} + } + } + } +}". + +rfc3525_msg17b() -> +"MEGACO/" ?VERSION_STR " [123.123.123.4]:55555 Reply = 50005 { + Context = - { + Notify = A5555 + } +}". + +%% Removed "{ }" after Signals +rfc3525_msg17c() -> +"MEGACO/" ?VERSION_STR " [123.123.123.4]:55555 Transaction = 50006 { + Context = 5000 { + Modify = A5555 { + Events = 1235 { + al/on{strict=state} + }, + Signals ; to turn off ringing + } + } +}". + +rfc3525_msg17d() -> +"MEGACO/" ?VERSION_STR " [125.125.125.111]:55555 Reply = 50006 { + Context = 5000 { + Modify = A4445 + } +}". + +%% Removed "{ }" after Signals +rfc3525_msg18a() -> +"MEGACO/" ?VERSION_STR " [123.123.123.4]:55555 Transaction = 10006 { + Context = 2000 { + Modify = A4445 { + Media { + Stream = 1 { + LocalControl { + Mode = SendReceive + } + } + } + }, + Modify = A4444 { + Signals + } + } +}". + +rfc3525_msg18b() -> +"MEGACO/" ?VERSION_STR " [124.124.124.222]:55555 Reply = 10006 { + Context = 2000 { + Modify = A4445, + Modify = A4444 + } +}". + +rfc3525_msg19() -> +"MEGACO/" ?VERSION_STR " [123.123.123.4]:55555 Transaction = 50007 { + Context = - { + AuditValue = A5556 { + Audit { + Media, DigitMap, Events, Signals, Packages, Statistics + } + } + } +}". + +%% Added ? +rfc3525_msg20() -> +"MEGACO/" ?VERSION_STR " [125.125.125.111]:55555 Reply = 50007 { + Context = - { + AuditValue = A5556 { + Media { + TerminationState { + ServiceStates = InService, + Buffer = OFF + }, + Stream = 1 { + LocalControl { + Mode = SendReceive, + nt/jit=40 + }, + Local { + v=0 o=- 7736844526 7736842807 IN IP4 125.125.125.111 s=- t= 0 0 c=IN IP4 125.125.125.111 m=audio 1111 RTP/AVP 4 a=ptime:30 + }, + Remote { + v=0 o=- 2890844526 2890842807 IN IP4 124.124.124.222 s=- t= 0 0 c=IN IP4 124.124.124.222 m=audio 2222 RTP/AVP 4 a=ptime:30 + } + } + }, + Events, + Signals, + DigitMap, + Packages {nt-1, rtp-1}, + Statistics { + rtp/ps=1200, ; packets sent + nt/os=62300, ; octets sent + rtp/pr=700, ; packets received + nt/or=45100, ; octets received + rtp/pl=0.2, ; % packet loss + rtp/jit=20, + rtp/delay=40 ; avg latency + } + } + } +}". + +rfc3525_msg21a() -> +"MEGACO/" ?VERSION_STR " [125.125.125.111]:55555 Transaction = 50008 { + Context = 5000 { + Notify = A5555 { + ObservedEvents =1235 { + 19990729T24020002:al/on {init=false} + } + } + } +}". + +rfc3525_msg21b() -> +"MEGACO/" ?VERSION_STR " [123.123.123.4]:55555 Reply = 50008 { + Context = - { + Notify = A5555 + } +}". + +rfc3525_msg22a() -> +"MEGACO/" ?VERSION_STR " [123.123.123.4]:55555 Transaction = 50009 { + Context = 5000 { + Subtract = A5555 { + Audit { + Statistics + } + }, + Subtract = A5556 { + Audit { + Statistics + } + } + } +}". + +%% Added ? +rfc3525_msg22b() -> +"MEGACO/" ?VERSION_STR " [125.125.125.111]:55555 Reply = 50009 { + Context = 5000 { + Subtract = A5555 { + Statistics { + nt/os=45123, ; Octets Sent + nt/dur=40 ; in seconds + } + }, + Subtract = A5556 { + Statistics { + rtp/ps=1245, ; packets sent + nt/os=62345, ; octets sent + rtp/pr=780, ; packets received + nt/or=45123, ; octets received + rtp/pl=10, ; % packets lost + rtp/jit=27, + rtp/delay=48 ; average latency + } + } + } +}". + + +rfc3525_msgs() -> + [ + {msg1, rfc3525_msg1()}, + {msg2, rfc3525_msg2()}, + {msg3, rfc3525_msg3()}, + {msg4, rfc3525_msg4()}, + {msg6, rfc3525_msg6()}, + {msg7, rfc3525_msg7()}, + {msg8, rfc3525_msg8()}, + {msg9, rfc3525_msg9()}, + {msg10, rfc3525_msg10()}, + {msg11, rfc3525_msg11()}, + {msg12, rfc3525_msg12()}, + {msg13, rfc3525_msg13()}, + {msg14, rfc3525_msg14()}, + {msg15, rfc3525_msg15()}, + {msg16a, rfc3525_msg16a()}, + {msg16b, rfc3525_msg16b()}, + {msg17a, rfc3525_msg17a()}, + {msg17b, rfc3525_msg17b()}, + {msg17c, rfc3525_msg17c()}, + {msg17d, rfc3525_msg17d()}, + {msg18a, rfc3525_msg18a()}, + {msg18b, rfc3525_msg18b()}, + {msg19, rfc3525_msg19()}, + {msg20, rfc3525_msg20()}, + {msg21a, rfc3525_msg21a()}, + {msg21b, rfc3525_msg21b()}, + {msg22a, rfc3525_msg22a()}, + {msg22b, rfc3525_msg22b()} + ]. + + +rfc3525_msgs_display() -> + Msgs = rfc3525_msgs(), + Fun = fun({Name, Msg}) -> + io:format("~w: ~n~s~n~n", [Name, Msg]) + end, + lists:foreach(Fun, Msgs). + +rfc3525_msgs_test() -> + put(dbg,true), + Res = rfc3525_msgs_test(megaco_pretty_text_encoder, [], 1), + erase(dbg), + io:format("~w~n", [Res]). + +rfc3525_msgs_test(Codec, Config, Ver) -> + io:format("-----------------------------------------" + "~ntesting with" + "~n Codec: ~w" + "~n Config: ~w" + "~n Version: ~w" + "~n", [Codec, Config, Ver]), + Msgs = rfc3525_msgs(), + Test = fun({N,M1}) -> + %% io:format("testing ~w: ", [N]), + io:format("~n*** testing ~w *** ~n~s~n", [N,M1]), + Bin1 = erlang:list_to_binary(M1), + case (catch Codec:decode_message(Config, Ver, Bin1)) of + {ok, M2} -> + %% io:format("d", []), + io:format("decoded:~n~p~n", [M2]), + case (catch Codec:encode_message(Config, Ver, M2)) of + {ok, Bin2} when is_binary(Bin2) -> + %% io:format("e~n", []), + io:format("encode: ~n~s~n", [erlang:binary_to_list(Bin2)]), + {N,ok}; + {ok, M3} -> + %% io:format("e~n", []), + io:format("encode: ~n~s~n", [M3]), + {N,ok}; + E -> + io:format("~n~p~n", [E]), + {N,encode_error} + end; + E -> + io:format("~n~p~n", [E]), + {N,decode_error} + end + end, + [Test(M) || M <- Msgs]. + +%% -------------------------- + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +skip(Reason) -> + megaco_codec_test_lib:skip(Reason). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +decode_message(Codec, DynamicDecode, Conf, Bin) -> + megaco_codec_test_lib:decode_message(Codec, DynamicDecode, ?VERSION, + Conf, Bin). +encode_message(Codec, Conf, Msg) -> + megaco_codec_test_lib:encode_message(Codec, ?VERSION, Conf, Msg). + +test_msgs(Codec, DynamicDecode, Conf, Msgs) -> + megaco_codec_test_lib:test_msgs(Codec, DynamicDecode, ?VERSION, Conf, + fun chk_MegacoMessage/2, Msgs). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +chk_MegacoMessage(M,M) when is_record(M,'MegacoMessage') -> + ok; +chk_MegacoMessage(#'MegacoMessage'{authHeader = Auth1, + mess = Mess1}, + #'MegacoMessage'{authHeader = Auth2, + mess = Mess2}) -> + chk_opt_AuthenticationHeader(Auth1,Auth2), + chk_Message(Mess1,Mess2), + ok; +chk_MegacoMessage(M1, M2) -> + wrong_type({'MegacoMessage', M1, M2}). + +chk_opt_AuthenticationHeader(A,A) -> + ok; +chk_opt_AuthenticationHeader(A1,A2) -> + not_equal({auth,A1,A2}). + +chk_Message(M,M) when is_record(M,'Message') -> + ok; +chk_Message(#'Message'{version = Version1, + mId = MID1, + messageBody = Body1}, + #'Message'{version = Version2, + mId = MID2, + messageBody = Body2}) -> + chk_version(Version1,Version2), + chk_MId(MID1,MID2), + chk_messageBody(Body1,Body2), + ok; +chk_Message(M1,M2) -> + wrong_type({'Message',M1,M2}). + + +chk_version(V,V) when is_integer(V) -> + ok; +chk_version(V1,V2) when is_integer(V1) andalso is_integer(V2) -> + not_equal({version,V1,V2}); +chk_version(V1,V2) -> + wrong_type({integer,V1,V2}). + + +chk_MId(M,M) -> + {equal,mid}; +chk_MId({Tag,M1},{Tag,M2}) -> + Res = chk_MId(Tag,M1,M2), + equal(Res); +chk_MId(M1,M2) -> + not_equal({mid,M1,M2}). + +chk_MId(ip4Address,M1,M2) -> chk_IP4Address(M1, M2); +chk_MId(ip6Address,M1,M2) -> chk_IP6Address(M1, M2); +chk_MId(domainName,M1,M2) -> chk_DomainName(M1, M2); +chk_MId(deviceName,M1,M2) -> chk_PathName(M1, M2); +chk_MId(mtpAddress,M1,M2) -> chk_mtpAddress(M1, M2); +chk_MId(Tag,M1,M2) -> + wrong_type({invalid_tag,Tag,M1,M2}). + + +chk_IP4Address(M, M) -> + ok; +chk_IP4Address(M1, M2) -> + not_equal({ip4Address,M1,M2}). + +chk_IP6Address(M, M) -> + ok; +chk_IP6Address(M1, M2) -> + not_equal({ip6Address,M1,M2}). + +chk_DomainName(D, D) when is_record(D,'DomainName') -> + ok; +chk_DomainName(#'DomainName'{name = Name1, + portNumber = Port1}, + #'DomainName'{name = Name2, + portNumber = Port2}) -> + chk_DomainName_name(Name1,Name2), + chk_DomainName_opt_portNumber(Port1,Port2), + equal('DomainName'); +chk_DomainName(D1,D2) -> + wrong_type({'DomainName',D1,D2}). + +chk_DomainName_name(N,N) when is_list(N) -> + ok; +chk_DomainName_name(N1,N2) when is_list(N1) andalso is_list(N2) -> + not_equal({'DomainName',name,N1,N2}); +chk_DomainName_name(N1,N2) -> + wrong_type({'DomainName',name,N1,N2}). + +chk_DomainName_opt_portNumber(asn1_NOVALUE, asn1_NOVALUE) -> + ok; +chk_DomainName_opt_portNumber(P,P) + when is_integer(P) andalso (P >= 0) -> + ok; +chk_DomainName_opt_portNumber(P1,P2) + when (is_integer(P1) andalso (P1 >= 0) andalso + is_integer(P2) andalso (P2 >= 0)) -> + not_equal({'DomainName',portNumber,P1,P2}); +chk_DomainName_opt_portNumber(P1,P2) -> + wrong_type({'DomainName',portNumber,P1,P2}). + + +chk_PathName(P, P) -> + ok; +chk_PathName(P1, P2) -> + not_equal({pathname,P1,P2}). + +chk_mtpAddress(M, M) -> + ok; +chk_mtpAddress(M1, M2) -> + not_equal({mtpAddress, M1, M2}). + + +chk_messageBody({messageError, B}, + {messageError, B}) when is_record(B,'ErrorDescriptor') -> + ok; +chk_messageBody({messageError,B1},{messageError,B2}) -> + chk_ErrorDescriptor(B1,B2), + equal({messageBody, messageError}); +chk_messageBody({transactions,T},{transactions,T}) when is_list(T) -> + ok; +chk_messageBody({transactions,T1},{transactions,T2}) -> + chk_transactions(T1,T2), + ok; +chk_messageBody(B1,B2) -> + wrong_type({messageBody,B1,B2}). + + +chk_transactions(T,T) when is_list(T) -> + ok; +chk_transactions(T1,T2) + when is_list(T1) andalso is_list(T2) andalso (length(T1) =:= length(T2)) -> + chk_transactions1(T1,T2); +chk_transactions(T1,T2) + when is_list(T1) andalso is_list(T2) -> + not_equal({transactions, T1, T2}); +chk_transactions(T1, T2) -> + wrong_type({transactions,T1,T2}). + +chk_transactions1([],[]) -> + equal(transactions); +chk_transactions1([T|Ts1],[T|Ts2]) -> + chk_transactions1(Ts1,Ts2); +chk_transactions1([T1|_Ts1],[T2|_Ts2]) -> + chk_transaction(T1,T2), + ok. + +chk_transaction(T,T) -> + ok; +chk_transaction({transactionRequest,T1},{transactionRequest,T2}) -> + chk_transactionRequest(T1,T2), + ok; +chk_transaction({transactionPending,T1},{transactionPending,T2}) -> + chk_transactionPending(T1,T2), + equal({transactionPending,T1,T2}); +chk_transaction({transactionReply,T1},{transactionReply,T2}) -> + chk_transactionReply(T1,T2), + equal({transactionReply,T1,T2}); +chk_transaction({transactionResponseAck,T1},{transactionResponseAck,T2}) -> + chk_transactionAck(T1,T2), + equal({transactionResponseAck,T1,T2}); +chk_transaction({Tag1,_T1},{Tag2,_T2}) -> + wrong_type({transaction_tag,Tag1,Tag2}). + + +chk_transactionRequest(T,T) when is_record(T,'TransactionRequest') -> + ok; +chk_transactionRequest(T1,T2) when is_record(T1,'TransactionRequest') andalso + is_record(T2,'TransactionRequest') -> + chk_transactionId(T1#'TransactionRequest'.transactionId, + T2#'TransactionRequest'.transactionId), + chk_actionRequests(T1#'TransactionRequest'.actions, + T2#'TransactionRequest'.actions), + ok; +chk_transactionRequest(T1,T2) -> + wrong_type({transactionRequest,T1,T2}). + + +chk_transactionPending(T,T) when is_record(T,'TransactionPending') -> + ok; +chk_transactionPending(#'TransactionPending'{transactionId = Id1}, + #'TransactionPending'{transactionId = Id2}) -> + chk_transactionId(Id1,Id2), + equal(transactionPending); +chk_transactionPending(T1,T2) -> + wrong_type({transactionPending,T1,T2}). + +chk_transactionReply(T,T) when is_record(T,'TransactionReply') -> + ok; +chk_transactionReply(#'TransactionReply'{transactionId = Id1, + immAckRequired = ImmAck1, + transactionResult = TransRes1}, + #'TransactionReply'{transactionId = Id2, + immAckRequired = ImmAck2, + transactionResult = TransRes2}) -> + chk_transactionId(Id1,Id2), + ImmAck1 = ImmAck2, + chk_transactionReply_transactionResult(TransRes1,TransRes2), + equal(transactionReply); +chk_transactionReply(T1,T2) -> + wrong_type({transactionReply,T1,T2}). + +chk_transactionReply_transactionResult(R,R) -> + ok; +chk_transactionReply_transactionResult(R1,R2) -> + not_equal({transactionReply_transactionResult,R1,R2}). + +chk_transactionAck(T,T) when is_record(T,'TransactionAck') -> + ok; +chk_transactionAck(#'TransactionAck'{firstAck = F1, + lastAck = L1}, + #'TransactionAck'{firstAck = F2, + lastAck = L2}) -> + chk_transactionId(F1,F2), + chk_opt_transactionId(L1,L2), + equal('TransactionAck'); +chk_transactionAck(T1,T2) -> + wrong_type({transactionAck,T1,T2}). + + +chk_actionRequests(A,A) when is_list(A) andalso (length(A) =:= 0) -> + ok; +chk_actionRequests(A,A) when is_list(A) -> + case hd(A) of + A when is_record(A,'ActionRequest') -> + ok; + Else -> + wrong_type({'ActionRequest',Else}) + end; +chk_actionRequests(A1,A2) + when is_list(A1) andalso is_list(A2) andalso (length(A1) =:= length(A2)) -> + chk_actionRequests1(A1,A2); +chk_actionRequests(A1,A2) -> + wrong_type({actionRequests,A1,A2}). + +chk_actionRequests1([],[]) -> + equal(actionRequests); +chk_actionRequests1([A|As1],[A|As2]) when is_record(A,'ActionRequest') -> + chk_actionRequests1(As1,As2); +chk_actionRequests1([A1|_As1],[A2|_As2]) -> + chk_actionRequest(A1,A2), + ok. + +chk_actionRequest(A,A) when is_record(A,'ActionRequest') -> + ok; +chk_actionRequest(#'ActionRequest'{contextId = Id1, + contextRequest = Req1, + contextAttrAuditReq = AuditReq1, + commandRequests = CmdReqs1}, + #'ActionRequest'{contextId = Id2, + contextRequest = Req2, + contextAttrAuditReq = AuditReq2, + commandRequests = CmdReqs2}) -> + t("chk_actionRequest -> entry with" + "~n CmdReqs1: ~p" + "~n CmdReqs2: ~p",[CmdReqs1,CmdReqs2]), + chk_contextId(Id1,Id2), + chk_opt_contextRequest(Req1,Req2), + chk_opt_contextAttrAuditReq(AuditReq1,AuditReq2), + chk_commandRequests(CmdReqs1,CmdReqs2), + ok. + +chk_contextId(Id,Id) when is_integer(Id) -> + ok; +chk_contextId(Id1,Id2) when is_integer(Id1) andalso is_integer(Id2) -> + not_equal({contextId,Id1,Id2}); +chk_contextId(Id1,Id2) -> + wrong_type({contextId,Id1,Id2}). + +chk_opt_contextRequest(asn1_NOVALUE, asn1_NOVALUE) -> + ok; +chk_opt_contextRequest(R,R) when is_record(R,'ContextRequest') -> + ok; +chk_opt_contextRequest(#'ContextRequest'{priority = Prio1, + emergency = Em1, + topologyReq = TopReq1} = C1, + #'ContextRequest'{priority = Prio2, + emergency = Em2, + topologyReq = TopReq2} = C2) -> + chk_contextRequest_priority(Prio1,Prio2), + chk_contextRequest_emergency(Em1,Em2), + chk_topologyRequest(TopReq1,TopReq2), + equal({'ContextRequest',C1,C2}). + +chk_contextRequest_priority(asn1_NOVALUE,asn1_NOVALUE) -> + ok; +chk_contextRequest_priority(P,P) when is_integer(P) -> + ok; +chk_contextRequest_priority(P1,P2) when is_integer(P1) andalso is_integer(P2) -> + not_equal({contextRequest_priority,P1,P2}); +chk_contextRequest_priority(P1,P2) -> + wrong_type({contextRequest_priority,P1,P2}). + +chk_contextRequest_emergency(asn1_NOVALUE,asn1_NOVALUE) -> + ok; +chk_contextRequest_emergency(true,true) -> + ok; +chk_contextRequest_emergency(false,false) -> + ok; +chk_contextRequest_emergency(E1,E2) -> + not_equal({contextRequest_emergency,E1,E2}). + +chk_topologyRequest(asn1_NOVALUE,asn1_NOVALUE) -> + ok; +chk_topologyRequest(T,T) when is_record(T,'TopologyRequest') -> + ok; +chk_topologyRequest(#'TopologyRequest'{terminationFrom = F1, + terminationTo = T1, + topologyDirection = D1} = T1, + #'TopologyRequest'{terminationFrom = F2, + terminationTo = T2, + topologyDirection = D2} = T2) -> + chk_terminationId(F1,F2), + chk_terminationId(T1,T2), + chk_topologyRequest_topologyDirection(D1,D2), + equal({'TopologyRequest',D1,D2}). + +chk_topologyRequest_topologyDirection(bothway,bothway) -> + ok; +chk_topologyRequest_topologyDirection(isolate,isolate) -> + ok; +chk_topologyRequest_topologyDirection(oneway,oneway) -> + ok; +chk_topologyRequest_topologyDirection(D1,D2) -> + not_equal({topologyRequest_topologyDirection, D1, D2}). + +chk_opt_contextAttrAuditReq(asn1_NOVALUE,asn1_NOVALUE) -> + ok; +chk_opt_contextAttrAuditReq(R,R) when is_record(R,'ContextAttrAuditRequest') -> + ok; +chk_opt_contextAttrAuditReq(#'ContextAttrAuditRequest'{topology = T1, + emergency = E1, + priority = P1} = R1, + #'ContextAttrAuditRequest'{topology = T2, + emergency = E2, + priority = P2} = R2) -> + T1 = T2, + E1 = E2, + P1 = P2, + equal({'ContextAttrAuditRequest',R1,R2}). + +chk_commandRequests(C1,C2) + when is_list(C1) andalso is_list(C2) andalso (length(C1) =:= length(C2)) -> + t("chk_commandRequests -> entry with" + "~n C1: ~p" + "~n C2: ~p", [C1, C2]), + chk_commandRequests1(C1,C2); +chk_commandRequests(C1,C2) -> + t("chk_commandRequests -> entry",[]), + wrong_type({commandRequests,C1,C2}). + +chk_commandRequests1([],[]) -> + ok; +chk_commandRequests1([C1|Cs1],[C2|Cs2]) -> + chk_commandRequest(C1,C2), + chk_commandRequests1(Cs1,Cs2). + +chk_commandRequest(C,C) when is_record(C,'CommandRequest') -> + ok; +chk_commandRequest(#'CommandRequest'{command = Cmd1, + optional = O1, + wildcardReturn = W1}, + #'CommandRequest'{command = Cmd2, + optional = O2, + wildcardReturn = W2}) -> + t("chk_commandRequest -> entry with" + "~n C1: ~p" + "~n C2: ~p", [Cmd1, Cmd2]), + chk_commandRequest_command(Cmd1,Cmd2), + O1 = O2, + W1 = W2, + ok; +chk_commandRequest(C1,C2) -> + wrong_type({commandRequest,C1,C2}). + +chk_commandRequest_command({addReq,C1},{addReq,C2}) -> + chk_AmmRequest(C1,C2); +chk_commandRequest_command({moveReq,C1},{moveReq,C2}) -> + chk_AmmRequest(C1,C2); +chk_commandRequest_command({modReq,C1},{modReq,C2}) -> + chk_AmmRequest(C1,C2); +chk_commandRequest_command({subtractReq,C1},{subtractReq,C2}) -> + chk_SubtractRequest(C1,C2); +chk_commandRequest_command({auditCapRequest,C1},{auditCapRequest,C2}) -> + chk_AuditRequest(C1,C2); +chk_commandRequest_command({auditValueRequest,C1},{auditValueRequest,C2}) -> + chk_AuditRequest(C1,C2); +chk_commandRequest_command({notifyReq,C1},{notifyReq,C2}) -> + chk_NotifyRequest(C1,C2); +chk_commandRequest_command({serviceChangeReq,C1},{serviceChangeReq,C2}) -> + chk_ServiceChangeRequest(C1,C2); +chk_commandRequest_command(C1,C2) -> + wrong_type({commandRequest_command,C1,C2}). + + +chk_AmmRequest(R,R) when is_record(R,'AmmRequest') -> + ok; +chk_AmmRequest(#'AmmRequest'{terminationID = Tids1, + descriptors = D1}, + #'AmmRequest'{terminationID = Tids2, + descriptors = D2}) -> + chk_terminationIds(Tids1,Tids2), + chk_AmmRequest_descriptors(D1,D2), + ok; +chk_AmmRequest(R1,R2) -> + wrong_type({'AmmRequest',R1,R2}). + +chk_AmmRequest_descriptors([],[]) -> + ok; +chk_AmmRequest_descriptors(D1,D2) + when is_list(D1) andalso is_list(D2) andalso (length(D1) =:= length(D2)) -> + chk_AmmRequest_descriptors1(D1,D2); +chk_AmmRequest_descriptors(D1,D2) -> + wrong_type({ammRequest_descriptors,D1,D2}). + +chk_AmmRequest_descriptors1([],[]) -> + ok; +chk_AmmRequest_descriptors1([D1|Ds1],[D2|Ds2]) -> + chk_AmmRequest_descriptor(D1,D2), + chk_AmmRequest_descriptors1(Ds1,Ds2). + +chk_AmmRequest_descriptor({mediaDescriptor,D1},{mediaDescriptor,D2}) -> + chk_MediaDescriptor(D1,D2); +chk_AmmRequest_descriptor({modemDescriptor,D1},{modemDescriptor,D2}) -> + chk_ModemDescriptor(D1,D2); +chk_AmmRequest_descriptor({muxDescriptor,D1},{muxDescriptor,D2}) -> + chk_MuxDescriptor(D1,D2); +chk_AmmRequest_descriptor({eventsDescriptor,D1},{eventsDescriptor,D2}) -> + chk_EventsDescriptor(D1,D2); +chk_AmmRequest_descriptor({eventBufferDescriptor,D1},{eventBufferDescriptor,D2}) -> + chk_EventBufferDescriptor(D1,D2); +chk_AmmRequest_descriptor({signalsDescriptor,D1},{signalsDescriptor,D2}) -> + chk_SignalsDescriptor(D1,D2); +chk_AmmRequest_descriptor({digitMapDescriptor,D1},{digitMapDescriptor,D2}) -> + chk_DigitMapDescriptor(D1,D2); +chk_AmmRequest_descriptor({auditDescriptor,D1},{auditDescriptor,D2}) -> + chk_AuditDescriptor(D1,D2); +chk_AmmRequest_descriptor({Tag1,_D1},{Tag2,_D2}) -> + wrong_type({ammRequest_descriptor_tag,Tag1,Tag2}). + + +chk_SubtractRequest(R,R) when is_record(R,'SubtractRequest') -> + ok; +chk_SubtractRequest(#'SubtractRequest'{terminationID = Tids1, + auditDescriptor = D1} = R1, + #'SubtractRequest'{terminationID = Tids2, + auditDescriptor = D2} = R2) -> + chk_terminationIds(Tids1, Tids2), + chk_opt_AuditDescriptor(D1, D2), + equal({'SubtractRequest',R1,R2}); +chk_SubtractRequest(R1,R2) -> + wrong_type({'SubtractRequest',R1,R2}). + + +chk_AuditRequest(R,R) when is_record(R,'AuditRequest') -> + ok; +chk_AuditRequest(#'AuditRequest'{terminationID = Tid1, + auditDescriptor = D1} = R1, + #'AuditRequest'{terminationID = Tid2, + auditDescriptor = D2} = R2) -> + chk_terminationId(Tid1,Tid2), + chk_AuditDescriptor(D1,D2), + equal({'AuditRequest',R1,R2}); +chk_AuditRequest(R1,R2) -> + wrong_type({'AuditRequest',R1,R2}). + + +chk_NotifyRequest(R,R) when is_record(R,'NotifyRequest') -> + ok; +chk_NotifyRequest(#'NotifyRequest'{terminationID = Tids1, + observedEventsDescriptor = ObsDesc1, + errorDescriptor = ErrDesc1} = R1, + #'NotifyRequest'{terminationID = Tids2, + observedEventsDescriptor = ObsDesc2, + errorDescriptor = ErrDesc2} = R2) -> + chk_terminationIds(Tids1,Tids2), + chk_ObservedEventsDescriptor(ObsDesc1,ObsDesc2), + chk_opt_ErrorDescriptor(ErrDesc1,ErrDesc2), + equal({'NotifyRequest',R1,R2}); +chk_NotifyRequest(R1,R2) -> + wrong_type({'NotifyRequest',R1,R2}). + + +chk_ServiceChangeRequest(R,R) when is_record(R,'ServiceChangeRequest') -> + ok; +chk_ServiceChangeRequest(#'ServiceChangeRequest'{terminationID = Tids1, + serviceChangeParms = P1} = R1, + #'ServiceChangeRequest'{terminationID = Tids2, + serviceChangeParms = P2} = R2) -> + chk_terminationIds(Tids1,Tids2), + chk_ServiceChangeParm(P1,P2), + equal({'ServiceChangeRequest',R1,R2}); +chk_ServiceChangeRequest(R1,R2) -> + wrong_type({'ServiceChangeRequest',R1,R2}). + + +chk_MediaDescriptor(D, D) when is_record(D,'MediaDescriptor') -> + ok; +chk_MediaDescriptor(#'MediaDescriptor'{termStateDescr = Tsd1, + streams = S1} = D1, + #'MediaDescriptor'{termStateDescr = Tsd2, + streams = S2} = D2) -> +%% io:format("chk_MediaDescriptor -> entry with" +%% "~n Tsd1: ~p" +%% "~n Tsd2: ~p" +%% "~n S1: ~p" +%% "~n S2: ~p" +%% "~n", [Tsd1, Tsd2, S1, S2]), + chk_MediaDescriptor_tsd(Tsd1, Tsd2), + chk_MediaDescriptor_streams(S1, S2), + equal({'MediaDescriptor',D1,D2}); +chk_MediaDescriptor(D1,D2) -> + wrong_type({'MediaDescriptor',D1,D2}). + +chk_MediaDescriptor_tsd(D, D) -> + ok; +chk_MediaDescriptor_tsd(D1, D2) -> + not_equal({termStateDescr, D1, D2}). + +chk_MediaDescriptor_streams({oneStream, S}, {oneStream, S}) -> + ok; +chk_MediaDescriptor_streams({oneStream, S1}, {oneStream, S2}) -> + not_equal({oneStream, S1, S2}); +chk_MediaDescriptor_streams({multiStream, MS}, {multiStream, MS}) -> + ok; +chk_MediaDescriptor_streams({multiStream, MS1}, {multiStream, MS2}) -> + chk_StreamDescriptors(MS1, MS2); +chk_MediaDescriptor_streams(S1, S2) -> + not_equal({streams, S1, S2}). + +chk_StreamDescriptors([], []) -> + ok; +chk_StreamDescriptors([SD1|MS1], [SD2|MS2]) -> + chk_StreamDescriptor(SD1, SD2), + chk_StreamDescriptors(MS1, MS2). + +chk_StreamDescriptor(SD, SD) when is_record(SD, 'StreamDescriptor') -> + ok; +chk_StreamDescriptor(#'StreamDescriptor'{streamID = SID1, + streamParms = SP1} = SD1, + #'StreamDescriptor'{streamID = SID2, + streamParms = SP2} = SD2) -> + SID1 = SID2, + chk_StreamParms(SP1, SP2), + equal({'StreamDescriptor',SD1, SD2}); +chk_StreamDescriptor(SD1, SD2) -> + wrong_type({'StreamDescriptor',SD1,SD2}). + + +chk_StreamParms(SP, SP) when is_record(SP, 'StreamParms') -> + ok; +chk_StreamParms(#'StreamParms'{localControlDescriptor = LCD1, + localDescriptor = LD1, + remoteDescriptor = RD1} = SP1, + #'StreamParms'{localControlDescriptor = LCD2, + localDescriptor = LD2, + remoteDescriptor = RD2} = SP2) -> + LCD1 = LCD2, + LD1 = LD2, + RD1 = RD2, + equal({'StreamParms', SP1, SP2}); +chk_StreamParms(SP1, SP2) -> + wrong_type({'StreamDescriptor', SP1, SP2}). + +chk_ModemDescriptor(D,D) when is_record(D,'ModemDescriptor') -> + ok; +chk_ModemDescriptor(#'ModemDescriptor'{mtl = T1, + mpl = P1} = D1, + #'ModemDescriptor'{mtl = T2, + mpl = P2} = D2) -> + T1 = T2, + P1 = P2, + equal({'ModemDescriptor',D1,D2}); +chk_ModemDescriptor(D1,D2) -> + wrong_type({'ModemDescriptor',D1,D2}). + +chk_MuxDescriptor(D,D) when is_record(D,'MuxDescriptor') -> + ok; +chk_MuxDescriptor(#'MuxDescriptor'{muxType = T1, + termList = I1} = D1, + #'MuxDescriptor'{muxType = T2, + termList = I2} = D2) -> + T1 = T2, + I1 = I2, + equal({'MuxDescriptor',D1,D2}); +chk_MuxDescriptor(D1,D2) -> + wrong_type({'MuxDescriptor',D1,D2}). + +chk_EventsDescriptor(D,D) when is_record(D,'EventsDescriptor') -> + ok; +chk_EventsDescriptor(#'EventsDescriptor'{requestID = I1, + eventList = E1} = D1, + #'EventsDescriptor'{requestID = I2, + eventList = E2} = D2) -> + I1 = I2, + E1 = E2, + equal({'EventsDescriptor',D1,D2}); +chk_EventsDescriptor(D1,D2) -> + wrong_type({'EventsDescriptor',D1,D2}). + +chk_EventBufferDescriptor(D1,D2) + when is_list(D1) andalso is_list(D2) andalso (length(D1) =:= length(D2)) -> + chk_EventBufferDescriptor1(D1,D2); +chk_EventBufferDescriptor(D1,D2) -> + wrong_type({eventBufferDescriptor,D1,D2}). + +chk_EventBufferDescriptor1([],[]) -> + ok; +chk_EventBufferDescriptor1([ES1|D1],[ES2|D2]) -> + chk_EventSpec(ES1,ES2), + chk_EventBufferDescriptor1(D1,D2). + +chk_EventSpec(ES,ES) when is_record(ES,'EventSpec') -> + ok; +chk_EventSpec(#'EventSpec'{eventName = N1, + streamID = I1, + eventParList = P1} = ES1, + #'EventSpec'{eventName = N2, + streamID = I2, + eventParList = P2} = ES2) -> + N1 = N2, + chk_opt_StreamId(I1,I2), + chk_EventParameters(P1,P2), + equal({'EventSpec',ES1,ES2}); +chk_EventSpec(ES1,ES2) -> + wrong_type({'EventSpec',ES1,ES2}). + + +chk_opt_ErrorDescriptor(asn1_NOVALUE,asn1_NOVALUE) -> + ok; +chk_opt_ErrorDescriptor(E1,E2) -> + chk_ErrorDescriptor(E1,E2). + +chk_ErrorDescriptor(E,E) when is_record(E,'ErrorDescriptor') -> + ok; +chk_ErrorDescriptor(#'ErrorDescriptor'{errorCode = Code1, + errorText = Text1} = E1, + #'ErrorDescriptor'{errorCode = Code2, + errorText = Text2} = E2) -> + chk_ErrorCode(Code1,Code2), + chk_opt_ErrorText(Text1,Text2), + equal({'ErrorDescriptor',E1,E2}); +chk_ErrorDescriptor(E1,E2) -> + wrong_type({'ErrorDescriptor',E1,E2}). + +chk_ErrorCode(C,C) when is_integer(C) -> + ok; +chk_ErrorCode(C1,C2) when is_integer(C1) andalso is_integer(C2) -> + not_equal({errorCode,C1,C2}); +chk_ErrorCode(C1,C2) -> + throw({wrong_type,{errorCode,C1,C2}}). + +chk_opt_ErrorText(asn1_NOVALUE,asn1_NOVALUE) -> + ok; +chk_opt_ErrorText(T,T) when is_list(T) -> + ok; +chk_opt_ErrorText(T1,T2) when is_list(T1) andalso is_list(T2) -> + not_equal({errorText,T1,T2}); +chk_opt_ErrorText(T1,T2) -> + wrong_type({errorText,T1,T2}). + + +chk_SignalsDescriptor(D1,D2) + when is_list(D1) andalso is_list(D2) andalso (length(D1) =:= length(D2)) -> + chk_SignalsDescriptor1(D1,D2); +chk_SignalsDescriptor(D1,D2) -> + wrong_type({signalsDescriptor,D1,D2}). + +chk_SignalsDescriptor1([],[]) -> + ok; +chk_SignalsDescriptor1([S1|D1],[S2|D2]) -> + chk_SignalRequest(S1,S2), + chk_SignalsDescriptor1(D1,D2). + +chk_SignalRequest({signal,S1},{signal,S2}) -> + chk_Signal(S1,S2); +chk_SignalRequest({seqSigList,S1},{seqSigList,S2}) -> + chk_SeqSignalList(S1,S2); +chk_SignalRequest(R1,R2) -> + wrong_type({signalRequest,R1,R2}). + +chk_SeqSignalList(S,S) when is_record(S,'SeqSigList') -> + ok; +chk_SeqSignalList(#'SeqSigList'{id = Id1, + signalList = SigList1} = S1, + #'SeqSigList'{id = Id2, + signalList = SigList2} = S2) -> + Id1 = Id2, + chk_Signals(SigList1,SigList2), + equal({'SeqSigList',S1,S2}); +chk_SeqSignalList(S1,S2) -> + wrong_type({'SeqSigList',S1,S2}). + + +chk_Signals([],[]) -> + ok; +chk_Signals([Sig1|Sigs1],[Sig2|Sigs2]) -> + chk_Signal(Sig1,Sig2), + chk_Signals(Sigs1,Sigs2). + + +chk_Signal(S,S) when is_record(S,'Signal') -> + ok; +chk_Signal(#'Signal'{signalName = N1, + streamID = I1, + sigType = T1, + duration = D1, + notifyCompletion = C1, + keepActive = K1, + sigParList = P1} = S1, + #'Signal'{signalName = N2, + streamID = I2, + sigType = T2, + duration = D2, + notifyCompletion = C2, + keepActive = K2, + sigParList = P2} = S2) -> + N1 = N2, + chk_opt_StreamId(I1,I2), + chk_opt_SignalType(T1,T2), + chk_opt_duration(D1,D2), + chk_opt_NotifyCompletion(C1,C2), + chk_opt_keepAlive(K1,K2), + chk_sigParameters(P1,P2), + equal({'Signal',S1,S2}); +chk_Signal(S1,S2) -> + wrong_type({'Signal',S1,S2}). + +chk_DigitMapDescriptor(D,D) when is_record(D,'DigitMapDescriptor') -> + ok; +chk_DigitMapDescriptor(#'DigitMapDescriptor'{digitMapName = N1, + digitMapValue = V1}, + #'DigitMapDescriptor'{digitMapName = N2, + digitMapValue = V2}) -> + chk_opt_digitMapName(N1,N2), + chk_opt_digitMapValue(V1,V2), + ok; +chk_DigitMapDescriptor(D1,D2) -> + wrong_type({'DigitMapDescriptor',D1,D2}). + +chk_opt_digitMapName(asn1_NOVALUE,asn1_NOVALUE) -> + ok; +chk_opt_digitMapName(N1,N2) -> + chk_digitMapName(N1,N2). + +chk_digitMapName(N,N) -> + ok; +chk_digitMapName(N1,N2) -> + not_equal({digitMapName,N1,N2}). + +chk_opt_digitMapValue(asn1_NOVALUE,asn1_NOVALUE) -> + ok; +chk_opt_digitMapValue(V1,V2) -> + chk_digitMapValue(V1,V2). + +chk_digitMapValue(V,V) when is_record(V,'DigitMapValue') -> + ok; +chk_digitMapValue(#'DigitMapValue'{digitMapBody = Body1, + startTimer = Start1, + shortTimer = Short1, + longTimer = Long1}, + #'DigitMapValue'{digitMapBody = Body2, + startTimer = Start2, + shortTimer = Short2, + longTimer = Long2}) -> + chk_digitMapValue_digitMapBody(Body1,Body2), % Could contain trailing '\n', ... + chk_opt_timer(Start1,Start2), + chk_opt_timer(Short1,Short2), + chk_opt_timer(Long1,Long2), + ok; +chk_digitMapValue(V1,V2) -> + wrong_type({digitMapValue,V1,V2}). + +chk_digitMapValue_digitMapBody(B,B) when is_list(B) -> + ok; +chk_digitMapValue_digitMapBody(B1, B2) + when is_list(B1) andalso is_list(B2) andalso (length(B1) > length(B2)) -> + case string:str(B2, B1) of + 0 -> + ok; + _ -> + not_equal({digitMapValue_digitMapBody,B1,B2}) + end; +chk_digitMapValue_digitMapBody(B1, B2) + when is_list(B1) andalso is_list(B2) andalso (length(B1) < length(B2)) -> + case string:str(B1, B2) of + 0 -> + ok; + _ -> + not_equal({digitMapValue_digitMapBody,B1,B2}) + end; +chk_digitMapValue_digitMapBody(B1,B2) when is_list(B1) andalso is_list(B2) -> + not_equal({digitMapValue_digitMapBody,B1,B2}); +chk_digitMapValue_digitMapBody(B1,B2) -> + wrong_type({digitMapValue_digitMapBody,B1,B2}). + + +chk_opt_AuditDescriptor(asn1_NOVALUE,asn1_NOVALUE) -> + ok; +chk_opt_AuditDescriptor(D1,D2) -> + chk_AuditDescriptor(D1,D2). + +chk_AuditDescriptor(D,D) when is_record(D,'AuditDescriptor') -> + ok; +chk_AuditDescriptor(#'AuditDescriptor'{auditToken = T1} = D1, + #'AuditDescriptor'{auditToken = T2} = D2) -> + chk_opt_auditToken(T1,T2), + equal({'AuditDescriptor',D1,D2}); +chk_AuditDescriptor(D1,D2) -> + wrong_type({'AuditDescriptor',D1,D2}). + +chk_opt_auditToken(asn1_NOVALUE,asn1_NOVALUE) -> + ok; +chk_opt_auditToken(T1,T2) -> + chk_auditToken(T1,T2). + +chk_auditToken(T1,T2) + when is_list(T1) andalso is_list(T2) andalso (length(T1) =:= length(T2)) -> + chk_auditToken1(T1,T2); +chk_auditToken(T1,T2) -> + wrong_type({auditToken,T1,T2}). + +chk_auditToken1([],[]) -> + ok; +chk_auditToken1([H1|T1],[H2|T2]) -> + chk_auditToken2(H1,H2), + chk_auditToken1(T1,T2). + +chk_auditToken2(muxToken,muxToken) -> + ok; +chk_auditToken2(modemToken,modemToken) -> + ok; +chk_auditToken2(mediaToken,mediaToken) -> + ok; +chk_auditToken2(eventsToken,eventsToken) -> + ok; +chk_auditToken2(signalsToken,signalsToken) -> + ok; +chk_auditToken2(digitMapToken,digitMapToken) -> + ok; +chk_auditToken2(statsToken,statsToken) -> + ok; +chk_auditToken2(observedEventsToken,observedEventsToken) -> + ok; +chk_auditToken2(packagesToken,packagesToken) -> + ok; +chk_auditToken2(eventBufferToken,eventBufferToken) -> + ok; +chk_auditToken2(T1,T2) when is_atom(T1) andalso is_atom(T2) -> + not_equal({auditToken,T1,T2}); +chk_auditToken2(T1,T2) -> + wrong_type({auditToken,T1,T2}). + +chk_ObservedEventsDescriptor(D,D) + when is_record(D,'ObservedEventsDescriptor') -> + ok; +chk_ObservedEventsDescriptor( + #'ObservedEventsDescriptor'{requestId = Id1, + observedEventLst = E1} = D1, + #'ObservedEventsDescriptor'{requestId = Id2, + observedEventLst = E2} = D2) -> + Id1 = Id2, + chk_ObservedEvents(E1,E2), + equal({'ObservedEventsDescriptor',D1,D2}); +chk_ObservedEventsDescriptor(D1,D2) -> + wrong_type({'ObservedEventsDescriptor',D1,D2}). + + +chk_ObservedEvents(E1,E2) + when is_list(E1) andalso is_list(E2) andalso (length(E1) =:= length(E2)) -> + chk_ObservedEvents1(E1,E2); +chk_ObservedEvents(E1,E2) -> + wrong_type({observedEvents,E1,E2}). + + +chk_ObservedEvents1([],[]) -> + ok; +chk_ObservedEvents1([Ev1|Evs1],[Ev2|Evs2]) -> + chk_ObservedEvent(Ev1,Ev2), + chk_ObservedEvents1(Evs1,Evs2). + +chk_ObservedEvent(#'ObservedEvent'{eventName = N1, + streamID = I1, + eventParList = P1, + timeNotation = T1} = E1, + #'ObservedEvent'{eventName = N2, + streamID = I2, + eventParList = P2, + timeNotation = T2} = E2) -> + N1 = N2, + chk_opt_StreamId(I1,I2), + chk_EventParameters(P1,P2), + chk_opt_TimeNotation(T1,T2), + equal({'ObservedEvent',E1,E2}); +chk_ObservedEvent(E1,E2) -> + wrong_type({'ObservedEvent',E1,E2}). + + +chk_opt_TimeNotation(asn1_NOVALUE,asn1_NOVALUE) -> + ok; +chk_opt_TimeNotation(T1,T2) -> + chk_TimeNotation(T1,T2). + +chk_TimeNotation(T,T) when is_record(T,'TimeNotation') -> + ok; +chk_TimeNotation(#'TimeNotation'{date = Date1, + time = Time1} = T1, + #'TimeNotation'{date = Date2, + time = Time2} = T2) -> + Date1 = Date2, + Time1 = Time2, + equal({'TimeNotation',T1,T2}); +chk_TimeNotation(T1,T2) -> + wrong_type({'TimeNotation',T1,T2}). + + +chk_opt_timer(asn1_NOVALUE,asn1_NOVALUE) -> + ok; +chk_opt_timer(T1,T2) -> + chk_timer(T1,T2). + +chk_timer(T,T) when is_integer(T) -> + {equal,timer}; +chk_timer(T1,T2) when is_integer(T1) andalso is_integer(T2) -> + throw({not_equal,{timer,T1,T2}}); +chk_timer(T1,T2) -> + throw({wrong_type,{timer,T1,T2}}). + + +chk_opt_SignalType(asn1_NOVALUE,asn1_NOVALUE) -> + {equal,signalType}; +chk_opt_SignalType(T1,T2) -> + chk_SignalType(T1,T2). + +chk_SignalType(brief,brief) -> + {equal,signalType}; +chk_SignalType(onOffonOff,onOffonOff) -> + {equal,signalType}; +chk_SignalType(timeOut,timeOut) -> + {equal,signalType}; +chk_SignalType(T1,T2) -> + throw({wrong_type,{signalType,T1,T2}}). + + +chk_opt_duration(asn1_NOVALUE,asn1_NOVALUE) -> + {equal,duration}; +chk_opt_duration(D1,D2) -> + chk_duration(D1,D2). + +chk_duration(D,D) when is_integer(D) -> + {equal,duration}; +chk_duration(D1,D2) when is_integer(D1) andalso is_integer(D2) -> + throw({not_equal,{duration,D1,D2}}); +chk_duration(D1,D2) -> + throw({wrong_type,{duration,D1,D2}}). + + +chk_opt_NotifyCompletion(asn1_NOVALUE,asn1_NOVALUE) -> + {equal,notifyCompletion}; +chk_opt_NotifyCompletion(N1,N2) -> + chk_NotifyCompletion(N1,N2). + +chk_NotifyCompletion([],[]) -> + {equal,notifyCompletion}; +chk_NotifyCompletion([Item1|Items1],[Item2|Items2]) -> + chk_NotifyCompletion1(Item1,Item2), + chk_NotifyCompletion(Items1,Items2); +chk_NotifyCompletion(C1,C2) -> + throw({wrong_type,{notifyCompletion,C1,C2}}). + +chk_NotifyCompletion1(onTimeOut,onTimeOut) -> + {equal,notifyCompletion_part}; +chk_NotifyCompletion1(onInterruptByEvent,onInterruptByEvent) -> + {equal,notifyCompletion_part}; +chk_NotifyCompletion1(onInterruptByNewSignalDescr,onInterruptByNewSignalDescr) -> + {equal,notifyCompletion_part}; +chk_NotifyCompletion1(otherReason,otherReason) -> + {equal,notifyCompletion_part}; +chk_NotifyCompletion1(C1,C2) -> + throw({wrong_type,{notifyCompletion_part,C1,C2}}). + + +chk_opt_keepAlive(asn1_NOVALUE,asn1_NOVALUE) -> + {equal,keepAlive}; +chk_opt_keepAlive(K1,K2) -> + chk_keepAlive(K1,K2). + +chk_keepAlive(true,true) -> + ok; +chk_keepAlive(false,false) -> + ok; +chk_keepAlive(K1,K2) -> + wrong_type({keepAlive,K1,K2}). + + +chk_ServiceChangeParm(P,P) when is_record(P,'ServiceChangeParm') -> + ok; +chk_ServiceChangeParm(#'ServiceChangeParm'{serviceChangeMethod = M1, + serviceChangeAddress = A1, + serviceChangeVersion = V1, + serviceChangeProfile = P1, + serviceChangeReason = R1, + serviceChangeDelay = D1, + serviceChangeMgcId = Mid1, + timeStamp = T1} = P1, + #'ServiceChangeParm'{serviceChangeMethod = M2, + serviceChangeAddress = A2, + serviceChangeVersion = V2, + serviceChangeProfile = P2, + serviceChangeReason = R2, + serviceChangeDelay = D2, + serviceChangeMgcId = Mid2, + timeStamp = T2} = P2) -> + M1 = M2, + A1 = A2, + V1 = V2, + P1 = P2, + R1 = R2, + D1 = D2, + Mid1 = Mid2, + T1 = T2, + equal({'ServiceChangeParm',P1,P2}); +chk_ServiceChangeParm(P1,P2) -> + wrong_type({'ServiceChangeParm',P1,P2}). + + +chk_sigParameters(S1,S2) + when is_list(S1) andalso is_list(S2) andalso (length(S1) =:= length(S2)) -> + chk_sigParameters1(S1,S2); +chk_sigParameters(S1,S2) -> + wrong_type({sigParameters,S1,S2}). + +chk_sigParameters1([],[]) -> + ok; +chk_sigParameters1([H1|T1],[H2|T2]) -> + chk_sigParameter(H1,H2), + chk_sigParameters1(T1,T2); +chk_sigParameters1(P1,P2) -> + wrong_type({sigParameters,P1,P2}). + +chk_sigParameter(#'SigParameter'{sigParameterName = N1, + value = V1, + extraInfo = E1}, + #'SigParameter'{sigParameterName = N2, + value = V2, + extraInfo = E2}) -> + N1 = N2, + chk_Value(V1,V2), + chk_opt_extraInfo(E1,E2), + ok; +chk_sigParameter(P1,P2) -> + wrong_type({'SigParameter',P1,P2}). + + +chk_opt_StreamId(asn1_NOVALUE,asn1_NOVALUE) -> + ok; +chk_opt_StreamId(I1,I2) -> + chk_StreamId(I1,I2). + +chk_StreamId(I,I) when is_integer(I) -> + ok; +chk_StreamId(I1,I2) when is_integer(I1) andalso is_integer(I2) -> + not_equal({streamId,I1,I2}); +chk_StreamId(I1,I2) -> + wrong_type({streamId,I1,I2}). + + +chk_EventParameters(EP1,EP2) + when is_list(EP1) andalso is_list(EP2) andalso (length(EP1) =:= length(EP2)) -> + chk_EventParameters1(EP1,EP2); +chk_EventParameters(EP1,EP2) -> + wrong_type({eventParameters,EP1,EP2}). + +chk_EventParameters1([],[]) -> + ok; +chk_EventParameters1([EP1|EPS1],[EP2|EPS2]) -> + chk_EventParameter(EP1,EP2), + chk_EventParameters1(EPS1,EPS2). + +chk_EventParameter(EP,EP) when is_record(EP,'EventParameter') -> + ok; +chk_EventParameter(#'EventParameter'{eventParameterName = N1, + value = V1, + extraInfo = E1} = EP1, + #'EventParameter'{eventParameterName = N2, + value = V2, + extraInfo = E2} = EP2) -> + N1 = N2, + chk_Value(V1,V2), + chk_opt_extraInfo(E1,E2), + equal({'EventParameter',EP1,EP2}); +chk_EventParameter(EP1,EP2) -> + wrong_type({'EventParameter',EP1,EP2}). + + +chk_Value(V,V) when is_list(V) -> + chk_Value(V); +chk_Value(V1,V2) + when is_list(V1) andalso is_list(V2) andalso (length(V1) =:= length(V2)) -> + chk_Value1(V1,V2); +chk_Value(V1,V2) -> + wrong_type({value,V1,V2}). + +chk_Value([]) -> + ok; +chk_Value([H|T]) when is_list(H) -> + chk_Value(T); +chk_Value([H|_T]) -> + wrong_type({value_part,H}). + +chk_Value1([],[]) -> + ok; +chk_Value1([H|T1],[H|T2]) when is_list(H) -> + chk_Value1(T1,T2); +chk_Value1([H|_T1],[H|_T2]) -> + wrong_type({value_part,H}); +chk_Value1([H1|_T1],[H2|_T2]) when is_list(H1) andalso is_list(H2) -> + not_equal({value_part,H1,H2}); +chk_Value1(V1,V2) -> + wrong_type({value,V1,V2}). + + +chk_opt_extraInfo(asn1_NOVALUE,asn1_NOVALUE) -> + ok; +chk_opt_extraInfo(E1,E2) -> + chk_extraInfo(E1,E2). + +chk_extraInfo({relation,greaterThan},{relation,greaterThan}) -> + ok; +chk_extraInfo({relation,smallerThan},{relation,smallerThan}) -> + ok; +chk_extraInfo({relation,unequalTo},{relation,unequalTo}) -> + ok; +chk_extraInfo({range,true},{range,true}) -> + ok; +chk_extraInfo({range,false},{range,false}) -> + ok; +chk_extraInfo({sublist,true},{sublist,true}) -> + ok; +chk_extraInfo({sublist,false},{sublist,false}) -> + ok; +chk_extraInfo(E1,E2) -> + wrong_type({extraInfo,E1,E2}). + + +chk_opt_transactionId(asn1_NOVALUE,asn1_NOVALUE) -> + ok; +chk_opt_transactionId(Id1,Id2) -> + chk_transactionId(Id1,Id2). + +chk_transactionId(Id,Id) when is_integer(Id) -> + ok; +chk_transactionId(Id1,Id2) when is_integer(Id1) andalso is_integer(Id2) -> + not_equal({transactionId,Id1,Id2}); +chk_transactionId(Id1,Id2) -> + wrong_type({transactionId,Id1,Id2}). + + +chk_terminationIds(Tids1,Tids2) + when is_list(Tids1) andalso is_list(Tids2) andalso (length(Tids1) =:= length(Tids2)) -> + chk_terminationIds1(Tids1,Tids2); +chk_terminationIds(Tids1,Tids2) -> + wrong_type({terminationIds,Tids1,Tids2}). + +chk_terminationIds1([],[]) -> + ok; +chk_terminationIds1([Tid1|Tids1],[Tid2|Tids2]) -> + chk_terminationId(Tid1,Tid2), + chk_terminationIds1(Tids1,Tids2). + +chk_terminationId(Id,Id) when is_record(Id,'TerminationID') -> + ok; +chk_terminationId(Id,Id) when is_record(Id,megaco_term_id) -> + ok; +chk_terminationId(#'TerminationID'{wildcard = W1, + id = I1} = Tid1, + #'TerminationID'{wildcard = W2, + id = I2} = Tid2) -> + chk_terminationId_wildcard(W1,W2), + chk_terminationId_id(I1,I2), + equal({'TerminationID',Tid1,Tid2}); +chk_terminationId(#megaco_term_id{contains_wildcards = W1, + id = I1} = Tid1, + #megaco_term_id{contains_wildcards = W2, + id = I2} = Tid2) -> + chk_terminationId_wildcard(W1,W2), + chk_terminationId_id(I1,I2), + equal({megaco_term_id,Tid1,Tid2}); +chk_terminationId(Tid1,Tid2) -> + wrong_type({terminationId,Tid1,Tid2}). + +chk_terminationId_wildcard(W,W) -> + ok; +chk_terminationId_wildcard(W1,W2) -> + not_equal({terminationId_wildcard,W1,W2}). + +chk_terminationId_id(I,I) -> + ok; +chk_terminationId_id(I1,I2) -> + not_equal({terminationId_id,I1,I2}). + + +equal(What) -> + error({equal, What}). + +not_equal(What) -> + error({not_equal, What}). + +wrong_type(What) -> + error({wrong_type, What}). + +error(Reason) -> + throw({error, Reason}). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +cre_MegacoMessage(Mess) -> + ?MSG_LIB:cre_MegacoMessage(Mess). + +cre_megacoMessage(V, Mid, Body) -> + #'MegacoMessage'{mess = #'Message'{version = V, + mId = Mid, + messageBody = Body}}. + +cre_Msg(Mid, Body) -> + cre_Msg(?VERSION, Mid, Body). + +cre_Msg(V, Mid, Body) -> + ?MSG_LIB:cre_Message(V, Mid, Body). + +cre_authHeader() -> + SecParmIdx = [239, 205, 171, 137], + SeqNum = [18, 52, 86, 120], + AD = [18, 52, 86, 120, 137, 171, 205, 239, 118, 84, 50, 16], + cre_authHeader(SecParmIdx, SeqNum, AD). + +cre_authHeader(Idx, Num, D) -> + #'AuthenticationHeader'{secParmIndex = Idx, + seqNum = Num, + ad = D}. + +cre_TransId(TransId) -> + ?MSG_LIB:cre_TransactionId(TransId). + +cre_Trans(Trans) -> + ?MSG_LIB:cre_Transaction(Trans). + +cre_TransReq(TransId, Actions) -> + ?MSG_LIB:cre_TransactionRequest(TransId, Actions). + +cre_transactionReply(TransId, Actions) -> + #'TransactionReply'{transactionId = TransId, + transactionResult = {actionReplies, Actions}}. + +cre_transactionAck(Serial, Serial) -> + #'TransactionAck'{firstAck = Serial}; +cre_transactionAck(First, Last) -> + #'TransactionAck'{firstAck = First, lastAck = Last}. + +cre_ActReq(CtxId, CmdReqs) -> + ?MSG_LIB:cre_ActionRequest(CtxId, CmdReqs). + +cre_actionReply(CtxId, CmdReply) -> + #'ActionReply'{contextId = CtxId, + commandReply = CmdReply}. + +cre_CtxID(Id) -> + ?MSG_LIB:cre_ContextID(Id). + +%% Parameter related +cre_propertyParm(Name, Val) -> + #'PropertyParm'{name = Name, value = [Val]}. + + +%% Statistics related +cre_statisticsParm(Name, Val) -> + #'StatisticsParameter'{statName = Name, statValue = [Val]}. + + +% Event related +cre_eventParm(Name, Val) -> + #'EventParameter'{eventParameterName = Name, value = Val}. + +cre_observedEvent(Name, Not) -> + #'ObservedEvent'{eventName = Name, timeNotation = Not}. +cre_observedEvent(Name, Not, Par) -> + #'ObservedEvent'{eventName = Name, timeNotation = Not, eventParList = Par}. + +cre_requestedEvent(Name) -> + #'RequestedEvent'{pkgdName = Name}. +cre_requestedEvent(Name, ParList) when is_list(ParList) -> + #'RequestedEvent'{pkgdName = Name, evParList = ParList}; +cre_requestedEvent(Name, Action) when is_tuple(Action) -> + #'RequestedEvent'{pkgdName = Name, eventAction = Action}. + + +cre_observedEventsDesc(Id, EvList) -> + #'ObservedEventsDescriptor'{requestId = Id, observedEventLst = EvList}. + +cre_eventsDesc(Id, EvList) -> + #'EventsDescriptor'{requestID = Id, eventList = EvList}. + + +%% Service change related +cre_serviceChangeParm(M,A,R,P) -> + #'ServiceChangeParm'{serviceChangeMethod = M, serviceChangeAddress = A, + serviceChangeReason = R, serviceChangeProfile = P}. + +cre_serviceChangeResParm(A,P) -> + #'ServiceChangeResParm'{serviceChangeAddress = A, + serviceChangeProfile = P}. + +cre_serviceChangeReq(Tid, P) -> + #'ServiceChangeRequest'{terminationID = Tid, serviceChangeParms = P}. + +cre_serviceChangeProf(Name, Ver) when is_list(Name) andalso is_integer(Ver) -> + #'ServiceChangeProfile'{profileName = Name, version = Ver}. + +cre_serviceChangeReply(Tid, Res) -> + #'ServiceChangeReply'{terminationID = Tid, serviceChangeResult = Res}. + + +%% Stream related +cre_streamParms(Lcd) -> + #'StreamParms'{localControlDescriptor = Lcd}. +cre_streamParms(Lcd, Ld) -> + #'StreamParms'{localControlDescriptor = Lcd, localDescriptor = Ld}. +cre_streamParms(Lcd, Ld, Rd) -> + #'StreamParms'{localControlDescriptor = Lcd, + localDescriptor = Ld, + remoteDescriptor = Rd}. +cre_streamParmsL(Ld) -> + #'StreamParms'{localDescriptor = Ld}. +cre_streamParmsR(Rd) -> + #'StreamParms'{remoteDescriptor = Rd}. + +cre_streamDesc(Id, P) -> + #'StreamDescriptor'{streamID = Id, streamParms = P}. + + +%% "Local" related +cre_localControlDesc(Mode) -> + #'LocalControlDescriptor'{streamMode = Mode}. +cre_localControlDesc(Mode, Parms) -> + #'LocalControlDescriptor'{streamMode = Mode, propertyParms = Parms }. + +cre_localRemoteDesc(Grps) -> + #'LocalRemoteDescriptor'{propGrps = Grps}. + + +%% DigitMap related +cre_digitMapDesc(Value) when is_record(Value, 'DigitMapValue') -> + #'DigitMapDescriptor'{digitMapValue = Value}; +cre_digitMapDesc(Name) -> + #'DigitMapDescriptor'{digitMapName = Name}. + +cre_digitMapDesc(Name, Val) -> + #'DigitMapDescriptor'{digitMapName = Name, digitMapValue = Val}. + +cre_digitMapValue(Body) -> + #'DigitMapValue'{digitMapBody = Body}. + +cre_digitMapValue(Body, Start, Short, Long) -> + #'DigitMapValue'{startTimer = Start, + shortTimer = Short, + longTimer = Long, + digitMapBody = Body}. + +%% Media related +cre_mediaDesc(StreamDesc) -> + #'MediaDescriptor'{streams = {multiStream, [StreamDesc]}}. + + +%% Notify related +cre_notifyReq(Tid, EvsDesc) -> + #'NotifyRequest'{terminationID = Tid, observedEventsDescriptor = EvsDesc}. + +cre_notifyReply(Tid) -> + #'NotifyReply'{terminationID = Tid}. + + +%% Subtract related +cre_subtractReq(Tid, Desc) -> + #'SubtractRequest'{terminationID = Tid, auditDescriptor = Desc}. + + +%% Audit related +cre_auditDesc(Tokens) -> + #'AuditDescriptor'{auditToken = Tokens}. + +cre_auditReq(Tid, Desc) -> + #'AuditRequest'{terminationID = Tid, auditDescriptor = Desc}. + +cre_auditRes(Tid, Res) -> + #'AuditResult'{terminationID = Tid, terminationAuditResult = Res}. + + +%% AMM/AMMS related +cre_ammReq(Tid, Descs) -> + #'AmmRequest'{terminationID = Tid, descriptors = Descs}. + +cre_ammsReply(Tid) -> + #'AmmsReply'{terminationID = Tid}. +cre_ammsReply(Tid, Descs) -> + #'AmmsReply'{terminationID = Tid, terminationAudit = Descs}. + + +%% Command related +cre_commandReq(Cmd) -> + #'CommandRequest'{command = Cmd}. + + +%% Actions related +cre_requestedActions(DmName) -> + #'RequestedActions'{eventDM = {digitMapName, DmName}}. + + +%% Signal related +cre_signal(Name) -> + #'Signal'{signalName = Name}. + + +%% Others +cre_timeNotation(D,T) -> + #'TimeNotation'{date = D, time = T}. + +cre_packagesItem(_Name, _Ver) -> + #'PackagesItem'{packageName = "nt", packageVersion = 1}. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +flex_init(Config) -> + megaco_codec_flex_lib:init(Config). + +flex_finish(Config) -> + megaco_codec_flex_lib:finish(Config). + +flex_scanner_conf(Config) -> + megaco_codec_flex_lib:scanner_conf(Config). + +start_flex_scanner() -> + megaco_codec_flex_lib:start(). + +stop_flex_scanner(Pid) -> + megaco_codec_flex_lib:stop(Pid). + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +t(F,A) -> + p(printable(get(severity),trc),trc,F,A). + +d(F,A) -> + p(printable(get(severity),dbg),dbg,F,A). + +l(F,A) -> + p(printable(get(severity),log),log,F,A). + +e(F,A) -> + p(printable(get(severity),err),err,F,A). + + +printable(trc,_) -> + true; +printable(dbg,trc) -> + false; +printable(dbg,_) -> + true; +printable(log,log) -> + true; +printable(log,err) -> + true; +printable(err,err) -> + true; +printable(_,_) -> + false. + + +p(true,L,F,A) -> + io:format("~s: " ++ F ++ "~n", [image_of(L)|A]); +p(_,_,_,_) -> + ok. + +image_of(trc) -> + "T"; +image_of(dbg) -> + "D"; +image_of(log) -> + "L"; +image_of(err) -> + "E"; +image_of(L) -> + io_lib:format("~p",[L]). + + -- cgit v1.2.3