20#include <test/csf/ledgers.h>
22#include <xrpld/consensus/LedgerTrie.h>
24#include <xrpl/beast/unit_test.h>
40 LedgerHistoryHelper h;
54 LedgerHistoryHelper h;
78 LedgerHistoryHelper h;
104 LedgerHistoryHelper h;
122 LedgerHistoryHelper h;
143 LedgerHistoryHelper h;
167 LedgerHistoryHelper h;
170 BEAST_EXPECT(!t.
remove(h[
"ab"]));
172 BEAST_EXPECT(!t.
remove(h[
"a"]));
178 LedgerHistoryHelper h;
184 BEAST_EXPECT(!t.
remove(h[
"abc"]));
192 LedgerHistoryHelper h;
196 BEAST_EXPECT(t.
remove(h[
"abc"]));
202 BEAST_EXPECT(t.
remove(h[
"abc"], 2));
208 BEAST_EXPECT(t.
remove(h[
"abc"], 300));
215 LedgerHistoryHelper h;
224 BEAST_EXPECT(t.
remove(h[
"abc"]));
234 LedgerHistoryHelper h;
244 BEAST_EXPECT(t.
remove(h[
"abc"]));
254 LedgerHistoryHelper h;
263 BEAST_EXPECT(t.
remove(h[
"abc"]));
272 LedgerHistoryHelper h;
297 LedgerHistoryHelper h;
298 BEAST_EXPECT(t.
empty());
302 BEAST_EXPECT(!t.
empty());
304 BEAST_EXPECT(t.
empty());
307 BEAST_EXPECT(!t.
empty());
309 BEAST_EXPECT(t.
empty());
316 using Seq = Ledger::Seq;
319 LedgerHistoryHelper h;
364 using Seq = Ledger::Seq;
374 LedgerHistoryHelper h;
377 BEAST_EXPECT(t.
getPreferred(Seq{0})->id == genesis.id());
378 BEAST_EXPECT(t.
remove(genesis));
380 BEAST_EXPECT(!t.
remove(genesis));
385 LedgerHistoryHelper h;
387 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
392 LedgerHistoryHelper h;
395 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
396 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
401 LedgerHistoryHelper h;
404 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcd"].id());
405 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcd"].id());
410 LedgerHistoryHelper h;
414 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
415 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
418 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
419 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
424 LedgerHistoryHelper h;
428 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
429 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
432 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcd"].id());
433 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcd"].id());
438 LedgerHistoryHelper h;
442 BEAST_EXPECT(h[
"abce"].
id() > h[
"abcd"].
id());
443 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abce"].id());
446 BEAST_EXPECT(h[
"abce"].
id() > h[
"abcd"].
id());
447 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcd"].id());
453 LedgerHistoryHelper h;
458 BEAST_EXPECT(h[
"abce"].
id() > h[
"abcd"].
id());
459 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abce"].id());
460 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abce"].id());
465 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
466 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
472 LedgerHistoryHelper h;
476 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcde"].id());
477 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcde"].id());
478 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"abcde"].id());
484 LedgerHistoryHelper h;
489 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
490 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
491 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"abc"].id());
498 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcde"].id());
499 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcde"].id());
504 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"abc"].id());
521 LedgerHistoryHelper h;
528 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"ab"].id());
529 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"ab"].id());
532 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"a"].id());
533 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"a"].id());
549 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"ab"].id());
550 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"ab"].id());
551 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"a"].id());
552 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"a"].id());
553 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"a"].id());
568 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"ab"].id());
569 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"ab"].id());
570 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"ab"].id());
571 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"a"].id());
572 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"a"].id());
587 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"abde"].id());
588 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"abde"].id());
589 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abde"].id());
590 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"ab"].id());
591 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"ab"].id());
599 using Seq = Ledger::Seq;
604 LedgerHistoryHelper h;
605 BEAST_EXPECT(!t.
remove(h[
""]));
619 BEAST_EXPECT(t.
remove(h[
"e"]));
630 LedgerHistoryHelper h;
651 char depth = depthDist(gen);
653 for (
char d = 0; d < depth; ++d)
655 char a = offset + widthDist(gen);
657 offset = (a + 1) * width;
Ancestry trie of ledgers.
bool empty() const
Return whether the trie is tracking any ledgers.
std::uint32_t tipSupport(Ledger const &ledger) const
Return count of tip support for the specific ledger.
void insert(Ledger const &ledger, std::uint32_t count=1)
Insert and/or increment the support for the given ledger.
std::optional< SpanTip< Ledger > > getPreferred(Seq const largestIssued) const
Return the preferred ledger ID.
std::uint32_t branchSupport(Ledger const &ledger) const
Return the count of branch support for the specific ledger.
bool remove(Ledger const &ledger, std::uint32_t count=1)
Decrease support for a ledger, removing and compressing if possible.
bool checkInvariants() const
Check the compressed trie and support invariants.
void run() override
Runs the suite.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.