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.
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.