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
This commit is contained in:
juga0 2018-06-30 06:29:11 +00:00
parent 87fc409a70
commit e87793bae5

View File

@ -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);
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);
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);
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);
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=
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(&content, "%ld\n%s%s", (long)timestamp, v110_header_lines,
sbws_relay_lines);
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));
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,
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,
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,
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,
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),