rippled
Loading...
Searching...
No Matches
Scheduler_test.cpp
1#include <test/csf/Scheduler.h>
2
3#include <xrpl/beast/unit_test.h>
4
5#include <set>
6
7namespace ripple {
8namespace test {
9
11{
12public:
13 void
14 run() override
15 {
16 using namespace std::chrono_literals;
17 csf::Scheduler scheduler;
18 std::set<int> seen;
19
20 scheduler.in(1s, [&] { seen.insert(1); });
21 scheduler.in(2s, [&] { seen.insert(2); });
22 auto token = scheduler.in(3s, [&] { seen.insert(3); });
23 scheduler.at(scheduler.now() + 4s, [&] { seen.insert(4); });
24 scheduler.at(scheduler.now() + 8s, [&] { seen.insert(8); });
25
26 auto start = scheduler.now();
27
28 // Process first event
29 BEAST_EXPECT(seen.empty());
30 BEAST_EXPECT(scheduler.step_one());
31 BEAST_EXPECT(seen == std::set<int>({1}));
32 BEAST_EXPECT(scheduler.now() == (start + 1s));
33
34 // No processing if stepping until current time
35 BEAST_EXPECT(scheduler.step_until(scheduler.now()));
36 BEAST_EXPECT(seen == std::set<int>({1}));
37 BEAST_EXPECT(scheduler.now() == (start + 1s));
38
39 // Process next event
40 BEAST_EXPECT(scheduler.step_for(1s));
41 BEAST_EXPECT(seen == std::set<int>({1, 2}));
42 BEAST_EXPECT(scheduler.now() == (start + 2s));
43
44 // Don't process cancelled event, but advance clock
45 scheduler.cancel(token);
46 BEAST_EXPECT(scheduler.step_for(1s));
47 BEAST_EXPECT(seen == std::set<int>({1, 2}));
48 BEAST_EXPECT(scheduler.now() == (start + 3s));
49
50 // Process until 3 seen ints
51 BEAST_EXPECT(scheduler.step_while([&]() { return seen.size() < 3; }));
52 BEAST_EXPECT(seen == std::set<int>({1, 2, 4}));
53 BEAST_EXPECT(scheduler.now() == (start + 4s));
54
55 // Process the rest
56 BEAST_EXPECT(scheduler.step());
57 BEAST_EXPECT(seen == std::set<int>({1, 2, 4, 8}));
58 BEAST_EXPECT(scheduler.now() == (start + 8s));
59
60 // Process the rest again doesn't advance
61 BEAST_EXPECT(!scheduler.step());
62 BEAST_EXPECT(seen == std::set<int>({1, 2, 4, 8}));
63 BEAST_EXPECT(scheduler.now() == (start + 8s));
64 }
65};
66
67BEAST_DEFINE_TESTSUITE(Scheduler, csf, ripple);
68
69} // namespace test
70} // namespace ripple
A testsuite class.
Definition suite.h:52
void run() override
Runs the suite.
Simulated discrete-event scheduler.
bool step_one()
Run the scheduler for up to one event.
bool step_while(Function &&func)
Run the scheduler while a condition is true.
cancel_token at(time_point const &when, Function &&f)
Schedule an event at a specific time.
bool step_for(std::chrono::duration< Period, Rep > const &amount)
Run the scheduler until time has elapsed.
time_point now() const
Return the current network time.
bool step_until(time_point const &until)
Run the scheduler until the specified time.
void cancel(cancel_token const &token)
Cancel a timer.
bool step()
Run the scheduler until no events remain.
cancel_token in(duration const &delay, Function &&f)
Schedule an event after a specified duration passes.
T empty(T... args)
T insert(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6