From d690a99dfe65ba164aa3de0662be2a8fedc69b01 Mon Sep 17 00:00:00 2001 From: Karsten Loesing Date: Thu, 4 Aug 2011 14:45:24 +0200 Subject: [PATCH] Clean up bridge-stats code. Only write a bridge-stats string if bridge stats have been initialized. This behavior is similar to dirreq-stats, entry-stats, etc. Also add a few unit tests for the bridge-stats code. --- src/or/geoip.c | 8 +++++--- src/or/geoip.h | 1 + src/test/test.c | 23 ++++++++++++++++++++++- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/or/geoip.c b/src/or/geoip.c index e525b2a095..67dea965f3 100644 --- a/src/or/geoip.c +++ b/src/or/geoip.c @@ -1197,8 +1197,8 @@ static char *bridge_stats_extrainfo = NULL; /** Return a newly allocated string holding our bridge usage stats by country * in a format suitable for inclusion in an extrainfo document. Return NULL on * failure. */ -static char * -format_bridge_stats_extrainfo(time_t now) +char * +geoip_format_bridge_stats(time_t now) { char *out = NULL, *data = NULL; long duration = now - start_of_bridge_stats_interval; @@ -1206,6 +1206,8 @@ format_bridge_stats_extrainfo(time_t now) if (duration < 0) return NULL; + if (!start_of_bridge_stats_interval) + return NULL; /* Not initialized. */ format_iso_time(written, now); data = geoip_get_client_history(GEOIP_CLIENT_CONNECT); @@ -1255,7 +1257,7 @@ geoip_bridge_stats_write(time_t now) geoip_remove_old_clients(start_of_bridge_stats_interval); /* Generate formatted string */ - val = format_bridge_stats_extrainfo(now); + val = geoip_format_bridge_stats(now); if (val == NULL) goto done; diff --git a/src/or/geoip.h b/src/or/geoip.h index 3372260357..ce3841967f 100644 --- a/src/or/geoip.h +++ b/src/or/geoip.h @@ -53,6 +53,7 @@ void geoip_entry_stats_term(void); void geoip_reset_entry_stats(time_t now); char *geoip_format_entry_stats(time_t now); void geoip_bridge_stats_init(time_t now); +char *geoip_format_bridge_stats(time_t now); time_t geoip_bridge_stats_write(time_t now); void geoip_bridge_stats_term(void); const char *geoip_get_bridge_stats_extrainfo(time_t); diff --git a/src/test/test.c b/src/test/test.c index fe8146a097..605e44ca4d 100644 --- a/src/test/test.c +++ b/src/test/test.c @@ -1483,7 +1483,10 @@ test_geoip(void) int i, j; time_t now = 1281533250; /* 2010-08-11 13:27:30 UTC */ char *s = NULL; - const char *dirreq_stats_1 = + const char *bridge_stats_1 = + "bridge-stats-end 2010-08-12 13:27:30 (86400 s)\n" + "bridge-ips zz=24,xy=8\n", + *dirreq_stats_1 = "dirreq-stats-end 2010-08-12 13:27:30 (86400 s)\n" "dirreq-v3-ips ab=8\n" "dirreq-v2-ips \n" @@ -1594,6 +1597,24 @@ test_geoip(void) test_assert(s); test_streq("zz=24,xy=8", s); + /* Start testing bridge statistics by making sure that we don't output + * bridge stats without initializing them. */ + s = geoip_format_bridge_stats(now + 86400); + test_assert(!s); + + /* Initialize stats and generate the bridge-stats history string out of + * the connecting clients added above. */ + geoip_bridge_stats_init(now); + s = geoip_format_bridge_stats(now + 86400); + test_streq(bridge_stats_1, s); + tor_free(s); + + /* Stop collecting bridge stats and make sure we don't write a history + * string anymore. */ + geoip_bridge_stats_term(); + s = geoip_format_bridge_stats(now + 86400); + test_assert(!s); + /* Stop being a bridge and start being a directory mirror that gathers * directory request statistics. */ geoip_bridge_stats_term();