Browse Source

Unit tests for ext_or_id_map.

Nick Mathewson 10 years ago
parent
commit
c342ea9879

+ 2 - 1
src/or/connection.c

@@ -10,6 +10,7 @@
  * on connections.
  **/
 
+#define CONNECTION_PRIVATE
 #include "or.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
  * if <b>conn</b> is an OR or OP connection.
  */
-static void
+STATIC void
 connection_free_(connection_t *conn)
 {
   void *mem;

+ 4 - 0
src/or/connection.h

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

+ 10 - 0
src/or/connection_or.c

@@ -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);
 }
 
+/** 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 */
 void
 connection_or_clear_ext_or_id_map(void)

+ 1 - 0
src/or/ext_orport.h

@@ -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_remove_from_ext_or_id_map(or_connection_t *conn);
 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_process_inbuf(or_connection_t *or_conn);

+ 1 - 0
src/test/include.am

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

+ 2 - 0
src/test/test.c

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

+ 65 - 0
src/test/test_extorport.c

@@ -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
+};

+ 2 - 1
src/test/test_options.c

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