diff --git a/src/test/include.am b/src/test/include.am index ecb7689579..955016bee8 100644 --- a/src/test/include.am +++ b/src/test/include.am @@ -132,6 +132,7 @@ src_test_test_SOURCES += \ src/test/test_hs_common.c \ src/test/test_hs_config.c \ src/test/test_hs_cell.c \ + src/test/test_hs_circ.c \ src/test/test_hs_ntor.c \ src/test/test_hs_service.c \ src/test/test_hs_client.c \ diff --git a/src/test/test.c b/src/test/test.c index 58b468775c..70c5558150 100644 --- a/src/test/test.c +++ b/src/test/test.c @@ -877,6 +877,7 @@ struct testgroup_t testgroups[] = { { "legacy_hs/", hs_tests }, { "hs_cache/", hs_cache }, { "hs_cell/", hs_cell_tests }, + { "hs_circ/", hs_circ_tests }, { "hs_common/", hs_common_tests }, { "hs_config/", hs_config_tests }, { "hs_control/", hs_control_tests }, diff --git a/src/test/test.h b/src/test/test.h index aacc9dba87..8a5c675bc3 100644 --- a/src/test/test.h +++ b/src/test/test.h @@ -216,6 +216,7 @@ extern struct testcase_t geoip_tests[]; extern struct testcase_t hs_tests[]; extern struct testcase_t hs_cache[]; extern struct testcase_t hs_cell_tests[]; +extern struct testcase_t hs_circ_tests[]; extern struct testcase_t hs_common_tests[]; extern struct testcase_t hs_config_tests[]; extern struct testcase_t hs_control_tests[]; diff --git a/src/test/test_hs_circ.c b/src/test/test_hs_circ.c new file mode 100644 index 0000000000..af28af2573 --- /dev/null +++ b/src/test/test_hs_circ.c @@ -0,0 +1,70 @@ +/* Copyright (c) 2017-2019, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file test_hs_circ.c + * \brief Test hidden service circuit functionality. + */ + +#define CIRCUITLIST_PRIVATE + +#include "test/test.h" +#include "test/test_helpers.h" +#include "test/log_test_helpers.h" + +#include "core/or/circuitbuild.h" +#include "core/or/circuitlist.h" +#include "core/or/circuituse.h" +#include "core/or/origin_circuit_st.h" + +#include "feature/hs/hs_circuit.h" +#include "feature/hs/hs_circuitmap.h" + +static void +test_circuit_repurpose(void *arg) +{ + origin_circuit_t *intro_circ = NULL; + const origin_circuit_t *search; + ed25519_keypair_t kp; + + (void) arg; + + hs_init(); + + intro_circ = origin_circuit_init(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, 0); + tt_assert(intro_circ); + ed25519_keypair_generate(&kp, 0); + + /* Register circuit in global map and make sure it is actually there. */ + hs_circuitmap_register_intro_circ_v3_service_side(intro_circ, + &kp.pubkey); + tt_assert(TO_CIRCUIT(intro_circ)->hs_token); + search = hs_circuitmap_get_intro_circ_v3_service_side(&kp.pubkey); + tt_mem_op(search, OP_EQ, intro_circ, sizeof(origin_circuit_t)); + + /* Setup circuit HS ident. We don't care about the service pubkey. */ + intro_circ->hs_ident = hs_ident_circuit_new(&kp.pubkey, + HS_IDENT_CIRCUIT_INTRO); + tt_assert(intro_circ->hs_ident); + + /* Trigger a repurpose. State should be cleaned up. */ + hs_circ_repurpose(TO_CIRCUIT(intro_circ)); + + /* Removed from map. */ + search = hs_circuitmap_get_intro_circ_v3_service_side(&kp.pubkey); + tt_assert(!search); + /* HS identifier has been removed. */ + tt_assert(!intro_circ->hs_ident); + + done: + circuit_free_(TO_CIRCUIT(intro_circ)); + hs_free_all(); +} + +struct testcase_t hs_circ_tests[] = { + { "repurpose", test_circuit_repurpose, TT_FORK, + NULL, NULL }, + + END_OF_TESTCASES +}; +