[tor-commits] [tor/master] Move bandwidth file tests to same function

nickm at torproject.org nickm at torproject.org
Mon Jul 30 12:45:08 UTC 2018


commit e87793bae52baf7673b3083e85b7121ffcfea290
Author: juga0 <juga at riseup.net>
Date:   Sat Jun 30 06:29:11 2018 +0000

    Move bandwidth file tests to same function
    
    also add tests for bw_file_headers.
    Headers are all that is found before a correct relay line or
    the terminator.
    Tests include:
    * a empty bandwidth file
    * a bandwidth file with only timestamp
    * a bandwidth file with v1.0.0 headers
    * a bandwidth file with v1.0.0 headers and relay lines
    * a bandwidth file with v1.1.0 headers and v1.0.0 relay lines
    * a bandwidth file with v1.0.0 headers, malformed relay lines and
      relay lines
    * a bandwidth file with v1.0.0 headers, malformed relay lines,
      relay lines and malformed relay lines
    * a bandwidth file with v1.1.0 headers without terminator
    * a bandwidth file with v1.1.0 headers with terminator
    * a bandwidth file with v1.1.0 headers without terminator and
      relay lines
    * a bandwidth file with v1.1.0 headers with terminator and relay
      lines
    * a bandwidth file with v1.1.0 headers without terminator, bad
      relay lines and relay lines
    * a bandwidth file with v1.1.0 headers with terminator, bad relay
      lines and relay lines
---
 src/test/test_dir.c | 340 +++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 230 insertions(+), 110 deletions(-)

diff --git a/src/test/test_dir.c b/src/test/test_dir.c
index e44f16154..c4af7b255 100644
--- a/src/test/test_dir.c
+++ b/src/test/test_dir.c
@@ -1591,62 +1591,6 @@ test_dir_measured_bw_kb(void *arg)
   return;
 }
 
-/* Test dirserv_read_measured_bandwidths */
-static void
-test_dir_dirserv_read_measured_bandwidths_empty(void *arg)
-{
-  (void)arg;
-  char *content = NULL;
-  time_t timestamp = time(NULL);
-  char *fname = tor_strdup(get_fname("V3BandwidthsFile"));
-  smartlist_t *bwlist_headers = smartlist_new();
-  char *bwlist_headers_str = NULL;
-  char *out_bwlist_headers_str = NULL;
-
-  /* Test an empty file */
-  write_str_to_file(fname, "", 0);
-  setup_capture_of_logs(LOG_WARN);
-  tt_int_op(-1, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL, NULL));
-  expect_log_msg("Empty bandwidth file\n");
-
-  /* Test v1.1.0 headers */
-  const char *v110_header_lines=
-    "version=1.1.0\n"
-    "software=sbws\n"
-    "software_version=0.1.0\n"
-    "generator_started=2018-05-08T16:13:25\n"
-    "earliest_bandwidth=2018-05-08T16:13:26\n"
-    "====\n";
-
-  /* And test bwlist_headers generation for dirvote.c */
-  tor_asprintf(&content, "%ld\n%s", timestamp, v110_header_lines);
-  write_str_to_file(fname, content, 0);
-  tor_free(content);
-  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL,
-                                                       bwlist_headers));
-
-  /* The bwlist_headers str that should get generated by the previous
-   * v110v110_header_lines */
-  const char *headers_str = "version=1.1.0 software=sbws "
-                            "software_version=0.1.0 "
-                            "generator_started=2018-05-08T16:13:25 "
-                            "earliest_bandwidth=2018-05-08T16:13:26";
-  tor_asprintf(&bwlist_headers_str, "timestamp=%ld %s", timestamp,
-               headers_str);
-  /* Compare the strings */
-  out_bwlist_headers_str = smartlist_join_strings(bwlist_headers, " ",
-                                                        0, NULL);
-  tt_str_op(bwlist_headers_str, OP_EQ, out_bwlist_headers_str);
-
- done:
-  tor_free(fname);
-  tor_free(bwlist_headers_str);
-  tor_free(out_bwlist_headers_str);
-  SMARTLIST_FOREACH(bwlist_headers, char *, cp, tor_free(cp));
-  smartlist_free(bwlist_headers);
-  teardown_capture_of_logs();
-}
-
 /* Unit tests for measured_bw_line_parse using line_is_after_headers flag.
  * When the end of the header is detected (a first complete bw line is parsed),
  * incomplete lines fail and give warnings, but do not give warnings if
@@ -1690,7 +1634,7 @@ test_dir_measured_bw_kb_line_is_after_headers(void *arg)
   teardown_capture_of_logs();
 }
 
-/* Test dirserv_read_measured_bandwidths with whole files. */
+/* Test dirserv_read_measured_bandwidths with headers and complete files. */
 static void
 test_dir_dirserv_read_measured_bandwidths(void *arg)
 {
@@ -1698,76 +1642,253 @@ test_dir_dirserv_read_measured_bandwidths(void *arg)
   char *content = NULL;
   time_t timestamp = time(NULL);
   char *fname = tor_strdup(get_fname("V3BandwidthsFile"));
-
-  /* Test Torflow file only with timestamp*/
-  tor_asprintf(&content, "%ld", (long)timestamp);
-  write_str_to_file(fname, content, 0);
-  tor_free(content);
-  tt_int_op(-1, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL));
-
-  /* Test Torflow file with timestamp followed by '\n' */
-  tor_asprintf(&content, "%ld\n", (long)timestamp);
-  write_str_to_file(fname, content, 0);
-  tor_free(content);
-  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL));
-
-  /* Test Torflow complete file*/
-  const char *torflow_relay_lines=
+  smartlist_t *bw_file_headers = smartlist_new();
+  /* bw file strings in vote */
+  char *bw_file_headers_str = NULL;
+  char *bw_file_headers_str_v100 = NULL;
+  char *bw_file_headers_str_v110 = NULL;
+  char *bw_file_headers_str_bad = NULL;
+  char *bw_file_headers_str_extra = NULL;
+  char bw_file_headers_str_long[MAX_BW_FILE_HEADERS_LEN * 8 + 1] = "";
+  /* string header lines in bw file */
+  char *header_lines_v100 = NULL;
+  char *header_lines_v110_no_terminator = NULL;
+  char *header_lines_v110 = NULL;
+  char header_lines_long[MAX_BW_FILE_HEADERS_LEN * 8 + 1] = "";
+  int i;
+  const char *header_lines_v110_no_terminator_no_timestamp =
+    "version=1.1.0\n"
+    "software=sbws\n"
+    "software_version=0.1.0\n"
+    "earliest_bandwidth=2018-05-08T16:13:26\n"
+    "file_created=2018-04-16T21:49:18\n"
+    "generator_started=2018-05-08T16:13:25\n"
+    "latest_bandwidth=2018-04-16T20:49:18\n";
+  const char *bw_file_headers_str_v110_no_timestamp =
+    "version=1.1.0 software=sbws "
+    "software_version=0.1.0 "
+    "earliest_bandwidth=2018-05-08T16:13:26 "
+    "file_created=2018-04-16T21:49:18 "
+    "generator_started=2018-05-08T16:13:25 "
+    "latest_bandwidth=2018-04-16T20:49:18";
+  const char *relay_lines_v100 =
     "node_id=$557365204145532d32353620696e73746561642e bw=1024 "
     "nick=Test measured_at=1523911725 updated_at=1523911725 "
     "pid_error=4.11374090719 pid_error_sum=4.11374090719 "
     "pid_bw=57136645 pid_delta=2.12168374577 circ_fail=0.2 "
     "scanner=/filepath\n";
-
-  tor_asprintf(&content, "%ld\n%s", (long)timestamp, torflow_relay_lines);
+  const char *relay_lines_v110 =
+    "node_id=$68A483E05A2ABDCA6DA5A3EF8DB5177638A27F80 "
+    "master_key_ed25519=YaqV4vbvPYKucElk297eVdNArDz9HtIwUoIeo0+cVIpQ "
+    "bw=760 nick=Test rtt=380 time=2018-05-08T16:13:26\n";
+  const char *relay_lines_bad =
+    "node_id=$68A483E05A2ABDCA6DA5A3EF8DB5177638A27F80 \n";
+
+  tor_asprintf(&header_lines_v100, "%ld\n", (long)timestamp);
+  tor_asprintf(&header_lines_v110_no_terminator, "%ld\n%s", (long)timestamp,
+               header_lines_v110_no_terminator_no_timestamp);
+  tor_asprintf(&header_lines_v110, "%s%s",
+               header_lines_v110_no_terminator, BW_FILE_HEADERS_TERMINATOR);
+
+  tor_asprintf(&bw_file_headers_str_v100, "timestamp=%ld",(long)timestamp);
+  tor_asprintf(&bw_file_headers_str_v110, "timestamp=%ld %s",
+               (long)timestamp, bw_file_headers_str_v110_no_timestamp);
+  tor_asprintf(&bw_file_headers_str_bad, "%s "
+               "node_id=$68A483E05A2ABDCA6DA5A3EF8DB5177638A27F80 ",
+               bw_file_headers_str_v110);
+
+  for (i=0; i<MAX_BW_FILE_HEADERS_LEN; i++) {
+    strlcat(header_lines_long, "foo=bar\n",
+            sizeof(header_lines_long));
+  }
+  /* 8 is the number of v110 lines in header_lines_v110 */
+  for (i=0; i<MAX_BW_FILE_HEADERS_LEN - 8 - 1; i++) {
+    strlcat(bw_file_headers_str_long, "foo=bar ",
+            sizeof(bw_file_headers_str_long));
+  }
+  strlcat(bw_file_headers_str_long, "foo=bar",
+          sizeof(bw_file_headers_str_long));
+  tor_asprintf(&bw_file_headers_str_extra,
+               "%s %s",
+               bw_file_headers_str_v110,
+               bw_file_headers_str_long);
+
+  /* Test an empty bandwidth file. bw_file_headers will be empty string */
+  write_str_to_file(fname, "", 0);
+  setup_capture_of_logs(LOG_WARN);
+  tt_int_op(-1, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL,
+                                                        bw_file_headers));
+  expect_log_msg("Empty bandwidth file\n");
+  teardown_capture_of_logs();
+  bw_file_headers_str = smartlist_join_strings(bw_file_headers, " ", 0, NULL);
+  tt_str_op("", OP_EQ, bw_file_headers_str);
+  SMARTLIST_FOREACH(bw_file_headers, char *, c, tor_free(c));
+  smartlist_free(bw_file_headers);
+  tor_free(bw_file_headers_str);
+
+  /* Test bandwidth file with only timestamp.
+   * bw_file_headers will be empty string */
+  bw_file_headers = smartlist_new();
+  tor_asprintf(&content, "%ld", (long)timestamp);
   write_str_to_file(fname, content, 0);
   tor_free(content);
-  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL));
-
-  /* Test Torflow complete file including v1.1.0 headers */
-  const char *v110_header_lines=
-    "version=1.1.0\n"
-    "software=sbws\n"
-    "software_version=0.1.0\n"
-    "generator_started=2018-05-08T16:13:25\n"
-    "earliest_bandwidth=2018-05-08T16:13:26\n"
-    "====\n";
-
-  tor_asprintf(&content, "%ld\n%s%s", (long)timestamp, v110_header_lines,
-               torflow_relay_lines);
+  tt_int_op(-1, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL,
+                                                        bw_file_headers));
+  bw_file_headers_str = smartlist_join_strings(bw_file_headers, " ", 0, NULL);
+  tt_str_op("", OP_EQ, bw_file_headers_str);
+  SMARTLIST_FOREACH(bw_file_headers, char *, c, tor_free(c));
+  smartlist_free(bw_file_headers);
+  tor_free(bw_file_headers_str);
+
+  /* Test v1.0.0 bandwidth file headers */
+  write_str_to_file(fname, header_lines_v100, 0);
+  bw_file_headers = smartlist_new();
+  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL,
+                                                       bw_file_headers));
+  bw_file_headers_str = smartlist_join_strings(bw_file_headers, " ", 0, NULL);
+  tt_str_op(bw_file_headers_str_v100, OP_EQ, bw_file_headers_str);
+  SMARTLIST_FOREACH(bw_file_headers, char *, c, tor_free(c));
+  smartlist_free(bw_file_headers);
+  tor_free(bw_file_headers_str);
+
+  /* Test v1.0.0 complete bandwidth file */
+  bw_file_headers = smartlist_new();
+  tor_asprintf(&content, "%s%s", header_lines_v100, relay_lines_v100);
   write_str_to_file(fname, content, 0);
   tor_free(content);
-  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL));
-
-  /* Test Torflow with additional headers afer a correct bw line */
-  tor_asprintf(&content, "%ld\n%s%s", (long)timestamp, torflow_relay_lines,
-               v110_header_lines);
+  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL,
+                                                       bw_file_headers));
+  bw_file_headers_str = smartlist_join_strings(bw_file_headers, " ", 0, NULL);
+  tt_str_op(bw_file_headers_str_v100, OP_EQ, bw_file_headers_str);
+  SMARTLIST_FOREACH(bw_file_headers, char *, c, tor_free(c));
+  smartlist_free(bw_file_headers);
+  tor_free(bw_file_headers_str);
+
+  /* Test bandwidth file including v1.1.0 bandwidth headers and
+   * v1.0.0 relay lines. bw_file_headers will contain the v1.1.0 headers. */
+  bw_file_headers = smartlist_new();
+  tor_asprintf(&content, "%s%s%s", header_lines_v100, header_lines_v110,
+               relay_lines_v100);
   write_str_to_file(fname, content, 0);
   tor_free(content);
-  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL));
-
-  /* Test Torflow with additional headers afer a correct bw line and more
-   * bw lines after the headers. */
-  tor_asprintf(&content, "%ld\n%s%s%s", (long)timestamp, torflow_relay_lines,
-               v110_header_lines, torflow_relay_lines);
+  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL,
+                                                       bw_file_headers));
+  bw_file_headers_str = smartlist_join_strings(bw_file_headers, " ", 0, NULL);
+  tt_str_op(bw_file_headers_str_v110, OP_EQ, bw_file_headers_str);
+  SMARTLIST_FOREACH(bw_file_headers, char *, c, tor_free(c));
+  smartlist_free(bw_file_headers);
+  tor_free(bw_file_headers_str);
+
+  /* Test v1.0.0 complete bandwidth file with v1.1.0 headers at the end.
+   * bw_file_headers will contain only v1.0.0 headers and the additional
+   * headers will be interpreted as malformed relay lines. */
+  bw_file_headers = smartlist_new();
+  tor_asprintf(&content, "%s%s%s", header_lines_v100, relay_lines_v100,
+               header_lines_v110);
   write_str_to_file(fname, content, 0);
   tor_free(content);
-  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL));
-
-  /* Test sbws file */
-  const char *sbws_relay_lines=
-    "node_id=$68A483E05A2ABDCA6DA5A3EF8DB5177638A27F80 "
-    "master_key_ed25519=YaqV4vbvPYKucElk297eVdNArDz9HtIwUoIeo0+cVIpQ "
-    "bw=760 nick=Test rtt=380 time=2018-05-08T16:13:26\n";
-
-  tor_asprintf(&content, "%ld\n%s%s", (long)timestamp, v110_header_lines,
-               sbws_relay_lines);
+  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL,
+                                                       bw_file_headers));
+  bw_file_headers_str = smartlist_join_strings(bw_file_headers, " ", 0, NULL);
+  tt_str_op(bw_file_headers_str_v100, OP_EQ, bw_file_headers_str);
+  SMARTLIST_FOREACH(bw_file_headers, char *, c, tor_free(c));
+  smartlist_free(bw_file_headers);
+  tor_free(bw_file_headers_str);
+
+  /* Test v1.0.0 complete bandwidth file, the v1.1.0 headers and more relay
+   * lines. bw_file_headers will contain only v1.0.0 headers, the additional
+   * headers will be interpreted as malformed relay lines and the last relay
+   * lines will be correctly interpreted as relay lines. */
+  bw_file_headers = smartlist_new();
+  tor_asprintf(&content, "%s%s%s%s", header_lines_v100, relay_lines_v100,
+               header_lines_v110, relay_lines_v100);
+  write_str_to_file(fname, content, 0);
+  tor_free(content);
+  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL,
+                                                       bw_file_headers));
+  bw_file_headers_str = smartlist_join_strings(bw_file_headers, " ", 0, NULL);
+  tt_str_op(bw_file_headers_str_v100, OP_EQ, bw_file_headers_str);
+  SMARTLIST_FOREACH(bw_file_headers, char *, c, tor_free(c));
+  smartlist_free(bw_file_headers);
+  tor_free(bw_file_headers_str);
+
+  /* Test v1.1.0 bandwidth headers without terminator */
+  bw_file_headers = smartlist_new();
+  write_str_to_file(fname, header_lines_v110_no_terminator, 0);
+  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL,
+                                                       bw_file_headers));
+  bw_file_headers_str = smartlist_join_strings(bw_file_headers, " ", 0, NULL);
+  tt_str_op(bw_file_headers_str_v110, OP_EQ, bw_file_headers_str);
+  SMARTLIST_FOREACH(bw_file_headers, char *, c, tor_free(c));
+  smartlist_free(bw_file_headers);
+  tor_free(bw_file_headers_str);
+
+  /* Test v1.1.0 bandwidth headers with terminator */
+  bw_file_headers = smartlist_new();
+  write_str_to_file(fname, header_lines_v110, 0);
+  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL,
+                                                       bw_file_headers));
+  bw_file_headers_str = smartlist_join_strings(bw_file_headers, " ", 0, NULL);
+  tt_str_op(bw_file_headers_str_v110, OP_EQ, bw_file_headers_str);
+  SMARTLIST_FOREACH(bw_file_headers, char *, c, tor_free(c));
+  smartlist_free(bw_file_headers);
+  tor_free(bw_file_headers_str);
+
+  /* Test v1.1.0 bandwidth file without terminator, then relay lines.
+   * bw_file_headers will contain the v1.1.0 headers. */
+  bw_file_headers = smartlist_new();
+  tor_asprintf(&content, "%s%s",
+               header_lines_v110_no_terminator, relay_lines_v110);
+  write_str_to_file(fname, content, 0);
+  tor_free(content);
+  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL,
+                                                       bw_file_headers));
+  bw_file_headers_str = smartlist_join_strings(bw_file_headers, " ", 0, NULL);
+  tt_str_op(bw_file_headers_str_v110, OP_EQ, bw_file_headers_str);
+  SMARTLIST_FOREACH(bw_file_headers, char *, c, tor_free(c));
+  smartlist_free(bw_file_headers);
+  tor_free(bw_file_headers_str);
+
+  /* Test v1.1.0 bandwidth headers with terminator, then relay lines
+   * bw_file_headers will contain the v1.1.0 headers. */
+  bw_file_headers = smartlist_new();
+  tor_asprintf(&content, "%s%s",
+               header_lines_v110, relay_lines_v110);
   write_str_to_file(fname, content, 0);
   tor_free(content);
-  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL));
+  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL,
+                                                       bw_file_headers));
+  bw_file_headers_str = smartlist_join_strings(bw_file_headers, " ", 0, NULL);
+  tt_str_op(bw_file_headers_str_v110, OP_EQ, bw_file_headers_str);
+  SMARTLIST_FOREACH(bw_file_headers, char *, c, tor_free(c));
+  smartlist_free(bw_file_headers);
+  tor_free(bw_file_headers_str);
+
+  /* Test v1.1.0 bandwidth headers with terminator, then bad relay lines,
+   * then terminator, then relay_lines_bad.
+   * bw_file_headers will contain the v1.1.0 headers. */
+  bw_file_headers = smartlist_new();
+  tor_asprintf(&content, "%s%s%s%s", header_lines_v110, relay_lines_bad,
+               BW_FILE_HEADERS_TERMINATOR, relay_lines_bad);
+  write_str_to_file(fname, content, 0);
+  tor_free(content);
+  tt_int_op(0, OP_EQ, dirserv_read_measured_bandwidths(fname, NULL,
+                                                       bw_file_headers));
+  bw_file_headers_str = smartlist_join_strings(bw_file_headers, " ", 0, NULL);
+  tt_str_op(bw_file_headers_str_v110, OP_EQ, bw_file_headers_str);
+  SMARTLIST_FOREACH(bw_file_headers, char *, c, tor_free(c));
+  smartlist_free(bw_file_headers);
+  tor_free(bw_file_headers_str);
 
  done:
   tor_free(fname);
+  tor_free(header_lines_v100);
+  tor_free(header_lines_v110_no_terminator);
+  tor_free(header_lines_v110);
+  tor_free(bw_file_headers_str_v100);
+  tor_free(bw_file_headers_str_v110);
+  tor_free(bw_file_headers_str_bad);
+  tor_free(bw_file_headers_str_extra);
 }
 
 #define MBWC_INIT_TIME 1000
@@ -6038,7 +6159,6 @@ struct testcase_t dir_tests[] = {
   DIR_LEGACY(versions),
   DIR_LEGACY(fp_pairs),
   DIR(split_fps, 0),
-  DIR_LEGACY(dirserv_read_measured_bandwidths_empty),
   DIR_LEGACY(measured_bw_kb),
   DIR_LEGACY(measured_bw_kb_line_is_after_headers),
   DIR_LEGACY(measured_bw_kb_cache),





More information about the tor-commits mailing list