📄 test_sresolv.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 * *//**@internal * * @CFILE test_sresolv.c Test module for sresolv * * @author Mikko Haataja <ext-Mikko.A.Haataja@nokia.com>, * @author Pekka Pessi <Pekka.Pessi@nokia.com>. * */#include "config.h"#if HAVE_SU_WAIT_Hstruct sres_context_s;#define SU_WAKEUP_ARG_T struct sres_context_s#include <sofia-sip/su_wait.h>#include <sofia-sip/su_time.h>#else#define _XOPEN_SOURCE (500)#include <stdint.h>#include <netinet/in.h>#include <arpa/inet.h>#include <poll.h>#include <errno.h>#endif#define TSTFLAGS tstflags#include <sofia-sip/tstdef.h>#include "sofia-sip/sresolv.h"#include <assert.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <pthread.h>#include <unistd.h>#include <sofia-sip/su_alloc.h>#if HAVE_ALARM#include <unistd.h>#include <signal.h>#endifchar const name[] = "test_sresolv";struct sres_context_s{ su_home_t home[1]; sres_resolver_t *resolver; sres_query_t *query; sres_record_t **result; int socket; pthread_mutex_t mutex[1]; int timeout; int sink; int sinkidx; char const *sinkconf; #if HAVE_SU_WAIT_H su_root_t *root;#else int ready; int n_sockets; int *sockets; struct pollfd *pollfds;#endif};static void test_answer(sres_context_t *ctx, sres_query_t *query, sres_record_t **answer);static void test_answer_multi(sres_context_t *ctx, sres_query_t *query, sres_record_t **answer);static int tstflags = 0;#if 0staticint setblocking(int s, int blocking){ unsigned mode = fcntl(s, F_GETFL, 0); if (mode < 0) return -1; if (blocking) mode &= ~(O_NDELAY | O_NONBLOCK); else mode |= O_NDELAY | O_NONBLOCK; return fcntl(s, F_SETFL, mode);}/** Test few assumptions about sockets */staticint test_socket(sres_context_t *ctx){ int af; int s1, s2, s3, s4; struct sockaddr_storage a[1]; struct sockaddr_storage a1[1], a2[1], a3[1], a4[1]; struct sockaddr_in *sin = (void *)a; struct sockaddr_in *sin1 = (void *)a1, *sin2 = (void *)a2; struct sockaddr_in *sin3 = (void *)a3, *sin4 = (void *)a4; struct sockaddr *sa = (void *)a; struct sockaddr *sa1 = (void *)a1, *sa2 = (void *)a2; struct sockaddr *sa3 = (void *)a3, *sa4 = (void *)a4; int alen, a1len, a2len, a3len, a4len; char buf[16]; BEGIN(); af = AF_INET; for (;;) { TEST_1((s1 = socket(af, SOCK_DGRAM, 0)) != -1); TEST_1((s2 = socket(af, SOCK_DGRAM, 0)) != -1); TEST_1((s3 = socket(af, SOCK_DGRAM, 0)) != -1); TEST_1((s4 = socket(af, SOCK_DGRAM, 0)) != -1); TEST_1(setblocking(s1, 0) == 0); TEST_1(setblocking(s2, 0) == 0); TEST_1(setblocking(s3, 0) == 0); TEST_1(setblocking(s4, 0) == 0); memset(a, 0, sizeof a); memset(a1, 0, sizeof a1); memset(a2, 0, sizeof a2); memset(a3, 0, sizeof a3); memset(a4, 0, sizeof a4);#if HAVE_SA_LEN a1->ss_len = a2->ss_len = a3->ss_len = a4->ss_len = sizeof a1;#endif a1->ss_family = a2->ss_family = a3->ss_family = a4->ss_family = af; if (af == AF_INET) a1len = a2len = a3len = a4len = sizeof (struct sockaddr_in); else a1len = a2len = a3len = a4len = sizeof (struct sockaddr_in6); if (af == AF_INET) { TEST_1(inet_pton(af, "127.0.0.1", &sin3->sin_addr) > 0); TEST_1(inet_pton(af, "127.0.0.1", &sin4->sin_addr) > 0); } else { } TEST(bind(s3, (struct sockaddr *)a3, a3len), 0); TEST(bind(s4, (struct sockaddr *)a4, a4len), 0); alen = sizeof a; TEST(getsockname(s3, (struct sockaddr *)a, &alen), 0); sin3->sin_port = sin->sin_port; memset(sin->sin_zero, 0, sizeof sin->sin_zero); TEST(alen, a3len); TEST_M(a, a3, a3len); alen = sizeof a; TEST(getsockname(s4, (struct sockaddr *)a, &alen), 0); sin4->sin_port = sin->sin_port; memset(sin->sin_zero, 0, sizeof sin->sin_zero); TEST(alen, a4len); TEST_M(a, a4, a4len); TEST(connect(s1, sa3, a3len), 0); TEST(getsockname(s1, (struct sockaddr *)a1, &a1len), 0); TEST(connect(s2, sa4, a4len), 0); TEST(getsockname(s2, (struct sockaddr *)a2, &a2len), 0); TEST(sendto(s1, "foo", 3, 0, sa4, a4len), 3); TEST(recvfrom(s4, buf, sizeof buf, 0, sa, &alen), 3); TEST(sendto(s4, "bar", 3, 0, sa, alen), 3); TEST(recvfrom(s2, buf, sizeof buf, 0, sa, &alen), -1); TEST(recvfrom(s1, buf, sizeof buf, 0, sa, &alen), 3); su_close(s1), su_close(s2), su_close(s3), su_close(s4); break; } END();}#endifstatic unsigned offset;#define TEST_RUN(ctx) \ { sres_free_answers(ctx->resolver, ctx->result); ctx->result = NULL; \ ctx->query = NULL; run(ctx); TEST_1(ctx->query); }#if HAVE_SU_WAIT_H#define BREAK(ctx) (su_root_break(ctx->root))static void run(sres_context_t *ctx){ if (ctx->timeout) offset += 1 << 7; su_root_run(ctx->root); }#else#define BREAK(ctx) (ctx->ready = 1)static void run(sres_context_t *ctx){ int i, n, events; n = ctx->n_sockets; for (ctx->ready = 0; !ctx->ready; ) { events = poll(ctx->pollfds, n, ctx->timeout ? 100 : 500); if (events) for (i = 0; i < n; i++) { if (ctx->pollfds[i].revents & POLLERR) sres_resolver_error(ctx->resolver, ctx->pollfds[i].fd); if (ctx->pollfds[i].revents & POLLIN) sres_resolver_receive(ctx->resolver, ctx->pollfds[i].fd); } if (ctx->timeout) { ctx->timeout <<= 1; offset += ctx->timeout; } /* No harm is done (except wasted CPU) if timer is called more often */ sres_resolver_timer(ctx->resolver, ctx->socket); }}#endifint test_soa(sres_context_t *ctx){ sres_resolver_t *res = ctx->resolver; int s = ctx->socket; sres_record_t **result; const sres_soa_record_t *rr_soa; char const *domain = "example.com"; BEGIN();#if HAVE_SU_WAIT_H /* Deprecated compatibility function */ TEST_1(sres_query(res, test_answer, ctx, sres_type_soa, domain));#else TEST_1(sres_query_make(res, test_answer, ctx, s, sres_type_soa, domain));#endif TEST_RUN(ctx); TEST_1(sres_query_make(res, test_answer, ctx, s, sres_type_soa, domain)); TEST_RUN(ctx); TEST_1(result = sres_cached_answers(res, sres_type_soa, domain)); TEST_1(result != NULL); TEST_1(result[0] != NULL); rr_soa = result[0]->sr_soa; TEST(rr_soa->soa_record->r_type, sres_type_soa); TEST(rr_soa->soa_record->r_class, sres_class_in); TEST_S(rr_soa->soa_mname, "ns.example.com."); TEST_S(rr_soa->soa_rname, "root.example.com."); TEST(rr_soa->soa_serial, 2002042901); TEST(rr_soa->soa_refresh, 7200); TEST(rr_soa->soa_retry, 600); TEST(rr_soa->soa_expire, 36000000); TEST(rr_soa->soa_minimum, 60); sres_free_answers(res, result); END();}int test_naptr(sres_context_t *ctx){ sres_resolver_t *res = ctx->resolver; int s = ctx->socket; sres_record_t **result; const sres_naptr_record_t *rr; char const *domain = "example.com"; int i; BEGIN(); TEST_1(sres_query_make(res, test_answer, ctx, s, sres_type_naptr, domain)); TEST_RUN(ctx); TEST_1(result = ctx->result); TEST_1(result[0]); for (i = 0; result[i] != NULL; i++) { rr = (sres_naptr_record_t *) result[i]->sr_naptr; switch(rr->na_order) { case 20: TEST(rr->na_record->r_type, sres_type_naptr); TEST(rr->na_record->r_class, sres_class_in); TEST(rr->na_record->r_ttl, 60); TEST(rr->na_order, 20); TEST(rr->na_prefer, 50); TEST_S(rr->na_flags, "s"); TEST_S(rr->na_services, "SIPS+D2T"); TEST_S(rr->na_regexp, ""); TEST_S(rr->na_replace, "_sips._tcp.example.com."); break; case 40: TEST(rr->na_record->r_type, sres_type_naptr); TEST(rr->na_record->r_class, sres_class_in); TEST(rr->na_record->r_ttl, 60); TEST(rr->na_order, 40); TEST(rr->na_prefer, 15); TEST_S(rr->na_flags, "s"); TEST_S(rr->na_services, "SIP+D2U"); TEST_S(rr->na_regexp, ""); TEST_S(rr->na_replace, "_sip._udp.example.com."); break; case 50: TEST(rr->na_record->r_type, sres_type_naptr); TEST(rr->na_record->r_class, sres_class_in); TEST(rr->na_record->r_ttl, 60); TEST(rr->na_order, 50); TEST(rr->na_prefer, 15); TEST_S(rr->na_flags, "u"); TEST_S(rr->na_services, "TEST+D2U"); TEST_S(rr->na_regexp, "/(tst:([^@]+@))?example.com$/\\1operator.com/i"); TEST_S(rr->na_replace, "."); break; case 80: TEST(rr->na_record->r_type, sres_type_naptr); TEST(rr->na_record->r_class, sres_class_in); TEST(rr->na_record->r_ttl, 60); TEST(rr->na_order, 80); TEST(rr->na_prefer, 25); TEST_S(rr->na_flags, "s"); TEST_S(rr->na_services, "SIP+D2T"); TEST_S(rr->na_regexp, ""); TEST_S(rr->na_replace, "_sip._tcp.example.com."); break; default: TEST_1(0); } } sres_free_answers(res, ctx->result), ctx->result = NULL; END();}char const longname[1026] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.";char name2048[2049] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" "gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg" "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" "gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg" "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" "gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg" "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" "gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg" "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";int test_a(sres_context_t *ctx){ sres_resolver_t *res = ctx->resolver; int s = ctx->socket; sres_query_t *query; sres_record_t **result; const sres_a_record_t *rr_a; char const *domain = "sip00.example.com"; char name1025[1026] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ".";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -