/* * This file is part of the Sofia-SIP package * * Copyright (C) 2005 Nokia Corporation. * * Contact: Pekka Pessi * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * */ /**@internal * * @CFILE sdp_torture.c * * Torture testing sdp module. * * @author Pekka Pessi * @author Kai Vehmanen * * @date Created: Tue Mar 6 18:33:42 2001 ppessi */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #define TSTFLAGS tstflags #include int tstflags; char const *name = "torture_sdp.c"; FILE *null; static char const e0_msg[] = "foo"; static char const e1_msg[] = "v=1\n" "s=/sdp_torture\n" "o=sdp_torture 0 0 IN IP4 0.0.0.0\n" "m=audio 0 RTP/AVP 96 97 98 10 99 8 0\n" "a=rtpmap:96 X-AMR-WB/16000\n" "a=rtpmap:97 X-AMR/8000\n" "a=rtpmap:98 GSM-EFR/8000\n" "a=rtpmap:10 L16/16000\n" "a=rtpmap:99 G723/8000\n" "a=rtpmap:8 PCMA/8000\n" "a=rtpmap:0 PCMU/8000\n" "m=video 0 *"; static int test_error(void) { su_home_t *home = su_home_create(); sdp_parser_t *parser; BEGIN(); su_home_check(home); TEST0(home); TEST_1((parser = sdp_parse(home, e0_msg, sizeof(e0_msg), 0))); TEST_1(sdp_session(parser) == NULL); TEST_1(sdp_parsing_error(parser)); sdp_parser_free(parser); TEST_1((parser = sdp_parse(home, e1_msg, sizeof(e1_msg), 0))); TEST_1(sdp_session(parser) == NULL); TEST_1(sdp_parsing_error(parser)); sdp_parser_free(parser); /* destroy the home objects */ su_home_check(home); su_home_zap(home); END(); } static char const s0_msg[] = "v=0\n" "s=/sdp_torture\n" "o=sdp_torture 0 0 IN IP4 0.0.0.0\n" "m=audio 0 RTP/AVP 96 97 98 10 99 8 0\n" "a=rtpmap:96 X-AMR-WB/16000\n" "a=rtpmap:97 X-AMR/8000\n" "a=rtpmap:98 GSM-EFR/8000\n" "a=rtpmap:10 L16/16000\n" "a=rtpmap:99 G723/8000\n" "a=rtpmap:8 PCMA/8000\n" "a=rtpmap:0 PCMU/8000\n" "m=video 0 *\n" "m=* 0 RTP/AVP *\n" ; static int test_session(void) { su_home_t *home = su_home_create(), *home2 = su_home_create(); sdp_session_t *sdp_src, *sdp_target; sdp_session_t const *sdp = NULL; sdp_parser_t *parser; sdp_printer_t *printer; sdp_media_t *m; char buffer[512]; tagi_t *lst, *dup; BEGIN(); su_home_check(home); TEST_1(home); su_home_check(home2); TEST_1(home2); TEST_1((parser = sdp_parse(home, s0_msg, sizeof(s0_msg), sdp_f_config))); TEST_1((sdp_src = sdp_session(parser))); TEST_1(sdp_src->sdp_media); TEST_1(sdp_src->sdp_media->m_session); TEST_P(sdp_src->sdp_media->m_session, sdp_src); /* clone the session using 'home2' */ TEST_1((sdp_target = sdp_session_dup(home2, sdp_src))); /* Check comparing */ TEST(sdp_session_cmp(sdp_src, sdp_target), 0); /* check the cloned session */ TEST_1(sdp_target->sdp_subject); TEST_S(sdp_target->sdp_subject, "/sdp_torture"); strcpy((char*)sdp_target->sdp_subject, "garbage"); TEST_S(sdp_src->sdp_subject, "/sdp_torture"); TEST_1(sdp_target->sdp_origin); TEST_1(sdp_target->sdp_origin->o_username); TEST_S(sdp_target->sdp_origin->o_username, "sdp_torture"); strcpy((char*)sdp_target->sdp_origin->o_username, "garbage"); TEST_S(sdp_src->sdp_origin->o_username, "sdp_torture"); TEST_1(m = sdp_target->sdp_media); TEST_P(m->m_session, sdp_target); TEST_1(sdp_src->sdp_media->m_session != sdp_target->sdp_media->m_session); TEST(m->m_type, sdp_media_audio); TEST_S(m->m_type_name, "audio"); TEST(m->m_port, 0); TEST(m->m_number_of_ports, 0); TEST(m->m_proto, sdp_proto_rtp); TEST_S(m->m_proto_name, "RTP/AVP"); /* FIXME: add more tests */ /* frees all data created by the parser including 'sdp_src' */ sdp_parser_free(parser); /* destroy the first home instance */ su_home_check(home); su_home_unref(home); /* access all cloned data by printing it */ printer = sdp_print(home2, sdp_target, buffer, sizeof(buffer), 0); if (printer != NULL) { char const *msg = sdp_message(printer); if (tstflags & tst_verbatim) { printf("sdp_torture.c: parsed SDP message:\"%s\".\n", msg); } sdp_printer_free(printer); } TEST_1(lst = tl_list(SDPTAG_SESSION(sdp_target), TAG_NULL())); TEST_1(dup = tl_adup(home2, lst)); if (tstflags & tst_verbatim) tl_print(stdout, "dup:\n", dup); else tl_print(null, "dup:\n", dup); TEST(tl_gets(dup, SDPTAG_SESSION_REF(sdp), TAG_END()), 1); /* access all copied data by printing it */ printer = sdp_print(home2, sdp, buffer, sizeof(buffer), 0); if (printer != NULL) { char const *msg = sdp_message(printer); if (tstflags & tst_verbatim) { printf("sdp_torture.c: " "SDP message passed through tag list:\n\"%s\".\n", msg); } sdp_printer_free(printer); } su_free(home2, dup); tl_vfree(lst); /* destroy the second home object */ su_home_check(home2); su_home_unref(home2); END(); } static char const s0_cmp_msg[] = "v=0\n" "s=/sdp_torture\n" "o=sdp_torture 0 0 IN IP4 0.0.0.0\n" "b=AS:64\n" "b=CRASH:32\n" "m=audio 0 RTP/AVP 96 97 98 10 99 8 0\n" "a=rtpmap:96 X-AMR-WB/16000\n" "a=rtpmap:97 X-AMR/8000\n" "a=rtpmap:98 GSM-EFR/8000\n" "a=rtpmap:10 L16/16000\n" "a=rtpmap:99 G723/8000\n" "a=rtpmap:8 PCMA/8000\n" "a=rtpmap:0 PCMU/8000\n" "m=video 0 *\n" "m=* 0 RTP/AVP *\n" ; static char const s1_cmp_msg[] = "v=0\n" "s=/sdp_torture\n" "o=sdp_torture 0 0 IN IP4 0.0.0.0\n" "b=AS:64\n" "m=audio 0 RTP/AVP 96 97 98 10 99 8 0\n" "a=rtpmap:96 X-AMR-WB/16000\n" "a=rtpmap:97 X-AMR/8000\n" "a=rtpmap:98 GSM-EFR/8000\n" "a=rtpmap:10 L16/16000\n" "a=rtpmap:99 G723/8000\n" "a=rtpmap:8 PCMA/8000\n" "a=rtpmap:0 PCMU/8000\n" "m=video 0 *\n" "m=* 0 RTP/AVP *\n" ; static int test_sdp_session_cmp(void) { su_home_t *home = su_home_create(), *home2 = su_home_create(); sdp_session_t *sdp_src, *sdp_target; sdp_session_t const *sdp = NULL; sdp_parser_t *parser, *parser2; BEGIN(); su_home_check(home); TEST_1(home); su_home_check(home2); TEST_1(home2); TEST_1((parser = sdp_parse(home, s0_cmp_msg, sizeof(s0_cmp_msg), sdp_f_config))); TEST_1((sdp_src = sdp_session(parser))); TEST_1((parser2 = sdp_parse(home2, s1_cmp_msg, sizeof(s1_cmp_msg), sdp_f_config))); TEST_1((sdp_target = sdp_session(parser2))); /* Check comparing */ TEST(sdp_session_cmp(sdp_src, sdp_target), 1); /* frees all data created by the parser including 'sdp_src' */ sdp_parser_free(parser); /* destroy the first home instance */ su_home_check(home); su_home_unref(home); /* frees all data created by the parser including 'sdp_target' */ sdp_parser_free(parser2); /* destroy the second home object */ su_home_check(home2); su_home_unref(home2); END(); } static char const s1_msg[] = "v=0\r\n" "o=- 2435697 2435697 IN IP4 172.21.137.44\r\n" "s=-\r\n" "c=IN IP4 172.21.137.44\r\n" "t=0 0\r\n" "a=sendonly\r\n" "m=video 49154 RTP/AVP 96 24 25 26 28 31 32 33 34\r\n" "a=rtpmap:96 H263-1998/90000\r\n" "m=audio 49152 RTP/AVP 97 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\r\n" "a=rtpmap 97 AMR/8000\r\n" "a=fmtp:97 mode-set=\"0,1,2,3,4\"\r\n" "a=ptime:400\r\n"; static char const s2_msg[] = "v=0\r\n" "o=- 308519342 2 IN IP4 172.168.1.55\r\n" "s=-\r\n" "c=IN IP4 172.168.1.55\r\n" "t=0 0\r\n" "a=recvonly\r\n" "m=video 59154 RTP/AVP 96\r\n" "b=AS:64\r\n" "a=rtpmap:96 H263-1998/90000\r\n" "a=framerate:8\r\n" "a=fmtp:96 QCIF=4\r\n" "m=audio 59152 RTP/AVP 97\r\n" "b=AS:8\r\n" "a=rtpmap:97 AMR/8000\r\n" "a=fmtp:97 mode-set=\"0\"\r\n" "a=maxptime:500\r\n"; static int test_session2(void) { su_home_t *home = su_home_create(); sdp_session_t const *sdp = NULL; sdp_parser_t *parser; sdp_media_t *m; sdp_rtpmap_t *rm; BEGIN(); su_home_check(home); TEST_1(home); TEST_1((parser = sdp_parse(home, s1_msg, sizeof(s1_msg), 0))); TEST_1((sdp = sdp_session(parser))); TEST_1(m = sdp->sdp_media); TEST(m->m_mode, sdp_sendonly); TEST_P(m->m_session, sdp); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 96); TEST_S(rm->rm_encoding, "H263-1998"); TEST(rm->rm_rate, 90000); { #define RTPMAP(pt, type, rate, params) \ { sizeof(sdp_rtpmap_t), NULL, type, rate, (char *)params, NULL, 1, pt, 0 } /* rtpmaps for well-known video codecs */ static sdp_rtpmap_t const sdp_rtpmap_celb = RTPMAP(25, "CelB", 90000, 0), sdp_rtpmap_jpeg = RTPMAP(26, "JPEG", 90000, 0), sdp_rtpmap_nv = RTPMAP(28, "nv", 90000, 0), sdp_rtpmap_h261 = RTPMAP(31, "H261", 90000, 0), sdp_rtpmap_mpv = RTPMAP(32, "MPV", 90000, 0), sdp_rtpmap_mp2t = RTPMAP(33, "MP2T", 90000, 0), sdp_rtpmap_h263 = RTPMAP(34, "H263", 90000, 0); TEST_1(rm = rm->rm_next); TEST_S(rm->rm_encoding, ""); TEST(rm->rm_rate, 0); TEST_1(rm = rm->rm_next); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_celb, rm), &sdp_rtpmap_celb); TEST_1(rm = rm->rm_next); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_jpeg, rm), &sdp_rtpmap_jpeg); TEST_1(rm = rm->rm_next); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_nv, rm), &sdp_rtpmap_nv); TEST_1(rm = rm->rm_next); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_h261, rm), &sdp_rtpmap_h261); TEST_1(rm = rm->rm_next); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_mpv, rm), &sdp_rtpmap_mpv); TEST_1(rm = rm->rm_next); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_mp2t, rm), &sdp_rtpmap_mp2t); TEST_1(rm = rm->rm_next); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_h263, rm), &sdp_rtpmap_h263); TEST_1(!rm->rm_next); } TEST_1(m = m->m_next); TEST(m->m_mode, sdp_sendonly); TEST_P(m->m_session, sdp); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 97); TEST_S(rm->rm_encoding, "AMR"); TEST(rm->rm_rate, 8000); TEST_S(rm->rm_fmtp, "mode-set=\"0,1,2,3,4\""); { /* rtpmaps for well-known audio codecs */ static sdp_rtpmap_t const sdp_rtpmap_pcmu = RTPMAP(0, "PCMU", 8000, "1"), sdp_rtpmap_1016 = RTPMAP(1, "1016", 8000, "1"), sdp_rtpmap_g721 = RTPMAP(2, "G721", 8000, "1"), sdp_rtpmap_gsm = RTPMAP(3, "GSM", 8000, "1"), sdp_rtpmap_g723 = RTPMAP(4, "G723", 8000, "1"), sdp_rtpmap_dvi4_8000 = RTPMAP(5, "DVI4", 8000, "1"), sdp_rtpmap_dvi4_16000 = RTPMAP(6, "DVI4", 16000, "1"), sdp_rtpmap_lpc = RTPMAP(7, "LPC", 8000, "1"), sdp_rtpmap_pcma = RTPMAP(8, "PCMA", 8000, "1"), sdp_rtpmap_g722 = RTPMAP(9, "G722", 8000, "1"), sdp_rtpmap_l16 = RTPMAP(10, "L16", 44100, "2"), sdp_rtpmap_l16_stereo = RTPMAP(11, "L16", 44100, "1"), sdp_rtpmap_qcelp = RTPMAP(12, "QCELP", 8000, "1"), sdp_rtpmap_cn = RTPMAP(13, "CN", 8000, "1"), sdp_rtpmap_mpa = RTPMAP(14, "MPA", 90000, 0), sdp_rtpmap_g728 = RTPMAP(15, "G728", 8000, "1"), sdp_rtpmap_dvi4_11025 = RTPMAP(16, "DVI4", 11025, "1"), sdp_rtpmap_dvi4_22050 = RTPMAP(17, "DVI4", 22050, "1"), sdp_rtpmap_g729 = RTPMAP(18, "G729", 8000, "1"), sdp_rtpmap_cn_reserved = RTPMAP(19, "CN", 8000, "1"); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_pcmu, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_pcmu, rm), &sdp_rtpmap_pcmu); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_1016, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_1016, rm), &sdp_rtpmap_1016); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_g721, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_g721, rm), &sdp_rtpmap_g721); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_gsm, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_gsm, rm), &sdp_rtpmap_gsm); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_g723, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_g723, rm), &sdp_rtpmap_g723); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_dvi4_8000, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_dvi4_8000, rm), &sdp_rtpmap_dvi4_8000); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_dvi4_16000, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_dvi4_16000, rm), &sdp_rtpmap_dvi4_16000); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_lpc, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_lpc, rm), &sdp_rtpmap_lpc); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_pcma, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_pcma, rm), &sdp_rtpmap_pcma); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_g722, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_g722, rm), &sdp_rtpmap_g722); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_l16, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_l16, rm), &sdp_rtpmap_l16); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_l16_stereo, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_l16_stereo, rm), &sdp_rtpmap_l16_stereo); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_qcelp, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_qcelp, rm), &sdp_rtpmap_qcelp); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_cn, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_cn, rm), &sdp_rtpmap_cn); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_mpa, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_mpa, rm), &sdp_rtpmap_mpa); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_g728, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_g728, rm), &sdp_rtpmap_g728); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_dvi4_11025, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_dvi4_11025, rm), &sdp_rtpmap_dvi4_11025); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_dvi4_22050, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_dvi4_22050, rm), &sdp_rtpmap_dvi4_22050); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_g729, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_g729, rm), &sdp_rtpmap_g729); TEST_1(rm = rm->rm_next); TEST_1(sdp_rtpmap_match(&sdp_rtpmap_cn_reserved, rm)); TEST_P(sdp_rtpmap_find_matching(&sdp_rtpmap_cn_reserved, rm), &sdp_rtpmap_cn_reserved); TEST_1(!rm->rm_next); } TEST_1((parser = sdp_parse(home, s2_msg, sizeof (s2_msg), 0))); TEST_1((sdp = sdp_session(parser))); TEST_1(m = sdp->sdp_media); TEST(m->m_mode, sdp_recvonly); TEST_P(m->m_session, sdp); TEST_1(m->m_rtpmaps); TEST(m->m_rtpmaps->rm_pt, 96); TEST_S(m->m_rtpmaps->rm_encoding, "H263-1998"); TEST(m->m_rtpmaps->rm_rate, 90000); TEST_S(m->m_rtpmaps->rm_fmtp, "QCIF=4"); TEST_1(m = sdp->sdp_media->m_next); TEST(m->m_mode, sdp_recvonly); TEST_P(m->m_session, sdp); TEST_1(m->m_rtpmaps); TEST(m->m_rtpmaps->rm_pt, 97); TEST_S(m->m_rtpmaps->rm_encoding, "AMR"); TEST(m->m_rtpmaps->rm_rate, 8000); TEST_S(m->m_rtpmaps->rm_fmtp, "mode-set=\"0\""); su_home_unref(home); END(); } static char const s3_msg[] = "v=0\r\n" "o=- 2435697 2435697 IN IP4 172.21.137.44\r\n" "s=-\r\n" "t=0 0\r\n" "m=video 49154 RTP/AVP 34\r\n" "c=IN IP4 172.21.137.44\r\n" "m=audio 49152 RTP/AVP 8 0\r\n" "c=IN IP4 172.21.137.44\r\n" "m=message 0 MSRP/TCP *\r\n" ; static int test_sanity(void) { su_home_t *home = su_home_create(); sdp_parser_t *parser; BEGIN(); su_home_check(home); TEST_1(home); TEST_1((parser = sdp_parse(home, s3_msg, sizeof(s3_msg) - 1, 0))); TEST_1(sdp_sanity_check(parser) == 0); su_home_unref(home); END(); } static char const pint_msg[] = "v=0\r\n" "o=- 2353687640 2353687640 IN IP4 128.3.4.5\r\n" "s=marketing\r\n" "e=john.jones.3@chinet.net\r\n" "c=TN RFC2543 +1-201-406-4090\r\n" "t=2353687640 0\r\n" "m=audio 1 voice -\r\n" ; static char const pint_torture_msg[] = "v=0\r\n" "o=- 2353687640 2353687640 IN IP4 128.3.4.5\r\n" "s=marketing\r\n" "c= TN RFC2543 123\r\n" "a=phone-context:+97252\r\n" "t=2353687640 0\r\n" "m= text 1 fax plain\r\n" "a=fmtp:plain spr:fi6MeoclEjaF3EDfYHlkqx1zn8A1lMoiJFUHpQ5Xo\r\n" ; static int test_pint(void) { su_home_t *home = su_home_create(); sdp_parser_t *parser; sdp_session_t *sdp; sdp_printer_t *printer; char const *m; BEGIN(); su_home_check(home); TEST_1(home); TEST_1((parser = sdp_parse(home, pint_msg, sizeof(pint_msg) - 1, sdp_f_anynet))); TEST_1((sdp = sdp_session(parser))); TEST_1((printer = sdp_print(home, sdp, NULL, -1, 0))); TEST_1((m = sdp_message(printer))); TEST_S(m, pint_msg); TEST(sdp_message_size(printer), sizeof(pint_msg) - 1); TEST_1((parser = sdp_parse(home, pint_torture_msg, sizeof(pint_torture_msg) - 1, sdp_f_anynet))); TEST_1((sdp = sdp_session(parser))); su_home_check(home); su_home_unref(home); END(); } static sdp_list_t const l0[1] = {{ sizeof(l0), NULL, "foo" }}; static sdp_list_t const l1[1] = {{ sizeof(l1), (sdp_list_t *)l0, "bar" }}; /** Test list things */ int test_list(void) { su_home_t *home = su_home_create(); sdp_list_t *l; BEGIN(); su_home_check(home); TEST_1(home); TEST_1((l = sdp_list_dup(home, l0))); TEST_P(l->l_next, NULL); TEST_S(l->l_text, "foo"); TEST_1((l = sdp_list_dup(home, l1))); TEST_1(l->l_next != NULL); TEST_1(l->l_next->l_next == NULL); TEST_S(l->l_text, "bar"); TEST_S(l->l_next->l_text, "foo"); su_home_check(home); su_home_unref(home); END(); } static sdp_rtpmap_t const rm0[1] = {{ sizeof(rm0), NULL, "AMR", 8000, "1", "mode-set=4,5,6 interleaving crc use-redundancy=1", 0, 96, 0 }}; static sdp_rtpmap_t const rm1[1] = {{ sizeof(rm1), (sdp_rtpmap_t *)rm0, "PCMA", 8000, "1", NULL, 1, 8, 0, }}; /** Test rtpmap-related things */ int test_rtpmap(void) { su_home_t *home = su_home_create(); sdp_rtpmap_t *rm; BEGIN(); su_home_check(home); TEST_1(home); TEST_1((rm = sdp_rtpmap_dup(home, rm0))); TEST_P(rm->rm_next, NULL); TEST_S(rm->rm_encoding, "AMR"); TEST_S(rm->rm_params, "1"); TEST(rm->rm_pt, 96); TEST_S(rm->rm_fmtp, "mode-set=4,5,6 interleaving crc use-redundancy=1"); TEST_1((rm = sdp_rtpmap_dup(home, rm1))); TEST_1(rm->rm_next != NULL); TEST_1(rm->rm_next->rm_next == NULL); TEST_S(rm->rm_encoding, "PCMA"); TEST_S(rm->rm_params, "1"); TEST(rm->rm_pt, 8); su_home_check(home); su_home_unref(home); END(); } static sdp_attribute_t const a0[1] = {{ sizeof(a0), NULL, "foo", "2"}}; static sdp_attribute_t const a1[1] = {{ sizeof(a1), (sdp_attribute_t *)a0, "bar", "1" }}; static int test_attribute(void) { su_home_t *home = su_home_create(); sdp_attribute_t *a, *a_new, *list, *replaced; BEGIN(); su_home_check(home); TEST_1(home); TEST_1((a = sdp_attribute_dup(home, a0))); TEST_P(a->a_next, NULL); TEST_S(a->a_name, "foo"); TEST_S(a->a_value, "2"); strcpy((char *)a->a_name, "FOO"); TEST_S(a0->a_name, "foo"); strcpy((char *)a->a_value, "X"); TEST_S(a0->a_value, "2"); TEST_1((a = sdp_attribute_dup(home, a1))); TEST_1(a->a_next != NULL); TEST_1(a->a_next->a_next == NULL); TEST_S(a->a_name, "bar"); TEST_S(a->a_value, "1"); TEST_S(a->a_next->a_name, "foo"); TEST_S(a->a_next->a_value, "2"); list = a; TEST_P(sdp_attribute_remove(&list, NULL), NULL); TEST_P(sdp_attribute_remove(&list, "kuik"), NULL); TEST_P(sdp_attribute_remove(&list, "barf"), NULL); TEST_P(sdp_attribute_remove(&list, "bar"), a); TEST_1(a_new = sdp_attribute_dup(home, a)); replaced = (void *)-1; TEST(sdp_attribute_replace(&list, NULL, &replaced), -1); TEST_P(replaced, NULL); TEST(sdp_attribute_replace(&list, a, &replaced), 0); TEST_P(replaced, NULL); TEST(sdp_attribute_replace(&list, a_new, &replaced), 1); TEST_P(replaced, a); TEST_VOID(sdp_attribute_append(&list, a)); TEST_P(sdp_attribute_remove(&list, "bAr"), a_new); TEST_P(sdp_attribute_remove(&list, "BAR"), a); TEST_P(sdp_attribute_remove(&list, "bar"), NULL); su_home_check(home); su_home_unref(home); END(); } static int test_connection(void) { BEGIN(); END(); } static char const media_msg[] = "v=0\n" "s=/sdp_torture\n" "o=sdp_torture 0 0 IN IP4 1.2.3.4\n" "c=IN IP4 1.2.3.4\n" "m=audio 0 RTP/AVP 96 97 98 10 99 8 0\n" "a=rtpmap:96 X-AMR-WB/16000\n" "a=rtpmap:97 X-AMR/8000\n" "a=rtpmap:98 GSM-EFR/8000\n" "a=rtpmap:10 L16/16000\n" "a=rtpmap:99 G723/8000\n" "a=rtpmap:8 PCMA/8000\n" "a=rtpmap:0 PCMU/8000\n" "m=video 0 RTP/AVP 31\n" "c=IN IP4 2.3.4.5\n"; static sdp_media_t const m0[1] = {{ sizeof(m0), NULL, NULL, sdp_media_audio, NULL, 1234, 5, sdp_proto_udp, "udp", }}; static int test_media(void) { su_home_t *home = su_home_create(); sdp_media_t *media; sdp_session_t *sdp; sdp_parser_t *parser; BEGIN(); su_home_check(home); TEST_1(home); TEST_1((parser = sdp_parse(home, media_msg, sizeof(media_msg), 0))); TEST_1((sdp = sdp_session(parser))); TEST_1((media = sdp_media_dup(home, m0, sdp))); /* Check comparing */ TEST(sdp_media_cmp(media, m0), 0); TEST(media->m_type, sdp_media_audio); TEST(media->m_port, 1234); TEST(media->m_number_of_ports, 5); TEST_P(media->m_session, sdp); /* FIXME: add more tests */ media->m_next = (sdp_media_t *)m0; TEST_1((media = sdp_media_dup_all(home, media, sdp))); TEST_P(media->m_connections, NULL); TEST_1(media->m_next); TEST_P(media->m_next->m_connections, NULL); TEST_P(sdp_media_connections(media), sdp->sdp_connection); TEST_P(sdp_media_connections(media->m_next), sdp->sdp_connection); sdp_parser_free(parser); su_home_check(home); su_home_unref(home); END(); } static int test_origin(void) { BEGIN(); END(); } static int test_bandwidth(void) { BEGIN(); END(); } static char const t_msg[] = "v=0\n" "s=/sdp_torture\n" "o=sdp_torture 1 1 IN IP4 1.2.3.4\n" "c=IN IP4 1.2.3.4\n" "t=3309789956 3309793556\n" "t=3309789956 3309793557\n" "t=3309789955 3309793557\n" "r=604800 3600 0 90000\n" "z=2882844526 -1h 2898848070 0\n" "t=3309789955 3309793557\n" "r=604800 3600 0 90000\n" "z=2882844526 -1h 2898848070 0\n" ; static int test_time(void) { sdp_parser_t *parser; sdp_session_t *sdp; sdp_time_t *t, t1[1], t2[1]; BEGIN(); TEST_1((parser = sdp_parse(NULL, t_msg, sizeof(t_msg), 0))); TEST_1((sdp = sdp_session(parser))); TEST_1((t = sdp->sdp_time)); *t1 = *t; t1->t_next = NULL; *t2 = *t1; TEST_1(sdp_time_cmp(t1, t1) == 0); TEST_1(sdp_time_cmp(t1, t2) == 0); TEST_1(sdp_time_cmp(t2, t1) == 0); TEST_1((t = t->t_next)); *t1 = *t; t1->t_next = NULL; TEST_1(sdp_time_cmp(t1, t2) > 0); TEST_1(sdp_time_cmp(t2, t1) < 0); TEST_1((t = t->t_next)); *t2 = *t; t2->t_next = NULL; TEST_1(t2->t_zone); TEST_1(t2->t_repeat); TEST_1(sdp_time_cmp(t2, t2) == 0); TEST_1(sdp_time_cmp(t1, t2) > 0); TEST_1(sdp_time_cmp(t2, t1) < 0); TEST_1((t = t->t_next)); *t1 = *t; t1->t_next = NULL; TEST_1(t1->t_zone); TEST_1(t1->t_repeat); TEST_1(sdp_time_cmp(t1, t1) == 0); TEST_1(sdp_time_cmp(t2, t2) == 0); TEST_1(sdp_time_cmp(t1, t2) == 0); sdp_parser_free(parser); END(); } static int test_key(void) { BEGIN(); END(); } #include #include static int test_build(void) { sdp_session_t *sdp, *dup; sdp_origin_t *o; sdp_time_t *t; sdp_connection_t *c; sdp_media_t *m, *m1; sdp_rtpmap_t *rm; sdp_list_t *l, *l1; sdp_attribute_t *a; su_home_t *home; sdp_printer_t *printer; char const *data; BEGIN(); srand(time(NULL)); TEST_1(home = su_home_create()); /* * Allocate an SDP structure using su_salloc(). * su_salloc() puts memory area size to the beginning of structure * and zeroes rest of the structure. */ TEST_1(sdp = su_salloc(home, sizeof(*sdp))); TEST_1(o = su_salloc(home, sizeof(*o))); TEST_1(t = su_salloc(home, sizeof(*t))); TEST_1(c = su_salloc(home, sizeof(*c))); TEST_1(m = su_salloc(home, sizeof(*m))); TEST_1(rm = su_salloc(home, sizeof(*rm))); sdp->sdp_origin = o; sdp->sdp_time = t; /* zero time is fine for SIP */ sdp->sdp_connection = c; sdp->sdp_media = m; o->o_username = "test"; o->o_id = rand(); o->o_version = 1; o->o_address = c; c->c_nettype = sdp_net_in; c->c_addrtype = sdp_addr_ip4; c->c_address = "172.21.40.40"; m->m_session = sdp; m->m_type = sdp_media_audio; m->m_type_name = "audio"; m->m_port = 5004; m->m_proto = sdp_proto_rtp; m->m_proto_name = "RTP/AVP"; m->m_rtpmaps = rm; rm->rm_predef = 1; rm->rm_pt = 8; rm->rm_encoding = "PCMA"; rm->rm_rate = 8000; TEST_1(m1 = su_salloc(home, sizeof(*m1))); TEST_1(l = su_salloc(home, sizeof(*l))); TEST_1(l1 = su_salloc(home, sizeof(*l1))); TEST_1(a = su_salloc(home, sizeof(*a))); m->m_next = m1; m1->m_session = sdp; m1->m_type = sdp_media_message; m->m_type_name = "message"; m1->m_port = 5060; m1->m_proto = sdp_proto_tcp; m->m_proto_name = "TCP"; m1->m_format = l; m1->m_attributes = a; l->l_text = "sip"; l->l_next = l1; l1->l_text = "cpim"; a->a_name = "user"; a->a_value = "chat-81273845"; TEST_1(dup = sdp_session_dup(home, sdp)); TEST_1(printer = sdp_print(home, dup, NULL, 0, 0)); TEST_1(data = sdp_message(printer)); if (tstflags & tst_verbatim) printf("sdp_torture.c: built SDP message:\"%s\".\n", data); sdp_printer_free(printer); END(); } void usage(int exitcode) { fprintf(stderr, "usage: %s [-v] [-a]\n", name); exit(exitcode); } int main(int argc, char *argv[]) { int retval = 0; int i; for (i = 1; argv[i]; i++) { if (su_strmatch(argv[i], "-v")) tstflags |= tst_verbatim; else if (su_strmatch(argv[i], "-a")) tstflags |= tst_abort; else usage(1); } null = fopen("/dev/null", "ab"); retval |= test_error(); fflush(stdout); retval |= test_sdp_session_cmp(); fflush(stdout); retval |= test_session(); fflush(stdout); retval |= test_session2(); fflush(stdout); retval |= test_pint(); fflush(stdout); retval |= test_sanity(); fflush(stdout); retval |= test_list(); fflush(stdout); retval |= test_rtpmap(); fflush(stdout); retval |= test_origin(); fflush(stdout); retval |= test_connection(); fflush(stdout); retval |= test_bandwidth(); fflush(stdout); retval |= test_time(); fflush(stdout); retval |= test_key(); fflush(stdout); retval |= test_attribute(); fflush(stdout); retval |= test_media(); fflush(stdout); retval |= test_build(); fflush(stdout); return retval; }