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
#include <gtest/gtest.h>
#include <lix/libutil/backoff.hh>

namespace nix {
TEST(Backoff, defaults)
{
    auto initial = 5;
    auto backoff = backoffTimeouts(
        5, std::chrono::seconds(300), std::chrono::seconds(initial), std::chrono::milliseconds(1000)
    );

    BackoffTiming timings = *backoff.next();
    ASSERT_EQ(10000, timings.downloadTimeout.count());
    ASSERT_LE(1500, timings.waitTime.count());
    ASSERT_GE(2500, timings.waitTime.count());

    timings = *backoff.next();
    ASSERT_EQ(20000, timings.downloadTimeout.count());
    ASSERT_LE(3500, timings.waitTime.count());
    ASSERT_GE(4500, timings.waitTime.count());

    ASSERT_TRUE(backoff.next().has_value());

    timings = *backoff.next();
    ASSERT_EQ(80000, timings.downloadTimeout.count());
    ASSERT_LE(15500, timings.waitTime.count());
    ASSERT_GE(16500, timings.waitTime.count());

    ASSERT_FALSE(backoff.next().has_value());
}

TEST(Backoff, capped)
{
    auto initial = 10;
    auto upper = 300;
    auto backoff = backoffTimeouts(
        7,
        std::chrono::seconds(upper),
        std::chrono::seconds(initial),
        std::chrono::milliseconds(1000)
    );

    BackoffTiming timings = *backoff.next();
    *backoff.next();
    *backoff.next();
    *backoff.next();
    *backoff.next();
    timings = *backoff.next();
    ASSERT_EQ(300000, timings.downloadTimeout.count());
    ASSERT_FALSE(backoff.next().has_value());
}
}