1#include <test/csf/ledgers.h>
3#include <xrpld/consensus/LedgerTrie.h>
5#include <xrpl/beast/unit_test.h>
21 LedgerHistoryHelper h;
35 LedgerHistoryHelper h;
59 LedgerHistoryHelper h;
85 LedgerHistoryHelper h;
103 LedgerHistoryHelper h;
124 LedgerHistoryHelper h;
148 LedgerHistoryHelper h;
151 BEAST_EXPECT(!t.
remove(h[
"ab"]));
153 BEAST_EXPECT(!t.
remove(h[
"a"]));
159 LedgerHistoryHelper h;
165 BEAST_EXPECT(!t.
remove(h[
"abc"]));
173 LedgerHistoryHelper h;
177 BEAST_EXPECT(t.
remove(h[
"abc"]));
183 BEAST_EXPECT(t.
remove(h[
"abc"], 2));
189 BEAST_EXPECT(t.
remove(h[
"abc"], 300));
196 LedgerHistoryHelper h;
205 BEAST_EXPECT(t.
remove(h[
"abc"]));
215 LedgerHistoryHelper h;
225 BEAST_EXPECT(t.
remove(h[
"abc"]));
235 LedgerHistoryHelper h;
244 BEAST_EXPECT(t.
remove(h[
"abc"]));
253 LedgerHistoryHelper h;
278 LedgerHistoryHelper h;
279 BEAST_EXPECT(t.
empty());
283 BEAST_EXPECT(!t.
empty());
285 BEAST_EXPECT(t.
empty());
288 BEAST_EXPECT(!t.
empty());
290 BEAST_EXPECT(t.
empty());
299 LedgerHistoryHelper h;
344 using Seq = Ledger::Seq;
354 LedgerHistoryHelper h;
357 BEAST_EXPECT(t.
getPreferred(Seq{0})->id == genesis.id());
358 BEAST_EXPECT(t.
remove(genesis));
360 BEAST_EXPECT(!t.
remove(genesis));
365 LedgerHistoryHelper h;
367 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
372 LedgerHistoryHelper h;
375 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
376 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
381 LedgerHistoryHelper h;
384 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcd"].id());
385 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcd"].id());
390 LedgerHistoryHelper h;
394 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
395 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
398 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
399 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
404 LedgerHistoryHelper h;
408 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
409 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
412 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcd"].id());
413 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcd"].id());
418 LedgerHistoryHelper h;
422 BEAST_EXPECT(h[
"abce"].
id() > h[
"abcd"].
id());
423 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abce"].id());
426 BEAST_EXPECT(h[
"abce"].
id() > h[
"abcd"].
id());
427 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcd"].id());
433 LedgerHistoryHelper h;
438 BEAST_EXPECT(h[
"abce"].
id() > h[
"abcd"].
id());
439 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abce"].id());
440 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abce"].id());
445 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
446 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
452 LedgerHistoryHelper h;
456 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcde"].id());
457 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcde"].id());
458 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"abcde"].id());
464 LedgerHistoryHelper h;
469 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
470 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
471 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"abc"].id());
478 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcde"].id());
479 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcde"].id());
484 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"abc"].id());
501 LedgerHistoryHelper h;
508 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"ab"].id());
509 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"ab"].id());
512 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"a"].id());
513 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"a"].id());
529 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"ab"].id());
530 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());
533 BEAST_EXPECT(t.
getPreferred(Seq{5})->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[
"ab"].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[
"abde"].id());
568 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"abde"].id());
569 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abde"].id());
570 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"ab"].id());
571 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"ab"].id());
583 LedgerHistoryHelper h;
584 BEAST_EXPECT(!t.
remove(h[
""]));
598 BEAST_EXPECT(t.
remove(h[
"e"]));
609 LedgerHistoryHelper h;
630 char depth = depthDist(gen);
632 for (
char d = 0; d < depth; ++d)
634 char a = offset + widthDist(gen);
636 offset = (a + 1) * width;
Ancestry trie of ledgers.
std::uint32_t tipSupport(Ledger const &ledger) const
Return count of tip support for the specific ledger.
bool empty() const
Return whether the trie is tracking any ledgers.
bool checkInvariants() const
Check the compressed trie and support invariants.
std::uint32_t branchSupport(Ledger const &ledger) const
Return the count of branch support for the specific ledger.
std::optional< SpanTip< Ledger > > getPreferred(Seq const largestIssued) const
Return the preferred ledger ID.
void insert(Ledger const &ledger, std::uint32_t count=1)
Insert and/or increment the support for the given ledger.
bool remove(Ledger const &ledger, std::uint32_t count=1)
Decrease support for a ledger, removing and compressing if possible.
void run() override
Runs the suite.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.