[svn-commits] mmichelson: branch group/dns r433027 - /team/group/dns/res/
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Tue Mar 17 12:42:41 CDT 2015
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;
}
More information about the svn-commits
mailing list