mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-25 07:07:52 +01:00
Another consdiffmgr test: only generate the diffs that are needed
This test makes sure that we only generate the diffs we actually want, rather than regenerating all the diffs every time anything changes.
This commit is contained in:
parent
7fc37d41b4
commit
b9c2f135bd
1 changed files with 71 additions and 3 deletions
|
@ -285,19 +285,87 @@ test_consdiffmgr_make_diffs(void *arg)
|
||||||
tor_free(applied);
|
tor_free(applied);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_consdiffmgr_diff_rules(void *arg)
|
||||||
|
{
|
||||||
|
(void)arg;
|
||||||
|
#define N 6
|
||||||
|
char *md_body[N], *ns_body[N];
|
||||||
|
networkstatus_t *md_ns[N], *ns_ns[N];
|
||||||
|
uint8_t md_ns_sha3[N][DIGEST256_LEN], ns_ns_sha3[N][DIGEST256_LEN];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
MOCK(cpuworker_queue_work, mock_cpuworker_queue_work);
|
||||||
|
|
||||||
|
/* Create a bunch of consensus things at 15-second intervals. */
|
||||||
|
time_t start = approx_time() - 120;
|
||||||
|
for (i = 0; i < N; ++i) {
|
||||||
|
time_t when = start + i * 15;
|
||||||
|
md_body[i] = fake_ns_body_new(FLAV_MICRODESC, when);
|
||||||
|
ns_body[i] = fake_ns_body_new(FLAV_NS, when);
|
||||||
|
md_ns[i] = fake_ns_new(FLAV_MICRODESC, when);
|
||||||
|
ns_ns[i] = fake_ns_new(FLAV_NS, when);
|
||||||
|
crypto_digest256((char *)md_ns_sha3[i], md_body[i], strlen(md_body[i]),
|
||||||
|
DIGEST_SHA3_256);
|
||||||
|
crypto_digest256((char *)ns_ns_sha3[i], ns_body[i], strlen(ns_body[i]),
|
||||||
|
DIGEST_SHA3_256);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For the MD consensuses: add 4 of them, and make sure that
|
||||||
|
* diffs are created to one consensus (the most recent) only. */
|
||||||
|
tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[1], md_ns[1]));
|
||||||
|
tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[2], md_ns[2]));
|
||||||
|
tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[3], md_ns[3]));
|
||||||
|
tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[4], md_ns[4]));
|
||||||
|
consdiffmgr_rescan();
|
||||||
|
tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue);
|
||||||
|
tt_int_op(3, OP_EQ, smartlist_len(fake_cpuworker_queue));
|
||||||
|
tt_int_op(0, OP_EQ, mock_cpuworker_run_work());
|
||||||
|
mock_cpuworker_handle_replies();
|
||||||
|
tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue);
|
||||||
|
|
||||||
|
/* For the NS consensuses: add 3, generate, and add one older one and
|
||||||
|
* make sure that older one is the only one whose diff is generated */
|
||||||
|
tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[0], ns_ns[0]));
|
||||||
|
tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[1], ns_ns[1]));
|
||||||
|
tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[5], ns_ns[5]));
|
||||||
|
consdiffmgr_rescan();
|
||||||
|
tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue);
|
||||||
|
tt_int_op(2, OP_EQ, smartlist_len(fake_cpuworker_queue));
|
||||||
|
tt_int_op(0, OP_EQ, mock_cpuworker_run_work());
|
||||||
|
mock_cpuworker_handle_replies();
|
||||||
|
|
||||||
|
tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[2], ns_ns[2]));
|
||||||
|
consdiffmgr_rescan();
|
||||||
|
tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue);
|
||||||
|
tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue));
|
||||||
|
tt_int_op(0, OP_EQ, mock_cpuworker_run_work());
|
||||||
|
mock_cpuworker_handle_replies();
|
||||||
|
|
||||||
|
done:
|
||||||
|
for (i = 0; i < N; ++i) {
|
||||||
|
tor_free(md_body[i]);
|
||||||
|
tor_free(ns_body[i]);
|
||||||
|
networkstatus_vote_free(md_ns[i]);
|
||||||
|
networkstatus_vote_free(ns_ns[i]);
|
||||||
|
}
|
||||||
|
UNMOCK(cpuworker_queue_work);
|
||||||
|
#undef N
|
||||||
|
}
|
||||||
|
|
||||||
#define TEST(name) \
|
#define TEST(name) \
|
||||||
{ #name, test_consdiffmgr_ ## name , TT_FORK, &setup_diffmgr, NULL }
|
{ #name, test_consdiffmgr_ ## name , TT_FORK, &setup_diffmgr, NULL }
|
||||||
|
|
||||||
struct testcase_t consdiffmgr_tests[] = {
|
struct testcase_t consdiffmgr_tests[] = {
|
||||||
TEST(add),
|
TEST(add),
|
||||||
TEST(make_diffs),
|
TEST(make_diffs),
|
||||||
|
TEST(diff_rules),
|
||||||
|
|
||||||
// XXXX Test: deleting consensuses for being too old
|
// XXXX Test: deleting consensuses for being too old
|
||||||
// XXXX Test: deleting diffs for not being to most recent consensus
|
// XXXX Test: deleting diffs for not being to most recent consensus
|
||||||
// XXXX Test: Objects of unrecognized doctype are not cleaned.
|
// XXXX Test: Objects of unrecognized doctype are not cleaned.
|
||||||
// XXXX Test: Objects with bad iso time are not cleaned.
|
// XXXX Test: Objects with bad iso time are not cleaned.
|
||||||
// XXXX Test: only generate diffs to most recent consensus
|
|
||||||
// XXXX Test: making diffs from some old consensuses, but having diffs
|
|
||||||
// for others.
|
|
||||||
// XXXX Test: Failure to open cache???
|
// XXXX Test: Failure to open cache???
|
||||||
// XXXX Test: failure to create consensus diff.
|
// XXXX Test: failure to create consensus diff.
|
||||||
END_OF_TESTCASES
|
END_OF_TESTCASES
|
||||||
|
|
Loading…
Add table
Reference in a new issue