aboutsummaryrefslogtreecommitdiffstats
path: root/lib/megaco/test/megaco_sdp_test.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/megaco/test/megaco_sdp_test.erl')
-rw-r--r--lib/megaco/test/megaco_sdp_test.erl1286
1 files changed, 1286 insertions, 0 deletions
diff --git a/lib/megaco/test/megaco_sdp_test.erl b/lib/megaco/test/megaco_sdp_test.erl
new file mode 100644
index 0000000000..e9bd550518
--- /dev/null
+++ b/lib/megaco/test/megaco_sdp_test.erl
@@ -0,0 +1,1286 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2001-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 application config
+%%----------------------------------------------------------------------
+
+-module(megaco_sdp_test).
+
+-export([all/1,
+ decode_encode/1,
+
+ tickets/1,
+ otp8123/1,
+
+ init_per_testcase/2, fin_per_testcase/2,
+
+ t/0, t/1]).
+
+-include("megaco_test_lib.hrl").
+-include_lib("megaco/include/megaco.hrl").
+-include_lib("megaco/include/megaco_message_v1.hrl").
+-include_lib("megaco/include/megaco_sdp.hrl").
+
+t() -> megaco_test_lib:t(?MODULE).
+t(Case) -> megaco_test_lib:t({?MODULE, Case}).
+
+%% Test server callbacks
+init_per_testcase(Case, Config) ->
+ megaco_test_lib:init_per_testcase(Case, Config).
+
+fin_per_testcase(Case, Config) ->
+ megaco_test_lib:fin_per_testcase(Case, Config).
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Top test case
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+all(suite) ->
+ [
+ decode_encode,
+ tickets
+ ].
+
+tickets(suite) ->
+ [
+ otp8123
+ ].
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+decode_encode(suite) ->
+ [];
+decode_encode(Config) when is_list(Config) ->
+ io:format("decode_encode -> entry with"
+ "~n Config: ~p"
+ "~n", [Config]),
+
+ %%-------------------------------------
+ %% Test data
+ %%-------------------------------------
+
+ %% -- (PP) (ok) --
+ io:format("setup for protocol version 01 (ok)~n", []),
+ PP_V01_V = 0,
+ PP_V01 = cre_PropertyParm_v(PP_V01_V),
+ SDP_V01 = cre_sdp_v(PP_V01_V),
+ PP_V01_Exp = {ok, SDP_V01},
+ SDP_V01_Exp = {ok, PP_V01},
+
+
+ %% -- (PP) (ok) --
+ io:format("setup for protocol version 02 (ok)~n", []),
+ PP_V02_V = 100,
+ PP_V02 = cre_PropertyParm_v(PP_V02_V),
+ SDP_V02 = cre_sdp_v(PP_V02_V),
+ PP_V02_Exp = {ok, SDP_V02},
+ SDP_V02_Exp = {ok, PP_V02},
+
+
+ %% -- (PP) (error) --
+ io:format("setup for protocol version 03 (error)~n", []),
+ PP_V03_V = "sune",
+ PP_V03 = cre_PropertyParm_v(PP_V03_V),
+ SDP_V03 = cre_sdp_v(PP_V03_V),
+ PP_V03_Exp = {error, {invalid_protocol_version, PP_V03_V}},
+ SDP_V03_Exp = PP_V03_Exp,
+
+
+ %% -- (PP) (ok) --
+ io:format("setup for connection info 01 (ok)~n", []),
+ PP_C01_CA = "123.123.123.120",
+ PP_C01 = cre_PropertyParm_c(ip4, PP_C01_CA),
+ SDP_C01 = cre_sdp_c(ip4, PP_C01_CA),
+ PP_C01_Exp = {ok, SDP_C01},
+ SDP_C01_Exp = {ok, PP_C01},
+
+
+ %% -- (PP) (ok) --
+ io:format("setup for connection info 02 (ok)~n", []),
+ PP_C02_TTL = 121,
+ PP_C02_Base = "123.123.123.121",
+ PP_C02 = cre_PropertyParm_c(ip4, PP_C02_Base, PP_C02_TTL),
+ SDP_C02_CA = #megaco_sdp_c_conn_addr{base = PP_C02_Base,
+ ttl = PP_C02_TTL},
+ SDP_C02 = cre_sdp_c(ip4, SDP_C02_CA),
+ PP_C02_Exp = {ok, SDP_C02},
+ SDP_C02_Exp = {ok, PP_C02},
+
+
+ %% -- (PP) (ok) --
+ io:format("setup for connection info 03 (ok)~n", []),
+ PP_C03_CA = "123.123.123.122",
+ PP_C03 = cre_PropertyParm_c(ip4, PP_C03_CA ++ "/"),
+ SDP_C03 = cre_sdp_c(ip4, PP_C03_CA),
+ PP_C03_Exp = {ok, SDP_C03},
+ SDP_C03_Exp = {ok, cre_PropertyParm_c(ip4, PP_C03_CA)},
+
+
+ %% -- (PP) (error) --
+ io:format("setup for connection info 04 (error)~n", []),
+ PP_C04_Base = "123.123.123.123",
+ PP_C04_TTL = "sune",
+ PP_C04_CA = PP_C04_Base ++ "/" ++ PP_C04_TTL,
+ PP_C04 = cre_PropertyParm_c(ip4, PP_C04_CA),
+ PP_C04_Exp = {error, {invalid_connection_data_conn_addr_ttl, "sune"}},
+
+
+ %% -- (PP) (ok) --
+ io:format("setup for connection info 05 (ok)~n", []),
+ PP_C05_TTL = 124,
+ PP_C05_NOF = 224,
+ PP_C05_Base = "123.123.123.124",
+ PP_C05 = cre_PropertyParm_c(ip4, PP_C05_Base, PP_C05_TTL,
+ PP_C05_NOF),
+ SDP_C05_CA = #megaco_sdp_c_conn_addr{base = PP_C05_Base,
+ ttl = PP_C05_TTL,
+ num_of = PP_C05_NOF},
+ SDP_C05 = cre_sdp_c(ip4, SDP_C05_CA),
+ PP_C05_Exp = {ok, SDP_C05},
+ SDP_C05_Exp = {ok, PP_C05},
+
+
+ %% -- (PP) (ok) --
+ io:format("setup for connection info 06 (ok)~n", []),
+ PP_C06_TTL = 125,
+ PP_C06_Base = "123.123.123.125",
+ PP_C06_CA = PP_C06_Base ++ "/" ++ integer_to_list(PP_C06_TTL) ++ "/",
+ PP_C06 = cre_PropertyParm_c(ip4, PP_C06_CA),
+ SDP_C06_CA = #megaco_sdp_c_conn_addr{base = PP_C06_Base,
+ ttl = PP_C06_TTL},
+ SDP_C06 = cre_sdp_c(ip4, SDP_C06_CA),
+ PP_C06_Exp = {ok, SDP_C06},
+ SDP_C06_Exp = {ok, cre_PropertyParm_c(ip4, PP_C06_Base ++ "/" ++ integer_to_list(PP_C06_TTL))},
+
+
+ %% -- (PP) (error) --
+ io:format("setup for connection info 07 (ok)~n", []),
+ PP_C07_NOF = "sune",
+ PP_C07_TTL = 125,
+ PP_C07_Base = "123.123.123.126",
+ PP_C07_CA = PP_C07_Base ++ "/" ++
+ integer_to_list(PP_C07_TTL) ++ "/" ++ PP_C07_NOF,
+ PP_C07 = cre_PropertyParm_c(ip4, PP_C07_CA),
+ SDP_C07_CA = #megaco_sdp_c_conn_addr{base = PP_C07_Base,
+ ttl = PP_C07_TTL,
+ num_of = PP_C07_NOF},
+ SDP_C07 = cre_sdp_c(ip4, SDP_C07_CA),
+ PP_C07_Exp = {error, {invalid_connection_data_conn_addr_num_of, PP_C07_NOF}},
+ SDP_C07_Exp = {error, {invalid_connection_data_conn_addr_num_of, PP_C07_NOF}},
+
+
+ %% -- (PP) (ok) --
+ io:format("setup for connection info 08 (ok)~n", []),
+ PP_C08_CA = "FF1E:03AD::7F2E:172A:1E24",
+ PP_C08 = cre_PropertyParm_c(ip6, PP_C08_CA),
+ SDP_C08 = cre_sdp_c(ip6, PP_C08_CA),
+ PP_C08_Exp = {ok, SDP_C08},
+ SDP_C08_Exp = {ok, PP_C08},
+
+
+ %% -- (PP) (ok) --
+ io:format("setup for media announcement 01 (ok)~n", []),
+ PP_M01_Media = audio,
+ PP_M01_Port = 2000,
+ PP_M01_Transport = "RTP/AVP",
+ PP_M01_FMT_LST = ["0"],
+ PP_M01 = cre_PropertyParm_m(PP_M01_Media,
+ PP_M01_Port,
+ PP_M01_Transport,
+ PP_M01_FMT_LST),
+ SDP_M01 = cre_sdp_m(PP_M01_Media, PP_M01_Port,
+ PP_M01_Transport, PP_M01_FMT_LST),
+ PP_M01_Exp = {ok, SDP_M01},
+ SDP_M01_Exp = {ok, PP_M01},
+
+
+ %% -- (PP) (ok) --
+ io:format("setup for media announcement 02 (ok)~n", []),
+ PP_M02_Media = audio,
+ PP_M02_Port = 2000,
+ PP_M02_NOP = 2,
+ PP_M02_Transport = "RTP/AVP",
+ PP_M02_FMT_LST = ["0"],
+ PP_M02 = cre_PropertyParm_m(PP_M02_Media, PP_M02_Port,
+ PP_M02_NOP, PP_M02_Transport,
+ PP_M02_FMT_LST),
+ SDP_M02 = cre_sdp_m(PP_M02_Media, PP_M02_Port, PP_M02_NOP,
+ PP_M02_Transport, PP_M02_FMT_LST),
+ PP_M02_Exp = {ok, SDP_M02},
+ SDP_M02_Exp = {ok, PP_M02},
+
+ %% -- (PP) (ok) --
+ io:format("setup for origin 01 (ok)~n", []),
+ PP_O01_Name = "kalle",
+ PP_O01_SID = 1414,
+ PP_O01_V = 2,
+ PP_O01_AT = ip4,
+ PP_O01_A = "126.12.64.4",
+ PP_O01 = cre_PropertyParm_o(PP_O01_Name, PP_O01_SID, PP_O01_V,
+ PP_O01_AT, PP_O01_A),
+ SDP_O01 = cre_sdp_o(PP_O01_Name, PP_O01_SID, PP_O01_V,
+ PP_O01_AT, PP_O01_A),
+ PP_O01_Exp = {ok, SDP_O01},
+ SDP_O01_Exp = {ok, PP_O01},
+
+
+ %% -- (PP) (ok) --
+ io:format("setup for origin 02 (ok)~n", []),
+ PP_O02_Name = "bobbe",
+ PP_O02_SID = 1515,
+ PP_O02_V = 3,
+ PP_O02_NT = in,
+ PP_O02_AT = ip6,
+ PP_O02_A = "2201:056D::112E:144A:1E24",
+ PP_O02 = cre_PropertyParm_o(PP_O02_Name, PP_O02_SID, PP_O02_V,
+ PP_O02_NT, PP_O02_AT, PP_O02_A),
+ SDP_O02 = cre_sdp_o(PP_O02_Name, PP_O02_SID, PP_O02_V, PP_O02_NT,
+ PP_O02_AT, PP_O02_A),
+ PP_O02_Exp = {ok, SDP_O02},
+ SDP_O02_Exp = {ok, PP_O02},
+
+
+ %% -- (PP) (ok) --
+ PP_A01_PL = 2,
+ PP_A01_EN = "G726-32",
+ PP_A01_CR = 8000,
+ PP_A01 = cre_PropertyParm_rtpmap(PP_A01_PL, PP_A01_EN, PP_A01_CR),
+ SDP_A01 = cre_sdp_a_rtpmap(PP_A01_PL, PP_A01_EN, PP_A01_CR),
+ PP_A01_Exp = {ok, SDP_A01},
+ SDP_A01_Exp = {ok, PP_A01},
+
+
+ %% -- (PP) (ok) --
+ PP_A02_PL = 2,
+ PP_A02_EN = "xxx",
+ PP_A02_CR = 42,
+ PP_A02_EP = ["1","2","3"],
+ PP_A02 = cre_PropertyParm_rtpmap(PP_A02_PL, PP_A02_EN,
+ PP_A02_CR, PP_A02_EP),
+ SDP_A02 = cre_sdp_a_rtpmap(PP_A02_PL, PP_A02_EN, PP_A02_CR, PP_A02_EP),
+ PP_A02_Exp = {ok, SDP_A02},
+ SDP_A02_Exp = {ok, PP_A02},
+
+
+ %% -- (PP) (ok) --
+ PP_A03_PT = 12,
+ PP_A03 = cre_PropertyParm_ptime(PP_A03_PT),
+ SDP_A03 = cre_sdp_a_ptime(PP_A03_PT),
+ PP_A03_Exp = {ok, SDP_A03},
+ SDP_A03_Exp = {ok, PP_A03},
+
+
+ %% -- (PP) (error) --
+ PP_A04_PT = "sune",
+ PP_A04 = cre_PropertyParm_ptime(PP_A04_PT),
+ SDP_A04 = cre_sdp_a_ptime(PP_A04_PT),
+ PP_A04_Exp = {error, {invalid_ptime_packet_time, PP_A04_PT}},
+ SDP_A04_Exp = {error, {invalid_ptime_packet_time, PP_A04_PT}},
+
+
+ %% -- (PP) (ok) --
+ PP_A05_QA = 10,
+ PP_A05 = cre_PropertyParm_quality(PP_A05_QA),
+ SDP_A05 = cre_sdp_a_quality(PP_A05_QA),
+ PP_A05_Exp = {ok, SDP_A05},
+ SDP_A05_Exp = {ok, PP_A05},
+
+
+ %% -- (PP) (error) --
+ PP_A06_QA = "sune",
+ PP_A06 = cre_PropertyParm_quality(PP_A06_QA),
+ SDP_A06 = cre_sdp_a_quality(PP_A06_QA),
+ PP_A06_Exp = {error, {invalid_quality_quality, PP_A06_QA}},
+ SDP_A06_Exp = {error, {invalid_quality_quality, PP_A06_QA}},
+
+
+ %% -- (PP) (ok) --
+ PP_A07_A = "recvonly",
+ PP_A07 = cre_PropertyParm_a(PP_A07_A),
+ SDP_A07 = cre_sdp_a(PP_A07_A),
+ PP_A07_Exp = {ok, SDP_A07},
+ SDP_A07_Exp = {ok, PP_A07},
+
+
+ %% -- (PP) (ok) --
+ PP_A08_V = portrait,
+ PP_A08 = cre_PropertyParm_orient(PP_A08_V),
+ SDP_A08 = cre_sdp_a_orient(PP_A08_V),
+ PP_A08_Exp = {ok, SDP_A08},
+ SDP_A08_Exp = {ok, PP_A08},
+
+
+ %% -- (PP) (ok) --
+ PP_A09_V = landscape,
+ PP_A09 = cre_PropertyParm_orient(PP_A09_V),
+ SDP_A09 = cre_sdp_a_orient(PP_A09_V),
+ PP_A09_Exp = {ok, SDP_A09},
+ SDP_A09_Exp = {ok, PP_A09},
+
+
+ %% -- (PP) (ok) --
+ PP_A10_V = seascape,
+ PP_A10 = cre_PropertyParm_orient(PP_A10_V),
+ SDP_A10 = cre_sdp_a_orient(PP_A10_V),
+ PP_A10_Exp = {ok, SDP_A10},
+ SDP_A10_Exp = {ok, PP_A10},
+
+
+ %% -- (PP) (error) --
+ PP_A11_V = gurka,
+ SDP_A11_V = atom_to_list(PP_A11_V),
+ PP_A11 = cre_PropertyParm_orient(PP_A11_V),
+ SDP_A11 = cre_sdp_a_orient(PP_A11_V),
+ PP_A11_Exp = {error, {invalid_orient_orientation, SDP_A11_V}},
+ SDP_A11_Exp = {error, {invalid_orient_orientation, PP_A11_V}},
+
+
+ %% -- (PP) (ok) --
+ PP_A12_V = "gurka",
+ PP_A12 = cre_PropertyParm_cat(PP_A12_V),
+ SDP_A12 = cre_sdp_a_cat(PP_A12_V),
+ PP_A12_Exp = {ok, SDP_A12},
+ SDP_A12_Exp = {ok, PP_A12},
+
+
+ %% -- (PP) (ok) --
+ PP_A13_V = "gurka",
+ PP_A13 = cre_PropertyParm_keywds(PP_A13_V),
+ SDP_A13 = cre_sdp_a_keywds(PP_A13_V),
+ PP_A13_Exp = {ok, SDP_A13},
+ SDP_A13_Exp = {ok, PP_A13},
+
+
+ %% -- (PP) (ok) --
+ PP_A14_V = "gurka 1.0",
+ PP_A14 = cre_PropertyParm_tool(PP_A14_V),
+ SDP_A14 = cre_sdp_a_tool(PP_A14_V),
+ PP_A14_Exp = {ok, SDP_A14},
+ SDP_A14_Exp = {ok, PP_A14},
+
+
+ %% -- (PP) (ok) --
+ PP_A15_V = 15,
+ PP_A15 = cre_PropertyParm_maxptime(PP_A15_V),
+ SDP_A15 = cre_sdp_a_maxptime(PP_A15_V),
+ PP_A15_Exp = {ok, SDP_A15},
+ SDP_A15_Exp = {ok, PP_A15},
+
+
+ %% -- (PP) (error) --
+ PP_A16_V = "gurka",
+ PP_A16 = cre_PropertyParm_maxptime(PP_A16_V),
+ SDP_A16 = cre_sdp_a_maxptime(PP_A16_V),
+ PP_A16_Exp = {error, {invalid_maxptime_maximum_packet_time, PP_A16_V}},
+ SDP_A16_Exp = {error, {invalid_maxptime_maximum_packet_time, PP_A16_V}},
+
+
+ %% -- (PP) (ok) --
+ PP_A17_V = "H332",
+ PP_A17 = cre_PropertyParm_type(PP_A17_V ),
+ SDP_A17 = cre_sdp_a_type(PP_A17_V),
+ PP_A17_Exp = {ok, SDP_A17},
+ SDP_A17_Exp = {ok, PP_A17},
+
+
+ %% -- (PP) (ok) --
+ PP_A18_V = "ISO-8859-1",
+ PP_A18 = cre_PropertyParm_charset(PP_A18_V),
+ SDP_A18 = cre_sdp_a_charset(PP_A18_V),
+ PP_A18_Exp = {ok, SDP_A18},
+ SDP_A18_Exp = {ok, PP_A18},
+
+
+ %% -- (PP) (ok) --
+ PP_A19_PT = "gurka",
+ PP_A19 = cre_PropertyParm_sdplang(PP_A19_PT),
+ SDP_A19 = cre_sdp_a_sdplang(PP_A19_PT),
+ PP_A19_Exp = {ok, SDP_A19},
+ SDP_A19_Exp = {ok, PP_A19},
+
+
+ %% -- (PP) (ok) --
+ PP_A20_PT = "gurka",
+ PP_A20 = cre_PropertyParm_lang(PP_A20_PT),
+ SDP_A20 = cre_sdp_a_lang(PP_A20_PT),
+ PP_A20_Exp = {ok, SDP_A20},
+ SDP_A20_Exp = {ok, PP_A20},
+
+
+ %% -- (PP) (ok) --
+ PP_A21_PT = "21.0",
+ PP_A21 = cre_PropertyParm_framerate(PP_A21_PT),
+ SDP_A21 = cre_sdp_a_framerate(PP_A21_PT),
+ PP_A21_Exp = {ok, SDP_A21},
+ SDP_A21_Exp = {ok, PP_A21},
+
+
+%% %% -- (PP) (ok) --
+%% PP_A22_PT = "ISO-8859-1",
+%% PP_A22 = cre_PropertyParm_(PP_A22_T),
+%% SDP_A22 = cre_sdp_a_(PP_A22_PT),
+%% PP_A22_Exp = {ok, SDP_A22},
+%% SDP_A22_Exp = {ok, PP_A22},
+
+
+ %% -- (PP) (ok) --
+ PP_A23_FORMAT = "125",
+ PP_A23_PARAM = "profile-level-id=222; max-br=1212; max-mbps=20200",
+ PP_A23 = cre_PropertyParm_a_fmtp(PP_A23_FORMAT, PP_A23_PARAM),
+ SDP_A23 = cre_sdp_a_fmtp(PP_A23_FORMAT, PP_A23_PARAM),
+ PP_A23_Exp = {ok, SDP_A23},
+ SDP_A23_Exp = {ok, PP_A23},
+
+
+ %% -- (PP) (ok) --
+ PP_B01_MOD = "2",
+ PP_B01_BW = 523,
+ PP_B01 = cre_PropertyParm_b(PP_B01_MOD, PP_B01_BW),
+ SDP_B01 = cre_sdp_b(PP_B01_MOD, PP_B01_BW),
+ PP_B01_Exp = {ok, SDP_B01},
+ SDP_B01_Exp = {ok, PP_B01},
+
+
+ %% -- (PP) (error) --
+ PP_B02_B = "sune",
+ PP_B02 = cre_PropertyParm("b", PP_B02_B),
+ PP_B02_Exp = {error, {invalid_PropertyParm,
+ {bandwidth_info, PP_B02_B, [PP_B02_B]}}},
+
+
+ %% -- (PP) (ok) --
+ PP_B03_MOD = "X",
+ PP_B03_BW = 525,
+ PP_B03 = cre_PropertyParm_b(PP_B03_MOD, PP_B03_BW),
+ SDP_B03 = cre_sdp_b(PP_B03_MOD, PP_B03_BW),
+ PP_B03_Exp = {ok, SDP_B03},
+ SDP_B03_Exp = {ok, PP_B03},
+
+
+ %% -- (PP) (error) --
+ PP_B04_BWT = "X",
+ PP_B04_BW = "sune",
+ PP_B04 = cre_PropertyParm_b(PP_B04_BWT, PP_B04_BW),
+ SDP_B04 = cre_sdp_b(PP_B04_BWT, PP_B04_BW),
+ PP_B04_Exp = {error, {invalid_bandwidth_bandwidth, PP_B04_BW}},
+ SDP_B04_Exp = {error, {invalid_bandwidth_bandwidth, PP_B04_BW}},
+
+
+ %% -- (PP) (ok) --
+ PP_T01_START = 1200,
+ PP_T01_STOP = 1300,
+ PP_T01 = cre_PropertyParm_t(PP_T01_START, PP_T01_STOP),
+ SDP_T01 = cre_sdp_t(PP_T01_START, PP_T01_STOP),
+ PP_T01_Exp = {ok, SDP_T01},
+ SDP_T01_Exp = {ok, PP_T01},
+
+
+ %% -- (PP) (ok) --
+ PP_R01_RPT = "10",
+ PP_R01_DUR = "100",
+ PP_R01_LOO = ["2", "4", "6"],
+ PP_R01 = cre_PropertyParm_r(PP_R01_RPT, PP_R01_DUR, PP_R01_LOO),
+ SDP_R01 = cre_sdp_r(PP_R01_RPT, PP_R01_DUR, PP_R01_LOO),
+ PP_R01_Exp = {ok, SDP_R01},
+ SDP_R01_Exp = {ok, PP_R01},
+
+
+ %% -- (PP) (ok) --
+ PP_Z01_LOA_V1 = #megaco_sdp_z_adjustement{time = "12121212",
+ offset = "-1h"},
+ PP_Z01_LOA_V2 = #megaco_sdp_z_adjustement{time = "34343434",
+ offset = "0"},
+ PP_Z01_LOA = [PP_Z01_LOA_V1, PP_Z01_LOA_V2],
+ PP_Z01 = cre_PropertyParm_z(PP_Z01_LOA),
+ SDP_Z01 = cre_sdp_z(PP_Z01_LOA),
+ PP_Z01_Exp = {ok, SDP_Z01},
+ SDP_Z01_Exp = {ok, PP_Z01},
+
+
+ %% -- (PP) (error) --
+ PP_Z02 = cre_PropertyParm("z", []),
+ SDP_Z02 = cre_sdp_z([]),
+ PP_Z02_Exp = {error, {invalid_tzones_list_of_adjustments, []}},
+ SDP_Z02_Exp = {error, {invalid_tzones_list_of_adjustments, []}},
+
+
+ %% -- (PP) (ok) --
+ PP_K01_M = prompt,
+ PP_K01_EK = undefined,
+ PP_K01 = cre_PropertyParm_k(PP_K01_M, PP_K01_EK),
+ SDP_K01 = cre_sdp_k(PP_K01_M),
+ PP_K01_Exp = {ok, SDP_K01},
+ SDP_K01_Exp = {ok, PP_K01},
+
+
+ %% -- (PP) (ok) --
+ PP_K02_M = clear,
+ PP_K02_EK = "whatever",
+ PP_K02 = cre_PropertyParm_k(PP_K02_M, PP_K02_EK),
+ SDP_K02 = cre_sdp_k(PP_K02_M, PP_K02_EK),
+ PP_K02_Exp = {ok, SDP_K02},
+ SDP_K02_Exp = {ok, PP_K02},
+
+
+ %% -- (PP) (ok) --
+ PP_K03_M = "method",
+ PP_K03_EK = "key",
+ PP_K03 = cre_PropertyParm_k(PP_K03_M, PP_K03_EK),
+ SDP_K03 = cre_sdp_k(PP_K03_M, PP_K03_EK),
+ PP_K03_Exp = {ok, SDP_K03},
+ SDP_K03_Exp = {ok, PP_K03},
+
+
+ %% -- (PP) (ok) --
+ PP_S01_SN = "new session",
+ PP_S01 = cre_PropertyParm_s(PP_S01_SN),
+ SDP_S01 = cre_sdp_s(PP_S01_SN),
+ PP_S01_Exp = {ok, SDP_S01},
+ SDP_S01_Exp = {ok, PP_S01},
+
+
+ %% -- (PP) (ok) --
+ PP_I01_SD = "Session and Media Information",
+ PP_I01 = cre_PropertyParm_i(PP_I01_SD),
+ SDP_I01 = cre_sdp_i(PP_I01_SD),
+ PP_I01_Exp = {ok, SDP_I01},
+ SDP_I01_Exp = {ok, PP_I01},
+
+
+ %% -- (PP) (ok) --
+ PP_U01_URI = "http://www.erlang.org/",
+ PP_U01 = cre_PropertyParm_u(PP_U01_URI),
+ SDP_U01 = cre_sdp_u(PP_U01_URI),
+ PP_U01_Exp = {ok, SDP_U01},
+ SDP_U01_Exp = {ok, PP_U01},
+
+
+ %% -- (PP) (ok) --
+ PP_E01_EMAIL = "[email protected]",
+ PP_E01 = cre_PropertyParm_e(PP_E01_EMAIL),
+ SDP_E01 = cre_sdp_e(PP_E01_EMAIL),
+ PP_E01_Exp = {ok, SDP_E01},
+ SDP_E01_Exp = {ok, PP_E01},
+
+
+ %% -- (PP) (ok) --
+ PP_P01_PHONE = "+1 713 555 1234",
+ PP_P01 = cre_PropertyParm_p(PP_P01_PHONE),
+ SDP_P01 = cre_sdp_p(PP_P01_PHONE),
+ PP_P01_Exp = {ok, SDP_P01},
+ SDP_P01_Exp = {ok, PP_P01},
+
+
+ %% -- (PP) (error) --
+ PP_N01 = cre_PropertyParm("not_recognized", "whatever"),
+ PP_N01_Exp = {error, undefined_PropertyParm},
+
+
+ %% -- (PG) (ok) --
+ PG01 = [{PP_V01, ok},
+ {PP_C01, ok},
+ {PP_M01, ok}],
+
+
+ %% -- (PG) (ok) --
+ PG02 = [{PP_V02, ok},
+ {PP_C05, ok},
+ {PP_A02, ok}],
+
+
+ %% -- (PG) (error) --
+ PG03 = [{PP_V03, error},
+ {PP_C08, ok},
+ {PP_M02, ok}],
+
+
+ %% -- (PG) (error) --
+ PG04 = [{PP_V02, ok},
+ {PP_C04, error},
+ {PP_C07, error}],
+
+
+ %% -- (PGs) (ok) --
+ PGS01 = [PG01, PG02],
+
+
+ %% -- (PGs) (error) --
+ PGS02 = [PG01, PG04],
+
+
+ Instructions =
+ [
+ pp_dec_instruction("version 01 - dec [ok]", PP_V01, PP_V01_Exp),
+ pp_enc_instruction("version 01 - enc [ok]", SDP_V01, SDP_V01_Exp),
+ pp_dec_instruction("version 02 - dec [ok]", PP_V02, PP_V02_Exp),
+ pp_enc_instruction("version 02 - enc [ok]", SDP_V02, SDP_V02_Exp),
+ pp_dec_instruction("version 03 - dec [error]", PP_V03, PP_V03_Exp),
+ pp_enc_instruction("version 03 - enc [error]", SDP_V03, SDP_V03_Exp),
+ pp_dec_instruction("connection info 01 - dec [ok]", PP_C01, PP_C01_Exp),
+ pp_enc_instruction("connection info 01 - enc [ok]", SDP_C01, SDP_C01_Exp),
+ pp_dec_instruction("connection info 02 - dec [ok]", PP_C02, PP_C02_Exp),
+ pp_enc_instruction("connection info 02 - enc [ok]", SDP_C02, SDP_C02_Exp),
+ pp_dec_instruction("connection info 03 - dec [ok]", PP_C03, PP_C03_Exp),
+ pp_enc_instruction("connection info 03 - enc [ok]", SDP_C03, SDP_C03_Exp),
+ pp_dec_instruction("connection info 04 - dec [error]", PP_C04, PP_C04_Exp),
+
+ pp_dec_instruction("connection info 05 - dec [ok]", PP_C05, PP_C05_Exp),
+ pp_enc_instruction("connection info 05 - enc [ok]", SDP_C05, SDP_C05_Exp),
+ pp_dec_instruction("connection info 06 - dec [ok]", PP_C06, PP_C06_Exp),
+ pp_enc_instruction("connection info 06 - enc [ok]", SDP_C06, SDP_C06_Exp),
+ pp_dec_instruction("connection info 07 - dec [error]", PP_C07, PP_C07_Exp),
+ pp_enc_instruction("connection info 07 - enc [error]", SDP_C07, SDP_C07_Exp),
+ pp_dec_instruction("connection info 08 - dec [ok]", PP_C08, PP_C08_Exp),
+ pp_enc_instruction("connection info 08 - enc [ok]", SDP_C08, SDP_C08_Exp),
+ pp_dec_instruction("media announcement 01 - dec [ok]", PP_M01, PP_M01_Exp),
+ pp_enc_instruction("media announcement 01 - enc [ok]", SDP_M01, SDP_M01_Exp),
+ pp_dec_instruction("media announcement 02 - dec [ok]", PP_M02, PP_M02_Exp),
+ pp_enc_instruction("media announcement 02 - enc [ok]", SDP_M02, SDP_M02_Exp),
+ pp_dec_instruction("origin 01 - dec [ok]", PP_O01, PP_O01_Exp),
+ pp_enc_instruction("origin 01 - enc [ok]", SDP_O01, SDP_O01_Exp),
+ pp_dec_instruction("origin 02 - dec [ok]", PP_O02, PP_O02_Exp),
+ pp_enc_instruction("origin 02 - enc [ok]", SDP_O02, SDP_O02_Exp),
+ pp_dec_instruction("attributes 01 - dec [ok]", PP_A01, PP_A01_Exp),
+ pp_enc_instruction("attributes 01 - enc [ok]", SDP_A01, SDP_A01_Exp),
+ pp_dec_instruction("attributes 02 - dec [ok]", PP_A02, PP_A02_Exp),
+ pp_enc_instruction("attributes 02 - enc [ok]", SDP_A02, SDP_A02_Exp),
+ pp_dec_instruction("attributes 03 - dec [ok]", PP_A03, PP_A03_Exp),
+ pp_enc_instruction("attributes 03 - enc [ok]", SDP_A03, SDP_A03_Exp),
+ pp_dec_instruction("attributes 04 - dec [error]", PP_A04, PP_A04_Exp),
+ pp_enc_instruction("attributes 04 - enc [error]", SDP_A04, SDP_A04_Exp),
+ pp_dec_instruction("attributes 05 - dec [ok]", PP_A05, PP_A05_Exp),
+ pp_enc_instruction("attributes 05 - enc [ok]", SDP_A05, SDP_A05_Exp),
+ pp_dec_instruction("attributes 06 - dec [error]", PP_A06, PP_A06_Exp),
+ pp_enc_instruction("attributes 06 - dec [error]", SDP_A06, SDP_A06_Exp),
+ pp_dec_instruction("attributes 07 - dec [ok]", PP_A07, PP_A07_Exp),
+ pp_enc_instruction("attributes 07 - enc [ok]", SDP_A07, SDP_A07_Exp),
+ pp_dec_instruction("attributes 08 - dec [ok]", PP_A08, PP_A08_Exp),
+ pp_enc_instruction("attributes 08 - enc [ok]", SDP_A08, SDP_A08_Exp),
+
+ pp_dec_instruction("attributes 09 - dec [ok]", PP_A09, PP_A09_Exp),
+ pp_enc_instruction("attributes 09 - enc [ok]", SDP_A09, SDP_A09_Exp),
+ pp_dec_instruction("attributes 10 - dec [ok]", PP_A10, PP_A10_Exp),
+ pp_enc_instruction("attributes 10 - enc [ok]", SDP_A10, SDP_A10_Exp),
+ pp_dec_instruction("attributes 11 - dec [error]", PP_A11, PP_A11_Exp),
+ pp_enc_instruction("attributes 11 - enc [error]", SDP_A11, SDP_A11_Exp),
+
+ pp_dec_instruction("attributes 12 - dec [ok]", PP_A12, PP_A12_Exp),
+ pp_enc_instruction("attributes 12 - enc [ok]", SDP_A12, SDP_A12_Exp),
+ pp_dec_instruction("attributes 13 - dec [ok]", PP_A13, PP_A13_Exp),
+ pp_enc_instruction("attributes 13 - enc [ok]", SDP_A13, SDP_A13_Exp),
+ pp_dec_instruction("attributes 14 - dec [ok]", PP_A14, PP_A14_Exp),
+ pp_enc_instruction("attributes 14 - enc [ok]", SDP_A14, SDP_A14_Exp),
+ pp_dec_instruction("attributes 15 - dec [ok]", PP_A15, PP_A15_Exp),
+ pp_enc_instruction("attributes 15 - enc [ok]", SDP_A15, SDP_A15_Exp),
+ pp_dec_instruction("attributes 16 - dec [error]", PP_A16, PP_A16_Exp),
+ pp_enc_instruction("attributes 16 - enc [error]", SDP_A16, SDP_A16_Exp),
+ pp_dec_instruction("attributes 17 - dec [ok]", PP_A17, PP_A17_Exp),
+ pp_enc_instruction("attributes 17 - enc [ok]", SDP_A17, SDP_A17_Exp),
+ pp_dec_instruction("attributes 18 - dec [ok]", PP_A18, PP_A18_Exp),
+ pp_enc_instruction("attributes 18 - enc [ok]", SDP_A18, SDP_A18_Exp),
+ pp_dec_instruction("attributes 19 - dec [ok]", PP_A19, PP_A19_Exp),
+ pp_enc_instruction("attributes 19 - enc [ok]", SDP_A19, SDP_A19_Exp),
+ pp_dec_instruction("attributes 20 - dec [ok]", PP_A20, PP_A20_Exp),
+ pp_enc_instruction("attributes 20 - enc [ok]", SDP_A20, SDP_A20_Exp),
+ pp_dec_instruction("attributes 21 - dec [ok]", PP_A21, PP_A21_Exp),
+ pp_enc_instruction("attributes 21 - enc [ok]", SDP_A21, SDP_A21_Exp),
+ pp_dec_instruction("attributes 23 - dec [ok]", PP_A23, PP_A23_Exp),
+ pp_enc_instruction("attributes 24 - enc [ok]", SDP_A23, SDP_A23_Exp),
+
+ pp_dec_instruction("bandwidth 01 - dec [ok]", PP_B01, PP_B01_Exp),
+ pp_enc_instruction("bandwidth 01 - enc [ok]", SDP_B01, SDP_B01_Exp),
+ pp_dec_instruction("bandwidth 02 - dec [ok]", PP_B02, PP_B02_Exp),
+
+ pp_dec_instruction("bandwidth 03 - dec [ok]", PP_B03, PP_B03_Exp),
+ pp_enc_instruction("bandwidth 03 - enc [ok]", SDP_B03, SDP_B03_Exp),
+ pp_dec_instruction("bandwidth 04 - dec [error]", PP_B04, PP_B04_Exp),
+ pp_enc_instruction("bandwidth 04 - enc [error]", SDP_B04, SDP_B04_Exp),
+ pp_dec_instruction("times 01 - dec [ok]", PP_T01, PP_T01_Exp),
+ pp_enc_instruction("times 01 - enc [ok]", SDP_T01, SDP_T01_Exp),
+ pp_dec_instruction("repeat times 01 - dec [ok]", PP_R01, PP_R01_Exp),
+ pp_enc_instruction("repeat times 01 - enc [ok]", SDP_R01, SDP_R01_Exp),
+ pp_dec_instruction("time zones 01 - dec [ok]", PP_Z01, PP_Z01_Exp),
+ pp_enc_instruction("time zones 01 - enc [ok]", SDP_Z01, SDP_Z01_Exp),
+ pp_dec_instruction("time zones 02 - dec [error]", PP_Z02, PP_Z02_Exp),
+ pp_enc_instruction("time zones 02 - enc [error]", SDP_Z02, SDP_Z02_Exp),
+ pp_dec_instruction("encryption keys 01 - dec [ok]", PP_K01, PP_K01_Exp),
+ pp_enc_instruction("encryption keys 01 - enc [ok]", SDP_K01, SDP_K01_Exp),
+ pp_dec_instruction("encryption keys 01 - dec [ok]", PP_K02, PP_K02_Exp),
+ pp_enc_instruction("encryption keys 01 - enc [ok]", SDP_K02, SDP_K02_Exp),
+ pp_dec_instruction("encryption keys 01 - dec [ok]", PP_K03, PP_K03_Exp),
+ pp_enc_instruction("encryption keys 01 - enc [ok]", SDP_K03, SDP_K03_Exp),
+ pp_dec_instruction("session name 01 - dec [ok]", PP_S01, PP_S01_Exp),
+ pp_enc_instruction("session name 01 - enc [ok]", SDP_S01, SDP_S01_Exp),
+ pp_dec_instruction("session and media information 01 - dec [ok]", PP_I01, PP_I01_Exp),
+ pp_enc_instruction("session and media information 01 - enc [ok]", SDP_I01, SDP_I01_Exp),
+ pp_dec_instruction("uri 01 - dec [ok]", PP_U01, PP_U01_Exp),
+ pp_enc_instruction("uri 01 - enc [ok]", SDP_U01, SDP_U01_Exp),
+ pp_dec_instruction("email 01 - dec [ok]", PP_E01, PP_E01_Exp),
+ pp_enc_instruction("email 01 - enc [ok]", SDP_E01, SDP_E01_Exp),
+ pp_dec_instruction("phone 01 - dec [ok]", PP_P01, PP_P01_Exp),
+ pp_enc_instruction("phone 01 - enc [ok]", SDP_P01, SDP_P01_Exp),
+ pp_dec_instruction("undefined 01 - dec [error]", PP_N01, PP_N01_Exp),
+
+ pg_dec_instruction("property group 01 - ok", PG01),
+ pg_dec_instruction("property group 02 - ok", PG02),
+ pg_dec_instruction("property group 03 - error", PG03),
+ pg_dec_instruction("property group 04 - error", PG04),
+
+ pgs_dec_instruction("property groups 01 - ok", PGS01),
+ pgs_dec_instruction("property groups 02 - error", PGS02)
+
+ ],
+ exec(Instructions).
+
+
+verify_decode_pg([], []) ->
+ ok;
+verify_decode_pg([{PP, error}|PPs], [{PP, _Err}|SDPs]) ->
+ verify_decode_pg(PPs, SDPs);
+verify_decode_pg([{PP, ok}|_], [{PP, _Err}|_]) ->
+ error;
+verify_decode_pg([{_PP, _ExpStatus}|PG], [_SDP|SDP_PG]) ->
+ verify_decode_pg(PG, SDP_PG).
+
+verify_decode_pgs(PGS, SDP_PGS) ->
+ verify_decode_pg(lists:flatten(PGS), lists:flatten(SDP_PGS)).
+
+
+%% ===============================================================
+
+otp8123(suite) ->
+ [];
+otp8123(Config) when is_list(Config) ->
+ io:format("otp8123 -> entry with"
+ "~n Config: ~p"
+ "~n", [Config]),
+
+ Instructions =
+ [
+ pg_dec_instruction("property group 01 - dec [ok]", otp8123_pg1()),
+ pg_dec_instruction("property group 02 - dec [ok]", otp8123_pg2()),
+ pg_dec_instruction("property group 03 - dec [ok]", otp8123_pg3()),
+ pg_dec_instruction("property group 04 - dec [ok]", otp8123_pg4())
+ ],
+ exec(Instructions),
+ ok.
+
+otp8123_pg1() ->
+ PP1 = #'PropertyParm'{name = "m",
+ value = ["audio 49154 RTP/AVP 8"]},
+ PP2 = #'PropertyParm'{name = "a",
+ value = ["maxptime: 30"]},
+ PP3 = #'PropertyParm'{name = "a",
+ value = ["ptime:2"]},
+ PP4 = #'PropertyParm'{name = "a",
+ value = ["tpmap:8 PCMA/8000/1"]},
+ PG = [PP1, PP2, PP3, PP4],
+ [{PP, ok} || PP <- PG].
+
+otp8123_pg2() ->
+ PP1 = #'PropertyParm'{name = "m",
+ value = ["audio 49154 RTP/AVP 8"]},
+ PP2 = #'PropertyParm'{name = "a",
+ value = ["maxptime: 30 "]},
+ PP3 = #'PropertyParm'{name = "a",
+ value = ["ptime:2"]},
+ PP4 = #'PropertyParm'{name = "a",
+ value = ["tpmap:8 PCMA/8000/1"]},
+ PG = [PP1, PP2, PP3, PP4],
+ [{PP, ok} || PP <- PG].
+
+otp8123_pg3() ->
+ PP1 = #'PropertyParm'{name = "m",
+ value = ["audio 49154 RTP/AVP 8"]},
+ PP2 = #'PropertyParm'{name = "a",
+ value = ["maxptime:30"]},
+ PP3 = #'PropertyParm'{name = "a",
+ value = ["ptime: 2"]},
+ PP4 = #'PropertyParm'{name = "a",
+ value = ["tpmap:8 PCMA/8000/1"]},
+ PG = [PP1, PP2, PP3, PP4],
+ [{PP, ok} || PP <- PG].
+
+otp8123_pg4() ->
+ PP1 = #'PropertyParm'{name = "m",
+ value = ["audio 49154 RTP/AVP 8"]},
+ PP2 = #'PropertyParm'{name = "a",
+ value = ["maxptime:30"]},
+ PP3 = #'PropertyParm'{name = "a",
+ value = ["ptime: 2 "]},
+ PP4 = #'PropertyParm'{name = "a",
+ value = ["tpmap:8 PCMA/8000/1"]},
+ PG = [PP1, PP2, PP3, PP4],
+ [{PP, ok} || PP <- PG].
+
+
+
+%% ===============================================================
+%%
+%% Instruction engine
+%%
+
+instr_verify_pp(Expected) ->
+ fun(Res) ->
+ case Res of
+ Expected -> ok;
+ _ -> {error, Expected}
+ end
+ end.
+
+instr_verify_dec_pg(Data) ->
+ fun({ok, SDP}) ->
+ verify_decode_pg(Data, SDP);
+ (_Bad) ->
+ error
+ end.
+
+instr_verify_dec_pgs(Data) ->
+ fun({ok, SDP}) ->
+ verify_decode_pgs(Data, SDP);
+ (_Bad) ->
+ error
+ end.
+
+
+pp_dec_instruction(Desc, Data, Exp) ->
+ dec_instruction(Desc, Data, instr_verify_pp(Exp)).
+
+pp_enc_instruction(Desc, Data, Exp) ->
+ enc_instruction(Desc, Data, instr_verify_pp(Exp)).
+
+pg_dec_instruction(Desc, Data0) ->
+ Data = [D || {D, _} <- Data0],
+ dec_instruction(Desc, Data, instr_verify_dec_pg(Data0)).
+
+pgs_dec_instruction(Desc, Data0) ->
+ Data = [[D || {D, _} <- PG] || PG <- Data0],
+ dec_instruction(Desc, Data, instr_verify_dec_pgs(Data0)).
+
+dec_instruction(Desc, Data, Verify) ->
+ instruction(Desc, fun(D) -> megaco:decode_sdp(D) end, Data, Verify).
+
+enc_instruction(Desc, Data, Verify) ->
+ instruction(Desc, fun(D) -> megaco:encode_sdp(D) end, Data, Verify).
+
+instruction(Desc, Cmd, Data, Verify) ->
+ {Desc, Cmd, Data, Verify}.
+
+exec(Instructions) ->
+ exec(Instructions, []).
+
+exec([], []) ->
+ ok;
+exec([], Acc) ->
+ {error, lists:reverse(Acc)};
+exec([Instr|Instructions], Acc) ->
+ case exec_instruction(Instr) of
+ ok ->
+ exec(Instructions, Acc);
+ Error ->
+ exec(Instructions, [Error|Acc])
+ end.
+
+
+exec_instruction({Desc, Cmd, Data, Verify}) ->
+ io:format("~n"
+ "*** Test ~s ***"
+ "~n", [Desc]),
+ Res = (catch Cmd(Data)),
+ case (catch Verify(Res)) of
+ ok ->
+ ok;
+ error ->
+ {error, {instruction_failed, {Desc, Data, Res}}};
+ {error, Expected} ->
+ {error, {instruction_failed, {Desc, Data, Res, Expected}}};
+ Else ->
+ {error, {verification_error, {Desc, Data, Res, Else}}}
+ end.
+
+
+%% ===============================================================
+%%
+%% Utility functions to generate PropertyParm records
+%%
+
+cre_PropertyParm_p(Num) when is_list(Num) ->
+ cre_PropertyParm("p", Num).
+
+cre_sdp_p(PN) ->
+ #megaco_sdp_p{phone_number = PN}.
+
+cre_PropertyParm_e(Email) when is_list(Email) ->
+ cre_PropertyParm("e", Email).
+
+cre_sdp_e(E) ->
+ #megaco_sdp_e{email = E}.
+
+cre_PropertyParm_u(URI) when is_list(URI) ->
+ cre_PropertyParm("u", URI).
+
+cre_sdp_u(U) ->
+ #megaco_sdp_u{uri = U}.
+
+cre_PropertyParm_i(SessionDescr) when is_list(SessionDescr) ->
+ cre_PropertyParm("i", SessionDescr).
+
+cre_sdp_i(SD) ->
+ #megaco_sdp_i{session_descriptor = SD}.
+
+cre_PropertyParm_s(Name) when is_list(Name) ->
+ cre_PropertyParm("s", Name).
+
+cre_sdp_s(N) ->
+ #megaco_sdp_s{name = N}.
+
+cre_PropertyParm_k(prompt, _) ->
+ cre_PropertyParm("k", "prompt");
+cre_PropertyParm_k(clear, EncryptionKey) when is_list(EncryptionKey) ->
+ cre_PropertyParm("k", "clear:" ++ EncryptionKey);
+cre_PropertyParm_k(base64, EncryptionKey) when is_list(EncryptionKey) ->
+ cre_PropertyParm("k", "base64:" ++ EncryptionKey);
+cre_PropertyParm_k(uri, EncryptionKey) when is_list(EncryptionKey) ->
+ cre_PropertyParm("k", "uri:" ++ EncryptionKey);
+cre_PropertyParm_k(Method, EncryptionKey)
+ when is_list(Method) and is_list(EncryptionKey) ->
+ cre_PropertyParm("k", Method ++ ":" ++ EncryptionKey).
+
+cre_sdp_k(M) ->
+ #megaco_sdp_k{method = M}.
+cre_sdp_k(M, EK) ->
+ #megaco_sdp_k{method = M, encryption_key = EK}.
+
+cre_PropertyParm_z([H | _] = LOA) when is_record(H, megaco_sdp_z_adjustement) ->
+ F = fun(#megaco_sdp_z_adjustement{time = T, offset = O}, Str) ->
+ Str ++ " " ++ T ++ " " ++ O
+ end,
+ cre_PropertyParm("z", lists:foldl(F, [], LOA)).
+
+cre_sdp_z(LOA) ->
+ #megaco_sdp_z{list_of_adjustments = LOA}.
+
+cre_PropertyParm_r(Repeat, Duration, ListOfOffsets)
+ when is_list(Repeat) and is_list(Duration) and is_list(ListOfOffsets) ->
+ F = fun(Elem, Str) -> Str ++ " " ++ Elem end,
+ Val = Repeat ++ " " ++ Duration ++ lists:foldl(F, [], ListOfOffsets),
+ cre_PropertyParm("r", Val).
+
+cre_sdp_r(Repeat, Duration, ListOfOffsets) ->
+ #megaco_sdp_r{repeat_interval = Repeat,
+ active_duration = Duration,
+ list_of_offsets = ListOfOffsets}.
+
+cre_PropertyParm_t(Start, Stop)
+ when is_list(Start) and is_list(Stop) ->
+ cre_PropertyParm("t", Start ++ " " ++ Stop);
+cre_PropertyParm_t(Start, Stop) ->
+ cre_PropertyParm_t(i2s(Start), i2s(Stop)).
+
+cre_sdp_t(Start, Stop) ->
+ #megaco_sdp_t{start = Start, stop = Stop}.
+
+cre_PropertyParm_b(BwType, Bandwidth)
+ when is_list(BwType) and is_integer(Bandwidth) ->
+ cre_PropertyParm_b(BwType, i2s(Bandwidth));
+cre_PropertyParm_b(BwType, Bandwidth)
+ when is_list(BwType) and is_list(Bandwidth) ->
+ cre_PropertyParm("b", BwType ++ ":" ++ Bandwidth).
+
+cre_sdp_b(BWT, BW) ->
+ #megaco_sdp_b{bwtype = BWT, bandwidth = BW}.
+
+
+cre_PropertyParm_cat(Cat) when is_list(Cat) ->
+ cre_PropertyParm_a("cat", Cat).
+
+cre_sdp_a_cat(C) ->
+ #megaco_sdp_a_cat{category = C}.
+
+
+cre_PropertyParm_keywds(KeyWds) when is_list(KeyWds) ->
+ cre_PropertyParm_a("keywds", KeyWds).
+
+cre_sdp_a_keywds(KW) ->
+ #megaco_sdp_a_keywds{keywords = KW}.
+
+
+cre_PropertyParm_tool(NameAndVersion) when is_list(NameAndVersion) ->
+ cre_PropertyParm_a("tool", NameAndVersion).
+
+cre_sdp_a_tool(NAV) ->
+ #megaco_sdp_a_tool{name_and_version = NAV}.
+
+
+cre_PropertyParm_ptime(PacketTime) when is_integer(PacketTime) ->
+ cre_PropertyParm_ptime(i2s(PacketTime));
+cre_PropertyParm_ptime(PacketTime) when is_list(PacketTime) ->
+ cre_PropertyParm_a("ptime", PacketTime).
+
+cre_sdp_a_ptime(PT) ->
+ #megaco_sdp_a_ptime{packet_time = PT}.
+
+
+cre_PropertyParm_maxptime(MaxPacketTime) when is_integer(MaxPacketTime) ->
+ cre_PropertyParm_maxptime(i2s(MaxPacketTime));
+cre_PropertyParm_maxptime(MaxPacketTime) when is_list(MaxPacketTime) ->
+ cre_PropertyParm_a("maxptime", MaxPacketTime).
+
+cre_sdp_a_maxptime(PT) ->
+ #megaco_sdp_a_maxptime{maximum_packet_time = PT}.
+
+
+cre_PropertyParm_rtpmap(Payload, EncName, ClockRate) ->
+ cre_PropertyParm_rtpmap(Payload, EncName, ClockRate, []).
+
+cre_PropertyParm_rtpmap(Payload, EncName, ClockRate, EncPar)
+ when is_integer(Payload) and
+ is_list(EncName) and
+ is_integer(ClockRate) and
+ is_list(EncPar) ->
+ F = fun(Elem, Str) -> Str ++ "/" ++ Elem end,
+ Val =
+ integer_to_list(Payload) ++ " " ++
+ EncName ++ "/" ++ integer_to_list(ClockRate) ++
+ lists:foldl(F, [], EncPar),
+ cre_PropertyParm_a("rtpmap", Val).
+
+cre_sdp_a_rtpmap(Payload, EncName, ClockRate) ->
+ #megaco_sdp_a_rtpmap{payload_type = Payload,
+ encoding_name = EncName,
+ clock_rate = ClockRate}.
+cre_sdp_a_rtpmap(Payload, EncName, ClockRate, EncParms) ->
+ #megaco_sdp_a_rtpmap{payload_type = Payload,
+ encoding_name = EncName,
+ clock_rate = ClockRate,
+ encoding_parms = EncParms}.
+
+cre_PropertyParm_orient(Orientation) when is_atom(Orientation) ->
+ cre_PropertyParm_orient(atom_to_list(Orientation));
+cre_PropertyParm_orient(Orientation) when is_list(Orientation) ->
+ cre_PropertyParm_a("orient", Orientation).
+
+cre_sdp_a_orient(O) ->
+ #megaco_sdp_a_orient{orientation = O}.
+
+cre_PropertyParm_type(CT) when is_list(CT) ->
+ cre_PropertyParm_a("type", CT).
+
+cre_sdp_a_type(CT) ->
+ #megaco_sdp_a_type{conf_type = CT}.
+
+cre_PropertyParm_charset(CS) when is_list(CS) ->
+ cre_PropertyParm_a("charset", CS).
+
+cre_sdp_a_charset(CS) ->
+ #megaco_sdp_a_charset{char_set = CS}.
+
+cre_PropertyParm_sdplang(L) when is_list(L) ->
+ cre_PropertyParm_a("sdplang", L).
+
+cre_sdp_a_sdplang(L) ->
+ #megaco_sdp_a_sdplang{tag = L}.
+
+cre_PropertyParm_lang(L) when is_list(L) ->
+ cre_PropertyParm_a("lang", L).
+
+cre_sdp_a_lang(L) ->
+ #megaco_sdp_a_lang{tag = L}.
+
+cre_PropertyParm_framerate(FR) when is_list(FR) ->
+ cre_PropertyParm_a("framerate", FR).
+
+cre_sdp_a_framerate(FR) ->
+ #megaco_sdp_a_framerate{frame_rate = FR}.
+
+cre_PropertyParm_quality(Quality) when is_integer(Quality) ->
+ cre_PropertyParm_quality(i2s(Quality));
+cre_PropertyParm_quality(Quality) when is_list(Quality) ->
+ cre_PropertyParm_a("quality", Quality).
+
+cre_sdp_a_quality(Qa) ->
+ #megaco_sdp_a_quality{quality = Qa}.
+
+cre_PropertyParm_a(Attr, AttrValue)
+ when is_list(Attr) and is_list(AttrValue) ->
+ cre_PropertyParm("a", Attr ++ ":" ++ AttrValue).
+
+cre_PropertyParm_a(Attr) when is_list(Attr) ->
+ cre_PropertyParm("a", Attr).
+
+cre_PropertyParm_a_fmtp(Format, Param)
+ when is_list(Format) and is_list(Param) ->
+ cre_PropertyParm_a("fmtp", Format ++ " " ++ Param).
+
+cre_sdp_a_fmtp(Fmt, Parm) ->
+ #megaco_sdp_a_fmtp{format = Fmt, param = Parm}.
+
+cre_sdp_a(Attr) ->
+ #megaco_sdp_a{attribute = Attr}.
+
+%% cre_sdp_a(Attr, Val) ->
+%% #megaco_sdp_a{attribute = Attr,
+%% value = Val}.
+
+cre_PropertyParm_o(User, SID, Version, AddrType, Addr) ->
+ cre_PropertyParm_o(User, SID, Version, in, AddrType, Addr).
+
+cre_PropertyParm_o(User, SID, Version, NetType, AddrType, Addr)
+ when is_list(User) and
+ is_integer(SID) and
+ is_integer(Version) and
+ is_list(NetType) or (NetType == in) and
+ is_list(AddrType) or ((AddrType == ip4) or (AddrType == ip6)) and
+ is_list(Addr) ->
+ NT = case NetType of
+ in -> "IN";
+ _ -> NetType
+ end,
+ AT = case AddrType of
+ ip4 -> "IP4";
+ ip6 -> "IP6";
+ _ -> AddrType
+ end,
+ Val =
+ User ++ " " ++
+ i2s(SID) ++ " " ++
+ i2s(Version) ++ " " ++
+ NT ++ " " ++
+ AT ++ " " ++
+ Addr,
+ cre_PropertyParm("o", Val).
+
+cre_sdp_o(Name, SID, V, AddrType, Addr) ->
+ cre_sdp_o(Name, SID, V, in, AddrType, Addr).
+cre_sdp_o(Name, SID, V, NetType, AddrType, Addr) ->
+ #megaco_sdp_o{user_name = Name,
+ session_id = SID,
+ version = V,
+ network_type = NetType,
+ address_type = AddrType,
+ address = Addr}.
+
+cre_PropertyParm_m(Media, Port, Transport, FmtList)
+ when is_atom(Media) ->
+ cre_PropertyParm_m(atom_to_list(Media),
+ Port, Transport, FmtList);
+cre_PropertyParm_m(Media, Port0, Transport, FmtList)
+ when is_list(Media) and is_list(Transport) and is_list(FmtList) ->
+ Port = i2s(Port0),
+ Val =
+ Media ++ " " ++ Port ++ " " ++ Transport ++ " " ++ val(FmtList),
+ cre_PropertyParm("m", Val).
+
+cre_PropertyParm_m(Media, Port, NumPorts, Transport, FmtList)
+ when is_atom(Media) ->
+ cre_PropertyParm_m(atom_to_list(Media),
+ Port, NumPorts, Transport, FmtList);
+cre_PropertyParm_m(Media, Port0, NumPorts0, Transport, FmtList)
+ when is_list(Media) and is_list(Transport) and is_list(FmtList) ->
+ Port = i2s(Port0),
+ NumPorts = i2s(NumPorts0),
+ Val =
+ Media ++ " " ++ Port ++ "/" ++ NumPorts ++ " " ++ Transport ++
+ " " ++ val(FmtList),
+ cre_PropertyParm("m", Val).
+
+cre_sdp_m(Media, Port, Transport, FmtList) ->
+ #megaco_sdp_m{media = Media,
+ port = Port,
+ transport = Transport,
+ fmt_list = FmtList}.
+
+cre_sdp_m(Media, Port, NumPorts, Transport, FmtList) ->
+ #megaco_sdp_m{media = Media,
+ port = Port,
+ num_ports = NumPorts,
+ transport = Transport,
+ fmt_list = FmtList}.
+
+
+cre_PropertyParm_c(ip4, ConnAddr) ->
+ cre_PropertyParm_c("IP4", ConnAddr);
+cre_PropertyParm_c(ip6, ConnAddr) ->
+ cre_PropertyParm_c("IP6", ConnAddr);
+cre_PropertyParm_c(AddrType, ConnAddr)
+ when is_list(AddrType) and is_list(ConnAddr) ->
+ Val = "IN " ++ AddrType ++ " " ++ ConnAddr,
+ cre_PropertyParm("c", Val).
+
+cre_PropertyParm_c(ip4, Base, TTL) ->
+ cre_PropertyParm_c("IP4", Base, i2s(TTL));
+cre_PropertyParm_c(AddrType, Base, TTL)
+ when is_list(AddrType) and
+ is_list(Base) and
+ is_list(TTL) ->
+ Val = "IN " ++ AddrType ++ " " ++ Base ++ "/" ++ TTL,
+ cre_PropertyParm("c", Val).
+
+cre_PropertyParm_c(ip4, Base, TTL, NumOf) ->
+ cre_PropertyParm_c("IP4", Base, i2s(TTL), i2s(NumOf));
+cre_PropertyParm_c(AddrType, Base, TTL, NumOf)
+ when is_list(AddrType) and
+ is_list(Base) and
+ is_list(TTL) and
+ is_list(NumOf) ->
+ Val =
+ "IN " ++ AddrType ++ " " ++ Base ++ "/" ++ TTL ++ "/" ++ NumOf,
+ cre_PropertyParm("c", Val).
+
+
+cre_sdp_c(AddrType, ConnAddr) ->
+ cre_sdp_c(in, AddrType, ConnAddr).
+
+cre_sdp_c(NetType, AddrType, ConnAddr) ->
+ #megaco_sdp_c{network_type = NetType,
+ address_type = AddrType,
+ connection_addr = ConnAddr}.
+
+
+cre_PropertyParm_v(Version) when is_integer(Version) ->
+ cre_PropertyParm_v(integer_to_list(Version));
+cre_PropertyParm_v(Version) when is_list(Version) ->
+ cre_PropertyParm("v", Version).
+
+cre_sdp_v(Version) ->
+ #megaco_sdp_v{version = Version}.
+
+
+cre_PropertyParm(Name, Val) when is_list(Name) and is_list(Val) ->
+ #'PropertyParm'{name = Name, value = [Val]}.
+
+
+val(Vals) ->
+ val(Vals, " ").
+val([Head|Tail], Sep) ->
+ lists:foldl(fun(E, S) -> S ++ Sep ++ E end, Head, Tail).
+
+i2s(I) when is_integer(I) ->
+ integer_to_list(I);
+i2s(S) when is_list(S) ->
+ S.
+
+
+%% error(Reason) ->
+%% throw({error, Reason}).