20#include <xrpld/app/misc/HashRouter.h>
21#include <xrpld/core/Config.h>
23#include <xrpl/basics/chrono.h>
24#include <xrpl/beast/unit_test.h>
44 using namespace std::chrono_literals;
54 BEAST_EXPECT(router.
getFlags(key1) == 11111);
56 BEAST_EXPECT(router.
getFlags(key2) == 22222);
65 BEAST_EXPECT(router.
getFlags(key1) == 11111);
74 BEAST_EXPECT(router.
getFlags(key1) == 11111);
75 BEAST_EXPECT(router.
getFlags(key2) == 0);
82 using namespace std::chrono_literals;
90 BEAST_EXPECT(key1 != key2 && key2 != key3 && key3 != key4);
94 BEAST_EXPECT(router.
getFlags(key1) == 12345);
107 BEAST_EXPECT(router.
getFlags(key1) == 12345);
108 BEAST_EXPECT(router.
getFlags(key2) == 9999);
115 BEAST_EXPECT(router.
getFlags(key2) == 9999);
123 BEAST_EXPECT(router.
getFlags(key1) == 0);
124 BEAST_EXPECT(router.
getFlags(key2) == 9999);
125 BEAST_EXPECT(router.
getFlags(key3) == 2222);
134 BEAST_EXPECT(router.
getFlags(key1) == 7654);
135 BEAST_EXPECT(router.
getFlags(key2) == 9999);
136 BEAST_EXPECT(router.
getFlags(key3) == 2222);
146 BEAST_EXPECT(router.
getFlags(key1) == 0);
147 BEAST_EXPECT(router.
getFlags(key2) == 0);
148 BEAST_EXPECT(router.
getFlags(key3) == 0);
149 BEAST_EXPECT(router.
getFlags(key4) == 7890);
161 using namespace std::chrono_literals;
169 BEAST_EXPECT(key1 != key2 && key2 != key3 && key3 != key4);
175 BEAST_EXPECT(
flags == 0);
182 BEAST_EXPECT(
flags == 0);
190 using namespace std::chrono_literals;
195 BEAST_EXPECT(router.
setFlags(key1, 10));
196 BEAST_EXPECT(!router.
setFlags(key1, 10));
197 BEAST_EXPECT(router.
setFlags(key1, 20));
204 using namespace std::chrono_literals;
213 BEAST_EXPECT(peers && peers->empty());
225 BEAST_EXPECT(peers && peers->size() == 3);
236 BEAST_EXPECT(peers && peers->size() == 2);
241 BEAST_EXPECT(peers && peers->size() == 0);
248 using namespace std::chrono_literals;
267 using namespace std::chrono_literals;
272 BEAST_EXPECT(setup.holdTime == 300s);
273 BEAST_EXPECT(setup.relayTime == 30s);
278 auto& h = cfg.
section(
"hashrouter");
279 h.
set(
"hold_time",
"600");
280 h.set(
"relay_time",
"15");
282 BEAST_EXPECT(setup.holdTime == 600s);
283 BEAST_EXPECT(setup.relayTime == 15s);
288 auto& h = cfg.
section(
"hashrouter");
289 h.
set(
"hold_time",
"400");
290 h.set(
"relay_time",
"400");
292 BEAST_EXPECT(setup.holdTime == 400s);
293 BEAST_EXPECT(setup.relayTime == 400s);
298 auto& h = cfg.
section(
"hashrouter");
299 h.
set(
"hold_time",
"60");
300 h.set(
"relay_time",
"120");
309 "HashRouter relay time must be less than or equal to hold "
311 BEAST_EXPECT(e.
what() == expected);
317 auto& h = cfg.
section(
"hashrouter");
318 h.
set(
"hold_time",
"10");
319 h.set(
"relay_time",
"120");
328 "HashRouter hold time must be at least 12 seconds (the "
329 "approximate validation time for three "
331 BEAST_EXPECT(e.
what() == expected);
337 auto& h = cfg.
section(
"hashrouter");
338 h.
set(
"hold_time",
"500");
339 h.set(
"relay_time",
"6");
348 "HashRouter relay time must be at least 8 seconds (the "
349 "approximate validation time for two ledgers).";
350 BEAST_EXPECT(e.
what() == expected);
356 auto& h = cfg.
section(
"hashrouter");
357 h.
set(
"hold_time",
"alice");
358 h.set(
"relay_time",
"bob");
362 BEAST_EXPECT(setup.holdTime == 300s);
363 BEAST_EXPECT(setup.relayTime == 30s);
testcase_t testcase
Memberspace for declaring test cases.
void fail(String const &reason, char const *file, int line)
Record a failure.
Section & section(std::string const &name)
Returns the section with the given name.
Routing table for objects identified by hash.
std::optional< std::set< PeerShortID > > shouldRelay(uint256 const &key)
Determines whether the hashed item should be relayed.
bool shouldProcess(uint256 const &key, PeerShortID peer, int &flags, std::chrono::seconds tx_interval)
int getFlags(uint256 const &key)
bool addSuppressionPeer(uint256 const &key, PeerShortID peer)
bool setFlags(uint256 const &key, int flags)
Set the flags on a hash.
void addSuppression(uint256 const &key)
void set(std::string const &key, std::string const &value)
Set a key/value pair.
void run() override
Runs the suite.
HashRouter::Setup getSetup(std::chrono::seconds hold, std::chrono::seconds relay)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
HashRouter::Setup setup_HashRouter(Config const &config)
Stopwatch & stopwatch()
Returns an instance of a wall clock.
Structure used to customize HashRouter behavior.
seconds holdTime
Expiration time for a hash entry.
seconds relayTime
Amount of time required before a relayed item will be relayed again.