[tor-commits] [tor/master] Add regression test for #22304

nickm at torproject.org nickm at torproject.org
Mon Apr 24 13:31:21 UTC 2017


commit 7bc636fdc937c5cd050cb243e5bebb8a52c1c144
Author: Taylor Yu <catalyst at torproject.org>
Date:   Fri Apr 21 20:17:27 2017 -0400

    Add regression test for #22304
---
 src/or/control.c    |  2 +-
 src/or/control.h    |  4 ++++
 src/or/routerlist.c |  4 ++--
 src/or/routerlist.h |  3 ++-
 src/test/test_dir.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 60 insertions(+), 4 deletions(-)

diff --git a/src/or/control.c b/src/or/control.c
index 8e86005..56f1329 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -1873,7 +1873,7 @@ getinfo_helper_listeners(control_connection_t *control_conn,
 
 /** Implementation helper for GETINFO: knows the answers for questions about
  * directory information. */
-static int
+STATIC int
 getinfo_helper_dir(control_connection_t *control_conn,
                    const char *question, char **answer,
                    const char **errmsg)
diff --git a/src/or/control.h b/src/or/control.h
index a786dfe..41a194b 100644
--- a/src/or/control.h
+++ b/src/or/control.h
@@ -290,6 +290,10 @@ STATIC int getinfo_helper_downloads(
     control_connection_t *control_conn,
     const char *question, char **answer,
     const char **errmsg);
+STATIC int getinfo_helper_dir(
+    control_connection_t *control_conn,
+    const char *question, char **answer,
+    const char **errmsg);
 
 #endif
 
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index 0b0bb4b..35fe501 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -3045,8 +3045,8 @@ router_get_by_extrainfo_digest,(const char *digest))
 /** Return the signed descriptor for the extrainfo_t in our routerlist whose
  * extra-info-digest is <b>digest</b>. Return NULL if no such extra-info
  * document is known. */
-signed_descriptor_t *
-extrainfo_get_by_descriptor_digest(const char *digest)
+MOCK_IMPL(signed_descriptor_t *,
+extrainfo_get_by_descriptor_digest,(const char *digest))
 {
   extrainfo_t *ei;
   tor_assert(digest);
diff --git a/src/or/routerlist.h b/src/or/routerlist.h
index 5376369..5c1f76c 100644
--- a/src/or/routerlist.h
+++ b/src/or/routerlist.h
@@ -92,7 +92,8 @@ routerinfo_t *router_get_mutable_by_digest(const char *digest);
 signed_descriptor_t *router_get_by_descriptor_digest(const char *digest);
 MOCK_DECL(signed_descriptor_t *,router_get_by_extrainfo_digest,
           (const char *digest));
-signed_descriptor_t *extrainfo_get_by_descriptor_digest(const char *digest);
+MOCK_DECL(signed_descriptor_t *,extrainfo_get_by_descriptor_digest,
+          (const char *digest));
 const char *signed_descriptor_get_body(const signed_descriptor_t *desc);
 const char *signed_descriptor_get_annotations(const signed_descriptor_t *desc);
 routerlist_t *router_get_routerlist(void);
diff --git a/src/test/test_dir.c b/src/test/test_dir.c
index e0c92a7..f6869cd 100644
--- a/src/test/test_dir.c
+++ b/src/test/test_dir.c
@@ -7,6 +7,7 @@
 #include <math.h>
 
 #define CONFIG_PRIVATE
+#define CONTROL_PRIVATE
 #define DIRSERV_PRIVATE
 #define DIRVOTE_PRIVATE
 #define ROUTER_PRIVATE
@@ -19,6 +20,7 @@
 #include "or.h"
 #include "confparse.h"
 #include "config.h"
+#include "control.h"
 #include "crypto_ed25519.h"
 #include "directory.h"
 #include "dirserv.h"
@@ -910,6 +912,23 @@ mock_get_by_ei_desc_digest(const char *d)
   }
 }
 
+static signed_descriptor_t *
+mock_ei_get_by_ei_digest(const char *d)
+{
+  char hex[HEX_DIGEST_LEN+1];
+  base16_encode(hex, sizeof(hex), d, DIGEST_LEN);
+  signed_descriptor_t *sd = &sd_ei_minimal;
+
+  if (!strcmp(hex, "11E0EDF526950739F7769810FCACAB8C882FAEEE")) {
+    sd->signed_descriptor_body = (char *)EX_EI_MINIMAL;
+    sd->signed_descriptor_len = sizeof(EX_EI_MINIMAL);
+    sd->annotations_len = 0;
+    sd->saved_location = SAVED_NOWHERE;
+    return sd;
+  }
+  return NULL;
+}
+
 static smartlist_t *mock_ei_insert_list = NULL;
 static was_router_added_t
 mock_ei_insert(routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible)
@@ -999,6 +1018,37 @@ test_dir_load_extrainfo(void *arg)
 }
 
 static void
+test_dir_getinfo_extra(void *arg)
+{
+  int r;
+  char *answer = NULL;
+  const char *errmsg = NULL;
+
+  (void)arg;
+  MOCK(extrainfo_get_by_descriptor_digest, mock_ei_get_by_ei_digest);
+  r = getinfo_helper_dir(NULL, "extra-info/digest/"
+                         "11E0EDF526950739F7769810FCACAB8C882FAEEE", &answer,
+                         &errmsg);
+  tt_int_op(0, OP_EQ, r);
+  tt_ptr_op(NULL, OP_EQ, errmsg);
+  tt_str_op(answer, OP_EQ, EX_EI_MINIMAL);
+  tor_free(answer);
+
+  answer = NULL;
+  r = getinfo_helper_dir(NULL, "extra-info/digest/"
+                         "NOTAVALIDHEXSTRINGNOTAVALIDHEXSTRINGNOTA", &answer,
+                         &errmsg);
+  tt_int_op(0, OP_EQ, r);
+  /* getinfo_helper_dir() should maybe return an error here but doesn't */
+  tt_ptr_op(NULL, OP_EQ, errmsg);
+  /* In any case, there should be no answer for an invalid hex string. */
+  tt_ptr_op(NULL, OP_EQ, answer);
+
+ done:
+  UNMOCK(extrainfo_get_by_descriptor_digest);
+}
+
+static void
 test_dir_versions(void *arg)
 {
   tor_version_t ver1;
@@ -5970,6 +6020,7 @@ struct testcase_t dir_tests[] = {
   DIR(parse_router_list, TT_FORK),
   DIR(load_routers, TT_FORK),
   DIR(load_extrainfo, TT_FORK),
+  DIR(getinfo_extra, 0),
   DIR_LEGACY(versions),
   DIR_LEGACY(fp_pairs),
   DIR(split_fps, 0),





More information about the tor-commits mailing list