📄 test_msg.c
字号:
/* * 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, ¶ms) >= 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, ¶ms) >= 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, ¶ms) >= 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, ¶ms) >= 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, ¶ms) >= 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, ¶ms) >= 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, ¶ms) >= 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 + -