diff options
author | Mark Michelson <mmichelson@digium.com> | 2015-04-06 17:05:47 +0000 |
---|---|---|
committer | Mark Michelson <mmichelson@digium.com> | 2015-04-06 17:05:47 +0000 |
commit | 0a26602b8c804db90855dd94fb6ef8aba549c410 (patch) | |
tree | 89e9c364b16d0c0bba4b3868958f8c6503ba611e /res | |
parent | edf9da436554973fe830fedea3ff2d059e8883e5 (diff) |
Merge NAPTR support into trunk.
This adds NAPTR record allocation and sorting, as well as
unit tests that verify that NAPTR records are parsed and
sorted correctly.
Review: https://reviewboard.asterisk.org/r/4542
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@434068 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res')
-rw-r--r-- | res/res_resolver_unbound.c | 122 |
1 files changed, 121 insertions, 1 deletions
diff --git a/res/res_resolver_unbound.c b/res/res_resolver_unbound.c index 94af28e7f..f53998425 100644 --- a/res/res_resolver_unbound.c +++ b/res/res_resolver_unbound.c @@ -303,7 +303,6 @@ static int unbound_resolver_resolve(struct ast_dns_query *query) ao2_ref(data, -1); ao2_ref(cfg, -1); - return res; } @@ -493,6 +492,8 @@ static int unbound_config_preapply_callback(void) #ifdef TEST_FRAMEWORK +#include "asterisk/dns_naptr.h" + /*! * \brief A DNS record to be used during a test */ @@ -1186,6 +1187,123 @@ AST_TEST_DEFINE(resolve_cancel_off_nominal) return AST_TEST_PASS; } +AST_TEST_DEFINE(resolve_naptr) +{ + RAII_VAR(struct unbound_resolver *, resolver, NULL, ao2_cleanup); + RAII_VAR(struct unbound_config *, cfg, NULL, ao2_cleanup); + RAII_VAR(struct ast_dns_result *, result, NULL, ast_dns_result_free); + + const struct ast_dns_record *record; + + static const char * DOMAIN1 = "goose.feathers"; + int i; + enum ast_test_result_state res = AST_TEST_PASS; + + struct naptr_record { + const char *zone_entry; + uint16_t order; + uint16_t preference; + const char *flags; + const char *services; + const char *regexp; + const char *replacement; + int visited; + } records [] = { + { "goose.feathers 12345 IN NAPTR 100 100 A SIP+D2U \"\" goose.down", 100, 100, "A", "SIP+D2U", "", "goose.down", 0}, + { "goose.feathers 12345 IN NAPTR 100 200 A SIP+D2T \"\" duck.down", 100, 200, "A", "SIP+D2T", "", "duck.down", 0}, + { "goose.feathers 12345 IN NAPTR 200 100 A SIPS+D2U \"\" pheasant.down", 200, 100, "A", "SIPS+D2U", "", "pheasant.down", 0}, + { "goose.feathers 12345 IN NAPTR 200 200 A SIPS+D2T \"\" platypus.fur", 200, 200, "A", "SIPS+D2T", "", "platypus.fur", 0}, + }; + + switch (cmd) { + case TEST_INIT: + info->name = "resolve_naptr"; + info->category = "/res/res_resolver_unbound/"; + info->summary = "Attempt resolution of NAPTR record\n"; + info->description = "This test performs a NAPTR lookup and ensures that\n" + "the returned record has the appropriate values set\n"; + return AST_TEST_NOT_RUN; + case TEST_EXECUTE: + break; + } + + cfg = ao2_global_obj_ref(globals); + resolver = ao2_bump(cfg->global->state->resolver); + + ub_ctx_zone_add(resolver->context, DOMAIN1, "static"); + + for (i = 0; i < ARRAY_LEN(records); ++i) { + ub_ctx_data_add(resolver->context, records[i].zone_entry); + } + + if (ast_dns_resolve(DOMAIN1, ns_t_naptr, ns_c_in, &result)) { + ast_test_status_update(test, "Failed to resolve domain\n"); + return AST_TEST_FAIL; + } + + if (!result) { + ast_test_status_update(test, "Successful resolution set a NULL result\n"); + return AST_TEST_FAIL; + } + + record = ast_dns_result_get_records(result); + if (!record) { + ast_test_status_update(test, "Failed to get any DNS records from the result\n"); + return AST_TEST_FAIL; + } + + i = 0; + for (record = ast_dns_result_get_records(result); record; record = ast_dns_record_get_next(record)) { + if (ast_dns_naptr_get_order(record) != records[i].order) { + ast_test_status_update(test, "Expected order %hu, got order %hu from NAPTR record\n", + records[i].order, ast_dns_naptr_get_order(record)); + res = AST_TEST_FAIL; + } + if (ast_dns_naptr_get_preference(record) != records[i].preference) { + ast_test_status_update(test, "Expected preference %hu, got preference %hu from NAPTR record\n", + records[i].preference, ast_dns_naptr_get_preference(record)); + res = AST_TEST_FAIL; + } + if (strcmp(ast_dns_naptr_get_flags(record), records[i].flags)) { + ast_test_status_update(test, "Expected flags %s, got flags %s from NAPTR record\n", + records[i].flags, ast_dns_naptr_get_flags(record)); + res = AST_TEST_FAIL; + } + if (strcmp(ast_dns_naptr_get_service(record), records[i].services)) { + ast_test_status_update(test, "Expected services %s, got services %s from NAPTR record\n", + records[i].services, ast_dns_naptr_get_service(record)); + res = AST_TEST_FAIL; + } + if (strcmp(ast_dns_naptr_get_regexp(record), records[i].regexp)) { + ast_test_status_update(test, "Expected regexp %s, got regexp %s from NAPTR record\n", + records[i].regexp, ast_dns_naptr_get_regexp(record)); + res = AST_TEST_FAIL; + } + if (strcmp(ast_dns_naptr_get_replacement(record), records[i].replacement)) { + ast_test_status_update(test, "Expected replacement %s, got replacement %s from NAPTR record\n", + records[i].replacement, ast_dns_naptr_get_replacement(record)); + res = AST_TEST_FAIL; + } + records[i].visited = 1; + ++i; + } + + if (i != ARRAY_LEN(records)) { + ast_test_status_update(test, "Unexpected number of records visited\n"); + res = AST_TEST_FAIL; + } + + for (i = 0; i < ARRAY_LEN(records); ++i) { + if (!records[i].visited) { + ast_test_status_update(test, "Did not visit all expected NAPTR records\n"); + res = AST_TEST_FAIL; + } + } + + return res; + +} + AST_TEST_DEFINE(resolve_srv) { RAII_VAR(struct unbound_resolver *, resolver, NULL, ao2_cleanup); @@ -1274,6 +1392,7 @@ static int unload_module(void) AST_TEST_UNREGISTER(resolve_sync_off_nominal); AST_TEST_UNREGISTER(resolve_sync_off_nominal); AST_TEST_UNREGISTER(resolve_cancel_off_nominal); + AST_TEST_UNREGISTER(resolve_naptr); AST_TEST_UNREGISTER(resolve_srv); return 0; } @@ -1331,6 +1450,7 @@ static int load_module(void) AST_TEST_REGISTER(resolve_sync_off_nominal); AST_TEST_REGISTER(resolve_async_off_nominal); AST_TEST_REGISTER(resolve_cancel_off_nominal); + AST_TEST_REGISTER(resolve_naptr); AST_TEST_REGISTER(resolve_srv); return AST_MODULE_LOAD_SUCCESS; |