📄 su_tag_test.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 * *//**@SU_TAG * * @file su_tag_test.c * * Testing functions for su_tag module. * * @author Pekka Pessi <Pekka.Pessi@nokia.com> * * @date Created: Tue Mar 6 18:33:42 2001 ppessi */#include "config.h"#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sofia-sip/su_tag.h>#include <sofia-sip/su_tag_io.h>#include <sofia-sip/su_tag_class.h>#include <sofia-sip/su_tagarg.h>#ifndef WIN32#define DEVNULL "/dev/null"#else#define DEVNULL "nul"#endif int tstflags = 0;#define TSTFLAGS tstflags#include <sofia-sip/tstdef.h>#define TAG_A(s) tag_a, tag_str_v((s))#define TAG_A_REF(s) tag_a_ref, tag_str_vr(&(s))#define TAG_B(s) tag_b, tag_str_v((s))#define TAG_B_REF(s) tag_b_ref, tag_str_vr(&(s))#define TAG_I(i) tag_i, tag_int_v((i))#define TAG_I_REF(i) tag_i_ref, tag_int_vr(&(i))#define TAG_J(i) tag_j, tag_int_v((i))#define TAG_J_REF(i) tag_j_ref, tag_int_vr(&(i))#define TAG_K(i) tag_k, tag_int_v((i))#define TAG_K_REF(i) tag_k_ref, tag_int_vr(&(i))#define TAG_ANY_PQ() tag_any_pq, (tag_value_t)0#define TAG_P(i) tag_p, tag_bool_v((i))#define TAG_P_REF(i) tag_p_ref, tag_bool_vr(&(i))#define TAG_Q(i) tag_q, tag_bool_v((i))#define TAG_Q_REF(i) tag_q_ref, tag_bool_vr(&(i))char const *name = "su_tag_test";static int test_assumptions();static int test_stackargs(int i, ...);static int test_dup(void);static int test_filters(void);static int test_print(void);static int test_tagargs(void);static int test_gets(void);static int test_scan(void);void usage(void){ fprintf(stderr, "usage: %s [-v]\n", name);}#if HAVE_WIN32typedef struct tag_type_s tag_typedef_win_t[1];tag_typedef_win_t tag_a, tag_a_ref, tag_b, tag_b_ref;tag_typedef_win_t tag_i, tag_i_ref, tag_j, tag_j_ref;tag_typedef_win_t tag_k, tag_k_ref, tag_n, tag_n_ref;tag_typedef_win_t tag_any_pq;tag_typedef_win_t tag_p, tag_p_ref, tag_q, tag_q_ref;#elsetag_typedef_t tag_a = STRTAG_TYPEDEF(a);tag_typedef_t tag_a_ref = REFTAG_TYPEDEF(tag_a);tag_typedef_t tag_b = STRTAG_TYPEDEF(b);tag_typedef_t tag_b_ref = REFTAG_TYPEDEF(tag_b);tag_typedef_t tag_i = INTTAG_TYPEDEF(i);tag_typedef_t tag_i_ref = REFTAG_TYPEDEF(tag_i);tag_typedef_t tag_j = INTTAG_TYPEDEF(j);tag_typedef_t tag_j_ref = REFTAG_TYPEDEF(tag_j);tag_typedef_t tag_k = INTTAG_TYPEDEF(k);tag_typedef_t tag_k_ref = REFTAG_TYPEDEF(tag_k);tag_typedef_t tag_n = INTTAG_TYPEDEF(n);tag_typedef_t tag_n_ref = REFTAG_TYPEDEF(tag_n);#undef TAG_NAMESPACE#define TAG_NAMESPACE "pq"tag_typedef_t tag_any_pq = NSTAG_TYPEDEF(*);tag_typedef_t tag_p = BOOLTAG_TYPEDEF(p);tag_typedef_t tag_p_ref = REFTAG_TYPEDEF(tag_p);tag_typedef_t tag_q = BOOLTAG_TYPEDEF(q);tag_typedef_t tag_q_ref = REFTAG_TYPEDEF(tag_q);#endifint main(int argc, char *argv[]){ int retval = 0; int i;#if HAVE_WIN32 tag_typedef_t _tag_a = STRTAG_TYPEDEF(a); tag_typedef_t _tag_a_ref = REFTAG_TYPEDEF(tag_a); tag_typedef_t _tag_b = STRTAG_TYPEDEF(b); tag_typedef_t _tag_b_ref = REFTAG_TYPEDEF(tag_b); tag_typedef_t _tag_i = INTTAG_TYPEDEF(i); tag_typedef_t _tag_i_ref = REFTAG_TYPEDEF(tag_i); tag_typedef_t _tag_j = INTTAG_TYPEDEF(j); tag_typedef_t _tag_j_ref = REFTAG_TYPEDEF(tag_j); tag_typedef_t _tag_k = INTTAG_TYPEDEF(k); tag_typedef_t _tag_k_ref = REFTAG_TYPEDEF(tag_k); tag_typedef_t _tag_n = INTTAG_TYPEDEF(n); tag_typedef_t _tag_n_ref = REFTAG_TYPEDEF(tag_n);#undef TAG_NAMESPACE#define TAG_NAMESPACE "pq" tag_typedef_t _tag_any_pq = NSTAG_TYPEDEF(*); tag_typedef_t _tag_p = BOOLTAG_TYPEDEF(p); tag_typedef_t _tag_p_ref = REFTAG_TYPEDEF(tag_p); tag_typedef_t _tag_q = BOOLTAG_TYPEDEF(q); tag_typedef_t _tag_q_ref = REFTAG_TYPEDEF(tag_q); *(struct tag_type_s *)tag_a = *_tag_a; *(struct tag_type_s *)tag_a_ref = *_tag_a_ref; *(struct tag_type_s *)tag_b = *_tag_b; *(struct tag_type_s *)tag_b_ref = *_tag_b_ref; *(struct tag_type_s *)tag_i = *_tag_i; *(struct tag_type_s *)tag_i_ref = *_tag_i_ref; *(struct tag_type_s *)tag_j = *_tag_j; *(struct tag_type_s *)tag_j_ref = *_tag_j_ref; *(struct tag_type_s *)tag_k = *_tag_k; *(struct tag_type_s *)tag_k_ref = *_tag_k_ref; *(struct tag_type_s *)tag_n = *_tag_n; *(struct tag_type_s *)tag_n_ref = *_tag_n_ref; *(struct tag_type_s *)tag_any_pq = *_tag_any_pq; *(struct tag_type_s *)tag_p = *_tag_p; *(struct tag_type_s *)tag_p_ref = *_tag_p_ref; *(struct tag_type_s *)tag_q = *_tag_q; *(struct tag_type_s *)tag_q_ref = *_tag_q_ref;#endif for (i = 1; argv[i]; i++) { if (strcmp(argv[i], "-v") == 0) tstflags |= tst_verbatim; else usage(); } retval |= test_assumptions(); retval |= test_stackargs(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); retval |= test_dup(); retval |= test_filters(); retval |= test_print(); retval |= test_tagargs(); retval |= test_gets(); retval |= test_scan(); return retval;}static int test_assumptions(void){ tagi_t tags[2], *tagi; BEGIN(); TEST_1(sizeof (tag_value_t) >= sizeof (void *)); /* First some pointer arithmetics - this is always true, right? */ tagi = tags; TEST(tagi + 1, tags + 1); tagi = (tagi_t *)(sizeof(tagi_t) + (char *)tagi); TEST(tagi, tags + 1); END();}#if SU_HAVE_TAGSTACK/* Automake thing:###### Test if we have stack suitable for handling tags directly###AC_TRY_RUN( [#include <stdarg.h>int test1(int l, int h, ...){ va_list ap; int i, *p = &l; va_start(ap, h); if (*p++ != l || *p++ != h) return 1; for (i = l; i <= h; i++) { if (*p++ != i) return 1; } for (i = l; i <= h; i++) { if (va_arg(ap, int) != i) return 1; } va_end(ap); return 0;}int main(int avc, char *av[]){ return test1(1, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);}], AC_SU_DEFINE(SU_HAVE_TAGSTACK, 1, [Define this as 1 if your compiler puts the variable argument list nicely in memory]), dnl SU_HAVE_TAGSTACK=0 dnl SU_HAVE_TAGSTACK=0)*/static int test_stackargs(int l, ...){ va_list ap; int i, *p; BEGIN(); va_start(ap, l); p = &l; for (i = l; i <= 10; i++) { TEST(*p++, i); } for (i = l + 1; i <= 10; i++) { TEST(va_arg(ap, int), i); } va_end(ap); END();}#elsestatic int test_stackargs(int l, ...) { return 0; }#endif/** Test tl_list, tl_llist and tl_dup */static int test_dup(void){ tagi_t const rest[] = {{ TAG_A("Foo") }, { TAG_NULL() }}; tagi_t *lst, *dup; BEGIN(); lst = tl_list(TAG_A("Moro"), TAG_A("Vaan"), TAG_I(1), TAG_SKIP(2), TAG_NEXT(rest)); TEST(lst[0].t_tag, tag_a); TEST(lst[1].t_tag, tag_a); TEST(lst[2].t_tag, tag_i); TEST(lst[3].t_tag, tag_skip); TEST(lst[4].t_tag, tag_next); TEST(tl_len(lst), 5 * sizeof(tagi_t)); TEST(tl_xtra(lst, 0), strlen("Moro" "Vaan" "Foo") + 3); dup = tl_adup(NULL, lst); TEST0(dup != NULL); TEST(tl_len(dup), 5 * sizeof(tagi_t)); TEST(tl_xtra(dup, 0), strlen("Moro" "Vaan" "Foo") + 3); su_free(NULL, dup); dup = tl_llist(TAG_B("Moi"), TAG_NEXT(lst)); TEST(dup[0].t_tag, tag_b); TEST(dup[1].t_tag, tag_a); TEST(dup[2].t_tag, tag_a); TEST(dup[3].t_tag, tag_i); TEST(dup[4].t_tag, tag_a); TEST(dup[5].t_tag, NULL); su_free(NULL, dup); dup = tl_llist(TAG_NEXT(NULL)); TEST(dup[0].t_tag, 0); su_free(NULL, dup); dup = tl_llist(TAG_END()); TEST(dup[0].t_tag, 0); su_free(NULL, dup); dup = tl_llist(TAG_SKIP(1), TAG_NEXT(lst + 4)); TEST(dup[0].t_tag, tag_a); TEST(dup[1].t_tag, 0); su_free(NULL, dup); tl_vfree(lst); END();}/* Test tl_afilter() */static int test_filters(void){ tagi_t *lst, *filter1, *filter2, *filter3, *filter4, *b1, *b2, *b3, *b4; tagi_t *nsfilter, *b5; BEGIN(); lst = tl_list(TAG_A("Moro"), TAG_I(2), TAG_Q(3), TAG_SKIP(2), TAG_A("Vaan"), TAG_I(1), TAG_P(2), TAG_NULL()); filter1 = tl_list(TAG_A(""), TAG_NULL()); filter2 = tl_list(TAG_I(0), TAG_NULL()); filter3 = tl_list(TAG_A(""), TAG_I(0), TAG_NULL()); filter4 = tl_list(TAG_ANY(), TAG_NULL()); TEST0(lst && filter1 && filter2 && filter3); b1 = tl_afilter(NULL, filter1, lst); TEST(tl_len(b1), 3 * sizeof(tagi_t)); TEST(tl_xtra(b1, 0), strlen("Moro" "Vaan") + 2); b2 = tl_afilter(NULL, filter2, lst); TEST(tl_len(b2), 3 * sizeof(tagi_t)); TEST(tl_xtra(b2, 0), 0); b3 = tl_afilter(NULL, filter3, lst); TEST(tl_len(b3), 5 * sizeof(tagi_t)); TEST(tl_xtra(b3, 0), strlen("Moro" "Vaan") + 2); b4 = tl_afilter(NULL, filter4, lst); TEST(tl_len(b4), 7 * sizeof(tagi_t)); TEST(tl_xtra(b4, 0), strlen("Moro" "Vaan") + 2); su_free(NULL, b1); su_free(NULL, b2); su_free(NULL, b3); su_free(NULL, b4); nsfilter = tl_list(TAG_ANY_PQ(), TAG_END()); b5 = tl_afilter(NULL, nsfilter, lst); TEST(tl_len(b5), 3 * sizeof(tagi_t)); TEST(tl_xtra(b5, 0), 0); TEST(b5[0].t_tag, tag_q); TEST(b5[1].t_tag, tag_p); tl_vfree(filter1); tl_vfree(filter2); tl_vfree(filter3); tl_vfree(filter4); tl_vfree(lst); END();}/* Test tl_print */static int test_print(void){ BEGIN(); tagi_t *lst; FILE *out; lst = tl_list(TAG_A("Moro"), TAG_I(2), TAG_J(3), TAG_K(5), TAG_SKIP(2), TAG_A("Vaan"), TAG_B("b"), TAG_I(1), TAG_NULL()); if (tstflags & tst_verbatim) out = stdout; else out = fopen(DEVNULL, "w"); if (out) { tl_print(out, "test_print: ", lst); if ((tstflags & tst_verbatim) == 0) fclose(out); } END();}static int test_tagargs2(tag_type_t tag, tag_value_t value, ...){ ta_list ta; tagi_t const *t; BEGIN(); ta_start(ta, tag, value); t = ta_args(ta); TEST(t->t_tag, tag_a); TEST_S((char *)t->t_value, "a"); t = tl_next(t); TEST(t->t_tag, tag_b); TEST_S((char *)t->t_value, "b"); ta_end(ta); END();}/* Test tagargs) */static int test_tagargs(void){ return test_tagargs2(TAG_A("a"), TAG_B("b"), TAG_I(1), TAG_J(2), TAG_K(3), TAG_P(0), TAG_Q(-1), TAG_END());}/* Test tl_tgets() and tl_gets() */static int test_gets(void){ tagi_t *lst; char const *a = "B", *b = "A"; int i = 1, j = 0, k = 0, p = -1; BEGIN(); lst = tl_list(TAG_A("Moro"), TAG_I(2), TAG_J(3), TAG_K(5), TAG_P(3), TAG_SKIP(2), TAG_A("Vaan"), TAG_B("b"), TAG_I(1), TAG_NULL()); TEST_1(lst); TEST(tl_gets(lst, TAG_A_REF(a), TAG_B_REF(b), TAG_I_REF(i), TAG_J_REF(j), TAG_K_REF(k), TAG_P_REF(p), TAG_END()), 6); /* tl_gets() semantics have changed */#if 0 TEST_S(a, "Moro"); TEST(i, 2);#else TEST_S(a, "Vaan"); TEST(i, 1);#endif TEST(j, 3); TEST(k, 5); TEST(p, 1); TEST_S(b, "b"); lst = tl_list(TAG_A_REF(a), TAG_I_REF(i), TAG_NULL()); TEST(tl_tgets(lst, TAG_A("Foo"), TAG_I(-1), TAG_END()), 2); TEST_S(a, "Foo"); TEST(i, -1); END();}static int test_scan(void){ tag_value_t v = 0; BEGIN(); TEST(t_scan(tag_a, NULL, NULL, &v), -1); /* Invalid case */ TEST(t_scan(tag_a, NULL, "foo", &v), 1); TEST_S((char *)v, "foo"); su_free(NULL, (void *)v); TEST(t_scan(tag_i, NULL, "", &v), -1); /* Invalid case */ TEST(t_scan(tag_i, NULL, "kukkuu-reset", &v), -1); /* Invalid case */ TEST(t_scan(tag_i, NULL, "-1234", &v), 1); TEST(v, -1234); TEST(t_scan(tag_n, NULL, "", &v), -1); /* Invalid case */ TEST(t_scan(tag_n, NULL, "3243432", &v), 1); TEST(v, 3243432); TEST(t_scan(tag_p, NULL, "kukkuu-reset", &v), -1); /* Invalid case */ TEST(t_scan(tag_p, NULL, "", &v), -1); /* Invalid case */ TEST(t_scan(tag_p, NULL, "true", &v), 1); TEST(v, 1); TEST(t_scan(tag_p, NULL, "true ", &v), 1); TEST(v, 1); TEST(t_scan(tag_p, NULL, " 134 ", &v), 1); TEST(v, 1); TEST(t_scan(tag_p, NULL, "false \n\t", &v), 1); TEST(v, 0); TEST(t_scan(tag_p, NULL, " 000.000 ", &v), 1); TEST(v, 0); v = 1; TEST(t_scan(tag_null, NULL, "NULL", &v), 0); TEST(v, 0); v = 1; TEST(t_scan(tag_skip, NULL, "SKIP", &v), 0); TEST(v, 0); v = 1; TEST(t_scan(tag_any, NULL, "any", &v), 0); TEST(v, 0); /* Test API checks for invalid values */ TEST(t_scan(NULL, NULL, "-1234", &v), -1); TEST(t_scan(tag_a, NULL, NULL, &v), -1); TEST(t_scan(tag_a, NULL, "-1234", NULL), -1); END();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -