test_hs_metrics.c (3400B)
1 /* Copyright (c) 2020-2021, The Tor Project, Inc. */ 2 /* See LICENSE for licensing information */ 3 4 /** 5 * \file test_hs_metrics.c 6 * \brief Test hidden service metrics. 7 */ 8 9 #define HS_SERVICE_PRIVATE 10 11 #include "test/test.h" 12 #include "test/test_helpers.h" 13 #include "test/log_test_helpers.h" 14 15 #include "app/config/config.h" 16 17 #include "feature/hs/hs_metrics.h" 18 #include "feature/hs/hs_service.h" 19 20 #include "lib/crypt_ops/crypto_ed25519.h" 21 22 static void 23 test_metrics(void *arg) 24 { 25 hs_service_t *service = NULL; 26 27 (void) arg; 28 29 hs_init(); 30 31 service = hs_service_new(get_options()); 32 tt_assert(service); 33 service->config.version = HS_VERSION_THREE; 34 ed25519_secret_key_generate(&service->keys.identity_sk, 0); 35 ed25519_public_key_generate(&service->keys.identity_pk, 36 &service->keys.identity_sk); 37 register_service(get_hs_service_map(), service); 38 39 tt_assert(service->metrics.store); 40 41 /* Update entry by identifier. */ 42 hs_metrics_update_by_ident(HS_METRICS_NUM_INTRODUCTIONS, 43 &service->keys.identity_pk, 0, NULL, 42, 44 0, false); 45 46 /* Confirm the entry value. */ 47 const smartlist_t *entries = metrics_store_get_all(service->metrics.store, 48 "tor_hs_intro_num_total"); 49 tt_assert(entries); 50 tt_int_op(smartlist_len(entries), OP_EQ, 1); 51 const metrics_store_entry_t *entry = smartlist_get(entries, 0); 52 tt_assert(entry); 53 tt_int_op(metrics_store_entry_get_value(entry), OP_EQ, 42); 54 55 /* Update entry by service now. */ 56 hs_metrics_update_by_service(HS_METRICS_NUM_INTRODUCTIONS, 57 service, 0, NULL, 42, 0, false); 58 tt_int_op(metrics_store_entry_get_value(entry), OP_EQ, 84); 59 60 const char *reason = HS_METRICS_ERR_INTRO_REQ_BAD_AUTH_KEY; 61 62 /* Update tor_hs_intro_rejected_intro_req_count */ 63 hs_metrics_update_by_ident(HS_METRICS_NUM_REJECTED_INTRO_REQ, 64 &service->keys.identity_pk, 0, 65 reason, 112, 0, false); 66 67 entries = metrics_store_get_all(service->metrics.store, 68 "tor_hs_intro_rejected_intro_req_count"); 69 tt_assert(entries); 70 tt_int_op(smartlist_len(entries), OP_EQ, 71 hs_metrics_intro_req_error_reasons_size); 72 73 entry = metrics_store_find_entry_with_label( 74 entries, "reason=\"bad_auth_key\""); 75 tt_assert(entry); 76 tt_int_op(metrics_store_entry_get_value(entry), OP_EQ, 112); 77 78 /* Update tor_hs_intro_rejected_intro_req_count entry by service now. */ 79 hs_metrics_update_by_service(HS_METRICS_NUM_REJECTED_INTRO_REQ, service, 0, 80 reason, 10, 0, false); 81 tt_int_op(metrics_store_entry_get_value(entry), OP_EQ, 122); 82 83 /* So far these have been relative updates. Test updates with reset */ 84 hs_metrics_update_by_service(HS_METRICS_NUM_REJECTED_INTRO_REQ, 85 service, 0, reason, 10, 0, true); 86 tt_int_op(metrics_store_entry_get_value(entry), OP_EQ, 10); 87 88 hs_metrics_update_by_ident(HS_METRICS_NUM_REJECTED_INTRO_REQ, 89 &service->keys.identity_pk, 0, reason, 90 345, 0, true); 91 tt_int_op(metrics_store_entry_get_value(entry), OP_EQ, 345); 92 93 done: 94 hs_free_all(); 95 } 96 97 struct testcase_t hs_metrics_tests[] = { 98 99 { "metrics", test_metrics, TT_FORK, NULL, NULL }, 100 101 END_OF_TESTCASES 102 };