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>
25 #include <test/csf/Validation.h>
26 #include <test/unit_test/SuiteJournal.h>
48 c.now().time_since_epoch() + 86400s));
143 ledger.
id(), ledger.
seq(), signOffset, seenOffset,
true);
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);
313 harness.
clock().advance(1s);
323 harness.
clock().advance(2s);
324 auto const valABCDE = n.
validate(ledgerABCDE);
326 harness.
clock().advance(4s);
327 auto const valABCD = n.
validate(ledgerABCD);
380 for (
bool doFull : {
true,
false})
385 auto process = [&](
Ledger& lgr) {
392 harness.
clock().advance(1s);
393 BEAST_EXPECT(ledgerAB.
seq() < ledgerABC.
seq());
399 harness.
clock().advance(
409 testcase(
"Stale validation");
415 Ledger ledgerAB = h[
"ab"];
424 vals.getNodesAfter(ledgerA, ledgerA.
id());
426 for (Trigger trigger : triggers)
433 trigger(harness.
vals());
442 trigger(harness.
vals());
458 using namespace std::chrono_literals;
459 testcase(
"Get nodes after");
463 Ledger ledgerAB = h[
"ab"];
464 Ledger ledgerABC = h[
"abc"];
465 Ledger ledgerAD = h[
"ad"];
478 for (
Ledger const& ledger : {ledgerA, ledgerAB, ledgerABC, ledgerAD})
482 harness.
clock().advance(5s);
507 using namespace std::chrono_literals;
508 testcase(
"Current trusted validations");
513 Ledger ledgerAC = h[
"ac"];
528 harness.
clock().advance(3s);
530 for (
auto const& node : {a, b})
549 using namespace std::chrono_literals;
550 testcase(
"Current public keys");
554 Ledger ledgerAC = h[
"ac"];
560 for (
auto const& node : {a, b})
569 harness.
clock().advance(3s);
575 for (
auto const& node : {a, b})
593 using namespace std::chrono_literals;
594 testcase(
"By ledger functions");
621 auto sorted = [](
auto vec) {
625 auto compare = [&]() {
626 for (
auto& it : trustedValidations)
628 auto const&
id = it.first.first;
629 auto const&
seq = it.first.second;
630 auto const& expectedValidations = it.second;
634 expectedValidations.size());
637 sorted(expectedValidations));
641 for (
auto const& val : expectedValidations)
643 expectedFees.
push_back(val.loadFee().value_or(baseFee));
647 sorted(harness.
vals().
fees(
id, baseFee)) ==
648 sorted(expectedFees));
655 Ledger ledgerAC = h[
"ac"];
661 for (
auto const& node : {a, b, c})
663 auto const val = node.validate(ledgerA);
666 trustedValidations[{val.ledgerID(), val.seq()}].emplace_back(
671 auto const val = d.validate(ledgerB);
673 trustedValidations[{val.ledgerID(), val.seq()}].emplace_back(val);
680 harness.
clock().advance(5s);
682 for (
auto const& node : {a, b, c})
684 auto const val = node.validate(ledgerAC);
687 trustedValidations[{val.ledgerID(), val.seq()}].emplace_back(
709 testcase(
"Expire validations");
718 Ledger const ledgerA = h[
"a"];
728 Ledger const ledgerB = h[
"ab"];
741 for (
int i = 0; i < loops; ++i)
749 Ledger const ledgerC = h[
"abc"];
762 using namespace std::chrono_literals;
763 testcase(
"Flush validations");
772 Ledger ledgerAB = h[
"ab"];
775 for (
auto const& node : {a, b, c})
777 auto const val = node.validate(ledgerA);
779 expected.
emplace(node.nodeID(), val);
784 harness.
clock().advance(1s);
793 using namespace std::chrono_literals;
794 testcase(
"Preferred Ledger");
804 Ledger ledgerAC = h[
"ac"];
805 Ledger ledgerACD = h[
"acd"];
810 auto pref = [](
Ledger ledger) {
830 BEAST_EXPECT(ledgerB.
id() > ledgerA.
id());
839 harness.
clock().advance(5s);
842 for (
auto const& node : {a, b, c, d})
853 harness.
clock().advance(5s);
854 for (
auto const& node : {a, b, c, d})
857 for (
auto const& ledger : {ledgerA, ledgerB, ledgerACD})
865 using namespace std::chrono_literals;
866 testcase(
"Get preferred LCL");
886 ++peerCounts[ledgerB.
id()];
893 ++peerCounts[ledgerC.
id()];
895 BEAST_EXPECT(ledgerC.
id() > ledgerB.
id());
901 peerCounts[ledgerC.
id()] += 1000;
925 using namespace std::chrono_literals;
926 testcase(
"Acquire validated ledger");
954 harness.
add(b.
validate(ID{3}, Seq{2}, 0s, 0s,
true)));
960 Ledger ledgerAB = h[
"ab"];
965 harness.
clock().advance(5s);
982 harness.
clock().advance(5s);
983 Ledger ledgerABCDE = h[
"abcde"];
994 testcase(
"NumTrustedForLedger");
1011 testcase(
"SeqEnforcer");
1020 BEAST_EXPECT(enforcer(clock.now(), Seq{1}, p));
1021 BEAST_EXPECT(enforcer(clock.now(), Seq{10}, p));
1022 BEAST_EXPECT(!enforcer(clock.now(), Seq{5}, p));
1023 BEAST_EXPECT(!enforcer(clock.now(), Seq{9}, p));
1025 BEAST_EXPECT(!enforcer(clock.now(), Seq{1}, p));
1027 BEAST_EXPECT(enforcer(clock.now(), Seq{1}, p));
1033 testcase(
"TrustChanged");
1036 auto checker = [
this](
1041 : trustedVals[0].ledgerID();
1044 : trustedVals[0].seq();
1049 trustedVals.size());
1050 if (trustedVals.empty())
1052 vals.
getPreferred(this->genesisLedger) == std::nullopt);
1055 vals.
getPreferred(this->genesisLedger)->second == testID);
1067 Ledger ledgerAB = h[
"ab"];
1073 checker(harness.
vals(), listed, trustedVals);
1075 trustedVals.clear();
1077 checker(harness.
vals(), listed, trustedVals);
1086 Ledger ledgerAB = h[
"ab"];
1092 checker(harness.
vals(), listed, trustedVals);
1094 trustedVals.push_back(v);
1096 checker(harness.
vals(), listed, trustedVals);
1110 auto& vals = harness.
vals();
1111 BEAST_EXPECT(vals.currentTrusted() == trustedVals);
1117 trustedVals.clear();
1121 BEAST_EXPECT(vals.currentTrusted() == trustedVals);
1122 BEAST_EXPECT(vals.getPreferred(
genesisLedger) == std::nullopt);