📄 test_sresolv.c
字号:
char const *domain = "1.0.0.127.in-addr.arpa"; BEGIN(); TEST_1(sres_query(res, test_answer, ctx, sres_type_ptr, domain)); TEST_RUN(ctx); result = ctx->result; TEST_1(result != NULL); TEST_1(result[0] != NULL); rr = result[0]->sr_ptr; TEST_1(rr != NULL); TEST(rr->ptr_record->r_class, sres_class_in); TEST(rr->ptr_record->r_type, sres_type_ptr); TEST_S(rr->ptr_domain, "localhost."); END();}int test_ptr_ipv4_sockaddr(sres_context_t *ctx){ sres_resolver_t *res = ctx->resolver; sres_record_t **result; sres_query_t *query; const sres_ptr_record_t *rr; struct sockaddr_in sin = {0}; su_inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr); sin.sin_family = AF_INET; BEGIN(); query = sres_query_sockaddr(res, test_answer, ctx, sres_qtype_any, (struct sockaddr*)&sin); TEST_1(query != NULL); TEST_RUN(ctx); result = ctx->result; TEST_1(result != NULL); TEST_1(result[0] != NULL); rr = result[0]->sr_ptr; TEST_1(rr != NULL); TEST(rr->ptr_record->r_type, sres_type_ptr); TEST(rr->ptr_record->r_class, sres_class_in); TEST_S(rr->ptr_domain, "localhost."); END();}#if HAVE_SIN6int test_ptr_ipv6(sres_context_t *ctx){ sres_resolver_t *res = ctx->resolver; sres_record_t **result; const sres_ptr_record_t *rr; char const *domain = "c.a.7.e.d.7.e.f.f.f.0.2.8.0.a.0.0.0.0.c.2.1.0.3.0.0.2.1.e.f.f.3.ip6.int"; BEGIN(); TEST_1(sres_query(res, test_answer, ctx, sres_type_ptr, domain)); TEST_RUN(ctx); result = ctx->result; TEST_1(result != NULL); TEST_1(result[0] != NULL); rr = result[0]->sr_ptr; TEST_1(rr != NULL); TEST(rr->ptr_record->r_type, sres_type_ptr); TEST(rr->ptr_record->r_class, sres_class_in); TEST_S(rr->ptr_domain, "sip01.example.com."); END();}int test_ptr_ipv6_sockaddr(sres_context_t *ctx){ sres_resolver_t *res = ctx->resolver; sres_record_t **result; const sres_ptr_record_t *rr; struct sockaddr_in6 sin6 = {0}; BEGIN(); su_inet_pton(AF_INET6, "3ffe:1200:3012:c000:0a08:20ff:fe7d:e7ac", &sin6.sin6_addr); sin6.sin6_family = AF_INET6; ctx->query = sres_query_sockaddr(res, test_answer, ctx, sres_type_ptr, (struct sockaddr*)&sin6); TEST_1(ctx->query != NULL); TEST_RUN(ctx); result = ctx->result; TEST_1(result != NULL); TEST_1(result[0] != NULL); rr = result[0]->sr_ptr; TEST_1(rr != NULL); TEST(rr->ptr_record->r_type, sres_type_ptr); TEST(rr->ptr_record->r_class, sres_class_in); TEST_S(rr->ptr_domain, "sip01.example.com."); END();}#endif /* HAVE_SIN6 *//* Test sres_cached_answers(), sres_sort_answers(), sres_free_answers() */int test_cache(sres_context_t *ctx){ sres_resolver_t *res = ctx->resolver; int ok = 0; sres_record_t *sort_array[3]; sres_record_t **result; sres_query_t *query; const sres_record_t *rr = NULL; const sres_a6_record_t *rr_a6; const sres_aaaa_record_t *rr_aaaa; const sres_cname_record_t *rr_cname; const sres_ptr_record_t *rr_ptr;#if HAVE_SIN6 struct sockaddr_in6 sin6 = {0};#endif char const *domain; char buf[50] = {0}; int i, j; BEGIN(); sres_query(res, test_answer_multi, ctx, sres_qtype_any, "example.com"); sres_query(res, test_answer_multi, ctx, sres_qtype_any, "_sips._tcp.example.com"); sres_query(res, test_answer_multi, ctx, sres_qtype_any, "sip.example.com"); sres_query(res, test_answer_multi, ctx, sres_qtype_any, "subnet.example.com");#if HAVE_SIN6 sres_query(res, test_answer_multi, ctx, sres_type_aaaa, "mgw02.example.com"); su_inet_pton(AF_INET6, "3ffe:1200:3012:c000:0a08:20ff:fe7d:e7ac", &sin6.sin6_addr); sin6.sin6_family = AF_INET6; query = sres_query_sockaddr(res, test_answer_multi, ctx, sres_qtype_any, (struct sockaddr *)&sin6); TEST_1(query != NULL);#endif TEST_RUN(ctx); /* For a chance, a fully qualified domain name with final "." */ domain = "example.com."; result = sres_cached_answers(res, sres_qtype_any, domain); TEST_1(result != NULL); for (i = 0; result[i] != NULL; i++) { rr = result[i]; if (rr->sr_record->r_type == sres_type_naptr) { const sres_naptr_record_t *rr_naptr = rr->sr_naptr; switch(rr_naptr->na_order) { case 20: TEST(rr_naptr->na_record->r_type, sres_type_naptr); TEST(rr_naptr->na_record->r_class, sres_class_in); TEST(rr_naptr->na_record->r_ttl, 60); TEST(rr_naptr->na_order, 20); TEST(rr_naptr->na_prefer, 50); TEST_S(rr_naptr->na_flags, "s"); TEST_S(rr_naptr->na_services, "SIPS+D2T"); TEST_S(rr_naptr->na_regexp, ""); TEST_S(rr_naptr->na_replace, "_sips._tcp.example.com."); ok |= 1; break; case 40: TEST(rr_naptr->na_record->r_type, sres_type_naptr); TEST(rr_naptr->na_record->r_class, sres_class_in); TEST(rr_naptr->na_record->r_ttl, 60); TEST(rr_naptr->na_order, 40); TEST(rr_naptr->na_prefer, 15); TEST_S(rr_naptr->na_flags, "s"); TEST_S(rr_naptr->na_services, "SIP+D2U"); TEST_S(rr_naptr->na_regexp, ""); TEST_S(rr_naptr->na_replace, "_sip._udp.example.com."); ok |= 2; break; case 50: TEST(rr_naptr->na_record->r_type, sres_type_naptr); TEST(rr_naptr->na_record->r_class, sres_class_in); TEST(rr_naptr->na_record->r_ttl, 60); TEST(rr_naptr->na_order, 50); TEST(rr_naptr->na_prefer, 15); TEST_S(rr_naptr->na_flags, "u"); TEST_S(rr_naptr->na_services, "TEST+D2U"); TEST_S(rr_naptr->na_regexp, "/(tst:([^@]+@))?example.com$/\\1operator.com/i"); TEST_S(rr_naptr->na_replace, "."); break; case 80: TEST(rr_naptr->na_record->r_type, sres_type_naptr); TEST(rr_naptr->na_record->r_class, sres_class_in); TEST(rr_naptr->na_record->r_ttl, 60); TEST(rr_naptr->na_order, 80); TEST(rr_naptr->na_prefer, 25); TEST_S(rr_naptr->na_flags, "s"); TEST_S(rr_naptr->na_services, "SIP+D2T"); TEST_S(rr_naptr->na_regexp, ""); TEST_S(rr_naptr->na_replace, "_sip._tcp.example.com."); ok |= 4; break; default: TEST_1(0); } } } TEST(ok, 7); /* Reverse order before sorting */ for (j = 0; j < --i; j++) { sres_record_t *swap = result[j]; result[j] = result[i]; result[i] = swap; } /* Test sorting */ sres_sort_answers(res, result); /* Sort all records with themselves */ for (i = 0; result[i]; i++) { sort_array[0] = result[i], sort_array[1] = result[i], sort_array[2] = NULL; sres_sort_answers(res, sort_array); } /* Test free */ for (i = 0; result[i]; i++) { sres_free_answer(res, result[i]); result[i] = NULL; } /* Test sres_free_answers() */ sres_free_answers(res, result); result = sres_cached_answers(res, sres_qtype_any, "_sips._tcp.example.com"); TEST_1(result != NULL); ok = 0; for (i = 0; result[i] != NULL; i++) { sres_srv_record_t *rr_srv = result[i]->sr_srv; TEST(rr_srv->srv_record->r_type, sres_type_srv); switch(rr_srv->srv_priority) { case 3: TEST(rr_srv->srv_record->r_type, sres_type_srv); TEST(rr_srv->srv_record->r_class, sres_class_in); TEST(rr_srv->srv_record->r_ttl, 60); TEST(rr_srv->srv_weight, 100); TEST(rr_srv->srv_port, 5061); TEST_S(rr_srv->srv_target, "sip00.example.com."); ok |= 1; break; case 4: TEST(rr_srv->srv_record->r_type, sres_type_srv); TEST(rr_srv->srv_record->r_class, sres_class_in); TEST(rr_srv->srv_record->r_ttl, 60); TEST(rr_srv->srv_weight, 50); TEST(rr_srv->srv_port, 5050); TEST_S(rr_srv->srv_target, "sip02.example.com."); ok |= 2; break; case 5: TEST(rr_srv->srv_record->r_type, sres_type_srv); TEST(rr_srv->srv_record->r_class, sres_class_in); TEST(rr_srv->srv_record->r_ttl, 60); TEST(rr_srv->srv_weight, 10); TEST(rr_srv->srv_port, 5060); TEST_S(rr_srv->srv_target, "sip01.example.com."); ok |= 4; break; default: TEST_1(0); } } TEST(ok, 7); /* Reverse order before sorting */ for (j = 0; j < --i; j++) { sres_record_t *swap = result[j]; result[j] = result[i]; result[i] = swap; } sres_sort_answers(res, result); sres_free_answers(res, result); domain = "sip.example.com"; result = sres_cached_answers(res, sres_qtype_any, domain); TEST_1(result != NULL); TEST_1(result[0] != NULL); rr_cname = result[0]->sr_cname; TEST(rr_cname->cn_record->r_type, sres_type_cname); TEST(rr_cname->cn_record->r_class, sres_class_in); TEST(rr_cname->cn_record->r_ttl, 60); TEST_S(rr_cname->cn_cname, "sip00.example.com."); sres_free_answers(res, result);#if HAVE_SIN6 domain = "subnet.example.com"; result = sres_cached_answers(res, sres_qtype_any, domain); TEST_1(result != NULL); TEST_1(result[0] != NULL); rr_a6 = result[0]->sr_a6; TEST(rr_a6->a6_record->r_type, sres_type_a6); TEST(rr_a6->a6_record->r_class, sres_class_in); TEST(rr_a6->a6_record->r_ttl, 60); TEST(rr_a6->a6_prelen, 0); TEST_S(su_inet_ntop(AF_INET6, &rr_a6->a6_suffix, buf, sizeof(buf)), "3ff0::"); TEST_P(rr_a6->a6_prename, NULL); sres_free_answers(res, result); domain = "mgw02.example.com"; TEST_1(result = sres_cached_answers(res, sres_type_aaaa, domain)); TEST_1(rr_aaaa = result[0]->sr_aaaa); TEST(rr_aaaa->aaaa_record->r_type, sres_type_aaaa); TEST(rr_aaaa->aaaa_record->r_class, sres_class_in); TEST(rr_aaaa->aaaa_record->r_ttl, 60); TEST_S(su_inet_ntop(AF_INET6, &rr_aaaa->aaaa_addr, buf, sizeof(buf)), "3ffe:1200:3012:c000:206:5bff:fe55:462f"); sres_free_answers(res, result); result = sres_cached_answers_sockaddr(res, sres_type_ptr, (struct sockaddr *)&sin6); TEST_1(result != NULL); rr_ptr = result[0]->sr_ptr; TEST_1(rr_ptr != NULL); TEST(rr_ptr->ptr_record->r_type, sres_type_ptr); TEST(rr_ptr->ptr_record->r_class, sres_class_in); TEST_S(rr_ptr->ptr_domain, "sip01.example.com."); sres_free_answers(res, result);#endif /* HAVE_SIN6 */ END();}#if HAVE_SIN6int test_query_one_type(sres_context_t *ctx){ sres_resolver_t *res = ctx->resolver; sres_record_t **result; const sres_aaaa_record_t *rr_aaaa; char buf[50] = {0}; BEGIN(); TEST_1(sres_query(res, test_answer, ctx, sres_type_aaaa, "mgw02.example.com")); TEST_RUN(ctx); TEST_1(result = ctx->result); TEST_1(result[0] != NULL); TEST_1(rr_aaaa = result[0]->sr_aaaa); TEST(rr_aaaa->aaaa_record->r_type, sres_type_aaaa); TEST(rr_aaaa->aaaa_record->r_class, sres_class_in); TEST(rr_aaaa->aaaa_record->r_ttl, 60); TEST_S(su_inet_ntop(AF_INET6, &rr_aaaa->aaaa_addr, buf, sizeof(buf)), "3ffe:1200:3012:c000:206:5bff:fe55:462f"); TEST_P(result[1], NULL); END();}#endif /* HAVE_SIN6*/#ifdef _WIN32#include <fcntl.h>#endifint sink_make(sres_context_t *ctx){ char *tmpdir = getenv("TMPDIR"); char *template; int fd; sres_socket_t sink; struct sockaddr_in sin[1]; socklen_t sinsize = sizeof sin; FILE *f; BEGIN(); sink = socket(AF_INET, SOCK_DGRAM, 0); TEST_1(sink != INVALID_SOCKET); TEST(getsockname(sink, (struct sockaddr *)sin, &sinsize), 0); sin->sin_addr.s_addr = htonl(INADDR_LOOPBACK); TEST(bind(sink, (struct sockaddr *)sin, sinsize), 0); TEST(getsockname(sink, (struct sockaddr *)sin, &sinsize), 0); ctx->sink = sink; template = su_sprintf(ctx->home, "%s/test_sresolv.XXXXXX", tmpdir ? tmpdir : "/tmp"); TEST_1(template);#ifndef _WIN32 fd = mkstemp(template); TEST_1(fd != -1);#else fd = open(template, O_WRONLY); TEST_1(fd != -1);#endif f = fdopen(fd, "w"); TEST_1(f); fprintf(f, "domain example.com\n" "search foo.bar.com\n" "port %u\n", ntohs(sin->sin_port)); fclose(f); ctx->sinkconf = template; END();}#if 0int recv_sink(su_root_magic_t *rm, su_wait_t *w, sres_context_t *ctx){ union { char bytes[8192]; unsigned short shorts[4096]; } buffer[1]; su_wait_events(w, ctx->sink); recv(ctx->sink, buffer->bytes, sizeof buffer, 0); return 0;}int sink_init(sres_context_t *ctx){ su_wait_t w[1]; BEGIN(); TEST(su_wait_create(w, ctx->sink, SU_WAIT_IN), 0); ctx->sinkidx = su_root_register(ctx->root, w, recv_sink, ctx, 0); TEST_1(ctx->sinkidx != 0); END();}int sink_deinit(sres_context_t *ctx){ BEGIN(); if (ctx->sinkidx) su_root_deregister(ctx->root, ctx->sinkidx);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -