Fix spaces and other smaller issues

This commit is contained in:
Ola Bini 2015-10-05 14:31:10 -05:00
parent ade5005853
commit 70de8d4bf8
No known key found for this signature in database
GPG Key ID: 465757AF3914B4B7
4 changed files with 193 additions and 106 deletions

View File

@ -76,20 +76,28 @@ void rend_cache_intro_failure_note(rend_intro_point_failure_t failure,
const char *service_id); const char *service_id);
void rend_cache_failure_purge(void); void rend_cache_failure_purge(void);
#ifdef RENDCACHE_PRIVATE #ifdef RENDCACHE_PRIVATE
STATIC size_t rend_cache_entry_allocation(const rend_cache_entry_t *e); STATIC size_t rend_cache_entry_allocation(const rend_cache_entry_t *e);
STATIC void rend_cache_entry_free(rend_cache_entry_t *e); STATIC void rend_cache_entry_free(rend_cache_entry_t *e);
STATIC void rend_cache_failure_intro_entry_free(rend_cache_failure_intro_t *entry); STATIC void rend_cache_failure_intro_entry_free(rend_cache_failure_intro_t
*entry);
STATIC void rend_cache_failure_entry_free(rend_cache_failure_t *entry); STATIC void rend_cache_failure_entry_free(rend_cache_failure_t *entry);
STATIC int cache_failure_intro_lookup(const uint8_t *identity, const char *service_id, rend_cache_failure_intro_t **intro_entry); STATIC int cache_failure_intro_lookup(const uint8_t *identity,
const char *service_id,
rend_cache_failure_intro_t
**intro_entry);
STATIC void rend_cache_decrement_allocation(size_t n); STATIC void rend_cache_decrement_allocation(size_t n);
STATIC void rend_cache_increment_allocation(size_t n); STATIC void rend_cache_increment_allocation(size_t n);
STATIC rend_cache_failure_intro_t *rend_cache_failure_intro_entry_new(rend_intro_point_failure_t failure); STATIC rend_cache_failure_intro_t *rend_cache_failure_intro_entry_new(
rend_intro_point_failure_t failure);
STATIC rend_cache_failure_t *rend_cache_failure_entry_new(void); STATIC rend_cache_failure_t *rend_cache_failure_entry_new(void);
STATIC void rend_cache_failure_remove(rend_service_descriptor_t *desc); STATIC void rend_cache_failure_remove(rend_service_descriptor_t *desc);
STATIC void cache_failure_intro_add(const uint8_t *identity, const char *service_id, rend_intro_point_failure_t failure); STATIC void cache_failure_intro_add(const uint8_t *identity,
STATIC void validate_intro_point_failure(const rend_service_descriptor_t *desc, const char *service_id); const char *service_id,
rend_intro_point_failure_t failure);
STATIC void validate_intro_point_failure(const rend_service_descriptor_t *desc,
const char *service_id);
#endif #endif
#endif /* TOR_RENDCACHE_H */ #endif /* TOR_RENDCACHE_H */

View File

@ -5,7 +5,8 @@
/** TODO: Description */ /** TODO: Description */
void void
generate_desc(int time_diff, rend_encoded_v2_service_descriptor_t **desc, char **service_id, int intro_points) generate_desc(int time_diff, rend_encoded_v2_service_descriptor_t **desc,
char **service_id, int intro_points)
{ {
rend_service_descriptor_t *generated = NULL; rend_service_descriptor_t *generated = NULL;
smartlist_t *descs = smartlist_new(); smartlist_t *descs = smartlist_new();
@ -15,17 +16,18 @@ generate_desc(int time_diff, rend_encoded_v2_service_descriptor_t **desc, char *
create_descriptor(&generated, service_id, intro_points); create_descriptor(&generated, service_id, intro_points);
generated->timestamp = now; generated->timestamp = now;
rend_encode_v2_descriptors(descs, generated, now, 0, REND_NO_AUTH, NULL, NULL); rend_encode_v2_descriptors(descs, generated, now, 0, REND_NO_AUTH, NULL,
NULL);
*desc = ((rend_encoded_v2_service_descriptor_t *)smartlist_get(descs, 0)); *desc = ((rend_encoded_v2_service_descriptor_t *)smartlist_get(descs, 0));
smartlist_free(descs); smartlist_free(descs);
rend_service_descriptor_free(generated); rend_service_descriptor_free(generated);
} }
/** TODO: Description */ /** TODO: Description */
void void
create_descriptor(rend_service_descriptor_t **generated, char **service_id, int intro_points) create_descriptor(rend_service_descriptor_t **generated, char **service_id,
int intro_points)
{ {
crypto_pk_t *pk1 = NULL; crypto_pk_t *pk1 = NULL;
crypto_pk_t *pk2 = NULL; crypto_pk_t *pk2 = NULL;

View File

@ -6,7 +6,9 @@
#ifndef TOR_REND_TEST_HELPERS_H #ifndef TOR_REND_TEST_HELPERS_H
#define TOR_REND_TEST_HELPERS_H #define TOR_REND_TEST_HELPERS_H
void generate_desc(int time_diff, rend_encoded_v2_service_descriptor_t **desc, char **service_id, int intro_points); void generate_desc(int time_diff, rend_encoded_v2_service_descriptor_t **desc,
void create_descriptor(rend_service_descriptor_t **generated, char **service_id, int intro_points); char **service_id, int intro_points);
void create_descriptor(rend_service_descriptor_t **generated,
char **service_id, int intro_points);
#endif #endif

View File

@ -16,7 +16,8 @@
#define NS_MODULE rend_cache #define NS_MODULE rend_cache
static const int RECENT_TIME = -10; static const int RECENT_TIME = -10;
static const int TIME_IN_THE_PAST = -(REND_CACHE_MAX_AGE + REND_CACHE_MAX_SKEW + 10); static const int TIME_IN_THE_PAST = -(REND_CACHE_MAX_AGE + \
REND_CACHE_MAX_SKEW + 10);
static const int TIME_IN_THE_FUTURE = REND_CACHE_MAX_SKEW + 10; static const int TIME_IN_THE_FUTURE = REND_CACHE_MAX_SKEW + 10;
extern strmap_t *rend_cache; extern strmap_t *rend_cache;
@ -30,10 +31,12 @@ mock_rend_data(char *onion_address)
rend_data_t rend_query; rend_data_t rend_query;
memset(&rend_query, 0, sizeof(rend_query)); memset(&rend_query, 0, sizeof(rend_query));
strncpy(rend_query.onion_address, onion_address, REND_SERVICE_ID_LEN_BASE32+1); strncpy(rend_query.onion_address, onion_address,
REND_SERVICE_ID_LEN_BASE32+1);
rend_query.auth_type = REND_NO_AUTH; rend_query.auth_type = REND_NO_AUTH;
rend_query.hsdirs_fp = smartlist_new(); rend_query.hsdirs_fp = smartlist_new();
smartlist_add(rend_query.hsdirs_fp, tor_memdup("aaaaaaaaaaaaaaaaaaaaaaaa", DIGEST_LEN)); smartlist_add(rend_query.hsdirs_fp, tor_memdup("aaaaaaaaaaaaaaaaaaaaaaaa",
DIGEST_LEN));
return rend_query; return rend_query;
} }
@ -53,7 +56,6 @@ test_rend_cache_lookup_entry(void *data)
generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); generate_desc(RECENT_TIME, &desc_holder, &service_id, 3);
ret = rend_cache_lookup_entry("abababababababab", 0, NULL); ret = rend_cache_lookup_entry("abababababababab", 0, NULL);
tt_int_op(ret, OP_EQ, -ENOENT); tt_int_op(ret, OP_EQ, -ENOENT);
@ -67,8 +69,10 @@ test_rend_cache_lookup_entry(void *data)
tt_int_op(ret, OP_EQ, -ENOENT); tt_int_op(ret, OP_EQ, -ENOENT);
mock_rend_query = mock_rend_data(service_id); mock_rend_query = mock_rend_data(service_id);
base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, DIGEST_LEN); base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id,
rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, &mock_rend_query, NULL); DIGEST_LEN);
rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32,
&mock_rend_query, NULL);
ret = rend_cache_lookup_entry(service_id, 2, NULL); ret = rend_cache_lookup_entry(service_id, 2, NULL);
tt_int_op(ret, OP_EQ, 0); tt_int_op(ret, OP_EQ, 0);
@ -102,8 +106,11 @@ test_rend_cache_store_v2_desc_as_client(void *data)
// Test success // Test success
mock_rend_query = mock_rend_data(service_id); mock_rend_query = mock_rend_data(service_id);
base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, DIGEST_LEN); base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id,
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, &mock_rend_query, &entry); DIGEST_LEN);
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str,
desc_id_base32, &mock_rend_query,
&entry);
tt_int_op(ret, OP_EQ, RCS_OKAY); tt_int_op(ret, OP_EQ, RCS_OKAY);
tt_assert(entry); tt_assert(entry);
@ -113,34 +120,45 @@ test_rend_cache_store_v2_desc_as_client(void *data)
// Test various failure modes // Test various failure modes
// TODO: a too long desc_id_base32 argument crashes the function // TODO: a too long desc_id_base32 argument crashes the function
/* ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, "3TOOLONG3TOOLONG3TOOLONG3TOOLONG3TOOLONG3TOOLONG", &mock_rend_query, NULL); */ /* ret = rend_cache_store_v2_desc_as_client( */
/* desc_holder->desc_str, */
/* "3TOOLONG3TOOLONG3TOOLONG3TOOLONG3TOOLONG3TOOLONG", */
/* &mock_rend_query, NULL); */
/* tt_int_op(ret, OP_EQ, RCS_BADDESC); */ /* tt_int_op(ret, OP_EQ, RCS_BADDESC); */
// Test bad base32 failure // Test bad base32 failure
// This causes an assertion failure if we're running with assertions. But when doing coverage, we can test it. // This causes an assertion failure if we're running with assertions.
// But when doing coverage, we can test it.
#ifdef TOR_COVERAGE #ifdef TOR_COVERAGE
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, "!xqunszqnaolrrfmtzgaki7mxelgvkj", &mock_rend_query, NULL); ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str,
"!xqunszqnaolrrfmtzgaki7mxelgvkj", &mock_rend_query, NULL);
tt_int_op(ret, OP_EQ, RCS_BADDESC); tt_int_op(ret, OP_EQ, RCS_BADDESC);
#endif #endif
// Test invalid descriptor // Test invalid descriptor
ret = rend_cache_store_v2_desc_as_client("invalid descriptor", "3xqunszqnaolrrfmtzgaki7mxelgvkje", &mock_rend_query, NULL); ret = rend_cache_store_v2_desc_as_client("invalid descriptor",
"3xqunszqnaolrrfmtzgaki7mxelgvkje", &mock_rend_query, NULL);
tt_int_op(ret, OP_EQ, RCS_BADDESC); tt_int_op(ret, OP_EQ, RCS_BADDESC);
// TODO: it doesn't seem to be possible to test invalid service ID condition. // TODO: it doesn't seem to be possible to test invalid service ID condition.
// that means it is likely not possible to have that condition without earlier conditions failing first (such as signature checking of the desc) // that means it is likely not possible to have that condition without
// earlier conditions failing first (such as signature checking of the desc)
// Test mismatch between service ID and onion address // Test mismatch between service ID and onion address
rend_cache_init(); rend_cache_init();
strncpy(mock_rend_query.onion_address, "abc", REND_SERVICE_ID_LEN_BASE32+1); strncpy(mock_rend_query.onion_address, "abc", REND_SERVICE_ID_LEN_BASE32+1);
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, &mock_rend_query, NULL); ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str,
desc_id_base32,
&mock_rend_query, NULL);
tt_int_op(ret, OP_EQ, RCS_BADDESC); tt_int_op(ret, OP_EQ, RCS_BADDESC);
// Test incorrect descriptor ID // Test incorrect descriptor ID
rend_cache_init(); rend_cache_init();
mock_rend_query = mock_rend_data(service_id); mock_rend_query = mock_rend_data(service_id);
desc_id_base32[0]++; desc_id_base32[0]++;
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, &mock_rend_query, NULL); ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str,
desc_id_base32, &mock_rend_query,
NULL);
tt_int_op(ret, OP_EQ, RCS_BADDESC); tt_int_op(ret, OP_EQ, RCS_BADDESC);
desc_id_base32[0]--; desc_id_base32[0]--;
@ -151,9 +169,12 @@ test_rend_cache_store_v2_desc_as_client(void *data)
generate_desc(TIME_IN_THE_PAST, &desc_holder, &service_id, 3); generate_desc(TIME_IN_THE_PAST, &desc_holder, &service_id, 3);
mock_rend_query = mock_rend_data(service_id); mock_rend_query = mock_rend_data(service_id);
base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, DIGEST_LEN); base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id,
DIGEST_LEN);
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, &mock_rend_query, NULL); ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str,
desc_id_base32,
&mock_rend_query, NULL);
tt_int_op(ret, OP_EQ, RCS_BADDESC); tt_int_op(ret, OP_EQ, RCS_BADDESC);
// Test too new descriptor (in the future) // Test too new descriptor (in the future)
@ -163,9 +184,12 @@ test_rend_cache_store_v2_desc_as_client(void *data)
generate_desc(TIME_IN_THE_FUTURE, &desc_holder, &service_id, 3); generate_desc(TIME_IN_THE_FUTURE, &desc_holder, &service_id, 3);
mock_rend_query = mock_rend_data(service_id); mock_rend_query = mock_rend_data(service_id);
base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, DIGEST_LEN); base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id,
DIGEST_LEN);
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, &mock_rend_query, NULL); ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str,
desc_id_base32, &mock_rend_query,
NULL);
tt_int_op(ret, OP_EQ, RCS_BADDESC); tt_int_op(ret, OP_EQ, RCS_BADDESC);
// Test when a descriptor is already in the cache // Test when a descriptor is already in the cache
@ -176,13 +200,19 @@ test_rend_cache_store_v2_desc_as_client(void *data)
generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); generate_desc(RECENT_TIME, &desc_holder, &service_id, 3);
mock_rend_query = mock_rend_data(service_id); mock_rend_query = mock_rend_data(service_id);
base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, DIGEST_LEN); base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id,
DIGEST_LEN);
rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, &mock_rend_query, NULL); rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32,
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, &mock_rend_query, NULL); &mock_rend_query, NULL);
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str,
desc_id_base32, &mock_rend_query,
NULL);
tt_int_op(ret, OP_EQ, RCS_OKAY); tt_int_op(ret, OP_EQ, RCS_OKAY);
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, &mock_rend_query, &entry); ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str,
desc_id_base32, &mock_rend_query,
&entry);
tt_int_op(ret, OP_EQ, RCS_OKAY); tt_int_op(ret, OP_EQ, RCS_OKAY);
tt_assert(entry); tt_assert(entry);
@ -195,9 +225,13 @@ test_rend_cache_store_v2_desc_as_client(void *data)
mock_rend_query = mock_rend_data(service_id); mock_rend_query = mock_rend_data(service_id);
mock_rend_query.auth_type = REND_BASIC_AUTH; mock_rend_query.auth_type = REND_BASIC_AUTH;
client_cookie[0] = 'A'; client_cookie[0] = 'A';
memcpy(mock_rend_query.descriptor_cookie, client_cookie, REND_DESC_COOKIE_LEN); memcpy(mock_rend_query.descriptor_cookie, client_cookie,
base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, DIGEST_LEN); REND_DESC_COOKIE_LEN);
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, &mock_rend_query, NULL); base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id,
DIGEST_LEN);
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str,
desc_id_base32, &mock_rend_query,
NULL);
tt_int_op(ret, OP_EQ, RCS_OKAY); tt_int_op(ret, OP_EQ, RCS_OKAY);
// Test successful run when we have REND_BASIC_AUTH but not cookie // Test successful run when we have REND_BASIC_AUTH but not cookie
@ -208,8 +242,11 @@ test_rend_cache_store_v2_desc_as_client(void *data)
generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); generate_desc(RECENT_TIME, &desc_holder, &service_id, 3);
mock_rend_query = mock_rend_data(service_id); mock_rend_query = mock_rend_data(service_id);
mock_rend_query.auth_type = REND_BASIC_AUTH; mock_rend_query.auth_type = REND_BASIC_AUTH;
base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, DIGEST_LEN); base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id,
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, &mock_rend_query, NULL); DIGEST_LEN);
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str,
desc_id_base32, &mock_rend_query,
NULL);
tt_int_op(ret, OP_EQ, RCS_OKAY); tt_int_op(ret, OP_EQ, RCS_OKAY);
// Test when we have no introduction points // Test when we have no introduction points
@ -219,8 +256,11 @@ test_rend_cache_store_v2_desc_as_client(void *data)
generate_desc(RECENT_TIME, &desc_holder, &service_id, 0); generate_desc(RECENT_TIME, &desc_holder, &service_id, 0);
mock_rend_query = mock_rend_data(service_id); mock_rend_query = mock_rend_data(service_id);
base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, DIGEST_LEN); base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id,
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, &mock_rend_query, NULL); DIGEST_LEN);
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str,
desc_id_base32, &mock_rend_query,
NULL);
tt_int_op(ret, OP_EQ, RCS_BADDESC); tt_int_op(ret, OP_EQ, RCS_BADDESC);
// Test when we have too many intro points // Test when we have too many intro points
@ -230,8 +270,11 @@ test_rend_cache_store_v2_desc_as_client(void *data)
generate_desc(RECENT_TIME, &desc_holder, &service_id, MAX_INTRO_POINTS+1); generate_desc(RECENT_TIME, &desc_holder, &service_id, MAX_INTRO_POINTS+1);
mock_rend_query = mock_rend_data(service_id); mock_rend_query = mock_rend_data(service_id);
base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, DIGEST_LEN); base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id,
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str, desc_id_base32, &mock_rend_query, NULL); DIGEST_LEN);
ret = rend_cache_store_v2_desc_as_client(desc_holder->desc_str,
desc_id_base32, &mock_rend_query,
NULL);
tt_int_op(ret, OP_EQ, RCS_BADDESC); tt_int_op(ret, OP_EQ, RCS_BADDESC);
done: done:
@ -258,30 +301,42 @@ test_rend_cache_store_v2_desc_as_client_with_different_time(void *data)
create_descriptor(&generated, &service_id, 3); create_descriptor(&generated, &service_id, 3);
generated->timestamp = t + RECENT_TIME; generated->timestamp = t + RECENT_TIME;
rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, REND_NO_AUTH, NULL, NULL); rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0,
desc_holder_newer = ((rend_encoded_v2_service_descriptor_t *)smartlist_get(descs, 0)); REND_NO_AUTH, NULL, NULL);
desc_holder_newer = ((rend_encoded_v2_service_descriptor_t *)
smartlist_get(descs, 0));
smartlist_free(descs); smartlist_free(descs);
descs = smartlist_new(); descs = smartlist_new();
generated->timestamp = (t + RECENT_TIME) - 20; generated->timestamp = (t + RECENT_TIME) - 20;
rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, REND_NO_AUTH, NULL, NULL); rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0,
desc_holder_older = ((rend_encoded_v2_service_descriptor_t *)smartlist_get(descs, 0)); REND_NO_AUTH, NULL, NULL);
desc_holder_older = ((rend_encoded_v2_service_descriptor_t *)
smartlist_get(descs, 0));
(void)data; (void)data;
rend_cache_init(); rend_cache_init();
// Test when a descriptor is already in the cache and it is newer than the one we submit // Test when a descriptor is already in the cache and it is newer than the
// one we submit
mock_rend_query = mock_rend_data(service_id); mock_rend_query = mock_rend_data(service_id);
base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder_newer->desc_id, DIGEST_LEN); base32_encode(desc_id_base32, sizeof(desc_id_base32),
rend_cache_store_v2_desc_as_client(desc_holder_newer->desc_str, desc_id_base32, &mock_rend_query, NULL); desc_holder_newer->desc_id, DIGEST_LEN);
ret = rend_cache_store_v2_desc_as_client(desc_holder_older->desc_str, desc_id_base32, &mock_rend_query, NULL); rend_cache_store_v2_desc_as_client(desc_holder_newer->desc_str,
desc_id_base32, &mock_rend_query, NULL);
ret = rend_cache_store_v2_desc_as_client(desc_holder_older->desc_str,
desc_id_base32, &mock_rend_query,
NULL);
tt_int_op(ret, OP_EQ, RCS_OKAY); tt_int_op(ret, OP_EQ, RCS_OKAY);
// Test when an old descriptor is in the cache and we submit a newer one // Test when an old descriptor is in the cache and we submit a newer one
rend_cache_init(); rend_cache_init();
rend_cache_store_v2_desc_as_client(desc_holder_older->desc_str, desc_id_base32, &mock_rend_query, NULL); rend_cache_store_v2_desc_as_client(desc_holder_older->desc_str,
ret = rend_cache_store_v2_desc_as_client(desc_holder_newer->desc_str, desc_id_base32, &mock_rend_query, NULL); desc_id_base32, &mock_rend_query, NULL);
ret = rend_cache_store_v2_desc_as_client(desc_holder_newer->desc_str,
desc_id_base32, &mock_rend_query,
NULL);
tt_int_op(ret, OP_EQ, RCS_OKAY); tt_int_op(ret, OP_EQ, RCS_OKAY);
done: done:
@ -292,7 +347,6 @@ test_rend_cache_store_v2_desc_as_client_with_different_time(void *data)
tor_free(service_id); tor_free(service_id);
} }
#define NS_SUBMODULE lookup_v2_desc_as_dir #define NS_SUBMODULE lookup_v2_desc_as_dir
NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void));
NS_DECL(int, hid_serv_responsible_for_desc_id, (const char *id)); NS_DECL(int, hid_serv_responsible_for_desc_id, (const char *id));
@ -303,7 +357,7 @@ static int hid_serv_responsible_for_desc_id_response;
static const routerinfo_t * static const routerinfo_t *
NS(router_get_my_routerinfo)(void) NS(router_get_my_routerinfo)(void)
{ {
if(!mock_routerinfo) { if (!mock_routerinfo) {
mock_routerinfo = tor_malloc(sizeof(routerinfo_t)); mock_routerinfo = tor_malloc(sizeof(routerinfo_t));
} }
@ -313,6 +367,7 @@ NS(router_get_my_routerinfo)(void)
static int static int
NS(hid_serv_responsible_for_desc_id)(const char *id) NS(hid_serv_responsible_for_desc_id)(const char *id)
{ {
(void)id;
return hid_serv_responsible_for_desc_id_response; return hid_serv_responsible_for_desc_id_response;
} }
@ -337,14 +392,16 @@ test_rend_cache_lookup_v2_desc_as_dir(void *data)
tt_int_op(ret, OP_EQ, -1); tt_int_op(ret, OP_EQ, -1);
// Test non-existent descriptor but well formed // Test non-existent descriptor but well formed
ret = rend_cache_lookup_v2_desc_as_dir("3xqunszqnaolrrfmtzgaki7mxelgvkje", NULL); ret = rend_cache_lookup_v2_desc_as_dir("3xqunszqnaolrrfmtzgaki7mxelgvkje",
NULL);
tt_int_op(ret, OP_EQ, 0); tt_int_op(ret, OP_EQ, 0);
// Test existing descriptor // Test existing descriptor
hid_serv_responsible_for_desc_id_response = 1; hid_serv_responsible_for_desc_id_response = 1;
generate_desc(RECENT_TIME, &desc_holder, &service_id, 3); generate_desc(RECENT_TIME, &desc_holder, &service_id, 3);
rend_cache_store_v2_desc_as_dir(desc_holder->desc_str); rend_cache_store_v2_desc_as_dir(desc_holder->desc_str);
base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id, DIGEST_LEN); base32_encode(desc_id_base32, sizeof(desc_id_base32), desc_holder->desc_id,
DIGEST_LEN);
ret = rend_cache_lookup_v2_desc_as_dir(desc_id_base32, &ret_desc); ret = rend_cache_lookup_v2_desc_as_dir(desc_id_base32, &ret_desc);
tt_int_op(ret, OP_EQ, 1); tt_int_op(ret, OP_EQ, 1);
tt_assert(ret_desc); tt_assert(ret_desc);
@ -361,9 +418,6 @@ test_rend_cache_lookup_v2_desc_as_dir(void *data)
NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void)); NS_DECL(const routerinfo_t *, router_get_my_routerinfo, (void));
NS_DECL(int, hid_serv_responsible_for_desc_id, (const char *id)); NS_DECL(int, hid_serv_responsible_for_desc_id, (const char *id));
static routerinfo_t *mock_routerinfo;
static int hid_serv_responsible_for_desc_id_response;
static const routerinfo_t * static const routerinfo_t *
NS(router_get_my_routerinfo)(void) NS(router_get_my_routerinfo)(void)
{ {
@ -373,6 +427,7 @@ NS(router_get_my_routerinfo)(void)
static int static int
NS(hid_serv_responsible_for_desc_id)(const char *id) NS(hid_serv_responsible_for_desc_id)(const char *id)
{ {
(void)id;
return hid_serv_responsible_for_desc_id_response; return hid_serv_responsible_for_desc_id_response;
} }
@ -458,15 +513,19 @@ test_rend_cache_store_v2_desc_as_dir_with_different_time(void *data)
create_descriptor(&generated, &service_id, 3); create_descriptor(&generated, &service_id, 3);
generated->timestamp = t + RECENT_TIME; generated->timestamp = t + RECENT_TIME;
rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, REND_NO_AUTH, NULL, NULL); rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0,
desc_holder_newer = ((rend_encoded_v2_service_descriptor_t *)smartlist_get(descs, 0)); REND_NO_AUTH, NULL, NULL);
desc_holder_newer = ((rend_encoded_v2_service_descriptor_t *)
smartlist_get(descs, 0));
smartlist_free(descs); smartlist_free(descs);
descs = smartlist_new(); descs = smartlist_new();
generated->timestamp = (t + RECENT_TIME) - 20; generated->timestamp = (t + RECENT_TIME) - 20;
rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, REND_NO_AUTH, NULL, NULL); rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0,
desc_holder_older = ((rend_encoded_v2_service_descriptor_t *)smartlist_get(descs, 0)); REND_NO_AUTH, NULL, NULL);
desc_holder_older = ((rend_encoded_v2_service_descriptor_t *)
smartlist_get(descs, 0));
// Test when we have a newer descriptor stored // Test when we have a newer descriptor stored
mock_routerinfo = tor_malloc(sizeof(routerinfo_t)); mock_routerinfo = tor_malloc(sizeof(routerinfo_t));
@ -508,16 +567,20 @@ test_rend_cache_store_v2_desc_as_dir_with_different_content(void *data)
create_descriptor(&generated, &service_id, 3); create_descriptor(&generated, &service_id, 3);
generated->timestamp = t + RECENT_TIME; generated->timestamp = t + RECENT_TIME;
rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, REND_NO_AUTH, NULL, NULL); rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0,
desc_holder_one = ((rend_encoded_v2_service_descriptor_t *)smartlist_get(descs, 0)); REND_NO_AUTH, NULL, NULL);
desc_holder_one = ((rend_encoded_v2_service_descriptor_t *)
smartlist_get(descs, 0));
smartlist_free(descs); smartlist_free(descs);
descs = smartlist_new(); descs = smartlist_new();
generated->timestamp = t + RECENT_TIME; generated->timestamp = t + RECENT_TIME;
generated->protocols = 41; generated->protocols = 41;
rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0, REND_NO_AUTH, NULL, NULL); rend_encode_v2_descriptors(descs, generated, t + RECENT_TIME, 0,
desc_holder_two = ((rend_encoded_v2_service_descriptor_t *)smartlist_get(descs, 0)); REND_NO_AUTH, NULL, NULL);
desc_holder_two = ((rend_encoded_v2_service_descriptor_t *)
smartlist_get(descs, 0));
// Test when we have another descriptor stored, with a different descriptor // Test when we have another descriptor stored, with a different descriptor
mock_routerinfo = tor_malloc(sizeof(routerinfo_t)); mock_routerinfo = tor_malloc(sizeof(routerinfo_t));
@ -531,7 +594,6 @@ test_rend_cache_store_v2_desc_as_dir_with_different_content(void *data)
NS_UNMOCK(hid_serv_responsible_for_desc_id); NS_UNMOCK(hid_serv_responsible_for_desc_id);
} }
#undef NS_SUBMODULE #undef NS_SUBMODULE
static void static void
@ -540,14 +602,18 @@ test_rend_cache_init(void *data)
(void)data; (void)data;
tt_assert_msg(!rend_cache, "rend_cache should be NULL when starting"); tt_assert_msg(!rend_cache, "rend_cache should be NULL when starting");
tt_assert_msg(!rend_cache_v2_dir, "rend_cache_v2_dir should be NULL when starting"); tt_assert_msg(!rend_cache_v2_dir, "rend_cache_v2_dir should be NULL "
tt_assert_msg(!rend_cache_failure, "rend_cache_failure should be NULL when starting"); "when starting");
tt_assert_msg(!rend_cache_failure, "rend_cache_failure should be NULL when "
"starting");
rend_cache_init(); rend_cache_init();
tt_assert_msg(rend_cache, "rend_cache should not be NULL after initing"); tt_assert_msg(rend_cache, "rend_cache should not be NULL after initing");
tt_assert_msg(rend_cache_v2_dir, "rend_cache_v2_dir should not be NULL after initing"); tt_assert_msg(rend_cache_v2_dir, "rend_cache_v2_dir should not be NULL "
tt_assert_msg(rend_cache_failure, "rend_cache_failure should not be NULL after initing"); "after initing");
tt_assert_msg(rend_cache_failure, "rend_cache_failure should not be NULL "
"after initing");
tt_int_op(strmap_size(rend_cache), OP_EQ, 0); tt_int_op(strmap_size(rend_cache), OP_EQ, 0);
tt_int_op(digestmap_size(rend_cache_v2_dir), OP_EQ, 0); tt_int_op(digestmap_size(rend_cache_v2_dir), OP_EQ, 0);
@ -603,7 +669,6 @@ test_rend_cache_increment_allocation(void *data)
(void)0; (void)0;
} }
static void static void
test_rend_cache_failure_intro_entry_new(void *data) test_rend_cache_failure_intro_entry_new(void *data)
{ {
@ -790,7 +855,6 @@ test_rend_cache_failure_clean(void *data)
rend_cache_failure_clean(time(NULL)); rend_cache_failure_clean(time(NULL));
tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 0); tt_int_op(strmap_size(rend_cache_failure), OP_EQ, 0);
// Test with one old intro point and one new one // Test with one old intro point and one new one
rend_cache_failure_purge(); rend_cache_failure_purge();
failure = rend_cache_failure_entry_new(); failure = rend_cache_failure_entry_new();
@ -809,7 +873,6 @@ test_rend_cache_failure_clean(void *data)
(void)0; (void)0;
} }
static void static void
test_rend_cache_failure_remove(void *data) test_rend_cache_failure_remove(void *data)
{ {
@ -826,7 +889,8 @@ test_rend_cache_failure_remove(void *data)
desc->pk = pk_generate(0); desc->pk = pk_generate(0);
rend_cache_failure_remove(desc); rend_cache_failure_remove(desc);
// There seems to not exist any way of getting rend_cache_failure_remove() to fail because of a problem with rend_get_service_id from here // There seems to not exist any way of getting rend_cache_failure_remove()
// to fail because of a problem with rend_get_service_id from here
/* done: */ /* done: */
/* (void)0; */ /* (void)0; */
@ -864,7 +928,6 @@ test_rend_cache_free_all(void *data)
(void)0; (void)0;
} }
static void static void
test_rend_cache_entry_free(void *data) test_rend_cache_entry_free(void *data)
{ {
@ -887,7 +950,6 @@ test_rend_cache_entry_free(void *data)
/* (void)0; */ /* (void)0; */
} }
static void static void
test_rend_cache_purge(void *data) test_rend_cache_purge(void *data)
{ {
@ -922,7 +984,8 @@ test_rend_cache_failure_intro_add(void *data)
rend_cache_init(); rend_cache_init();
// Adds non-existing entry // Adds non-existing entry
cache_failure_intro_add((const uint8_t *)"foo1", "foo2", INTRO_POINT_FAILURE_TIMEOUT); cache_failure_intro_add((const uint8_t *)"foo1", "foo2",
INTRO_POINT_FAILURE_TIMEOUT);
fail_entry = strmap_get_lc(rend_cache_failure, "foo2"); fail_entry = strmap_get_lc(rend_cache_failure, "foo2");
tt_assert(fail_entry); tt_assert(fail_entry);
tt_int_op(digestmap_size(fail_entry->intro_failures), OP_EQ, 1); tt_int_op(digestmap_size(fail_entry->intro_failures), OP_EQ, 1);
@ -930,7 +993,8 @@ test_rend_cache_failure_intro_add(void *data)
tt_assert(entry); tt_assert(entry);
// Adds existing entry // Adds existing entry
cache_failure_intro_add((const uint8_t *)"foo1", "foo2", INTRO_POINT_FAILURE_TIMEOUT); cache_failure_intro_add((const uint8_t *)"foo1", "foo2",
INTRO_POINT_FAILURE_TIMEOUT);
fail_entry = strmap_get_lc(rend_cache_failure, "foo2"); fail_entry = strmap_get_lc(rend_cache_failure, "foo2");
tt_assert(fail_entry); tt_assert(fail_entry);
tt_int_op(digestmap_size(fail_entry->intro_failures), OP_EQ, 1); tt_int_op(digestmap_size(fail_entry->intro_failures), OP_EQ, 1);
@ -941,7 +1005,6 @@ test_rend_cache_failure_intro_add(void *data)
rend_cache_purge(); rend_cache_purge();
} }
static void static void
test_rend_cache_intro_failure_note(void *data) test_rend_cache_intro_failure_note(void *data)
{ {
@ -950,7 +1013,8 @@ test_rend_cache_intro_failure_note(void *data)
rend_cache_failure_intro_t *entry; rend_cache_failure_intro_t *entry;
// Test not found // Test not found
rend_cache_intro_failure_note(INTRO_POINT_FAILURE_TIMEOUT,(const uint8_t *)"foo1", "foo2"); rend_cache_intro_failure_note(INTRO_POINT_FAILURE_TIMEOUT,
(const uint8_t *)"foo1", "foo2");
fail_entry = strmap_get_lc(rend_cache_failure, "foo2"); fail_entry = strmap_get_lc(rend_cache_failure, "foo2");
tt_assert(fail_entry); tt_assert(fail_entry);
tt_int_op(digestmap_size(fail_entry->intro_failures), OP_EQ, 1); tt_int_op(digestmap_size(fail_entry->intro_failures), OP_EQ, 1);
@ -959,7 +1023,8 @@ test_rend_cache_intro_failure_note(void *data)
tt_int_op(entry->failure_type, OP_EQ, INTRO_POINT_FAILURE_TIMEOUT); tt_int_op(entry->failure_type, OP_EQ, INTRO_POINT_FAILURE_TIMEOUT);
// Test found // Test found
rend_cache_intro_failure_note(INTRO_POINT_FAILURE_UNREACHABLE,(const uint8_t *)"foo1", "foo2"); rend_cache_intro_failure_note(INTRO_POINT_FAILURE_UNREACHABLE,
(const uint8_t *)"foo1", "foo2");
tt_int_op(entry->failure_type, OP_EQ, INTRO_POINT_FAILURE_UNREACHABLE); tt_int_op(entry->failure_type, OP_EQ, INTRO_POINT_FAILURE_UNREACHABLE);
done: done:
@ -969,15 +1034,13 @@ test_rend_cache_intro_failure_note(void *data)
#define NS_SUBMODULE clean_v2_descs_as_dir #define NS_SUBMODULE clean_v2_descs_as_dir
NS_DECL(int, hid_serv_responsible_for_desc_id, (const char *id)); NS_DECL(int, hid_serv_responsible_for_desc_id, (const char *id));
static int hid_serv_responsible_for_desc_id_response;
static int static int
NS(hid_serv_responsible_for_desc_id)(const char *id) NS(hid_serv_responsible_for_desc_id)(const char *id)
{ {
(void)id;
return hid_serv_responsible_for_desc_id_response; return hid_serv_responsible_for_desc_id_response;
} }
static void static void
test_rend_cache_clean_v2_descs_as_dir(void *data) test_rend_cache_clean_v2_descs_as_dir(void *data)
{ {
@ -1013,7 +1076,8 @@ test_rend_cache_clean_v2_descs_as_dir(void *data)
rend_cache_clean_v2_descs_as_dir(now, 0); rend_cache_clean_v2_descs_as_dir(now, 0);
tt_int_op(digestmap_size(rend_cache_v2_dir), OP_EQ, 0); tt_int_op(digestmap_size(rend_cache_v2_dir), OP_EQ, 0);
// Test with one entry that is not under the responsibility of this hidden service // Test with one entry that is not under the responsibility of this
// hidden service
e = tor_malloc_zero(sizeof(rend_cache_entry_t)); e = tor_malloc_zero(sizeof(rend_cache_entry_t));
e->last_served = now; e->last_served = now;
desc = tor_malloc_zero(sizeof(rend_service_descriptor_t)); desc = tor_malloc_zero(sizeof(rend_service_descriptor_t));
@ -1052,8 +1116,6 @@ test_rend_cache_clean_v2_descs_as_dir(void *data)
rend_cache_clean_v2_descs_as_dir(now, 20000); rend_cache_clean_v2_descs_as_dir(now, 20000);
tt_int_op(digestmap_size(rend_cache_v2_dir), OP_EQ, 1); tt_int_op(digestmap_size(rend_cache_v2_dir), OP_EQ, 1);
done: done:
NS_UNMOCK(hid_serv_responsible_for_desc_id); NS_UNMOCK(hid_serv_responsible_for_desc_id);
rend_cache_purge(); rend_cache_purge();
@ -1061,7 +1123,6 @@ test_rend_cache_clean_v2_descs_as_dir(void *data)
#undef NS_SUBMODULE #undef NS_SUBMODULE
static void static void
test_rend_cache_entry_allocation(void *data) test_rend_cache_entry_allocation(void *data)
{ {
@ -1097,7 +1158,6 @@ test_rend_cache_failure_intro_entry_free(void *data)
rend_cache_failure_intro_entry_free(entry); rend_cache_failure_intro_entry_free(entry);
} }
static void static void
test_rend_cache_failure_purge(void *data) test_rend_cache_failure_purge(void *data)
{ {
@ -1148,31 +1208,46 @@ test_rend_cache_validate_intro_point_failure(void *data)
struct testcase_t rend_cache_tests[] = { struct testcase_t rend_cache_tests[] = {
{ "init", test_rend_cache_init, 0, NULL, NULL }, { "init", test_rend_cache_init, 0, NULL, NULL },
{ "decrement_allocation", test_rend_cache_decrement_allocation, 0, NULL, NULL }, { "decrement_allocation", test_rend_cache_decrement_allocation, 0,
{ "increment_allocation", test_rend_cache_increment_allocation, 0, NULL, NULL }, NULL, NULL },
{ "increment_allocation", test_rend_cache_increment_allocation, 0,
NULL, NULL },
{ "clean", test_rend_cache_clean, TT_FORK, NULL, NULL }, { "clean", test_rend_cache_clean, TT_FORK, NULL, NULL },
{ "clean_v2_descs_as_dir", test_rend_cache_clean_v2_descs_as_dir, 0, NULL, NULL }, { "clean_v2_descs_as_dir", test_rend_cache_clean_v2_descs_as_dir, 0,
NULL, NULL },
{ "entry_allocation", test_rend_cache_entry_allocation, 0, NULL, NULL }, { "entry_allocation", test_rend_cache_entry_allocation, 0, NULL, NULL },
{ "entry_free", test_rend_cache_entry_free, 0, NULL, NULL }, { "entry_free", test_rend_cache_entry_free, 0, NULL, NULL },
{ "failure_intro_entry_free", test_rend_cache_failure_intro_entry_free, 0, NULL, NULL }, { "failure_intro_entry_free", test_rend_cache_failure_intro_entry_free, 0,
NULL, NULL },
{ "free_all", test_rend_cache_free_all, 0, NULL, NULL }, { "free_all", test_rend_cache_free_all, 0, NULL, NULL },
{ "purge", test_rend_cache_purge, 0, NULL, NULL }, { "purge", test_rend_cache_purge, 0, NULL, NULL },
{ "failure_clean", test_rend_cache_failure_clean, 0, NULL, NULL }, { "failure_clean", test_rend_cache_failure_clean, 0, NULL, NULL },
{ "failure_entry_new", test_rend_cache_failure_entry_new, 0, NULL, NULL }, { "failure_entry_new", test_rend_cache_failure_entry_new, 0, NULL, NULL },
{ "failure_entry_free", test_rend_cache_failure_entry_free, 0, NULL, NULL }, { "failure_entry_free", test_rend_cache_failure_entry_free, 0, NULL, NULL },
{ "failure_intro_add", test_rend_cache_failure_intro_add, 0, NULL, NULL }, { "failure_intro_add", test_rend_cache_failure_intro_add, 0, NULL, NULL },
{ "failure_intro_entry_new", test_rend_cache_failure_intro_entry_new, 0, NULL, NULL }, { "failure_intro_entry_new", test_rend_cache_failure_intro_entry_new, 0,
{ "failure_intro_lookup", test_rend_cache_failure_intro_lookup, 0, NULL, NULL }, NULL, NULL },
{ "failure_intro_lookup", test_rend_cache_failure_intro_lookup, 0,
NULL, NULL },
{ "failure_purge", test_rend_cache_failure_purge, 0, NULL, NULL }, { "failure_purge", test_rend_cache_failure_purge, 0, NULL, NULL },
{ "failure_remove", test_rend_cache_failure_remove, 0, NULL, NULL }, { "failure_remove", test_rend_cache_failure_remove, 0, NULL, NULL },
{ "intro_failure_note", test_rend_cache_intro_failure_note, 0, NULL, NULL }, { "intro_failure_note", test_rend_cache_intro_failure_note, 0, NULL, NULL },
{ "lookup", test_rend_cache_lookup_entry, 0, NULL, NULL }, { "lookup", test_rend_cache_lookup_entry, 0, NULL, NULL },
{ "lookup_v2_desc_as_dir", test_rend_cache_lookup_v2_desc_as_dir, 0, NULL, NULL }, { "lookup_v2_desc_as_dir", test_rend_cache_lookup_v2_desc_as_dir, 0,
{ "store_v2_desc_as_client", test_rend_cache_store_v2_desc_as_client, 0, NULL, NULL }, NULL, NULL },
{ "store_v2_desc_as_client_with_different_time", test_rend_cache_store_v2_desc_as_client_with_different_time, 0, NULL, NULL }, { "store_v2_desc_as_client", test_rend_cache_store_v2_desc_as_client, 0,
{ "store_v2_desc_as_dir", test_rend_cache_store_v2_desc_as_dir, 0, NULL, NULL }, NULL, NULL },
{ "store_v2_desc_as_dir_with_different_time", test_rend_cache_store_v2_desc_as_dir_with_different_time, 0, NULL, NULL }, { "store_v2_desc_as_client_with_different_time",
{ "store_v2_desc_as_dir_with_different_content", test_rend_cache_store_v2_desc_as_dir_with_different_content, 0, NULL, NULL }, test_rend_cache_store_v2_desc_as_client_with_different_time, 0,
{ "validate_intro_point_failure", test_rend_cache_validate_intro_point_failure, 0, NULL, NULL }, NULL, NULL },
{ "store_v2_desc_as_dir", test_rend_cache_store_v2_desc_as_dir, 0,
NULL, NULL },
{ "store_v2_desc_as_dir_with_different_time",
test_rend_cache_store_v2_desc_as_dir_with_different_time, 0, NULL, NULL },
{ "store_v2_desc_as_dir_with_different_content",
test_rend_cache_store_v2_desc_as_dir_with_different_content, 0,
NULL, NULL },
{ "validate_intro_point_failure",
test_rend_cache_validate_intro_point_failure, 0, NULL, NULL },
END_OF_TESTCASES END_OF_TESTCASES
}; };