summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2018-11-19 15:35:55 -0500
committerNick Mathewson <nickm@torproject.org>2018-11-26 16:32:40 -0500
commit55512ef022de39770e0787e9dfc2e29e762652ae (patch)
tree7f6a5b08a555de2968752fa76d1d786948800a7a /src/test
parent3743f7969587079a2f2bb03d0b7e5038557fd64a (diff)
downloadtor-55512ef022de39770e0787e9dfc2e29e762652ae.tar.gz
tor-55512ef022de39770e0787e9dfc2e29e762652ae.zip
Test netstatus.c tracking of user participation status
Diffstat (limited to 'src/test')
-rw-r--r--src/test/test_mainloop.c57
1 files changed, 56 insertions, 1 deletions
diff --git a/src/test/test_mainloop.c b/src/test/test_mainloop.c
index 92ce2e9918..94b684fb3a 100644
--- a/src/test/test_mainloop.c
+++ b/src/test/test_mainloop.c
@@ -11,6 +11,7 @@
#include "core/or/or.h"
#include "core/mainloop/mainloop.h"
+#include "core/mainloop/netstatus.h"
static const uint64_t BILLION = 1000000000;
@@ -131,12 +132,66 @@ test_mainloop_update_time_jumps(void *arg)
monotime_disable_test_mocking();
}
+static int schedule_rescan_called = 0;
+static void
+mock_schedule_rescan_periodic_events(void)
+{
+ ++schedule_rescan_called;
+}
+
+static void
+test_mainloop_user_activity(void *arg)
+{
+ (void)arg;
+ const time_t start = 1542658829;
+ update_approx_time(start);
+
+ MOCK(schedule_rescan_periodic_events, mock_schedule_rescan_periodic_events);
+
+ reset_user_activity(start);
+ tt_i64_op(get_last_user_activity_time(), OP_EQ, start);
+
+ set_network_participation(false);
+
+ // reset can move backwards and forwards, but does not change network
+ // participation.
+ reset_user_activity(start-10);
+ tt_i64_op(get_last_user_activity_time(), OP_EQ, start-10);
+ reset_user_activity(start+10);
+ tt_i64_op(get_last_user_activity_time(), OP_EQ, start+10);
+
+ tt_int_op(schedule_rescan_called, OP_EQ, 0);
+ tt_int_op(false, OP_EQ, is_participating_on_network());
+
+ // "note" can only move forward. Calling it from a non-participating
+ // state makes us rescan the periodic callbacks and set participation.
+ note_user_activity(start+20);
+ tt_i64_op(get_last_user_activity_time(), OP_EQ, start+20);
+ tt_int_op(true, OP_EQ, is_participating_on_network());
+ tt_int_op(schedule_rescan_called, OP_EQ, 1);
+
+ // Calling it again will move us forward, but not call rescan again.
+ note_user_activity(start+25);
+ tt_i64_op(get_last_user_activity_time(), OP_EQ, start+25);
+ tt_int_op(true, OP_EQ, is_participating_on_network());
+ tt_int_op(schedule_rescan_called, OP_EQ, 1);
+
+ // We won't move backwards.
+ note_user_activity(start+20);
+ tt_i64_op(get_last_user_activity_time(), OP_EQ, start+25);
+ tt_int_op(true, OP_EQ, is_participating_on_network());
+ tt_int_op(schedule_rescan_called, OP_EQ, 1);
+
+ done:
+ UNMOCK(schedule_rescan_periodic_events);
+}
+
#define MAINLOOP_TEST(name) \
{ #name, test_mainloop_## name , TT_FORK, NULL, NULL }
struct testcase_t mainloop_tests[] = {
MAINLOOP_TEST(update_time_normal),
MAINLOOP_TEST(update_time_jumps),
+ MAINLOOP_TEST(user_activity),
END_OF_TESTCASES
};
-