[tor-commits] [tor/master] test: Unit test for the HS service event rescan

nickm at torproject.org nickm at torproject.org
Fri Apr 27 16:33:15 UTC 2018


commit 8b58e1e323e362463906d2576b9d2b9e788c2f30
Author: David Goulet <dgoulet at torproject.org>
Date:   Fri Apr 27 11:16:00 2018 -0400

    test: Unit test for the HS service event rescan
    
    Because we rescan the main loop event list if the global map of services has
    changed, this makes sure it does work.
    
    Signed-off-by: David Goulet <dgoulet at torproject.org>
---
 src/test/test_periodic_event.c | 57 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)

diff --git a/src/test/test_periodic_event.c b/src/test/test_periodic_event.c
index 9f62cd680..74e799360 100644
--- a/src/test/test_periodic_event.c
+++ b/src/test/test_periodic_event.c
@@ -253,6 +253,62 @@ test_pe_get_roles(void *arg)
   hs_free_all();
 }
 
+static void
+test_pe_hs_service(void *arg)
+{
+  hs_service_t service, *to_remove = NULL;
+
+  (void) arg;
+
+  hs_init();
+  /* We need to put tor in hibernation live state so the events requiring
+   * network gets enabled. */
+  consider_hibernation(time(NULL));
+  /* Initialize the events so we can enable them */
+  initialize_periodic_events();
+
+  /* Hack: We'll set a dumb fn() of each events so they don't get called when
+   * dispatching them. We just want to test the state of the callbacks, not
+   * the whole code path. */
+  for (int i = 0; periodic_events[i].name; ++i) {
+    periodic_event_item_t *item = &periodic_events[i];
+    item->fn = dumb_event_fn;
+  }
+
+  /* This should trigger a rescan of the list and enable the HS service
+   * events. */
+  register_dummy_hidden_service(&service);
+  /* Note down the reference because we need to remove this service from the
+   * global list before the hs_free_all() call so it doesn't try to free
+   * memory on the stack. Furthermore, we can't remove it now else it will
+   * trigger a rescan of the event disabling the HS service event. */
+  to_remove = &service;
+
+  for (int i = 0; periodic_events[i].name; ++i) {
+    periodic_event_item_t *item = &periodic_events[i];
+    if (item->roles & PERIODIC_EVENT_ROLE_HS_SERVICE) {
+      tt_int_op(periodic_event_is_enabled(item), OP_EQ, 1);
+    }
+  }
+  to_remove = NULL;
+
+  /* Remove the service from the global map, it should trigger a rescan and
+   * disable the HS service events. */
+  remove_service(get_hs_service_map(), &service);
+  for (int i = 0; periodic_events[i].name; ++i) {
+    periodic_event_item_t *item = &periodic_events[i];
+    if (item->roles & PERIODIC_EVENT_ROLE_HS_SERVICE) {
+      tt_int_op(periodic_event_is_enabled(item), OP_EQ, 0);
+    }
+  }
+
+ done:
+  if (to_remove) {
+    remove_service(get_hs_service_map(), to_remove);
+  }
+  hs_free_all();
+}
+
 #define PE_TEST(name) \
   { #name, test_pe_## name , TT_FORK, NULL, NULL }
 
@@ -260,6 +316,7 @@ struct testcase_t periodic_event_tests[] = {
   PE_TEST(initialize),
   PE_TEST(launch),
   PE_TEST(get_roles),
+  PE_TEST(hs_service),
 
   END_OF_TESTCASES
 };



More information about the tor-commits mailing list