[tor-commits] [tor/master] Fix up vote tests in test_dir_handle_get.

asn at torproject.org asn at torproject.org
Fri Oct 30 12:15:39 UTC 2020


commit acf4225441fbb20eebedf32d15cb7ccd0488da9f
Author: Nick Mathewson <nickm at torproject.org>
Date:   Fri Oct 16 09:26:41 2020 -0400

    Fix up vote tests in test_dir_handle_get.
    
    These tests used a hardcoded vote with a hardcoded digest.  That
    vote didn't have any pr lines, and so it is now invalid. I've
    adjusted the testing code so that it mocks the signature-checking,
    so that we can more easily change the contents of the vote.
---
 src/feature/dirparse/sigcommon.c |  6 +++---
 src/feature/dirparse/sigcommon.h | 12 +++++------
 src/test/test_dir_handle_get.c   | 46 ++++++++++++++++++++++++++++++++++------
 src/test/vote_descriptors.inc    |  8 ++++++-
 4 files changed, 55 insertions(+), 17 deletions(-)

diff --git a/src/feature/dirparse/sigcommon.c b/src/feature/dirparse/sigcommon.c
index 8b970d7d1f..fb81b2da6e 100644
--- a/src/feature/dirparse/sigcommon.c
+++ b/src/feature/dirparse/sigcommon.c
@@ -139,13 +139,13 @@ signed_digest_equals, (const uint8_t *d1, const uint8_t *d2, size_t len))
  * the document when generating log messages.  Return 0 on success, negative
  * on failure.
  */
-int
-check_signature_token(const char *digest,
+MOCK_IMPL(int,
+check_signature_token,(const char *digest,
                       ssize_t digest_len,
                       directory_token_t *tok,
                       crypto_pk_t *pkey,
                       int flags,
-                      const char *doctype)
+                      const char *doctype))
 {
   char *signed_digest;
   size_t keysize;
diff --git a/src/feature/dirparse/sigcommon.h b/src/feature/dirparse/sigcommon.h
index c2ed9df494..c7f370f8e8 100644
--- a/src/feature/dirparse/sigcommon.h
+++ b/src/feature/dirparse/sigcommon.h
@@ -20,12 +20,12 @@ int router_get_hash_impl(const char *s, size_t s_len, char *digest,
 
 #define CST_NO_CHECK_OBJTYPE  (1<<0)
 struct directory_token_t;
-int check_signature_token(const char *digest,
-                          ssize_t digest_len,
-                          struct directory_token_t *tok,
-                          crypto_pk_t *pkey,
-                          int flags,
-                          const char *doctype);
+MOCK_DECL(int, check_signature_token,(const char *digest,
+                                     ssize_t digest_len,
+                                     struct directory_token_t *tok,
+                                     crypto_pk_t *pkey,
+                                     int flags,
+                                     const char *doctype));
 
 int router_get_hash_impl_helper(const char *s, size_t s_len,
                             const char *start_str,
diff --git a/src/test/test_dir_handle_get.c b/src/test/test_dir_handle_get.c
index f446bbb5eb..31b44f8de0 100644
--- a/src/test/test_dir_handle_get.c
+++ b/src/test/test_dir_handle_get.c
@@ -31,6 +31,7 @@
 #include "feature/nodelist/nodelist.h"
 #include "feature/client/entrynodes.h"
 #include "feature/dirparse/authcert_parse.h"
+#include "feature/dirparse/sigcommon.h"
 #include "feature/nodelist/networkstatus.h"
 #include "core/proto/proto_http.h"
 #include "lib/geoip/geoip.h"
@@ -73,6 +74,23 @@ ENABLE_GCC_WARNING("-Woverlength-strings")
 
 #define consdiffmgr_add_consensus consdiffmgr_add_consensus_nulterm
 
+static int
+mock_ignore_signature_token(const char *digest,
+                            ssize_t digest_len,
+                            struct directory_token_t *tok,
+                            crypto_pk_t *pkey,
+                            int flags,
+                            const char *doctype)
+{
+  (void)digest;
+  (void)digest_len;
+  (void)tok;
+  (void)pkey;
+  (void)flags;
+  (void)doctype;
+  return 0;
+}
+
 static dir_connection_t *
 new_dir_conn(void)
 {
@@ -1976,7 +1994,8 @@ test_dir_handle_get_status_vote_current_not_found(void* data)
     tor_free(header);
 }
 
-#define VOTE_DIGEST "312A4890D4D832597ABBD3089C782DBBFB81E48D"
+/* What vote do we ask for, to get the vote in vote_descriptors.inc ? */
+#define VOTE_DIGEST "78400095d8e834d87135cfc46235c909f0e99911"
 
 static void
 status_vote_current_d_test(char **header, char **body, size_t *body_l)
@@ -2058,6 +2077,7 @@ test_dir_handle_get_status_vote_d(void* data)
   const char digest[DIGEST_LEN] = "";
   (void) data;
 
+  MOCK(check_signature_token, mock_ignore_signature_token);
   clear_dir_servers();
   dirvote_free_all();
 
@@ -2094,7 +2114,7 @@ test_dir_handle_get_status_vote_d(void* data)
   tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header);
   tt_assert(strstr(header, "Content-Type: text/plain\r\n"));
   tt_assert(strstr(header, "Content-Encoding: identity\r\n"));
-  tt_assert(strstr(header, "Content-Length: 4135\r\n"));
+  tt_assert(strstr(header, "Content-Length: 4403\r\n"));
 
   tt_str_op(VOTE_BODY_V3, OP_EQ, body);
 
@@ -2107,11 +2127,12 @@ test_dir_handle_get_status_vote_d(void* data)
   tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header);
   tt_assert(strstr(header, "Content-Type: text/plain\r\n"));
   tt_assert(strstr(header, "Content-Encoding: identity\r\n"));
-  tt_assert(strstr(header, "Content-Length: 4135\r\n"));
+  tt_assert(strstr(header, "Content-Length: 4403\r\n"));
 
   tt_str_op(VOTE_BODY_V3, OP_EQ, body);
 
   done:
+    UNMOCK(check_signature_token);
     tor_free(header);
     tor_free(body);
     or_options_free(mock_options); mock_options = NULL;
@@ -2188,6 +2209,7 @@ test_dir_handle_get_status_vote_current_authority_not_found(void* data)
   (void) data;
 
   MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock);
+  MOCK(check_signature_token, mock_ignore_signature_token);
 
   conn = new_dir_conn();
   tt_int_op(0, OP_EQ, directory_handle_command_get(conn,
@@ -2199,6 +2221,7 @@ test_dir_handle_get_status_vote_current_authority_not_found(void* data)
   tt_str_op(NOT_FOUND, OP_EQ, header);
 
   done:
+    UNMOCK(check_signature_token);
     UNMOCK(connection_write_to_buf_impl_);
     connection_free_minimal(TO_CONN(conn));
     tor_free(header);
@@ -2212,6 +2235,7 @@ test_dir_handle_get_status_vote_next_authority_not_found(void* data)
   (void) data;
 
   MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock);
+  MOCK(check_signature_token, mock_ignore_signature_token);
 
   conn = new_dir_conn();
   tt_int_op(0, OP_EQ, directory_handle_command_get(conn,
@@ -2223,6 +2247,7 @@ test_dir_handle_get_status_vote_next_authority_not_found(void* data)
   tt_str_op(NOT_FOUND, OP_EQ, header);
 
   done:
+    UNMOCK(check_signature_token);
     UNMOCK(connection_write_to_buf_impl_);
     connection_free_minimal(TO_CONN(conn));
     tor_free(header);
@@ -2236,7 +2261,7 @@ test_dir_handle_get_status_vote_next_bandwidth_not_found(void* data)
   (void) data;
 
   MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock);
-
+  MOCK(check_signature_token, mock_ignore_signature_token);
   conn = new_dir_conn();
 
   tt_int_op(0, OP_EQ, directory_handle_command_get(conn,
@@ -2248,6 +2273,7 @@ test_dir_handle_get_status_vote_next_bandwidth_not_found(void* data)
   tt_str_op(NOT_FOUND, OP_EQ, header);
 
   done:
+    UNMOCK(check_signature_token);
     UNMOCK(connection_write_to_buf_impl_);
     connection_free_minimal(TO_CONN(conn));
     tor_free(header);
@@ -2428,6 +2454,7 @@ test_dir_handle_get_status_vote_next_authority(void* data)
   const char digest[DIGEST_LEN] = "";
   (void) data;
 
+  MOCK(check_signature_token, mock_ignore_signature_token);
   clear_dir_servers();
   routerlist_free_all();
   dirvote_free_all();
@@ -2477,11 +2504,12 @@ test_dir_handle_get_status_vote_next_authority(void* data)
   tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header);
   tt_assert(strstr(header, "Content-Type: text/plain\r\n"));
   tt_assert(strstr(header, "Content-Encoding: identity\r\n"));
-  tt_assert(strstr(header, "Content-Length: 4135\r\n"));
+  tt_assert(strstr(header, "Content-Length: 4403\r\n"));
 
   tt_str_op(VOTE_BODY_V3, OP_EQ, body);
 
   done:
+    UNMOCK(check_signature_token);
     UNMOCK(connection_write_to_buf_impl_);
     UNMOCK(get_my_v3_authority_cert);
     connection_free_minimal(TO_CONN(conn));
@@ -2587,6 +2615,7 @@ test_dir_handle_get_status_vote_current_authority(void* data)
   dir_server_t *ds = NULL;
   (void) data;
 
+  MOCK(check_signature_token, mock_ignore_signature_token);
   clear_dir_servers();
   routerlist_free_all();
   dirvote_free_all();
@@ -2640,11 +2669,12 @@ test_dir_handle_get_status_vote_current_authority(void* data)
   tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header);
   tt_assert(strstr(header, "Content-Type: text/plain\r\n"));
   tt_assert(strstr(header, "Content-Encoding: identity\r\n"));
-  tt_assert(strstr(header, "Content-Length: 4135\r\n"));
+  tt_assert(strstr(header, "Content-Length: 4403\r\n"));
 
   tt_str_op(VOTE_BODY_V3, OP_EQ, body);
 
   done:
+    UNMOCK(check_signature_token);
     UNMOCK(connection_write_to_buf_impl_);
     UNMOCK(get_my_v3_authority_cert);
     connection_free_minimal(TO_CONN(conn));
@@ -2672,6 +2702,7 @@ test_dir_handle_get_status_vote_too_late(void* data)
   dir_server_t *ds = NULL;
   const char* mode = (const char *)data;
 
+  MOCK(check_signature_token, mock_ignore_signature_token);
   clear_dir_servers();
   routerlist_free_all();
   dirvote_free_all();
@@ -2817,11 +2848,12 @@ test_dir_handle_get_status_vote_too_late(void* data)
   tt_ptr_op(strstr(header, "HTTP/1.0 200 OK\r\n"), OP_EQ, header);
   tt_assert(strstr(header, "Content-Type: text/plain\r\n"));
   tt_assert(strstr(header, "Content-Encoding: identity\r\n"));
-  tt_assert(strstr(header, "Content-Length: 4135\r\n"));
+  tt_assert(strstr(header, "Content-Length: 4403\r\n"));
 
   tt_str_op(VOTE_BODY_V3, OP_EQ, body);
 
   done:
+    UNMOCK(check_signature_token);
     UNMOCK(connection_write_to_buf_impl_);
     UNMOCK(get_my_v3_authority_cert);
     connection_free_minimal(TO_CONN(conn));
diff --git a/src/test/vote_descriptors.inc b/src/test/vote_descriptors.inc
index 895dc6c65c..51cf465170 100644
--- a/src/test/vote_descriptors.inc
+++ b/src/test/vote_descriptors.inc
@@ -1,3 +1,6 @@
+/* Not sure where we got this; it appears to be hand-generated and signed.
+ * It's been edited so that the signature doesn't verify any more;
+ * you need to mock check_signature_token for this to work. */
 static const char* VOTE_BODY_V3 =
 "network-status-version 3\n"
 "vote-status vote\n"
@@ -60,6 +63,7 @@ static const char* VOTE_BODY_V3 =
 "w Bandwidth=30 Measured=30\n"
 "p reject 1-65535\n"
 "id ed25519 none\n"
+"pr Cons=1-2 Desc=1-2 DirCache=1-2 FlowCtrl=1 HSDir=1-2 HSIntro=3-5\n"
 "m 9,10,11,12,13,14,15,16,17 sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa0\n"
 "r router1 BQUFBQUFBQUFBQUFBQUFBQUFBQU TU1NTU1NTU1NTU1NTU1NTU1NTU0 2015-09-02 19:17:35 153.0.153.1 443 0\n"
 "a [1:2:3::4]:4711\n"
@@ -68,6 +72,7 @@ static const char* VOTE_BODY_V3 =
 "w Bandwidth=120 Measured=120\n"
 "p reject 1-65535\n"
 "id ed25519 none\n"
+"pr Cons=1-2 Desc=1-2 DirCache=1-2 FlowCtrl=1 HSDir=1-2 HSIntro=3-5\n"
 "m 9,10,11,12,13,14,15,16,17 sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa1\n"
 "r router3 MzMzMzMzMzMzMzMzMzMzMzMzMzM T09PT09PT09PT09PT09PT09PT08 2015-09-02 19:17:35 170.0.153.1 400 9999\n"
 "s Authority Exit Fast Guard Running Stable V2Dir Valid\n"
@@ -75,6 +80,7 @@ static const char* VOTE_BODY_V3 =
 "w Bandwidth=120\n"
 "p reject 1-65535\n"
 "id ed25519 none\n"
+"pr Cons=1-2 Desc=1-2 DirCache=1-2 FlowCtrl=1 HSDir=1-2 HSIntro=3-5\n"
 "m 9,10,11,12,13,14,15,16,17 "
 "sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa2\n"
 "r router4 NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ Ly8vLy8vLy8vLy8vLy8vLy8vLy8 2015-09-02 19:17:35 192.0.2.3 500 1999\n"
@@ -83,6 +89,7 @@ static const char* VOTE_BODY_V3 =
 "w Bandwidth=30\n"
 "p reject 1-65535\n"
 "id ed25519 none\n"
+"pr Cons=1-2 Desc=1-2 DirCache=1-2 FlowCtrl=1 HSDir=1-2 HSIntro=3-5\n"
 "m 9,10,11,12,13,14,15,16,17 sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa3\n"
 "directory-footer\n"
 "directory-signature D867ACF56A9D229B35C25F0090BC9867E906BE69 CBF56A83368A5150F1A9AAADAFB4D77F8C4170E2\n"
@@ -91,4 +98,3 @@ static const char* VOTE_BODY_V3 =
 "TXQWGUq9Z7jdSVnzWT3xqPA4zjw6eZkj+DKUtwq+oEDZGlf8eHTFmr0NAWfwZbk9\n"
 "NAjbMTUXUP37N2XAZwkoCWwFCrrfMwXrL7OhZbj7ifo=\n"
 "-----END SIGNATURE-----\n";
-





More information about the tor-commits mailing list