⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_msg.c

📁 this is simple sip stack.
💻 C
📖 第 1 页 / 共 4 页
字号:
/* * This file is part of the Sofia-SIP package * * Copyright (C) 2005 Nokia Corporation. * * Contact: Pekka Pessi <pekka.pessi@nokia.com> * * 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 * *//**@ingroup test_msg * * @CFILE test_msg.c * * Torture tests for message parser. * * @author Pekka Pessi <Pekka.Pessi@nokia.com> * * @date Created: Tue Aug 21 15:18:26 2001 ppessi */#include "config.h"#include "test_class.h"#include "test_protos.h"#include "sofia-sip/msg.h"#include "sofia-sip/msg_addr.h"#include "sofia-sip/msg_date.h"#include "sofia-sip/msg_parser.h"#include "sofia-sip/bnf.h"#include "sofia-sip/msg_mclass.h"#include "sofia-sip/msg_mclass_hash.h"#include <stddef.h>#include <stdlib.h>#include <string.h>#include <limits.h>#include <stdio.h>#include <assert.h>static int test_flags = 0;#define TSTFLAGS test_flags#include <sofia-sip/tstdef.h>char const name[] = "test_msg";void usage(void){  fprintf(stderr, "usage: %s [-v]\n", name);}static int msg_time_test(void){  char buf[32];  char const *s;  char date1900[] = "Mon,  1 Jan 1900 00:00:00 GMT";  char date1900_1[] = "Mon, 01 Jan 1900 00:00:01 GMT";  char date822[] = "Thursday, 01-Jan-70 00:00:01 GMT";  char date822b[] = "Wednesday, 09-Nov-99 23:12:40 GMT";  char date822c[] = "Wednesday, 01-Sep-04 23:12:40 GMT";  char date2822[] = "Monday, 01-Jan-1900 00:00:01 GMT";  char dateasc[] = "Mon Jan  1 00:00:01 1900";  msg_time_t now = msg_now(), date = now;  BEGIN();  s = date1900;  TEST_1(msg_date_d(&s, &date) == 0);  TEST(date, 0);  TEST(msg_date_e(buf, sizeof(buf), date), strlen(date1900));  TEST(msg_date_e(buf, sizeof(buf), 1), strlen(date1900_1));  TEST_S(buf, date1900_1);  s = date822;  TEST_1(msg_date_d(&s, &date) == 0);  TEST(date, 2208988801U);  s = date822b;  TEST_1(msg_date_d(&s, &date) == 0);  TEST(date, 3151177960U);  s = date822c;  TEST_1(msg_date_d(&s, &date) == 0);  TEST(date, 3303069160U);  s = date2822;  TEST_1(msg_date_d(&s, &date) == 0);  TEST(date, 1);  s = dateasc;  TEST_1(msg_date_d(&s, &date) == 0);  TEST(date, 1);  {    char error1[] = "Mo";    char error2[] = "Mon,  1 Jan 19100 00:00:00 GMT";    char error3[] = "Mon,  1 Jan 1900 00:00:";    char error4[] = "Mon,  1 Jan 1900 25:00:00 GMT";    char noerror5[] = "Mon,  1 Jan 1899 24:00:00 GMT";    char error6[] = "Mon, 30 Feb 1896 23:59:59 GMT";    char noerror7[] = "Mon, 29 Feb 1896 23:59:59 GMT";    char error8[] = "Mon, 32 Jan 1900 24:00:00 GMT";    char error9[] = "Mon, 27 Fev 1900 24:00:00 GMT";    s = error1; TEST_1(msg_date_d(&s, &date) < 0);    s = error2; TEST_1(msg_date_d(&s, &date) < 0);    s = error3; TEST_1(msg_date_d(&s, &date) < 0);    s = error4; TEST_1(msg_date_d(&s, &date) < 0);    s = noerror5; TEST_1(msg_date_d(&s, &date) == 0); TEST(date, 0);    s = error6; TEST_1(msg_date_d(&s, &date) < 0);    s = noerror7; TEST_1(msg_date_d(&s, &date) == 0); TEST(date, 0);    s = error8; TEST_1(msg_date_d(&s, &date) < 0);    s = error9; TEST_1(msg_date_d(&s, &date) < 0);  }  {    char error1[] = "4294967297";    char *s;    msg_numeric_t x[1];    memset(x, 0, sizeof (x));    TEST_1(msg_numeric_d(NULL, (msg_header_t *)x, s = error1, strlen(error1)) < 0);  }  END();  return 0;}static int addr_test(void){  BEGIN();    /* It *will* fail. */  /* TEST(sizeof(socklen_t), sizeof(msg_addrlen(NULL))); */  END();}int test_header_parsing(void){  BEGIN();  {    /* Test quoting/unquoting */    su_home_t home[1] = { SU_HOME_INIT(home) };    char *quoted = "\"foo \\b\\a\\r\\\"\\\\\"extra";    char *unquoted;    TEST_1(unquoted = msg_unquote_dup(home, quoted));    TEST_S(unquoted, "foo bar\"\\");    su_home_deinit(home);  }  {    /* Test parameter list */    su_home_t home[1] = { SU_HOME_INIT(home) };    msg_param_t const *params = NULL;    char str[] = ";uffe;duffe = \"entten\" ; doo = [::1]  ", *s = str;    char const canonic[] = ";uffe;duffe=\"entten\";doo=[::1]";    char *end = str + strlen(str);    char b[sizeof(canonic) + 8];    TEST_1(msg_params_d(home, &s, &params) >= 0);    TEST_1(params != 0);    TEST(s, end);    TEST_S(params[0], "uffe");    TEST_S(params[1], "duffe=\042entten\042");    TEST_S(params[2], "doo=[::1]");    TEST_1(params[3] == NULL);    TEST(msg_params_e(NULL, 0, params), strlen(canonic));    TEST(msg_params_e(b, sizeof(b), params), strlen(canonic));    TEST_S(b, canonic);    TEST_S(msg_params_find(params, "uffe"), "");    TEST_S(msg_params_find(params, "uffe="), "");    TEST_S(msg_params_find(params, "duffe"), "\"entten\"");    TEST_S(msg_params_find(params, "duffe="), "\"entten\"");    TEST_S(msg_params_find(params, "doo"), "[::1]");    TEST_S(msg_params_find(params, "doo="), "[::1]");    TEST(msg_params_remove((msg_param_t *)params, "uffe"), 1);    TEST_S(params[0], "duffe=\042entten\042");    TEST_S(params[1], "doo=[::1]");    TEST_1(params[2] == NULL);    TEST(msg_params_remove((msg_param_t *)params, "doo"), 1);    TEST_S(params[0], "duffe=\042entten\042");    TEST_1(params[1] == NULL);    su_home_deinit(home);  }  {    /* Test that parameter list of length MSG_PARAMS_N is handled correctly */    su_home_t home[1] = { SU_HOME_INIT(home) };    msg_param_t const *params = NULL;    char list1[] = ";one;two;three;four;five;six;seven;eight", *s = list1;    char list2[] = ";one;two;three;four;five;six;seven";    char list3[] = ";one;two;three;four;five;six;seven, humppaa";    char *end3 = strchr(list3, ',');    char list4[] = ";one;two;three;four;five;six;seven;eight;nine;ten"      ";eleven;twelve;thirteen;fourteen;fiveteen;sixteen";    char list5[] = ";one;two;three;four;five;six;seven;eight;nine;ten"      ";eleven;twelve;thirteen;fourteen;fiveteen";    char list6[] = ";one;two;three;four;five;six;seven;eight;nine;ten"      ";eleven;twelve;thirteen;fourteen;fiveteen;sixteen;seventeen";    int i;    TEST_1(msg_params_d(home, &s, &params) >= 0);    TEST_1(params);    for (i = 0; i < 8; i++)      TEST_1(params[i]);    TEST_1(params[8] == NULL);    s = list2, params = NULL;    TEST_1(msg_params_d(home, &s, &params) >= 0);    TEST_1(params);    for (i = 0; i < 7; i++)      TEST_1(params[i]);    TEST_1(params[7] == NULL);    s = list3; params = NULL;    TEST_1(msg_params_d(home, &s, &params) >= 0);    TEST_S(s, end3);    TEST_1(params);    for (i = 0; i < 7; i++)      TEST_1(params[i]);    TEST_1(params[7] == NULL);    s = list4; params = NULL;    TEST_1(msg_params_d(home, &s, &params) >= 0);    TEST_1(params);    for (i = 0; i < 16; i++)      TEST_1(params[i]);    TEST_1(params[16] == NULL);    s = list5; params = NULL;    TEST_1(msg_params_d(home, &s, &params) >= 0);    TEST_1(params);    for (i = 0; i < 15; i++)      TEST_1(params[i]);    TEST_1(params[15] == NULL);    s = list6 ; params = NULL;    TEST_1(msg_params_d(home, &s, &params) >= 0);    TEST_1(params);    for (i = 0; i < 17; i++)      TEST_1(params[i]);    TEST_1(params[17] == NULL);    su_home_deinit(home);  }  {    /* Test parameter lists */    su_home_t home[1] = { SU_HOME_INIT(home) };    unsigned i, j;    msg_param_t const *p = NULL;    char *master = ";0", *list, *end;        for (i = 1; i < 256; i++) {      master = su_sprintf(home, "%s; %u", master, i); TEST_1(master);      list = end = su_strdup(home, master);      TEST_1(msg_params_d(home, &end, &p) >= 0);      TEST_S(end, "");      TEST_1(p);      for (j = 0; j <= i; j++) {	char number[10];	snprintf(number, sizeof number, "%u", j);	TEST_S(p[j], number);      }      TEST_1(p[i + 1] == NULL);      su_free(home, list);      su_free(home, (void *)p), p = NULL;    }    su_home_deinit(home);  }  {    /* Test comma-separated list */    su_home_t home[1] = { SU_HOME_INIT(home) };    msg_list_t k1[1] = {{{{ 0 }}}};    char list1[] = "foo, bar, baz  zi  \"baz\"";        TEST_1(msg_list_d(home, (msg_header_t *)k1, list1, strlen(list1)) >= 0);    TEST_1(k1->k_items);    TEST_S(k1->k_items[0], "foo");    TEST_S(k1->k_items[1], "bar");    TEST_S(k1->k_items[2], "baz zi\042baz\042");    TEST_1(!k1->k_items[3]);    su_home_deinit(home);  }  {    /* Test that list of length MSG_PARAMS_N is handled correctly */    su_home_t home[1] = { SU_HOME_INIT(home) };    msg_list_t k2[1] = {{{{ 0 }}}};    char list2[] = "one, two, three, four, five, six, seven, eight";        TEST_1(	  msg_list_d(home, (msg_header_t *)k2, list2, strlen(list2)) >= 0);    TEST_1(k2->k_items);    TEST_1(k2->k_items[7]);    TEST_1(k2->k_items[8] == NULL);    su_home_deinit(home);  }      {    /* Test that list longer than MSG_PARAMS_N is handled correctly */    su_home_t home[1] = { SU_HOME_INIT(home) };    msg_list_t k3[1] = {{{{ 0 }}}};    char list3[] = "one, two, three, four, five, six, seven, eight, nine";        TEST_1(	  msg_list_d(home, (msg_header_t *)k3, list3, strlen(list3)) >= 0);    TEST_1(k3->k_items);    TEST_1(k3->k_items[7]);    TEST_1(k3->k_items[8]);    TEST_1(k3->k_items[9] == NULL);      su_home_deinit(home);  }  {    /* Test that long lists are handled correctly */    su_home_t home[1] = { SU_HOME_INIT(home) };        msg_param_t *k = NULL;    char *s;    char list1[] = "one, two, three, four, five, six, seven, eight";    char list2[] = "one, two, three, four, five, six, seven, eight";    char list3[] = "one, two, three, four, five, six, seven, eight";    char list4[] = "one, two, three, four, five, six, seven, eight, nine";        s = list1; TEST_1(msg_commalist_d(home, &s, &k, msg_token_scan) >= 0);    TEST_1(k);    TEST_1(k[7]);    TEST_1(k[8] == NULL);    s = list2; TEST_1(msg_commalist_d(home, &s, &k, msg_token_scan) >= 0);    s = list3; TEST_1(msg_commalist_d(home, &s, &k, msg_token_scan) >= 0);    s = list4; TEST_1(msg_commalist_d(home, &s, &k, msg_token_scan) >= 0);    su_home_deinit(home);  }  {    /* Test parameter lists */    su_home_t home[1] = { SU_HOME_INIT(home) };    unsigned i, j;    msg_param_t *p = NULL;    char *master = "0", *list, *end;        for (i = 1; i < 256; i++) {      master = su_sprintf(home, "%s, %u", master, i); TEST_1(master);      list = end = su_strdup(home, master);      TEST_1(msg_commalist_d(home, &end, &p, msg_token_scan) >= 0);      TEST_S(end, "");      TEST_1(p);      for (j = 0; j <= i; j++) {	char number[10];	snprintf(number, sizeof number, "%u", j);	TEST_S(p[j], number);      }      TEST_1(p[i + 1] == NULL);      su_free(home, list);      su_free(home, (void *)p), p = NULL;    }    su_home_deinit(home);  }  {    /* Test that errors in lists are handled correctly */    su_home_t home[1] = { SU_HOME_INIT(home) };        msg_param_t *k = NULL;    char *s;    char list1[] = "one, two, three, four, five, six, seven, foo=\"eight";    char list2[] = "one, two, three,,@,$ four, five, six, seven, eight";    s = list1; TEST_1(msg_commalist_d(home, &s, &k, NULL) < 0);    TEST_1(k == NULL);    s = list2; TEST_1(msg_commalist_d(home, &s, &k, msg_token_scan) < 0);    su_home_deinit(home);  }  {    /* Test empty parameter list */    su_home_t home[1] = { SU_HOME_INIT(home) };    msg_list_t k4[1] = {{{{ 0 }}}};    char list4[] = ", ,\t,\r\n\t,  ,   ";        TEST_1(	  msg_list_d(home, (msg_header_t *)k4, list4, strlen(list4)) >= 0);    TEST_1(k4->k_items == NULL);    su_home_deinit(home);  }  {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -