Author: mmichelson Date: Tue Mar 17 12:42:39 2015 New Revision: 433027 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=433027 Log: Add off-nominal async libunbound test.
This adds an async test and moves common components of the off-nominal sync and async tests into a single function, much like the nominal tests. Modified: team/group/dns/res/res_resolver_unbound.c Modified: team/group/dns/res/res_resolver_unbound.c URL: http://svnview.digium.com/svn/asterisk/team/group/dns/res/res_resolver_unbound.c?view=diff&rev=433027&r1=433026&r2=433027 ============================================================================== --- team/group/dns/res/res_resolver_unbound.c (original) +++ team/group/dns/res/res_resolver_unbound.c Tue Mar 17 12:42:39 2015 @@ -858,7 +858,133 @@ return nominal_test(test, nominal_async_run); } -AST_TEST_DEFINE(resolve_sync_off_nominal) +typedef int (*off_nominal_resolve_fn)(struct ast_test *test, const char *domain, int rr_type, + int rr_class, int expected_rcode); + +static int off_nominal_sync_run(struct ast_test *test, const char *domain, int rr_type, + int rr_class, int expected_rcode) +{ + struct ast_dns_result *result; + int res = 0; + + if (ast_dns_resolve(domain, rr_type, rr_class, &result)) { + ast_test_status_update(test, "Failed to perform resolution :(\n"); + return -1; + } + + if (!result) { + ast_test_status_update(test, "Resolution returned no result\n"); + return -1; + } + + if (ast_dns_result_get_rcode(result) != expected_rcode) { + ast_test_status_update(test, "Unexpected rcode from DNS resolution\n"); + res = -1; + } + + if (ast_dns_result_get_records(result)) { + ast_test_status_update(test, "DNS resolution returned records unexpectedly\n"); + res = -1; + } + + ast_dns_result_free(result); + return res; +} + +struct off_nominal_async_data { + int expected_rcode; + /*! Whether an asynchronous query failed */ + int failed; + /*! Indicates the asynchronous query is complete */ + int complete; + ast_mutex_t lock; + ast_cond_t cond; +}; + +static void off_nominal_async_data_destructor(void *obj) +{ + struct off_nominal_async_data *adata = obj; + + ast_mutex_destroy(&adata->lock); + ast_cond_destroy(&adata->cond); +} + +static struct off_nominal_async_data *off_nominal_async_data_alloc(int expected_rcode) +{ + struct off_nominal_async_data *adata; + + adata = ao2_alloc(sizeof(*adata), off_nominal_async_data_destructor); + if (!adata) { + return NULL; + } + + ast_mutex_init(&adata->lock); + ast_cond_init(&adata->cond, NULL); + + adata->expected_rcode = expected_rcode; + + return adata; +} + +static void off_nominal_async_callback(const struct ast_dns_query *query) +{ + struct off_nominal_async_data *adata = ast_dns_query_get_data(query); + struct ast_dns_result *result = ast_dns_query_get_result(query); + + if (!result) { + adata->failed = -1; + goto end; + } + + if (ast_dns_result_get_rcode(result) != adata->expected_rcode) { + adata->failed = -1; + } + + if (ast_dns_result_get_records(result)) { + adata->failed = -1; + } + +end: + ast_mutex_lock(&adata->lock); + adata->complete = 1; + ast_cond_signal(&adata->cond); + ast_mutex_unlock(&adata->lock); +} + +static int off_nominal_async_run(struct ast_test *test, const char *domain, int rr_type, + int rr_class, int expected_rcode) +{ + RAII_VAR(struct ast_dns_query_active *, active, NULL, ao2_cleanup); + RAII_VAR(struct off_nominal_async_data *, adata, NULL, ao2_cleanup); + + adata = off_nominal_async_data_alloc(expected_rcode); + if (!adata) { + ast_test_status_update(test, "Unable to allocate data for async query\n"); + return -1; + } + + ast_test_status_update(test, "Performing DNS query '%s', type %d\n", domain, rr_type); + + active = ast_dns_resolve_async(domain, rr_type, rr_class, off_nominal_async_callback, adata); + if (!active) { + ast_test_status_update(test, "Failed to perform asynchronous resolution of domain %s\n", domain); + return -1; + } + + ast_mutex_lock(&adata->lock); + while (!adata->complete) { + ast_cond_wait(&adata->cond, &adata->lock); + } + ast_mutex_unlock(&adata->lock); + + if (adata->failed) { + ast_test_status_update(test, "Asynchronous resolution failure %s\n", domain); + } + return adata->failed; +} + +static enum ast_test_result_state off_nominal_test(struct ast_test *test, + off_nominal_resolve_fn runner) { RAII_VAR(struct unbound_resolver *, resolver, NULL, ao2_cleanup); RAII_VAR(struct unbound_config *, cfg, NULL, ao2_cleanup); @@ -890,6 +1016,29 @@ { DOMAIN1, ns_t_a, ns_c_chaos, ns_r_refused }, }; + inet_pton(AF_INET, ADDR1, addr1_buf); + + cfg = ao2_global_obj_ref(globals); + resolver = ao2_bump(cfg->global->state->resolver); + + ub_ctx_zone_add(resolver->context, DOMAIN1, "static"); + ub_ctx_zone_add(resolver->context, DOMAIN2, "static"); + + for (i = 0; i < ARRAY_LEN(records); ++i) { + ub_ctx_data_add(resolver->context, records[i].as_string); + } + + for (i = 0; i < ARRAY_LEN(runs); ++i) { + if (runner(test, runs[i].domain, runs[i].rr_type, runs[i].rr_class, runs[i].rcode)) { + res = AST_TEST_FAIL; + } + } + + return res; +} + +AST_TEST_DEFINE(resolve_sync_off_nominal) +{ switch (cmd) { case TEST_INIT: info->name = "resolve_sync_off_nominal"; @@ -904,47 +1053,27 @@ break; } - inet_pton(AF_INET, ADDR1, addr1_buf); - - cfg = ao2_global_obj_ref(globals); - resolver = ao2_bump(cfg->global->state->resolver); - - ub_ctx_zone_add(resolver->context, DOMAIN1, "static"); - ub_ctx_zone_add(resolver->context, DOMAIN2, "static"); - - for (i = 0; i < ARRAY_LEN(records); ++i) { - ub_ctx_data_add(resolver->context, records[i].as_string); - } - - for (i = 0; i < ARRAY_LEN(runs); ++i) { - struct ast_dns_result *result; - - if (ast_dns_resolve(runs[i].domain, runs[i].rr_type, runs[i].rr_class, &result)) { - ast_test_status_update(test, "Failed to perform resolution :(\n"); - res = AST_TEST_FAIL; - } - - if (!result) { - ast_test_status_update(test, "Resolution returned no result\n"); - res = AST_TEST_FAIL; - } - - if (ast_dns_result_get_rcode(result) != runs[i].rcode) { - ast_test_status_update(test, "Unexpected rcode from DNS resolution\n"); - res = AST_TEST_FAIL; - } - - if (ast_dns_result_get_records(result)) { - ast_test_status_update(test, "DNS resolution returned records unexpectedly\n"); - res = AST_TEST_FAIL; - } - - ast_dns_result_free(result); - } - - return res; -} - + return off_nominal_test(test, off_nominal_sync_run); +} + +AST_TEST_DEFINE(resolve_async_off_nominal) +{ + switch (cmd) { + case TEST_INIT: + info->name = "resolve_async_off_nominal"; + info->category = "/res/res_resolver_unbound/"; + info->summary = "Test off-nominal synchronous resolution using libunbound\n"; + info->description = "This test performs the following:\n" + "\t* Attempt a lookup of a non-existent domain\n" + "\t* Attempt a lookup of a AAAA record on a domain that contains only A records\n" + "\t* Attempt a lookup of an A record on Chaos-net\n"; + return AST_TEST_NOT_RUN; + case TEST_EXECUTE: + break; + } + + return off_nominal_test(test, off_nominal_async_run); +} #endif static int reload_module(void) @@ -964,6 +1093,7 @@ AST_TEST_UNREGISTER(resolve_sync); AST_TEST_UNREGISTER(resolve_async); AST_TEST_UNREGISTER(resolve_sync_off_nominal); + AST_TEST_UNREGISTER(resolve_sync_off_nominal); return 0; } @@ -1018,6 +1148,7 @@ AST_TEST_REGISTER(resolve_sync); AST_TEST_REGISTER(resolve_async); AST_TEST_REGISTER(resolve_sync_off_nominal); + AST_TEST_REGISTER(resolve_async_off_nominal); return AST_MODULE_LOAD_SUCCESS; } -- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- svn-commits mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/svn-commits