%% %% %CopyrightBegin% %% %% Copyright Ericsson AB 2001-2010. 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, end_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). end_per_testcase(Case, Config) -> megaco_test_lib:end_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 = "kalle@company.se", 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}).