20 #include <ripple/basics/tagged_integer.h>
21 #include <ripple/beast/clock/manual_clock.h>
22 #include <ripple/beast/unit_test.h>
23 #include <ripple/consensus/Validations.h>
24 #include <test/csf/Validation.h>
48 c.now().time_since_epoch() + 86400s));
143 ledger.
id(), ledger.
seq(), signOffset, seenOffset,
true);
203 boost::optional<Ledger>
263 using namespace std::chrono_literals;
265 testcase(
"Add validation");
268 Ledger ledgerAB = h[
"ab"];
269 Ledger ledgerAZ = h[
"az"];
270 Ledger ledgerABC = h[
"abc"];
271 Ledger ledgerABCD = h[
"abcd"];
272 Ledger ledgerABCDE = h[
"abcde"];
287 harness.
clock().advance(1s);
303 harness.
clock().advance(1s);
312 harness.
clock().advance(1s);
322 harness.
clock().advance(2s);
323 auto const valABCDE = n.
validate(ledgerABCDE);
325 harness.
clock().advance(4s);
326 auto const valABCD = n.
validate(ledgerABCD);
379 for (
bool doFull : {
true,
false})
384 auto process = [&](
Ledger& lgr) {
391 harness.
clock().advance(1s);
392 BEAST_EXPECT(ledgerAB.
seq() < ledgerABC.
seq());
398 harness.
clock().advance(
408 testcase(
"Stale validation");
414 Ledger ledgerAB = h[
"ab"];
423 vals.getNodesAfter(ledgerA, ledgerA.
id());
425 for (Trigger trigger : triggers)
432 trigger(harness.
vals());
441 trigger(harness.
vals());
457 using namespace std::chrono_literals;
458 testcase(
"Get nodes after");
462 Ledger ledgerAB = h[
"ab"];
463 Ledger ledgerABC = h[
"abc"];
464 Ledger ledgerAD = h[
"ad"];
477 for (
Ledger const& ledger : {ledgerA, ledgerAB, ledgerABC, ledgerAD})
481 harness.
clock().advance(5s);
506 using namespace std::chrono_literals;
507 testcase(
"Current trusted validations");
512 Ledger ledgerAC = h[
"ac"];
527 harness.
clock().advance(3s);
529 for (
auto const& node : {a, b})
548 using namespace std::chrono_literals;
549 testcase(
"Current public keys");
553 Ledger ledgerAC = h[
"ac"];
559 for (
auto const& node : {a, b})
568 harness.
clock().advance(3s);
574 for (
auto const& node : {a, b})
592 using namespace std::chrono_literals;
593 testcase(
"By ledger functions");
619 auto sorted = [](
auto vec) {
624 for (
auto& it : trustedValidations)
626 auto const&
id = it.first;
627 auto const& expectedValidations = it.second;
631 expectedValidations.size());
634 sorted(expectedValidations));
638 for (
auto const& val : expectedValidations)
640 expectedFees.
push_back(val.loadFee().value_or(baseFee));
644 sorted(harness.
vals().
fees(
id, baseFee)) ==
645 sorted(expectedFees));
652 Ledger ledgerAC = h[
"ac"];
658 for (
auto const& node : {a, b, c})
660 auto const val = node.validate(ledgerA);
663 trustedValidations[val.ledgerID()].emplace_back(val);
667 auto const val = d.validate(ledgerB);
669 trustedValidations[val.ledgerID()].emplace_back(val);
676 harness.
clock().advance(5s);
678 for (
auto const& node : {a, b, c})
680 auto const val = node.validate(ledgerAC);
683 trustedValidations[val.ledgerID()].emplace_back(val);
704 testcase(
"Expire validations");
722 using namespace std::chrono_literals;
723 testcase(
"Flush validations");
732 Ledger ledgerAB = h[
"ab"];
735 for (
auto const& node : {a, b, c})
737 auto const val = node.validate(ledgerA);
739 expected.
emplace(node.nodeID(), val);
744 harness.
clock().advance(1s);
753 using namespace std::chrono_literals;
754 testcase(
"Preferred Ledger");
764 Ledger ledgerAC = h[
"ac"];
765 Ledger ledgerACD = h[
"acd"];
770 auto pref = [](
Ledger ledger) {
790 BEAST_EXPECT(ledgerB.
id() > ledgerA.
id());
799 harness.
clock().advance(5s);
802 for (
auto const& node : {a, b, c, d})
813 harness.
clock().advance(5s);
814 for (
auto const& node : {a, b, c, d})
817 for (
auto const& ledger : {ledgerA, ledgerB, ledgerACD})
825 using namespace std::chrono_literals;
826 testcase(
"Get preferred LCL");
846 ++peerCounts[ledgerB.
id()];
853 ++peerCounts[ledgerC.
id()];
855 BEAST_EXPECT(ledgerC.
id() > ledgerB.
id());
861 peerCounts[ledgerC.
id()] += 1000;
885 using namespace std::chrono_literals;
886 testcase(
"Acquire validated ledger");
914 harness.
add(b.
validate(ID{3}, Seq{2}, 0s, 0s,
true)));
920 Ledger ledgerAB = h[
"ab"];
925 harness.
clock().advance(5s);
942 harness.
clock().advance(5s);
943 Ledger ledgerABCDE = h[
"abcde"];
954 testcase(
"NumTrustedForLedger");
971 testcase(
"SeqEnforcer");
980 BEAST_EXPECT(enforcer(clock.now(), Seq{1}, p));
981 BEAST_EXPECT(enforcer(clock.now(), Seq{10}, p));
982 BEAST_EXPECT(!enforcer(clock.now(), Seq{5}, p));
983 BEAST_EXPECT(!enforcer(clock.now(), Seq{9}, p));
985 BEAST_EXPECT(!enforcer(clock.now(), Seq{1}, p));
987 BEAST_EXPECT(enforcer(clock.now(), Seq{1}, p));
993 testcase(
"TrustChanged");
996 auto checker = [
this](
1001 : trustedVals[0].ledgerID();
1006 trustedVals.size());
1007 if (trustedVals.empty())
1009 vals.
getPreferred(this->genesisLedger) == boost::none);
1012 vals.
getPreferred(this->genesisLedger)->second == testID);
1023 Ledger ledgerAB = h[
"ab"];
1029 checker(harness.
vals(), listed, trustedVals);
1031 trustedVals.clear();
1033 checker(harness.
vals(), listed, trustedVals);
1042 Ledger ledgerAB = h[
"ab"];
1048 checker(harness.
vals(), listed, trustedVals);
1050 trustedVals.push_back(v);
1052 checker(harness.
vals(), listed, trustedVals);
1066 auto& vals = harness.
vals();
1067 BEAST_EXPECT(vals.currentTrusted() == trustedVals);
1073 trustedVals.clear();
1077 BEAST_EXPECT(vals.currentTrusted() == trustedVals);
1078 BEAST_EXPECT(vals.getPreferred(
genesisLedger) == boost::none);