19 #include <ripple/beast/unit_test.h>
20 #include <ripple/consensus/LedgerTrie.h>
22 #include <test/csf/ledgers.h>
37 LedgerHistoryHelper h;
51 LedgerHistoryHelper h;
75 LedgerHistoryHelper h;
101 LedgerHistoryHelper h;
119 LedgerHistoryHelper h;
140 LedgerHistoryHelper h;
164 LedgerHistoryHelper h;
167 BEAST_EXPECT(!t.
remove(h[
"ab"]));
169 BEAST_EXPECT(!t.
remove(h[
"a"]));
175 LedgerHistoryHelper h;
181 BEAST_EXPECT(!t.
remove(h[
"abc"]));
189 LedgerHistoryHelper h;
193 BEAST_EXPECT(t.
remove(h[
"abc"]));
199 BEAST_EXPECT(t.
remove(h[
"abc"], 2));
205 BEAST_EXPECT(t.
remove(h[
"abc"], 300));
212 LedgerHistoryHelper h;
221 BEAST_EXPECT(t.
remove(h[
"abc"]));
231 LedgerHistoryHelper h;
241 BEAST_EXPECT(t.
remove(h[
"abc"]));
251 LedgerHistoryHelper h;
260 BEAST_EXPECT(t.
remove(h[
"abc"]));
269 LedgerHistoryHelper h;
294 LedgerHistoryHelper h;
295 BEAST_EXPECT(t.
empty());
299 BEAST_EXPECT(!t.
empty());
301 BEAST_EXPECT(t.
empty());
304 BEAST_EXPECT(!t.
empty());
306 BEAST_EXPECT(t.
empty());
313 using Seq = Ledger::Seq;
316 LedgerHistoryHelper h;
361 using Seq = Ledger::Seq;
371 LedgerHistoryHelper h;
374 BEAST_EXPECT(t.
getPreferred(Seq{0})->id == genesis.id());
375 BEAST_EXPECT(t.
remove(genesis));
377 BEAST_EXPECT(!t.
remove(genesis));
382 LedgerHistoryHelper h;
384 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
389 LedgerHistoryHelper h;
392 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
393 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
398 LedgerHistoryHelper h;
401 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcd"].id());
402 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcd"].id());
407 LedgerHistoryHelper h;
411 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
412 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
415 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
416 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
421 LedgerHistoryHelper h;
425 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
426 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
429 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcd"].id());
430 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcd"].id());
435 LedgerHistoryHelper h;
439 BEAST_EXPECT(h[
"abce"].
id() > h[
"abcd"].
id());
440 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abce"].id());
443 BEAST_EXPECT(h[
"abce"].
id() > h[
"abcd"].
id());
444 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcd"].id());
450 LedgerHistoryHelper h;
455 BEAST_EXPECT(h[
"abce"].
id() > h[
"abcd"].
id());
456 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abce"].id());
457 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abce"].id());
462 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
463 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
469 LedgerHistoryHelper h;
473 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcde"].id());
474 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcde"].id());
475 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"abcde"].id());
481 LedgerHistoryHelper h;
486 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abc"].id());
487 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abc"].id());
488 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"abc"].id());
495 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abcde"].id());
496 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"abcde"].id());
501 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"abc"].id());
518 LedgerHistoryHelper h;
525 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"ab"].id());
526 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"ab"].id());
529 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"a"].id());
530 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"a"].id());
546 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"ab"].id());
547 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"ab"].id());
548 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"a"].id());
549 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"a"].id());
550 BEAST_EXPECT(t.
getPreferred(Seq{5})->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[
"ab"].id());
568 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"a"].id());
569 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"a"].id());
584 BEAST_EXPECT(t.
getPreferred(Seq{1})->id == h[
"abde"].id());
585 BEAST_EXPECT(t.
getPreferred(Seq{2})->id == h[
"abde"].id());
586 BEAST_EXPECT(t.
getPreferred(Seq{3})->id == h[
"abde"].id());
587 BEAST_EXPECT(t.
getPreferred(Seq{4})->id == h[
"ab"].id());
588 BEAST_EXPECT(t.
getPreferred(Seq{5})->id == h[
"ab"].id());
596 using Seq = Ledger::Seq;
601 LedgerHistoryHelper h;
602 BEAST_EXPECT(!t.
remove(h[
""]));
616 BEAST_EXPECT(t.
remove(h[
"e"]));
627 LedgerHistoryHelper h;
648 char depth = depthDist(gen);
650 for (
char d = 0; d < depth; ++d)
652 char a = offset + widthDist(gen);
654 offset = (a + 1) * width;
std::uint32_t branchSupport(Ledger const &ledger) const
Return the count of branch support for the specific ledger.
bool checkInvariants() const
Check the compressed trie and support invariants.
std::uint32_t tipSupport(Ledger const &ledger) const
Return count of tip 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.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Ancestry trie of ledgers.
bool empty() const
Return whether the trie is tracking any ledgers.
bool remove(Ledger const &ledger, std::uint32_t count=1)
Decrease support for a ledger, removing and compressing if possible.
BEAST_DEFINE_TESTSUITE(DeliverMin, app, ripple)