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());
281 Ledger const genesis = h[
""];
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;
355 Ledger const genesis = h[
""];
359 BEAST_EXPECT(t.
getPreferred(Seq{0})->id == genesis.id());
360 BEAST_EXPECT(t.
remove(genesis));
362 BEAST_EXPECT(!t.
remove(genesis));
367 LedgerHistoryHelper h;
371 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
376 LedgerHistoryHelper h;
381 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
384 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
389 LedgerHistoryHelper h;
394 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcd"].id());
397 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcd"].id());
402 LedgerHistoryHelper h;
408 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
409 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
413 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
414 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
420 LedgerHistoryHelper h;
426 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
427 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());
438 LedgerHistoryHelper h;
442 BEAST_EXPECT(h[
"abce"].
id() > h[
"abcd"].
id());
445 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abce"].id());
448 BEAST_EXPECT(h[
"abce"].
id() > h[
"abcd"].
id());
451 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcd"].id());
457 LedgerHistoryHelper h;
462 BEAST_EXPECT(h[
"abce"].
id() > h[
"abcd"].
id());
465 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abce"].id());
466 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abce"].id());
472 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
473 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
480 LedgerHistoryHelper h;
486 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcde"].id());
487 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcde"].id());
488 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"abcde"].id());
495 LedgerHistoryHelper h;
501 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
502 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
503 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"abc"].id());
509 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcde"].id());
510 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcde"].id());
515 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"abc"].id());
533 LedgerHistoryHelper h;
541 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"ab"].id());
542 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"ab"].id());
546 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"a"].id());
547 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"a"].id());
565 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"ab"].id());
566 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"ab"].id());
567 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"a"].id());
568 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"a"].id());
569 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"a"].id());
587 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"ab"].id());
588 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"ab"].id());
589 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"ab"].id());
590 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"a"].id());
591 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"a"].id());
609 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"abde"].id());
610 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"abde"].id());
611 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abde"].id());
612 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"ab"].id());
613 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"ab"].id());
626 LedgerHistoryHelper h;
627 BEAST_EXPECT(!t.
remove(h[
""]));
641 BEAST_EXPECT(t.
remove(h[
"e"]));
652 LedgerHistoryHelper h;
673 char const depth = depthDist(gen);
675 for (
char d = 0; d < depth; ++d)
677 char const a = offset + widthDist(gen);
679 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.