aboutsummaryrefslogtreecommitdiffstats
path: root/tests/internals/test_rate_limiter.c
blob: 93cdda54045f1c4e16a249fe506a54bdfec53e6f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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);