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());
318 LedgerHistoryHelper h;
363 using Seq = Ledger::Seq;
373 LedgerHistoryHelper h;
376 BEAST_EXPECT(t.
getPreferred(Seq{0})->id == genesis.id());
377 BEAST_EXPECT(t.
remove(genesis));
379 BEAST_EXPECT(!t.
remove(genesis));
384 LedgerHistoryHelper h;
386 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
391 LedgerHistoryHelper h;
394 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
395 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
400 LedgerHistoryHelper h;
403 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcd"].id());
404 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcd"].id());
409 LedgerHistoryHelper h;
413 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
414 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
417 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
418 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
423 LedgerHistoryHelper h;
427 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
428 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
431 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcd"].id());
432 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcd"].id());
437 LedgerHistoryHelper h;
441 BEAST_EXPECT(h[
"abce"].
id() > h[
"abcd"].
id());
442 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abce"].id());
445 BEAST_EXPECT(h[
"abce"].
id() > h[
"abcd"].
id());
446 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcd"].id());
452 LedgerHistoryHelper h;
457 BEAST_EXPECT(h[
"abce"].
id() > h[
"abcd"].
id());
458 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abce"].id());
459 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abce"].id());
464 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
465 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
471 LedgerHistoryHelper h;
475 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcde"].id());
476 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcde"].id());
477 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"abcde"].id());
483 LedgerHistoryHelper h;
488 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
489 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
490 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"abc"].id());
497 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcde"].id());
498 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcde"].id());
503 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"abc"].id());
520 LedgerHistoryHelper h;
527 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"ab"].id());
528 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"ab"].id());
531 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"a"].id());
532 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"a"].id());
548 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"ab"].id());
549 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"ab"].id());
550 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"a"].id());
551 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"a"].id());
552 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"a"].id());
567 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"ab"].id());
568 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"ab"].id());
569 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"ab"].id());
570 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"a"].id());
571 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"a"].id());
586 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"abde"].id());
587 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"abde"].id());
588 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abde"].id());
589 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"ab"].id());
590 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"ab"].id());
602 LedgerHistoryHelper h;
603 BEAST_EXPECT(!t.
remove(h[
""]));
617 BEAST_EXPECT(t.
remove(h[
"e"]));
628 LedgerHistoryHelper h;
649 char depth = depthDist(gen);
651 for (
char d = 0; d < depth; ++d)
653 char a = offset + widthDist(gen);
655 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.