[tor-commits] [tor/master] Add unit test for dirserv measured bandwidth cache

nickm at torproject.org nickm at torproject.org
Mon Mar 18 19:19:01 UTC 2013


commit 6e978ab8294eda5bb9a658c8d062bdd0098a9ac5
Author: Andrea Shepard <andrea at torproject.org>
Date:   Thu Mar 7 15:41:22 2013 -0800

    Add unit test for dirserv measured bandwidth cache
---
 src/or/dirserv.c    |   20 +++----------
 src/or/dirserv.h    |   12 ++++++++
 src/test/test_dir.c |   78 +++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 95 insertions(+), 15 deletions(-)

diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index 3dfa1e7..e97def7 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -85,18 +85,8 @@ static const signed_descriptor_t *get_signed_descriptor_by_fp(
                                                         time_t publish_cutoff);
 static was_router_added_t dirserv_add_extrainfo(extrainfo_t *ei,
                                                 const char **msg);
-static void dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line,
-                                      time_t as_of);
-static void dirserv_clear_measured_bw_cache(void);
-static void dirserv_expire_measured_bw_cache(time_t now);
-static int dirserv_get_measured_bw_cache_size(void);
-static int dirserv_query_measured_bw_cache(const char *node_id, long *bw_out,
-                                           time_t *as_of_out);
 static uint32_t dirserv_get_bandwidth_for_router(const routerinfo_t *ri);
 
-/************** Measured Bandwidth parsing code ******/
-#define MAX_MEASUREMENT_AGE (3*24*60*60) /* 3 days */
-
 /************** Fingerprint handling code ************/
 
 #define FP_NAMED   1  /**< Listed in fingerprint file. */
@@ -2066,7 +2056,7 @@ static digestmap_t *mbw_cache = NULL;
 
 /** Store a measured bandwidth cache entry when reading the measured
  * bandwidths file. */
-static void
+void
 dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line,
                           time_t as_of)
 {
@@ -2096,7 +2086,7 @@ dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line,
 }
 
 /** Clear and free the measured bandwidth cache */
-static void
+void
 dirserv_clear_measured_bw_cache(void)
 {
   if (mbw_cache) {
@@ -2107,7 +2097,7 @@ dirserv_clear_measured_bw_cache(void)
 }
 
 /** Scan the measured bandwidth cache and remove expired entries */
-static void
+void
 dirserv_expire_measured_bw_cache(time_t now)
 {
   digestmap_iter_t *itr = NULL;
@@ -2152,7 +2142,7 @@ dirserv_expire_measured_bw_cache(time_t now)
 }
 
 /** Get the current size of the measured bandwidth cache */
-static int
+int
 dirserv_get_measured_bw_cache_size(void)
 {
   if (mbw_cache) return digestmap_size(mbw_cache);
@@ -2161,7 +2151,7 @@ dirserv_get_measured_bw_cache_size(void)
 
 /** Query the cache by identity digest, return value indicates whether
  * we found it. */
-static int
+int
 dirserv_query_measured_bw_cache(const char *node_id, long *bw_out,
                                 time_t *as_of_out)
 {
diff --git a/src/or/dirserv.h b/src/or/dirserv.h
index 0caf55f..887a499 100644
--- a/src/or/dirserv.h
+++ b/src/or/dirserv.h
@@ -138,10 +138,22 @@ void cached_dir_decref(cached_dir_t *d);
 cached_dir_t *new_cached_dir(char *s, time_t published);
 
 #ifdef DIRSERV_PRIVATE
+
+/* Put the MAX_MEASUREMENT_AGE #define here so unit tests can see it */
+#define MAX_MEASUREMENT_AGE (3*24*60*60) /* 3 days */
+
 int measured_bw_line_parse(measured_bw_line_t *out, const char *line);
 
 int measured_bw_line_apply(measured_bw_line_t *parsed_line,
                            smartlist_t *routerstatuses);
+
+void dirserv_cache_measured_bw(const measured_bw_line_t *parsed_line,
+                               time_t as_of);
+void dirserv_clear_measured_bw_cache(void);
+void dirserv_expire_measured_bw_cache(time_t now);
+int dirserv_get_measured_bw_cache_size(void);
+int dirserv_query_measured_bw_cache(const char *node_id, long *bw_out,
+                                    time_t *as_of_out);
 #endif
 
 int dirserv_read_measured_bandwidths(const char *from_file,
diff --git a/src/test/test_dir.c b/src/test/test_dir.c
index fbd49b7..667e8f4 100644
--- a/src/test/test_dir.c
+++ b/src/test/test_dir.c
@@ -575,6 +575,83 @@ test_dir_measured_bw(void)
   return;
 }
 
+#define MBWC_INIT_TIME 1000
+
+/** Do the measured bandwidth cache unit test */
+static void
+test_dir_measured_bw_cache(void)
+{
+  /* Initial fake time_t for testing */
+  time_t curr = MBWC_INIT_TIME;
+  /* Some measured_bw_line_ts */
+  measured_bw_line_t mbwl[3];
+  /* For receiving output on cache queries */
+  long bw;
+  time_t as_of;
+
+  /* First, clear the cache and assert that it's empty */
+  dirserv_clear_measured_bw_cache();
+  test_eq(dirserv_get_measured_bw_cache_size(), 0);
+  /*
+   * Set up test mbwls; none of the dirserv_cache_*() functions care about
+   * the node_hex field.
+   */
+  memset(mbwl[0].node_id, 0x01, DIGEST_LEN);
+  mbwl[0].bw = 20;
+  memset(mbwl[1].node_id, 0x02, DIGEST_LEN);
+  mbwl[1].bw = 40;
+  memset(mbwl[2].node_id, 0x03, DIGEST_LEN);
+  mbwl[2].bw = 80;
+  /* Try caching something */
+  dirserv_cache_measured_bw(&(mbwl[0]), curr);
+  test_eq(dirserv_get_measured_bw_cache_size(), 1);
+  /* Okay, let's see if we can retrieve it */
+  test_assert(dirserv_query_measured_bw_cache(mbwl[0].node_id, &bw, &as_of));
+  test_eq(bw, 20);
+  test_eq(as_of, MBWC_INIT_TIME);
+  /* Try retrieving it without some outputs */
+  test_assert(dirserv_query_measured_bw_cache(mbwl[0].node_id, NULL, NULL));
+  test_assert(dirserv_query_measured_bw_cache(mbwl[0].node_id, &bw, NULL));
+  test_eq(bw, 20);
+  test_assert(dirserv_query_measured_bw_cache(mbwl[0].node_id, NULL, &as_of));
+  test_eq(as_of, MBWC_INIT_TIME);
+  /* Now expire it */
+  curr += MAX_MEASUREMENT_AGE + 1;
+  dirserv_expire_measured_bw_cache(curr);
+  /* Check that the cache is empty */
+  test_eq(dirserv_get_measured_bw_cache_size(), 0);
+  /* Check that we can't retrieve it */
+  test_assert(!dirserv_query_measured_bw_cache(mbwl[0].node_id, NULL, NULL));
+  /* Try caching a few things now */
+  dirserv_cache_measured_bw(&(mbwl[0]), curr);
+  test_eq(dirserv_get_measured_bw_cache_size(), 1);
+  curr += MAX_MEASUREMENT_AGE / 4;
+  dirserv_cache_measured_bw(&(mbwl[1]), curr);
+  test_eq(dirserv_get_measured_bw_cache_size(), 2);
+  curr += MAX_MEASUREMENT_AGE / 4;
+  dirserv_cache_measured_bw(&(mbwl[2]), curr);
+  test_eq(dirserv_get_measured_bw_cache_size(), 3);
+  curr += MAX_MEASUREMENT_AGE / 4 + 1;
+  /* Do an expire that's too soon to get any of them */
+  dirserv_expire_measured_bw_cache(curr);
+  test_eq(dirserv_get_measured_bw_cache_size(), 3);
+  /* Push the oldest one off the cliff */
+  curr += MAX_MEASUREMENT_AGE / 4;
+  dirserv_expire_measured_bw_cache(curr);
+  test_eq(dirserv_get_measured_bw_cache_size(), 2);
+  /* And another... */
+  curr += MAX_MEASUREMENT_AGE / 4;
+  dirserv_expire_measured_bw_cache(curr);
+  test_eq(dirserv_get_measured_bw_cache_size(), 1);
+  /* This should empty it out again */
+  curr += MAX_MEASUREMENT_AGE / 4;
+  dirserv_expire_measured_bw_cache(curr);
+  test_eq(dirserv_get_measured_bw_cache_size(), 0);
+
+ done:
+  return;
+}
+
 static void
 test_dir_param_voting(void)
 {
@@ -2141,6 +2218,7 @@ struct testcase_t dir_tests[] = {
   DIR(scale_bw),
   DIR_LEGACY(clip_unmeasured_bw),
   DIR_LEGACY(clip_unmeasured_bw_alt),
+  DIR_LEGACY(measured_bw_cache),
   END_OF_TESTCASES
 };
 





More information about the tor-commits mailing list