Unit tests for ext_or_id_map.

This commit is contained in:
Nick Mathewson 2013-07-18 15:51:29 -04:00
parent 7da59721a9
commit c342ea9879
8 changed files with 87 additions and 2 deletions

View File

@ -10,6 +10,7 @@
* on connections. * on connections.
**/ **/
#define CONNECTION_PRIVATE
#include "or.h" #include "or.h"
#include "buffers.h" #include "buffers.h"
/* /*
@ -458,7 +459,7 @@ connection_link_connections(connection_t *conn_a, connection_t *conn_b)
* necessary, close its socket if necessary, and mark the directory as dirty * necessary, close its socket if necessary, and mark the directory as dirty
* if <b>conn</b> is an OR or OP connection. * if <b>conn</b> is an OR or OP connection.
*/ */
static void STATIC void
connection_free_(connection_t *conn) connection_free_(connection_t *conn)
{ {
void *mem; void *mem;

View File

@ -214,5 +214,9 @@ void connection_enable_rate_limiting(connection_t *conn);
#define connection_type_uses_bufferevent(c) (0) #define connection_type_uses_bufferevent(c) (0)
#endif #endif
#ifdef CONNECTION_PRIVATE
STATIC void connection_free_(connection_t *conn);
#endif
#endif #endif

View File

@ -197,6 +197,16 @@ connection_or_remove_from_ext_or_id_map(or_connection_t *conn)
memset(conn->ext_or_conn_id, 0, EXT_OR_CONN_ID_LEN); memset(conn->ext_or_conn_id, 0, EXT_OR_CONN_ID_LEN);
} }
/** Return the connection whose ext_or_id is <b>id</b>. Return NULL if no such
* connection is found. */
or_connection_t *
connection_or_get_by_ext_or_id(const char *id)
{
if (!orconn_ext_or_id_map)
return NULL;
return digestmap_get(orconn_ext_or_id_map, id);
}
/** Deallocate the global Extended ORPort identifier list */ /** Deallocate the global Extended ORPort identifier list */
void void
connection_or_clear_ext_or_id_map(void) connection_or_clear_ext_or_id_map(void)

View File

@ -14,6 +14,7 @@ void ext_or_cmd_free(ext_or_cmd_t *cmd);
void connection_or_set_ext_or_identifier(or_connection_t *conn); void connection_or_set_ext_or_identifier(or_connection_t *conn);
void connection_or_remove_from_ext_or_id_map(or_connection_t *conn); void connection_or_remove_from_ext_or_id_map(or_connection_t *conn);
void connection_or_clear_ext_or_id_map(void); void connection_or_clear_ext_or_id_map(void);
or_connection_t *connection_or_get_by_ext_or_id(const char *id);
int connection_ext_or_finished_flushing(or_connection_t *conn); int connection_ext_or_finished_flushing(or_connection_t *conn);
int connection_ext_or_process_inbuf(or_connection_t *or_conn); int connection_ext_or_process_inbuf(or_connection_t *or_conn);

View File

@ -26,6 +26,7 @@ src_test_test_SOURCES = \
src/test/test_cell_queue.c \ src/test/test_cell_queue.c \
src/test/test_data.c \ src/test/test_data.c \
src/test/test_dir.c \ src/test/test_dir.c \
src/test/test_extorport.c \
src/test/test_introduce.c \ src/test/test_introduce.c \
src/test/test_microdesc.c \ src/test/test_microdesc.c \
src/test/test_options.c \ src/test/test_options.c \

View File

@ -1569,6 +1569,7 @@ extern struct testcase_t circuitlist_tests[];
extern struct testcase_t cell_queue_tests[]; extern struct testcase_t cell_queue_tests[];
extern struct testcase_t options_tests[]; extern struct testcase_t options_tests[];
extern struct testcase_t socks_tests[]; extern struct testcase_t socks_tests[];
extern struct testcase_t extorport_tests[];
static struct testgroup_t testgroups[] = { static struct testgroup_t testgroups[] = {
{ "", test_array }, { "", test_array },
@ -1588,6 +1589,7 @@ static struct testgroup_t testgroups[] = {
{ "introduce/", introduce_tests }, { "introduce/", introduce_tests },
{ "circuitlist/", circuitlist_tests }, { "circuitlist/", circuitlist_tests },
{ "options/", options_tests }, { "options/", options_tests },
{ "extorport/", extorport_tests },
END_OF_GROUPS END_OF_GROUPS
}; };

65
src/test/test_extorport.c Normal file
View File

@ -0,0 +1,65 @@
/* Copyright (c) 2013, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define CONNECTION_PRIVATE
#include "or.h"
#include "connection.h"
#include "ext_orport.h"
#include "test.h"
/* Test connection_or_remove_from_ext_or_id_map and
* connection_or_set_ext_or_identifier */
static void
test_ext_or_id_map(void *arg)
{
or_connection_t *c1 = NULL, *c2 = NULL, *c3 = NULL;
char *idp = NULL, *idp2 = NULL;
(void)arg;
/* pre-initialization */
tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx"));
c1 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
c2 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
c3 = or_connection_new(CONN_TYPE_OR, AF_INET);
tt_ptr_op(c1->ext_or_conn_id, !=, NULL);
tt_ptr_op(c2->ext_or_conn_id, !=, NULL);
tt_ptr_op(c3->ext_or_conn_id, ==, NULL);
tt_ptr_op(c1, ==, connection_or_get_by_ext_or_id(c1->ext_or_conn_id));
tt_ptr_op(c2, ==, connection_or_get_by_ext_or_id(c2->ext_or_conn_id));
tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx"));
idp = tor_memdup(c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN);
/* Give c2 a new ID. */
connection_or_set_ext_or_identifier(c2);
test_mem_op(idp, !=, c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN);
idp2 = tor_memdup(c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN);
tt_assert(!tor_digest_is_zero(idp2));
tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id(idp));
tt_ptr_op(c2, ==, connection_or_get_by_ext_or_id(idp2));
/* Now remove it. */
connection_or_remove_from_ext_or_id_map(c2);
tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id(idp));
tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id(idp2));
done:
if (c1)
connection_free_(TO_CONN(c1));
if (c2)
connection_free_(TO_CONN(c2));
if (c3)
connection_free_(TO_CONN(c3));
tor_free(idp);
tor_free(idp2);
connection_or_clear_ext_or_id_map();
}
struct testcase_t extorport_tests[] = {
{ "id_map", test_ext_or_id_map, TT_FORK, NULL, NULL },
END_OF_TESTCASES
};

View File

@ -148,6 +148,8 @@ test_options_validate(void *arg)
(void)arg; (void)arg;
setup_log_callback(); setup_log_callback();
WANT_ERR("ExtORPort 500000", "Invalid ExtORPort");
WANT_ERR_LOG("ServerTransportOptions trebuchet", WANT_ERR_LOG("ServerTransportOptions trebuchet",
"ServerTransportOptions did not parse", "ServerTransportOptions did not parse",
LOG_WARN, "Too few arguments"); LOG_WARN, "Too few arguments");
@ -157,7 +159,6 @@ test_options_validate(void *arg)
"ServerTransportOptions did not parse", "ServerTransportOptions did not parse",
LOG_WARN, "\"slingsnappy\" is not a k=v"); LOG_WARN, "\"slingsnappy\" is not a k=v");
// done:
clear_log_messages(); clear_log_messages();
return; return;
} }