[asterisk-commits] mmichelson: branch group/dns r433002 - /team/group/dns/res/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Mar 16 18:10:48 CDT 2015


Author: mmichelson
Date: Mon Mar 16 18:10:46 2015
New Revision: 433002

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=433002
Log:
Add off-nominal synchronous test.

This test performs synchronous resolutions that "succeed" but return
off-nominal rcodes and/or no records.


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=433002&r1=433001&r2=433002
==============================================================================
--- team/group/dns/res/res_resolver_unbound.c (original)
+++ team/group/dns/res/res_resolver_unbound.c Mon Mar 16 18:10:46 2015
@@ -533,7 +533,7 @@
 /*!
  * \brief Pluggable function for running a synchronous query and checking its results
  */
-static int sync_run(struct ast_test *test, const char *domain, int rr_type,
+static int nominal_sync_run(struct ast_test *test, const char *domain, int rr_type,
 		int rr_class, struct dns_record *records, size_t num_records)
 {
 	RAII_VAR(struct ast_dns_result *, result, NULL, ast_dns_result_free);
@@ -677,7 +677,7 @@
  * Unlike the synchronous version, this does not check the records, instead leaving
  * that to be done in the asynchronous callback.
  */
-static int async_run(struct ast_test *test, const char *domain, int rr_type,
+static int nominal_async_run(struct ast_test *test, const char *domain, int rr_type,
 		int rr_class, struct dns_record *records, size_t num_records)
 {
 	RAII_VAR(struct ast_dns_query_active *, active, NULL, ao2_cleanup);
@@ -807,11 +807,11 @@
 	ub_ctx_zone_remove(resolver->context, DOMAIN2);
 
 	return res;
-
 }
 
 AST_TEST_DEFINE(resolve_sync)
 {
+
 	switch (cmd) {
 	case TEST_INIT:
 		info->name = "resolve_sync";
@@ -831,7 +831,7 @@
 		break;
 	}
 
-	return nominal_test(test, sync_run);
+	return nominal_test(test, nominal_sync_run);
 }
 
 AST_TEST_DEFINE(resolve_async)
@@ -855,7 +855,94 @@
 		break;
 	}
 
-	return nominal_test(test, async_run);
+	return nominal_test(test, nominal_async_run);
+}
+
+AST_TEST_DEFINE(resolve_sync_off_nominal)
+{
+	RAII_VAR(struct unbound_resolver *, resolver, NULL, ao2_cleanup);
+	RAII_VAR(struct unbound_config *, cfg, NULL, ao2_cleanup);
+
+	static const size_t V4_SIZE = sizeof(struct in_addr);
+
+	static const char *DOMAIN1 = "goose.feathers";
+	static const char *DOMAIN2 = "duck.feathers";
+
+	static const char *ADDR1 = "127.0.0.2";
+
+	char addr1_buf[V4_SIZE];
+
+	struct dns_record records [] = {
+		{ "goose.feathers 12345 IN A 127.0.0.2", DOMAIN1, ns_t_a, ns_c_in, 12345, addr1_buf, V4_SIZE, 0, },
+	};
+
+	int i;
+	enum ast_test_result_state res = AST_TEST_PASS;
+
+	struct {
+		const char *domain;
+		int rr_type;
+		int rr_class;
+		int rcode;
+	} runs [] = {
+		{ DOMAIN2, ns_t_a,    ns_c_in, ns_r_nxdomain },
+		{ DOMAIN1, ns_t_aaaa, ns_c_in, ns_r_noerror },
+		{ DOMAIN1, ns_t_a,    ns_c_chaos, ns_r_refused },
+	};
+
+	switch (cmd) {
+	case TEST_INIT:
+		info->name = "resolve_sync_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;
+	}
+
+	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;
 }
 
 #endif
@@ -876,6 +963,7 @@
 	
 	AST_TEST_UNREGISTER(resolve_sync);
 	AST_TEST_UNREGISTER(resolve_async);
+	AST_TEST_UNREGISTER(resolve_sync_off_nominal);
 	return 0;
 }
 
@@ -929,6 +1017,7 @@
 
 	AST_TEST_REGISTER(resolve_sync);
 	AST_TEST_REGISTER(resolve_async);
+	AST_TEST_REGISTER(resolve_sync_off_nominal);
 
 	return AST_MODULE_LOAD_SUCCESS;
 }




More information about the asterisk-commits mailing list