diff options
Diffstat (limited to 'tests/internals')
-rw-r--r-- | tests/internals/Makefile.am | 14 | ||||
-rw-r--r-- | tests/internals/test_common.c | 9 | ||||
-rw-r--r-- | tests/internals/test_common.h | 17 | ||||
-rw-r--r-- | tests/internals/test_internals.c | 14 | ||||
-rw-r--r-- | tests/internals/test_rate_limiter.c | 68 | ||||
-rwxr-xr-x | tests/internals/test_rate_limiter_valgrind.sh | 3 |
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 |