aboutsummaryrefslogtreecommitdiffstats
path: root/tests/internals
diff options
context:
space:
mode:
Diffstat (limited to 'tests/internals')
-rw-r--r--tests/internals/Makefile.am14
-rw-r--r--tests/internals/test_common.c9
-rw-r--r--tests/internals/test_common.h17
-rw-r--r--tests/internals/test_internals.c14
-rw-r--r--tests/internals/test_rate_limiter.c68
-rwxr-xr-xtests/internals/test_rate_limiter_valgrind.sh3
6 files changed, 109 insertions, 16 deletions
diff --git a/tests/internals/Makefile.am b/tests/internals/Makefile.am
index c3116e6..3006399 100644
--- a/tests/internals/Makefile.am
+++ b/tests/internals/Makefile.am
@@ -1,9 +1,15 @@
-noinst_PROGRAMS = test_internals
-test_internals_SOURCES = test_internals.c $(top_builddir)/src/misc.c
+noinst_HEADERS = test_common.h
+noinst_PROGRAMS = test_internals test_rate_limiter
+test_internals_SOURCES = test_internals.c test_common.c $(top_builddir)/src/misc.c
+test_rate_limiter_SOURCES = test_rate_limiter.c test_common.c $(top_builddir)/src/rate_limiter.c
-test_internals_CPPFLAGS = ${my_CPPFLAGS} ${fuse_CFLAGS} -I$(top_builddir)/src
+test_internals_CPPFLAGS = ${my_CPPFLAGS} ${fuse_CFLAGS} -I. -I$(top_builddir)/src
test_internals_CFLAGS = ${my_CFLAGS}
test_internals_LDADD = ${my_LDFLAGS}
-TESTS = test_internals_valgrind.sh
+test_rate_limiter_CPPFLAGS = ${my_CPPFLAGS} ${fuse_CFLAGS} -I. -I$(top_builddir)/src
+test_rate_limiter_CFLAGS = ${my_CFLAGS}
+test_rate_limiter_LDADD = ${my_LDFLAGS}
+
+TESTS = test_internals_valgrind.sh test_rate_limiter_valgrind.sh
diff --git a/tests/internals/test_common.c b/tests/internals/test_common.c
new file mode 100644
index 0000000..6c10292
--- /dev/null
+++ b/tests/internals/test_common.c
@@ -0,0 +1,9 @@
+
+#include "test_common.h"
+
+int failures = 0;
+
+int run_suite(void (*suite)()) {
+ suite();
+ return (failures > 0) ? 1 : 0;
+}
diff --git a/tests/internals/test_common.h b/tests/internals/test_common.h
new file mode 100644
index 0000000..160d9b9
--- /dev/null
+++ b/tests/internals/test_common.h
@@ -0,0 +1,17 @@
+
+#ifndef INC_BINDFS_TEST_COMMON_H
+#define INC_BINDFS_TEST_COMMON_H
+
+#include <stdio.h>
+#include <math.h>
+
+extern int failures;
+
+#define TEST_ASSERT(expr) do { if (!(expr)) { printf("Assertion failed: %s:%d: `%s'\n", __FILE__, __LINE__, #expr); failures++; } } while (0);
+#define NEAR(a, b, eps) (fabs((a) - (b)) < (eps))
+
+int run_suite(void (*suite)());
+
+#define TEST_MAIN(suite) int main() { return run_suite(suite); }
+
+#endif
diff --git a/tests/internals/test_internals.c b/tests/internals/test_internals.c
index cf7a18b..aba4045 100644
--- a/tests/internals/test_internals.c
+++ b/tests/internals/test_internals.c
@@ -1,13 +1,9 @@
+#include "test_common.h"
#include "misc.h"
#include <string.h>
-#include <stdio.h>
#include <stdlib.h>
-int failures = 0;
-
-#define TEST_ASSERT(expr) do { if (!(expr)) { printf("Assertion failed: `%s'\n", #expr); failures++; } } while (0);
-
void test_my_dirname(char *arg, const char *expected)
{
char *orig = strdup(arg);
@@ -56,10 +52,4 @@ void my_dirname_suite()
test_my_dirname(buf, "..");
}
-int main()
-{
- my_dirname_suite();
-
- return (failures > 0) ? 1 : 0;
-}
-
+TEST_MAIN(my_dirname_suite);
diff --git a/tests/internals/test_rate_limiter.c b/tests/internals/test_rate_limiter.c
new file mode 100644
index 0000000..93cdda5
--- /dev/null
+++ b/tests/internals/test_rate_limiter.c
@@ -0,0 +1,68 @@
+
+#include "test_common.h"
+#include "rate_limiter.h"
+
+static const double epsilon = 0.000000000001;
+
+static volatile double time_now = 123123.0;
+
+double test_clock()
+{
+ return time_now;
+}
+
+void computes_correct_sleep_times()
+{
+ time_now = 123123.0;
+ RateLimiter limiter;
+ rate_limiter_init(&limiter, 10, &test_clock);
+
+ double sleep_time = rate_limiter_wait_nosleep(&limiter, 30);
+ TEST_ASSERT(NEAR(3.0 + rate_limiter_idle_credit, sleep_time, epsilon));
+ sleep_time = rate_limiter_wait_nosleep(&limiter, 20);
+ TEST_ASSERT(NEAR(5.0 + rate_limiter_idle_credit, sleep_time, epsilon));
+
+ time_now += 0.5;
+ sleep_time = rate_limiter_wait_nosleep(&limiter, 30);
+ TEST_ASSERT(NEAR(7.5 + rate_limiter_idle_credit, sleep_time, epsilon));
+
+ rate_limiter_destroy(&limiter);
+}
+
+void works_after_being_idle()
+{
+ time_now = 123123.0;
+ RateLimiter limiter;
+ rate_limiter_init(&limiter, 10, &test_clock);
+
+ double sleep_time = rate_limiter_wait_nosleep(&limiter, 30);
+ TEST_ASSERT(NEAR(3.0 + rate_limiter_idle_credit, sleep_time, epsilon));
+ time_now += 100;
+
+ sleep_time = rate_limiter_wait_nosleep(&limiter, 20);
+ TEST_ASSERT(NEAR(2 + rate_limiter_idle_credit, sleep_time, epsilon));
+
+ rate_limiter_destroy(&limiter);
+}
+
+void sleeps_correct_amount()
+{
+ RateLimiter limiter;
+ rate_limiter_init(&limiter, 10, &gettimeofday_clock);
+
+ double start = gettimeofday_clock();
+ rate_limiter_wait(&limiter, 5);
+ double elapsed = gettimeofday_clock() - start;
+ TEST_ASSERT(NEAR(0.5, elapsed, 0.2));
+
+ rate_limiter_destroy(&limiter);
+}
+
+void rate_limiter_suite()
+{
+ computes_correct_sleep_times();
+ works_after_being_idle();
+ sleeps_correct_amount();
+}
+
+TEST_MAIN(rate_limiter_suite);
diff --git a/tests/internals/test_rate_limiter_valgrind.sh b/tests/internals/test_rate_limiter_valgrind.sh
new file mode 100755
index 0000000..e291360
--- /dev/null
+++ b/tests/internals/test_rate_limiter_valgrind.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+cd `dirname "$0"`
+valgrind --error-exitcode=100 ./test_rate_limiter