From 2f5d0ea13341367e086d2c7a795894ba34029bcb Mon Sep 17 00:00:00 2001 From: rl1987 Date: Sun, 27 Sep 2015 19:51:04 +0300 Subject: [PATCH 01/13] Use NS_SUBMODULEs in test_dns.c --- src/test/test_dns.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/test/test_dns.c b/src/test/test_dns.c index ad81914ccb..6549339397 100644 --- a/src/test/test_dns.c +++ b/src/test/test_dns.c @@ -6,8 +6,12 @@ #include "dns.h" #include "connection.h" +#define NS_MODULE dns + +#define NS_SUBMODULE clip_ttl + static void -test_dns_clip_ttl(void *arg) +NS(test_main)(void *arg) { (void)arg; @@ -21,8 +25,12 @@ test_dns_clip_ttl(void *arg) return; } +#undef NS_SUBMODULE + +#define NS_SUBMODULE expiry_ttl + static void -test_dns_expiry_ttl(void *arg) +NS(test_main)(void *arg) { (void)arg; @@ -36,6 +44,10 @@ test_dns_expiry_ttl(void *arg) return; } +#undef NS_SUBMODULE + +#define NS_SUBMODULE resolve + static int resolve_retval = 0; static int resolve_made_conn_pending = 0; static char *resolved_name = NULL; @@ -130,7 +142,7 @@ connection_free_replacement(connection_t *conn) } static void -test_dns_resolve_outer(void *arg) +NS(test_main)(void *arg) { (void) arg; int retval; @@ -302,10 +314,14 @@ test_dns_resolve_outer(void *arg) return; } +#undef NS_SUBMODULE + struct testcase_t dns_tests[] = { - { "clip_ttl", test_dns_clip_ttl, 0, NULL, NULL }, - { "expiry_ttl", test_dns_expiry_ttl, 0, NULL, NULL }, - { "resolve_outer", test_dns_resolve_outer, TT_FORK, NULL, NULL }, + TEST_CASE(clip_ttl), + TEST_CASE(expiry_ttl), + TEST_CASE(resolve), END_OF_TESTCASES }; +#undef NS_MODULE + From 882d33a80c36cb4c2b137a0fedaf5758c1d1f748 Mon Sep 17 00:00:00 2001 From: rl1987 Date: Mon, 28 Sep 2015 21:44:05 +0300 Subject: [PATCH 02/13] Using namespace macros for mock functions in test_dns.c --- src/test/test_dns.c | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/src/test/test_dns.c b/src/test/test_dns.c index 6549339397..654f8132a8 100644 --- a/src/test/test_dns.c +++ b/src/test/test_dns.c @@ -55,6 +55,11 @@ static cached_resolve_t *cache_entry = NULL; static int n_fake_impl = 0; +NS_DECL(int, dns_resolve_impl, (edge_connection_t *exitconn, int is_resolve, + or_circuit_t *oncirc, char **hostname_out, + int *made_connection_pending_out, + cached_resolve_t **resolve_out)); + /** This will be our configurable substitute for dns_resolve_impl in * dns.c. It will return resolve_retval, * and set resolve_made_conn_pending to @@ -64,10 +69,10 @@ static int n_fake_impl = 0; * 1. */ static int -dns_resolve_fake_impl(edge_connection_t *exitconn, int is_resolve, - or_circuit_t *oncirc, char **hostname_out, - int *made_connection_pending_out, - cached_resolve_t **resolve_out) +NS(dns_resolve_impl)(edge_connection_t *exitconn, int is_resolve, + or_circuit_t *oncirc, char **hostname_out, + int *made_connection_pending_out, + cached_resolve_t **resolve_out) { (void)oncirc; (void)exitconn; @@ -94,8 +99,8 @@ static uint8_t last_answer_type = 0; static cached_resolve_t *last_resolved; static void -send_resolved_cell_replacement(edge_connection_t *conn, uint8_t answer_type, - const cached_resolve_t *resolved) +NS(send_resolved_cell)(edge_connection_t *conn, uint8_t answer_type, + const cached_resolve_t *resolved) { conn_for_resolved_cell = conn; @@ -110,8 +115,8 @@ static int n_send_resolved_hostname_cell_replacement = 0; static char *last_resolved_hostname = NULL; static void -send_resolved_hostname_cell_replacement(edge_connection_t *conn, - const char *hostname) +NS(send_resolved_hostname_cell)(edge_connection_t *conn, + const char *hostname) { conn_for_resolved_cell = conn; @@ -124,7 +129,7 @@ send_resolved_hostname_cell_replacement(edge_connection_t *conn, static int n_dns_cancel_pending_resolve_replacement = 0; static void -dns_cancel_pending_resolve_replacement(const char *address) +NS(dns_cancel_pending_resolve)(const char *address) { (void) address; n_dns_cancel_pending_resolve_replacement++; @@ -134,7 +139,7 @@ static int n_connection_free = 0; static connection_t *last_freed_conn = NULL; static void -connection_free_replacement(connection_t *conn) +NS(connection_free)(connection_t *conn) { n_connection_free++; @@ -161,9 +166,9 @@ NS(test_main)(void *arg) memset(exitconn,0,sizeof(edge_connection_t)); memset(nextconn,0,sizeof(edge_connection_t)); - MOCK(dns_resolve_impl,dns_resolve_fake_impl); - MOCK(send_resolved_cell,send_resolved_cell_replacement); - MOCK(send_resolved_hostname_cell,send_resolved_hostname_cell_replacement); + NS_MOCK(dns_resolve_impl); + NS_MOCK(send_resolved_cell); + NS_MOCK(send_resolved_hostname_cell); /* * CASE 1: dns_resolve_impl returns 1 and sets a hostname. purpose is @@ -276,8 +281,8 @@ NS(test_main)(void *arg) * on exitconn with type being RESOLVED_TYPE_ERROR. */ - MOCK(dns_cancel_pending_resolve,dns_cancel_pending_resolve_replacement); - MOCK(connection_free,connection_free_replacement); + NS_MOCK(dns_cancel_pending_resolve); + NS_MOCK(connection_free); exitconn->on_circuit = &(on_circuit->base_); exitconn->base_.purpose = EXIT_PURPOSE_RESOLVE; @@ -300,11 +305,11 @@ NS(test_main)(void *arg) tt_assert(last_freed_conn == TO_CONN(exitconn)); done: - UNMOCK(dns_resolve_impl); - UNMOCK(send_resolved_cell); - UNMOCK(send_resolved_hostname_cell); - UNMOCK(dns_cancel_pending_resolve); - UNMOCK(connection_free); + NS_UNMOCK(dns_resolve_impl); + NS_UNMOCK(send_resolved_cell); + NS_UNMOCK(send_resolved_hostname_cell); + NS_UNMOCK(dns_cancel_pending_resolve); + NS_UNMOCK(connection_free); tor_free(on_circuit); tor_free(exitconn); tor_free(nextconn); From 595bd9295c438ed0b889287845ef75da30abd2aa Mon Sep 17 00:00:00 2001 From: rl1987 Date: Wed, 7 Oct 2015 22:14:48 +0300 Subject: [PATCH 03/13] First test case for dns_resolve_impl(). --- src/test/test_dns.c | 134 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) diff --git a/src/test/test_dns.c b/src/test/test_dns.c index 654f8132a8..04c84af207 100644 --- a/src/test/test_dns.c +++ b/src/test/test_dns.c @@ -321,10 +321,144 @@ NS(test_main)(void *arg) #undef NS_SUBMODULE +#define NS_SUBMODULE ASPECT(resolve_impl, addr_is_ip_no_need_to_resolve) + +/* + * Given that exitconn->base_.address is IP address string, we + * want dns_resolve_impl() to parse it and store in + * exitconn->base_.addr. We expect dns_resolve_impl to return 1. + * Lastly, we want it to set the TTL value to default one for DNS queries. + */ + +static void +NS(test_main)(void *arg) +{ + int retval; + int made_pending; + const tor_addr_t *resolved_addr; + tor_addr_t addr_to_compare; + + tor_addr_parse(&addr_to_compare, "8.8.8.8"); + + or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + + edge_connection_t *exitconn = tor_malloc_zero(sizeof(edge_connection_t)); + TO_CONN(exitconn)->type = CONN_TYPE_EXIT; + TO_CONN(exitconn)->magic = EDGE_CONNECTION_MAGIC; + TO_CONN(exitconn)->purpose = EXIT_PURPOSE_RESOLVE; + TO_CONN(exitconn)->state = EXIT_CONN_STATE_RESOLVING; + exitconn->base_.s = TOR_INVALID_SOCKET; + + TO_CONN(exitconn)->address = tor_strdup("8.8.8.8"); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + NULL); + + resolved_addr = &(exitconn->base_.addr); + + tt_int_op(retval,==,1); + tt_assert(tor_addr_compare(resolved_addr, + (const tor_addr_t *)&addr_to_compare, CMP_EXACT) == 0); + tt_int_op(exitconn->address_ttl,==,DEFAULT_DNS_TTL); + + done: + tor_free(on_circ); + tor_free(TO_CONN(exitconn)->address); + tor_free(exitconn); + return; +} + +#undef NS_SUBMODULE + +#define NS_SUBMODULE ASPECT(resolve_impl, non_exit) + +static void +NS(test_main)(void *arg) +{ + tt_skip(); + + done: + return; +} + +#undef NS_SUBMODULE + +#define NS_SUBMODULE ASPECT(resolve_impl, addr_is_invalid_dest) + +static void +NS(test_main)(void *arg) +{ + tt_skip(); + + done: + return; +} + +#undef NS_SUBMODULE + +#define NS_SUBMODULE ASPECT(resolve_impl, malformed_ptr) + +static void +NS(test_main)(void *arg) +{ + tt_skip(); + + done: + return; +} + +#undef NS_SUBMODULE + +#define NS_SUBMODULE ASPECT(resolve_impl, cache_hit_pending) + +static void +NS(test_main)(void *arg) +{ + tt_skip(); + + done: + return; +} + +#undef NS_SUBMODULE + +#define NS_SUBMODULE ASPECT(resolve_impl, cache_hit_cached) + +static void +NS(test_main)(void *arg) +{ + tt_skip(); + + done: + return; +} + +#undef NS_SUBMODULE + +#define NS_SUBMODULE ASPECT(resolve_impl, cache_miss) + +static void +NS(test_main)(void *arg) +{ + tt_skip(); + + done: + return; +} + +#undef NS_SUBMODULE + struct testcase_t dns_tests[] = { TEST_CASE(clip_ttl), TEST_CASE(expiry_ttl), TEST_CASE(resolve), + TEST_CASE_ASPECT(resolve_impl, addr_is_ip_no_need_to_resolve), + TEST_CASE_ASPECT(resolve_impl, non_exit), + TEST_CASE_ASPECT(resolve_impl, addr_is_invalid_dest), + TEST_CASE_ASPECT(resolve_impl, malformed_ptr), + TEST_CASE_ASPECT(resolve_impl, cache_hit_pending), + TEST_CASE_ASPECT(resolve_impl, cache_hit_cached), + TEST_CASE_ASPECT(resolve_impl, cache_miss), END_OF_TESTCASES }; From 2fc841aacbfdb0e824ab3bed9e06db8d9c793747 Mon Sep 17 00:00:00 2001 From: rl1987 Date: Thu, 8 Oct 2015 21:27:17 +0300 Subject: [PATCH 04/13] Making it slightly cleaner. --- src/test/test_dns.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/test/test_dns.c b/src/test/test_dns.c index 04c84af207..f1b11a88e8 100644 --- a/src/test/test_dns.c +++ b/src/test/test_dns.c @@ -321,6 +321,22 @@ NS(test_main)(void *arg) #undef NS_SUBMODULE +/** Create an edge_connection_t instance that is considered a + * valid exit connection by asserts in dns_resolve_impl. + */ +static edge_connection_t * +create_valid_exitconn(void) +{ + edge_connection_t *exitconn = tor_malloc_zero(sizeof(edge_connection_t)); + TO_CONN(exitconn)->type = CONN_TYPE_EXIT; + TO_CONN(exitconn)->magic = EDGE_CONNECTION_MAGIC; + TO_CONN(exitconn)->purpose = EXIT_PURPOSE_RESOLVE; + TO_CONN(exitconn)->state = EXIT_CONN_STATE_RESOLVING; + exitconn->base_.s = TOR_INVALID_SOCKET; + + return exitconn; +} + #define NS_SUBMODULE ASPECT(resolve_impl, addr_is_ip_no_need_to_resolve) /* @@ -342,12 +358,7 @@ NS(test_main)(void *arg) or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); - edge_connection_t *exitconn = tor_malloc_zero(sizeof(edge_connection_t)); - TO_CONN(exitconn)->type = CONN_TYPE_EXIT; - TO_CONN(exitconn)->magic = EDGE_CONNECTION_MAGIC; - TO_CONN(exitconn)->purpose = EXIT_PURPOSE_RESOLVE; - TO_CONN(exitconn)->state = EXIT_CONN_STATE_RESOLVING; - exitconn->base_.s = TOR_INVALID_SOCKET; + edge_connection_t *exitconn = create_valid_exitconn(); TO_CONN(exitconn)->address = tor_strdup("8.8.8.8"); @@ -357,8 +368,7 @@ NS(test_main)(void *arg) resolved_addr = &(exitconn->base_.addr); tt_int_op(retval,==,1); - tt_assert(tor_addr_compare(resolved_addr, - (const tor_addr_t *)&addr_to_compare, CMP_EXACT) == 0); + tt_assert(tor_addr_eq(resolved_addr, (const tor_addr_t *)&addr_to_compare)); tt_int_op(exitconn->address_ttl,==,DEFAULT_DNS_TTL); done: From 1096f7638e883f9a6dfc86b9804090f090afb68f Mon Sep 17 00:00:00 2001 From: rl1987 Date: Thu, 8 Oct 2015 21:47:52 +0300 Subject: [PATCH 05/13] A second test case for dns_resolve_impl. --- src/or/router.c | 4 ++-- src/or/router.h | 2 +- src/test/test_dns.c | 29 ++++++++++++++++++++++++++++- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/or/router.c b/src/or/router.c index 9c6204c729..1790416cf6 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -1714,8 +1714,8 @@ router_compare_to_my_exit_policy(const tor_addr_t *addr, uint16_t port) /** Return true iff my exit policy is reject *:*. Return -1 if we don't * have a descriptor */ -int -router_my_exit_policy_is_reject_star(void) +MOCK_IMPL(int, +router_my_exit_policy_is_reject_star,(void)) { if (!router_get_my_routerinfo()) /* make sure desc_routerinfo exists */ return -1; diff --git a/src/or/router.h b/src/or/router.h index 2e8c02537b..85f43d804d 100644 --- a/src/or/router.h +++ b/src/or/router.h @@ -80,7 +80,7 @@ void check_descriptor_ipaddress_changed(time_t now); void router_new_address_suggestion(const char *suggestion, const dir_connection_t *d_conn); int router_compare_to_my_exit_policy(const tor_addr_t *addr, uint16_t port); -int router_my_exit_policy_is_reject_star(void); +MOCK_DECL(int, router_my_exit_policy_is_reject_star,(void)); MOCK_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); extrainfo_t *router_get_my_extrainfo(void); const char *router_get_my_descriptor(void); diff --git a/src/test/test_dns.c b/src/test/test_dns.c index f1b11a88e8..88a2f4a74b 100644 --- a/src/test/test_dns.c +++ b/src/test/test_dns.c @@ -5,6 +5,7 @@ #include "dns.h" #include "connection.h" +#include "router.h" #define NS_MODULE dns @@ -382,12 +383,38 @@ NS(test_main)(void *arg) #define NS_SUBMODULE ASPECT(resolve_impl, non_exit) +/** Given that Tor instance is not configured as an exit node, we want + * dns_resolve_impl() to fail with return value -1. + */ +static int +NS(router_my_exit_policy_is_reject_star)(void) +{ + return 1; +} + static void NS(test_main)(void *arg) { - tt_skip(); + int retval; + int made_pending; + + edge_connection_t *exitconn = create_valid_exitconn(); + or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + + TO_CONN(exitconn)->address = tor_strdup("torproject.org"); + + NS_MOCK(router_my_exit_policy_is_reject_star); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + NULL); + + tt_int_op(retval,==,-1); done: + tor_free(TO_CONN(exitconn)->address); + tor_free(exitconn); + tor_free(on_circ); + NS_UNMOCK(router_my_exit_policy_is_reject_star); return; } From 787a27be3e27d11d873352a8eb14e068ed3fdad5 Mon Sep 17 00:00:00 2001 From: rl1987 Date: Sat, 10 Oct 2015 17:49:24 +0300 Subject: [PATCH 06/13] Third test case for dns_resolve_impl. --- src/test/test_dns.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/test/test_dns.c b/src/test/test_dns.c index 88a2f4a74b..aeabdf633f 100644 --- a/src/test/test_dns.c +++ b/src/test/test_dns.c @@ -422,12 +422,40 @@ NS(test_main)(void *arg) #define NS_SUBMODULE ASPECT(resolve_impl, addr_is_invalid_dest) +/** Given that address is not a valid destination (as judged by + * address_is_invalid_destination() function), we want dns_resolve_impl() + * function to fail with return value -1. + */ + +static int +NS(router_my_exit_policy_is_reject_star)(void) +{ + return 0; +} + static void NS(test_main)(void *arg) { - tt_skip(); + int retval; + int made_pending; + + edge_connection_t *exitconn = create_valid_exitconn(); + or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + + NS_MOCK(router_my_exit_policy_is_reject_star); + + TO_CONN(exitconn)->address = tor_strdup("invalid#@!.org"); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + NULL); + + tt_int_op(retval,==,-1); done: + NS_UNMOCK(router_my_exit_policy_is_reject_star); + tor_free(TO_CONN(exitconn)->address); + tor_free(exitconn); + tor_free(on_circ); return; } From 72bd192d80f8fed04c35f1a34b0e762562a41c48 Mon Sep 17 00:00:00 2001 From: rl1987 Date: Sat, 10 Oct 2015 18:03:11 +0300 Subject: [PATCH 07/13] Add a fourth test case. --- src/test/test_dns.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/test/test_dns.c b/src/test/test_dns.c index aeabdf633f..510fec12a5 100644 --- a/src/test/test_dns.c +++ b/src/test/test_dns.c @@ -463,12 +463,49 @@ NS(test_main)(void *arg) #define NS_SUBMODULE ASPECT(resolve_impl, malformed_ptr) +/** Given that address is a malformed PTR name, we want dns_resolve_impl to + * fail. + */ + +static int +NS(router_my_exit_policy_is_reject_star)(void) +{ + return 0; +} + static void NS(test_main)(void *arg) { - tt_skip(); + int retval; + int made_pending; + + edge_connection_t *exitconn = create_valid_exitconn(); + or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + + TO_CONN(exitconn)->address = tor_strdup("127.0.0.1.in-addr.arpa"); + + NS_MOCK(router_my_exit_policy_is_reject_star); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + NULL); + + tt_int_op(retval,==,-1); + + tor_free(TO_CONN(exitconn)->address); + + TO_CONN(exitconn)->address = + tor_strdup("z01234567890123456789.in-addr.arpa"); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + NULL); + + tt_int_op(retval,==,-1); done: + NS_UNMOCK(router_my_exit_policy_is_reject_star); + tor_free(TO_CONN(exitconn)->address); + tor_free(exitconn); + tor_free(on_circ); return; } From bb8ec2e1c61e7083cda37845ad40bc0997a16901 Mon Sep 17 00:00:00 2001 From: rl1987 Date: Mon, 12 Oct 2015 21:13:01 +0300 Subject: [PATCH 08/13] Whitespace fixes. --- src/test/test_dns.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/test_dns.c b/src/test/test_dns.c index 510fec12a5..f316de2821 100644 --- a/src/test/test_dns.c +++ b/src/test/test_dns.c @@ -342,7 +342,7 @@ create_valid_exitconn(void) /* * Given that exitconn->base_.address is IP address string, we - * want dns_resolve_impl() to parse it and store in + * want dns_resolve_impl() to parse it and store in * exitconn->base_.addr. We expect dns_resolve_impl to return 1. * Lastly, we want it to set the TTL value to default one for DNS queries. */ @@ -361,7 +361,7 @@ NS(test_main)(void *arg) edge_connection_t *exitconn = create_valid_exitconn(); - TO_CONN(exitconn)->address = tor_strdup("8.8.8.8"); + TO_CONN(exitconn)->address = tor_strdup("8.8.8.8"); retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, NULL); @@ -371,7 +371,7 @@ NS(test_main)(void *arg) tt_int_op(retval,==,1); tt_assert(tor_addr_eq(resolved_addr, (const tor_addr_t *)&addr_to_compare)); tt_int_op(exitconn->address_ttl,==,DEFAULT_DNS_TTL); - + done: tor_free(on_circ); tor_free(TO_CONN(exitconn)->address); @@ -401,7 +401,7 @@ NS(test_main)(void *arg) edge_connection_t *exitconn = create_valid_exitconn(); or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); - TO_CONN(exitconn)->address = tor_strdup("torproject.org"); + TO_CONN(exitconn)->address = tor_strdup("torproject.org"); NS_MOCK(router_my_exit_policy_is_reject_star); From cc1bed9974f90e7021468f9f85b0a66b21ee9151 Mon Sep 17 00:00:00 2001 From: rl1987 Date: Sun, 18 Oct 2015 18:04:48 +0300 Subject: [PATCH 09/13] Add a fifth unit test. --- src/or/dns.c | 13 ++++++++++++ src/or/dns.h | 4 ++++ src/test/test_dns.c | 52 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/or/dns.c b/src/or/dns.c index d71246d61e..234dfbe687 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -2118,5 +2118,18 @@ assert_cache_ok_(void) } }); } + #endif +cached_resolve_t +*dns_get_cache_entry(cached_resolve_t *query) +{ + return HT_FIND(cache_map, &cache_root, query); +} + +void +dns_insert_cache_entry(cached_resolve_t *new_entry) +{ + HT_INSERT(cache_map, &cache_root, new_entry); +} + diff --git a/src/or/dns.h b/src/or/dns.h index 6af7796dbb..163d61b881 100644 --- a/src/or/dns.h +++ b/src/or/dns.h @@ -42,6 +42,10 @@ uint8_t answer_type,const cached_resolve_t *resolved)); MOCK_DECL(STATIC void,send_resolved_hostname_cell,(edge_connection_t *conn, const char *hostname)); + +cached_resolve_t *dns_get_cache_entry(cached_resolve_t *query); +void dns_insert_cache_entry(cached_resolve_t *new_entry); + #endif #endif diff --git a/src/test/test_dns.c b/src/test/test_dns.c index f316de2821..3fbb6f25d9 100644 --- a/src/test/test_dns.c +++ b/src/test/test_dns.c @@ -513,12 +513,62 @@ NS(test_main)(void *arg) #define NS_SUBMODULE ASPECT(resolve_impl, cache_hit_pending) +/* Given that there is already a pending resolve for the given address, + * we want dns_resolve_impl to append our exit connection to list + * of pending connections for the pending DNS request and return 0. + */ + +static int +NS(router_my_exit_policy_is_reject_star)(void) +{ + return 0; +} + static void NS(test_main)(void *arg) { - tt_skip(); + int retval; + int made_pending = 0; + + pending_connection_t *pending_conn = NULL; + + edge_connection_t *exitconn = create_valid_exitconn(); + or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + + cached_resolve_t *cache_entry = tor_malloc_zero(sizeof(cached_resolve_t)); + cache_entry->magic = CACHED_RESOLVE_MAGIC; + cache_entry->state = CACHE_STATE_PENDING; + cache_entry->minheap_idx = -1; + cache_entry->expire = time(NULL) + 60 * 60; + + TO_CONN(exitconn)->address = tor_strdup("torproject.org"); + + strlcpy(cache_entry->address, TO_CONN(exitconn)->address, + sizeof(cache_entry->address)); + + NS_MOCK(router_my_exit_policy_is_reject_star); + + dns_init(); + + dns_insert_cache_entry(cache_entry); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + NULL); + + tt_int_op(retval,==,0); + tt_int_op(made_pending,==,1); + + pending_conn = cache_entry->pending_connections; + + tt_assert(pending_conn != NULL); + tt_assert(pending_conn->conn == exitconn); done: + NS_UNMOCK(router_my_exit_policy_is_reject_star); + tor_free(on_circ); + tor_free(TO_CONN(exitconn)->address); + tor_free(cache_entry->pending_connections); + tor_free(cache_entry); return; } From f53dcf6a357e83a0b018d6f66bfb8a30734bd9a9 Mon Sep 17 00:00:00 2001 From: rl1987 Date: Tue, 20 Oct 2015 20:40:21 +0300 Subject: [PATCH 10/13] Sixth test case for dns_resolve_impl. --- src/or/dns.c | 11 +++----- src/or/dns.h | 5 ++++ src/test/test_dns.c | 66 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 74 insertions(+), 8 deletions(-) diff --git a/src/or/dns.c b/src/or/dns.c index 234dfbe687..297ac6f0d5 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -111,9 +111,6 @@ static int launch_resolve(cached_resolve_t *resolve); static void add_wildcarded_test_address(const char *address); static int configure_nameservers(int force); static int answer_is_wildcarded(const char *ip); -static int set_exitconn_info_from_resolve(edge_connection_t *exitconn, - const cached_resolve_t *resolve, - char **hostname_out); static int evdns_err_is_transient(int err); static void inform_pending_connections(cached_resolve_t *resolve); static void make_pending_resolve_cached(cached_resolve_t *cached); @@ -859,10 +856,10 @@ dns_resolve_impl,(edge_connection_t *exitconn, int is_resolve, * Return -2 on a transient error, -1 on a permenent error, and 1 on * a successful lookup. */ -static int -set_exitconn_info_from_resolve(edge_connection_t *exitconn, - const cached_resolve_t *resolve, - char **hostname_out) +MOCK_IMPL(STATIC int, +set_exitconn_info_from_resolve,(edge_connection_t *exitconn, + const cached_resolve_t *resolve, + char **hostname_out)) { int ipv4_ok, ipv6_ok, answer_with_ipv4, r; uint32_t begincell_flags; diff --git a/src/or/dns.h b/src/or/dns.h index 163d61b881..64e970a222 100644 --- a/src/or/dns.h +++ b/src/or/dns.h @@ -46,6 +46,11 @@ const char *hostname)); cached_resolve_t *dns_get_cache_entry(cached_resolve_t *query); void dns_insert_cache_entry(cached_resolve_t *new_entry); +MOCK_DECL(STATIC int, +set_exitconn_info_from_resolve,(edge_connection_t *exitconn, + const cached_resolve_t *resolve, + char **hostname_out)); + #endif #endif diff --git a/src/test/test_dns.c b/src/test/test_dns.c index 3fbb6f25d9..0ed3c9db44 100644 --- a/src/test/test_dns.c +++ b/src/test/test_dns.c @@ -576,12 +576,76 @@ NS(test_main)(void *arg) #define NS_SUBMODULE ASPECT(resolve_impl, cache_hit_cached) +/* Given that a finished DNS resolve is available in our cache, we want + * dns_resolve_impl() return it to called via resolve_out and pass the + * handling to set_exitconn_info_from_resolve function. + */ +static int +NS(router_my_exit_policy_is_reject_star)(void) +{ + return 0; +} + +static edge_connection_t *last_exitconn = NULL; +static cached_resolve_t *last_resolve = NULL; + +static int +NS(set_exitconn_info_from_resolve)(edge_connection_t *exitconn, + const cached_resolve_t *resolve, + char **hostname_out) +{ + last_exitconn = exitconn; + last_resolve = (cached_resolve_t *)resolve; + + return 0; +} + static void NS(test_main)(void *arg) { - tt_skip(); + int retval; + int made_pending = 0; + + edge_connection_t *exitconn = create_valid_exitconn(); + or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + + cached_resolve_t *resolve_out = NULL; + + cached_resolve_t *cache_entry = tor_malloc_zero(sizeof(cached_resolve_t)); + cache_entry->magic = CACHED_RESOLVE_MAGIC; + cache_entry->state = CACHE_STATE_CACHED; + cache_entry->minheap_idx = -1; + cache_entry->expire = time(NULL) + 60 * 60; + + TO_CONN(exitconn)->address = tor_strdup("torproject.org"); + + strlcpy(cache_entry->address, TO_CONN(exitconn)->address, + sizeof(cache_entry->address)); + + NS_MOCK(router_my_exit_policy_is_reject_star); + NS_MOCK(set_exitconn_info_from_resolve); + + dns_init(); + + dns_insert_cache_entry(cache_entry); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + &resolve_out); + + tt_int_op(retval,==,0); + tt_int_op(made_pending,==,0); + tt_assert(resolve_out == cache_entry); + + tt_assert(last_exitconn == exitconn); + tt_assert(last_resolve == cache_entry); done: + NS_UNMOCK(router_my_exit_policy_is_reject_star); + NS_UNMOCK(set_exitconn_info_from_resolve); + tor_free(on_circ); + tor_free(TO_CONN(exitconn)->address); + tor_free(cache_entry->pending_connections); + tor_free(cache_entry); return; } From a187c772af440cb5543eecc329ee573cebc60391 Mon Sep 17 00:00:00 2001 From: rl1987 Date: Wed, 21 Oct 2015 22:24:00 +0300 Subject: [PATCH 11/13] Seventh test case for dns_resolve_impl(). --- src/or/dns.c | 5 ++-- src/or/dns.h | 3 +++ src/test/test_dns.c | 66 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/src/or/dns.c b/src/or/dns.c index 297ac6f0d5..f98181756e 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -107,7 +107,6 @@ static void dns_found_answer(const char *address, uint8_t query_type, const tor_addr_t *addr, const char *hostname, uint32_t ttl); -static int launch_resolve(cached_resolve_t *resolve); static void add_wildcarded_test_address(const char *address); static int configure_nameservers(int force); static int answer_is_wildcarded(const char *ip); @@ -1661,8 +1660,8 @@ launch_one_resolve(const char *address, uint8_t query_type, /** For eventdns: start resolving as necessary to find the target for * exitconn. Returns -1 on error, -2 on transient error, * 0 on "resolve launched." */ -static int -launch_resolve(cached_resolve_t *resolve) +MOCK_IMPL(STATIC int, +launch_resolve,(cached_resolve_t *resolve)) { tor_addr_t a; int r; diff --git a/src/or/dns.h b/src/or/dns.h index 64e970a222..c2778b216c 100644 --- a/src/or/dns.h +++ b/src/or/dns.h @@ -51,6 +51,9 @@ set_exitconn_info_from_resolve,(edge_connection_t *exitconn, const cached_resolve_t *resolve, char **hostname_out)); +MOCK_DECL(STATIC int, +launch_resolve,(cached_resolve_t *resolve)); + #endif #endif diff --git a/src/test/test_dns.c b/src/test/test_dns.c index 0ed3c9db44..6ba9cf4e50 100644 --- a/src/test/test_dns.c +++ b/src/test/test_dns.c @@ -653,12 +653,76 @@ NS(test_main)(void *arg) #define NS_SUBMODULE ASPECT(resolve_impl, cache_miss) +/* Given that there are neither pending nor pre-cached resolve for a given + * address, we want dns_resolve_impl() to create a new cached_resolve_t + * object, mark it as pending, insert it into the cache, attach the exit + * connection to list of pending connections and call launch_resolve() + * with the cached_resolve_t object it created. + */ +static int +NS(router_my_exit_policy_is_reject_star)(void) +{ + return 0; +} + +static cached_resolve_t *last_launched_resolve = NULL; + +static int +NS(launch_resolve)(cached_resolve_t *resolve) +{ + last_launched_resolve = resolve; + + return 0; +} + static void NS(test_main)(void *arg) { - tt_skip(); + int retval; + int made_pending = 0; + + pending_connection_t *pending_conn = NULL; + + edge_connection_t *exitconn = create_valid_exitconn(); + or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + + cached_resolve_t *cache_entry = NULL; + cached_resolve_t query; + + TO_CONN(exitconn)->address = tor_strdup("torproject.org"); + + strlcpy(query.address, TO_CONN(exitconn)->address, sizeof(query.address)); + + NS_MOCK(router_my_exit_policy_is_reject_star); + NS_MOCK(launch_resolve); + + dns_init(); + + retval = dns_resolve_impl(exitconn, 1, on_circ, NULL, &made_pending, + NULL); + + tt_int_op(retval,==,0); + tt_int_op(made_pending,==,1); + + cache_entry = dns_get_cache_entry(&query); + + tt_assert(cache_entry); + + pending_conn = cache_entry->pending_connections; + + tt_assert(pending_conn != NULL); + tt_assert(pending_conn->conn == exitconn); + + tt_assert(last_launched_resolve == cache_entry); + tt_str_op(cache_entry->address,==,TO_CONN(exitconn)->address); done: + NS_UNMOCK(router_my_exit_policy_is_reject_star); + NS_UNMOCK(launch_resolve); + tor_free(on_circ); + tor_free(TO_CONN(exitconn)->address); + tor_free(cache_entry->pending_connections); + tor_free(cache_entry); return; } From 6d8952fae09bb2da7668d99903c711c8cb941b2d Mon Sep 17 00:00:00 2001 From: rl1987 Date: Thu, 22 Oct 2015 18:56:43 +0300 Subject: [PATCH 12/13] Adding changes file. --- changes/test16831 | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changes/test16831 diff --git a/changes/test16831 b/changes/test16831 new file mode 100644 index 0000000000..7db2d14df5 --- /dev/null +++ b/changes/test16831 @@ -0,0 +1,3 @@ + o Testing: + - Cover dns_resolve_impl() in dns.c with unit tests. Implements a + portion of ticket 16831. From 2e980e9a2ed1b6cc75c0b1d6107ad6b91cf97a2e Mon Sep 17 00:00:00 2001 From: rl1987 Date: Thu, 29 Oct 2015 13:12:29 +0100 Subject: [PATCH 13/13] Fix GCC warnings. --- src/test/test_dns.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/test/test_dns.c b/src/test/test_dns.c index 6ba9cf4e50..b40a4825a6 100644 --- a/src/test/test_dns.c +++ b/src/test/test_dns.c @@ -355,6 +355,8 @@ NS(test_main)(void *arg) const tor_addr_t *resolved_addr; tor_addr_t addr_to_compare; + (void)arg; + tor_addr_parse(&addr_to_compare, "8.8.8.8"); or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); @@ -401,6 +403,8 @@ NS(test_main)(void *arg) edge_connection_t *exitconn = create_valid_exitconn(); or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + (void)arg; + TO_CONN(exitconn)->address = tor_strdup("torproject.org"); NS_MOCK(router_my_exit_policy_is_reject_star); @@ -442,6 +446,8 @@ NS(test_main)(void *arg) edge_connection_t *exitconn = create_valid_exitconn(); or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + (void)arg; + NS_MOCK(router_my_exit_policy_is_reject_star); TO_CONN(exitconn)->address = tor_strdup("invalid#@!.org"); @@ -482,6 +488,8 @@ NS(test_main)(void *arg) edge_connection_t *exitconn = create_valid_exitconn(); or_circuit_t *on_circ = tor_malloc_zero(sizeof(or_circuit_t)); + (void)arg; + TO_CONN(exitconn)->address = tor_strdup("127.0.0.1.in-addr.arpa"); NS_MOCK(router_my_exit_policy_is_reject_star); @@ -541,6 +549,8 @@ NS(test_main)(void *arg) cache_entry->minheap_idx = -1; cache_entry->expire = time(NULL) + 60 * 60; + (void)arg; + TO_CONN(exitconn)->address = tor_strdup("torproject.org"); strlcpy(cache_entry->address, TO_CONN(exitconn)->address, @@ -597,6 +607,8 @@ NS(set_exitconn_info_from_resolve)(edge_connection_t *exitconn, last_exitconn = exitconn; last_resolve = (cached_resolve_t *)resolve; + (void)hostname_out; + return 0; } @@ -617,6 +629,8 @@ NS(test_main)(void *arg) cache_entry->minheap_idx = -1; cache_entry->expire = time(NULL) + 60 * 60; + (void)arg; + TO_CONN(exitconn)->address = tor_strdup("torproject.org"); strlcpy(cache_entry->address, TO_CONN(exitconn)->address, @@ -689,6 +703,8 @@ NS(test_main)(void *arg) cached_resolve_t *cache_entry = NULL; cached_resolve_t query; + (void)arg; + TO_CONN(exitconn)->address = tor_strdup("torproject.org"); strlcpy(query.address, TO_CONN(exitconn)->address, sizeof(query.address));