rippled
LedgerReplay_test.cpp
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2020 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #include <ripple/app/ledger/BuildLedger.h>
21 #include <ripple/app/ledger/LedgerMaster.h>
22 #include <ripple/app/ledger/LedgerReplay.h>
23 #include <ripple/app/ledger/LedgerReplayTask.h>
24 #include <ripple/app/ledger/LedgerReplayer.h>
25 #include <ripple/app/ledger/impl/LedgerDeltaAcquire.h>
26 #include <ripple/app/ledger/impl/LedgerReplayMsgHandler.h>
27 #include <ripple/app/ledger/impl/SkipListAcquire.h>
28 #include <ripple/basics/Slice.h>
29 #include <ripple/overlay/PeerSet.h>
30 #include <ripple/overlay/impl/PeerImp.h>
31 #include <test/jtx.h>
32 #include <test/jtx/envconfig.h>
33 
34 #include <chrono>
35 #include <thread>
36 
37 namespace ripple {
38 namespace test {
39 
40 struct LedgerReplay_test : public beast::unit_test::suite
41 {
42  void
43  run() override
44  {
45  testcase("Replay ledger");
46 
47  using namespace jtx;
48 
49  // Build a ledger normally
50  auto const alice = Account("alice");
51  auto const bob = Account("bob");
52 
53  Env env(*this);
54  env.fund(XRP(100000), alice, bob);
55  env.close();
56 
58  auto const lastClosed = ledgerMaster.getClosedLedger();
59  auto const lastClosedParent =
60  ledgerMaster.getLedgerByHash(lastClosed->info().parentHash);
61 
62  auto const replayed = buildLedger(
63  LedgerReplay(lastClosedParent, lastClosed),
64  tapNONE,
65  env.app(),
66  env.journal);
67 
68  BEAST_EXPECT(replayed->info().hash == lastClosed->info().hash);
69  }
70 };
71 
73  Good,
74  DropAll,
75 };
76 
83 {
84 public:
86  LedgerMaster& ledgerSource,
87  LedgerMaster& ledgerSink,
89  : ledgerSource(ledgerSource), ledgerSink(ledgerSink), bhvr(bhvr)
90  {
91  }
92  virtual ~MagicInboundLedgers() = default;
93 
96  override
97  {
99  return {};
100  if (auto l = ledgerSource.getLedgerByHash(hash); l)
101  {
102  ledgerSink.storeLedger(l);
103  return l;
104  }
105 
106  return {};
107  }
108 
110  find(LedgerHash const& hash) override
111  {
112  return {};
113  }
114 
115  virtual bool
117  LedgerHash const& ledgerHash,
120  {
121  return false;
122  }
123 
124  virtual void
126  {
127  }
128 
129  virtual void
130  logFailure(uint256 const& h, std::uint32_t seq) override
131  {
132  }
133 
134  virtual bool
135  isFailure(uint256 const& h) override
136  {
137  return false;
138  }
139 
140  virtual void
141  clearFailures() override
142  {
143  }
144 
145  virtual Json::Value
146  getInfo() override
147  {
148  return {};
149  }
150 
151  virtual std::size_t
152  fetchRate() override
153  {
154  return 0;
155  }
156 
157  virtual void
158  onLedgerFetched() override
159  {
160  }
161 
162  virtual void
163  gotFetchPack() override
164  {
165  }
166  virtual void
167  sweep() override
168  {
169  }
170 
171  virtual void
172  stop() override
173  {
174  }
175 
179 };
180 
181 enum class PeerFeature {
183  None,
184 };
185 
191 class TestPeer : public Peer
192 {
193 public:
194  TestPeer(bool enableLedgerReplay) : ledgerReplayEnabled_(enableLedgerReplay)
195  {
196  }
197 
198  void
199  send(std::shared_ptr<Message> const& m) override
200  {
201  }
203  getRemoteAddress() const override
204  {
205  return {};
206  }
207  void
208  charge(Resource::Charge const& fee) override
209  {
210  }
211  id_t
212  id() const override
213  {
214  return 1234;
215  }
216  bool
217  cluster() const override
218  {
219  return false;
220  }
221  bool
222  isHighLatency() const override
223  {
224  return false;
225  }
226  int
227  getScore(bool) const override
228  {
229  return 0;
230  }
231  PublicKey const&
232  getNodePublic() const override
233  {
234  static PublicKey key{};
235  return key;
236  }
238  json() override
239  {
240  return {};
241  }
242  bool
244  {
245  if (f == ProtocolFeature::LedgerReplay && ledgerReplayEnabled_)
246  return true;
247  return false;
248  }
250  publisherListSequence(PublicKey const&) const override
251  {
252  return {};
253  }
254  void
256  {
257  }
258  uint256 const&
259  getClosedLedgerHash() const override
260  {
261  static uint256 hash{};
262  return hash;
263  }
264  bool
265  hasLedger(uint256 const& hash, std::uint32_t seq) const override
266  {
267  return true;
268  }
269  void
270  ledgerRange(std::uint32_t& minSeq, std::uint32_t& maxSeq) const override
271  {
272  }
273  bool
274  hasTxSet(uint256 const& hash) const override
275  {
276  return false;
277  }
278  void
279  cycleStatus() override
280  {
281  }
282  bool
283  hasRange(std::uint32_t uMin, std::uint32_t uMax) override
284  {
285  return false;
286  }
287  bool
288  compressionEnabled() const override
289  {
290  return false;
291  }
292  void
293  sendTxQueue() override
294  {
295  }
296  void
297  addTxQueue(const uint256&) override
298  {
299  }
300  void
301  removeTxQueue(const uint256&) override
302  {
303  }
304  bool
305  txReduceRelayEnabled() const override
306  {
307  return false;
308  }
309 
311 };
312 
313 enum class PeerSetBehavior {
314  Good,
315  Drop50,
316  DropAll,
319  Repeat,
320 };
321 
328 struct TestPeerSet : public PeerSet
329 {
332  LedgerReplayMsgHandler& other,
333  PeerSetBehavior bhvr,
334  bool enableLedgerReplay)
335  : local(me)
336  , remote(other)
337  , dummyPeer(std::make_shared<TestPeer>(enableLedgerReplay))
338  , behavior(bhvr)
339  {
340  }
341 
342  void
344  std::size_t limit,
345  std::function<bool(std::shared_ptr<Peer> const&)> hasItem,
346  std::function<void(std::shared_ptr<Peer> const&)> onPeerAdded) override
347  {
348  hasItem(dummyPeer);
349  onPeerAdded(dummyPeer);
350  }
351 
352  void
354  ::google::protobuf::Message const& msg,
355  protocol::MessageType type,
356  std::shared_ptr<Peer> const& peer) override
357  {
358  int dropRate = 0;
359  if (behavior == PeerSetBehavior::Drop50)
360  dropRate = 50;
361  else if (behavior == PeerSetBehavior::DropAll)
362  dropRate = 100;
363 
364  if ((rand() % 100 + 1) <= dropRate)
365  return;
366 
367  switch (type)
368  {
369  case protocol::mtPROOF_PATH_REQ: {
370  if (behavior == PeerSetBehavior::DropSkipListReply)
371  return;
372  auto request = std::make_shared<protocol::TMProofPathRequest>(
373  dynamic_cast<protocol::TMProofPathRequest const&>(msg));
374  auto reply = std::make_shared<protocol::TMProofPathResponse>(
375  remote.processProofPathRequest(request));
376  local.processProofPathResponse(reply);
377  if (behavior == PeerSetBehavior::Repeat)
378  local.processProofPathResponse(reply);
379  break;
380  }
381  case protocol::mtREPLAY_DELTA_REQ: {
383  return;
384  auto request = std::make_shared<protocol::TMReplayDeltaRequest>(
385  dynamic_cast<protocol::TMReplayDeltaRequest const&>(msg));
386  auto reply = std::make_shared<protocol::TMReplayDeltaResponse>(
387  remote.processReplayDeltaRequest(request));
388  local.processReplayDeltaResponse(reply);
389  if (behavior == PeerSetBehavior::Repeat)
390  local.processReplayDeltaResponse(reply);
391  break;
392  }
393  default:
394  return;
395  }
396  }
397 
398  const std::set<Peer::id_t>&
399  getPeerIds() const override
400  {
401  static std::set<Peer::id_t> emptyPeers;
402  return emptyPeers;
403  }
404 
409 };
410 
415 {
416 public:
419  LedgerReplayMsgHandler& other,
420  PeerSetBehavior bhvr,
421  PeerFeature peerFeature)
422  : local(me)
423  , remote(other)
424  , behavior(bhvr)
425  , enableLedgerReplay(peerFeature == PeerFeature::LedgerReplayEnabled)
426  {
427  }
428 
430  build() override
431  {
432  return std::make_unique<TestPeerSet>(
433  local, remote, behavior, enableLedgerReplay);
434  }
435 
436 private:
441 };
442 
448 {
449  struct Parameter
450  {
452  int initAccounts = 10;
453  int initAmount = 1'000'000;
454  int numTxPerLedger = 10;
455  int txAmount = 10;
456  };
457 
458  LedgerServer(beast::unit_test::suite& suite, Parameter const& p)
459  : env(suite)
460  , app(env.app())
461  , ledgerMaster(env.app().getLedgerMaster())
462  , msgHandler(env.app(), env.app().getLedgerReplayer())
463  , param(p)
464  {
465  assert(param.initLedgers > 0);
466  createAccounts(param.initAccounts);
467  createLedgerHistory();
468  app.logs().threshold(beast::severities::Severity::kWarning);
469  }
470 
474  void
475  createAccounts(int newAccounts)
476  {
477  auto fundedAccounts = accounts.size();
478  for (int i = 0; i < newAccounts; ++i)
479  {
480  accounts.emplace_back(
481  "alice_" + std::to_string(fundedAccounts + i));
482  env.fund(jtx::XRP(param.initAmount), accounts.back());
483  }
484  env.close();
485  }
486 
490  void
491  sendPayments(int newTxes)
492  {
493  int fundedAccounts = accounts.size();
494  assert(fundedAccounts >= newTxes);
495  std::unordered_set<int> senders;
496 
497  // somewhat random but reproducible
498  int r = ledgerMaster.getClosedLedger()->seq() * 7;
499  int fromIdx = 0;
500  int toIdx = 0;
501  auto updateIdx = [&]() {
502  assert(fundedAccounts > senders.size());
503  fromIdx = (fromIdx + r) % fundedAccounts;
504  while (senders.count(fromIdx) != 0)
505  fromIdx = (fromIdx + 1) % fundedAccounts;
506  senders.insert(fromIdx);
507  toIdx = (toIdx + r * 2) % fundedAccounts;
508  if (toIdx == fromIdx)
509  toIdx = (toIdx + 1) % fundedAccounts;
510  };
511 
512  for (int i = 0; i < newTxes; ++i)
513  {
514  updateIdx();
515  env.apply(
516  pay(accounts[fromIdx],
517  accounts[toIdx],
518  jtx::drops(ledgerMaster.getClosedLedger()->fees().base) +
519  jtx::XRP(param.txAmount)),
523  }
524  env.close();
525  }
526 
530  void
532  {
533  for (int i = 0; i < param.initLedgers - 1; ++i)
534  {
535  sendPayments(param.numTxPerLedger);
536  }
537  }
538 
545 };
546 
547 enum class TaskStatus {
548  Failed,
549  Completed,
550  NotDone,
551  NotExist,
552 };
553 
562 {
563 public:
565  beast::unit_test::suite& suite,
566  LedgerServer& server,
570  : env(suite, jtx::envconfig(jtx::port_increment, 3))
571  , app(env.app())
572  , ledgerMaster(env.app().getLedgerMaster())
573  , inboundLedgers(
574  server.app.getLedgerMaster(),
575  ledgerMaster,
576  inboundBhvr)
577  , serverMsgHandler(server.app, server.app.getLedgerReplayer())
578  , clientMsgHandler(env.app(), replayer)
579  , replayer(
580  env.app(),
581  inboundLedgers,
582  std::make_unique<TestPeerSetBuilder>(
583  clientMsgHandler,
584  serverMsgHandler,
585  behavior,
586  peerFeature))
587  {
588  }
589 
590  void
592  {
593  ledgerMaster.storeLedger(l);
594  }
595 
596  bool
597  haveLedgers(uint256 const& finishLedgerHash, int totalReplay)
598  {
599  uint256 hash = finishLedgerHash;
600  int i = 0;
601  for (; i < totalReplay; ++i)
602  {
603  auto const l = ledgerMaster.getLedgerByHash(hash);
604  if (!l)
605  return false;
606  hash = l->info().parentHash;
607  }
608  return true;
609  }
610 
611  bool
612  waitForLedgers(uint256 const& finishLedgerHash, int totalReplay)
613  {
614  int totalRound = 100;
615  for (int i = 0; i < totalRound; ++i)
616  {
617  if (haveLedgers(finishLedgerHash, totalReplay))
618  return true;
619  if (i < totalRound - 1)
621  }
622  return false;
623  }
624 
625  bool
627  {
628  int totalRound = 100;
629  for (int i = 0; i < totalRound; ++i)
630  {
631  bool allDone = true;
632  {
633  std::unique_lock<std::mutex> lock(replayer.mtx_);
634  for (auto const& t : replayer.tasks_)
635  {
636  if (!t->finished())
637  {
638  allDone = false;
639  break;
640  }
641  }
642  }
643  if (allDone)
644  return true;
645  if (i < totalRound - 1)
647  }
648  return false;
649  }
650 
653  {
654  std::unique_lock<std::mutex> lock(replayer.mtx_);
655  return replayer.tasks_;
656  }
657 
659  findTask(uint256 const& hash, int totalReplay)
660  {
661  std::unique_lock<std::mutex> lock(replayer.mtx_);
662  auto i = std::find_if(
663  replayer.tasks_.begin(), replayer.tasks_.end(), [&](auto const& t) {
664  return t->parameter_.finishHash_ == hash &&
665  t->parameter_.totalLedgers_ == totalReplay;
666  });
667  if (i == replayer.tasks_.end())
668  return {};
669  return *i;
670  }
671 
674  {
675  std::unique_lock<std::mutex> lock(replayer.mtx_);
676  return replayer.deltas_.size();
677  }
678 
681  {
682  std::unique_lock<std::mutex> lock(replayer.mtx_);
683  return replayer.skipLists_.size();
684  }
685 
686  bool
688  std::size_t tasks,
689  std::size_t skipLists,
690  std::size_t deltas)
691  {
692  std::unique_lock<std::mutex> lock(replayer.mtx_);
693  return replayer.tasks_.size() == tasks &&
694  replayer.skipLists_.size() == skipLists &&
695  replayer.deltas_.size() == deltas;
696  }
697 
700  {
701  std::unique_lock<std::mutex> lock(replayer.mtx_);
702  auto i = replayer.skipLists_.find(hash);
703  if (i == replayer.skipLists_.end())
704  return {};
705  return i->second.lock();
706  }
707 
710  {
711  std::unique_lock<std::mutex> lock(replayer.mtx_);
712  auto i = replayer.deltas_.find(hash);
713  if (i == replayer.deltas_.end())
714  return {};
715  return i->second.lock();
716  }
717 
718  template <typename T>
719  TaskStatus
721  {
722  if (t->failed_)
723  return TaskStatus::Failed;
724  if (t->complete_)
725  return TaskStatus::Completed;
726  return TaskStatus::NotDone;
727  }
728 
729  bool
732  TaskStatus taskExpect,
733  TaskStatus skiplistExpect,
734  std::vector<TaskStatus> const& deltaExpects)
735  {
736  if (taskStatus(task) == taskExpect)
737  {
738  if (taskStatus(task->skipListAcquirer_) == skiplistExpect)
739  {
740  if (task->deltas_.size() == deltaExpects.size())
741  {
742  for (int i = 0; i < deltaExpects.size(); ++i)
743  {
744  if (taskStatus(task->deltas_[i]) != deltaExpects[i])
745  return false;
746  }
747  return true;
748  }
749  }
750  }
751  return false;
752  }
753 
754  bool
756  uint256 const& hash,
757  int totalReplay,
758  TaskStatus taskExpect,
759  TaskStatus skiplistExpect,
760  std::vector<TaskStatus> const& deltaExpects)
761  {
762  auto t = findTask(hash, totalReplay);
763  if (!t)
764  {
765  if (taskExpect == TaskStatus::NotExist)
766  return true;
767  return false;
768  }
769 
770  return asExpected(t, taskExpect, skiplistExpect, deltaExpects);
771  }
772 
773  bool
775  uint256 const& hash,
776  int totalReplay,
777  TaskStatus taskExpect,
778  TaskStatus skiplistExpect,
779  std::vector<TaskStatus> const& deltaExpects)
780  {
781  auto t = findTask(hash, totalReplay);
782  if (!t)
783  {
784  if (taskExpect == TaskStatus::NotExist)
785  return true;
786  return false;
787  }
788 
789  return asExpected(t, taskExpect, skiplistExpect, deltaExpects);
790  }
791 
792  bool
794  uint256 const& hash,
795  int totalReplay,
796  TaskStatus taskExpect,
797  TaskStatus skiplistExpect,
798  std::vector<TaskStatus> const& deltaExpects)
799  {
800  if (!waitForDone())
801  return false;
802 
803  return checkStatus(
804  hash, totalReplay, taskExpect, skiplistExpect, deltaExpects);
805  }
806 
814 };
815 
816 using namespace beast::severities;
817 void
819  LedgerServer& server,
820  LedgerReplayClient& client,
821  beast::severities::Severity level = Severity::kTrace)
822 {
823  server.app.logs().threshold(level);
824  client.app.logs().threshold(level);
825 }
826 // logAll(net.server, net.client);
827 
828 /*
829  * Create a LedgerServer and a LedgerReplayClient
830  */
832 {
834  beast::unit_test::suite& suite,
835  LedgerServer::Parameter const& param,
839  : server(suite, param)
840  , client(suite, server, behavior, inboundBhvr, peerFeature)
841  {
842  // logAll(server, client);
843  }
846 };
847 
873 struct LedgerReplayer_test : public beast::unit_test::suite
874 {
875  void
877  {
878  testcase("ProofPath");
879  LedgerServer server(*this, {1});
880  auto const l = server.ledgerMaster.getClosedLedger();
881 
882  {
883  // request, missing key
884  auto request = std::make_shared<protocol::TMProofPathRequest>();
885  request->set_ledgerhash(
886  l->info().hash.data(), l->info().hash.size());
887  request->set_type(protocol::TMLedgerMapType::lmACCOUNT_STATE);
888  auto reply = std::make_shared<protocol::TMProofPathResponse>(
889  server.msgHandler.processProofPathRequest(request));
890  BEAST_EXPECT(reply->has_error());
891  BEAST_EXPECT(!server.msgHandler.processProofPathResponse(reply));
892  }
893  {
894  // request, wrong hash
895  auto request = std::make_shared<protocol::TMProofPathRequest>();
896  request->set_type(protocol::TMLedgerMapType::lmACCOUNT_STATE);
897  request->set_key(
898  keylet::skip().key.data(), keylet::skip().key.size());
899  uint256 hash(1234567);
900  request->set_ledgerhash(hash.data(), hash.size());
901  auto reply = std::make_shared<protocol::TMProofPathResponse>(
902  server.msgHandler.processProofPathRequest(request));
903  BEAST_EXPECT(reply->has_error());
904  }
905 
906  {
907  // good request
908  auto request = std::make_shared<protocol::TMProofPathRequest>();
909  request->set_ledgerhash(
910  l->info().hash.data(), l->info().hash.size());
911  request->set_type(protocol::TMLedgerMapType::lmACCOUNT_STATE);
912  request->set_key(
913  keylet::skip().key.data(), keylet::skip().key.size());
914  // generate response
915  auto reply = std::make_shared<protocol::TMProofPathResponse>(
916  server.msgHandler.processProofPathRequest(request));
917  BEAST_EXPECT(!reply->has_error());
918  BEAST_EXPECT(server.msgHandler.processProofPathResponse(reply));
919 
920  {
921  // bad reply
922  // bad header
923  std::string r(reply->ledgerheader());
924  r.back()--;
925  reply->set_ledgerheader(r);
926  BEAST_EXPECT(
927  !server.msgHandler.processProofPathResponse(reply));
928  r.back()++;
929  reply->set_ledgerheader(r);
930  BEAST_EXPECT(server.msgHandler.processProofPathResponse(reply));
931  // bad proof path
932  reply->mutable_path()->RemoveLast();
933  BEAST_EXPECT(
934  !server.msgHandler.processProofPathResponse(reply));
935  }
936  }
937  }
938 
939  void
941  {
942  testcase("ReplayDelta");
943  LedgerServer server(*this, {1});
944  auto const l = server.ledgerMaster.getClosedLedger();
945 
946  {
947  // request, missing hash
948  auto request = std::make_shared<protocol::TMReplayDeltaRequest>();
949  auto reply = std::make_shared<protocol::TMReplayDeltaResponse>(
950  server.msgHandler.processReplayDeltaRequest(request));
951  BEAST_EXPECT(reply->has_error());
952  BEAST_EXPECT(!server.msgHandler.processReplayDeltaResponse(reply));
953  // request, wrong hash
954  uint256 hash(1234567);
955  request->set_ledgerhash(hash.data(), hash.size());
956  reply = std::make_shared<protocol::TMReplayDeltaResponse>(
957  server.msgHandler.processReplayDeltaRequest(request));
958  BEAST_EXPECT(reply->has_error());
959  BEAST_EXPECT(!server.msgHandler.processReplayDeltaResponse(reply));
960  }
961 
962  {
963  // good request
964  auto request = std::make_shared<protocol::TMReplayDeltaRequest>();
965  request->set_ledgerhash(
966  l->info().hash.data(), l->info().hash.size());
967  auto reply = std::make_shared<protocol::TMReplayDeltaResponse>(
968  server.msgHandler.processReplayDeltaRequest(request));
969  BEAST_EXPECT(!reply->has_error());
970  BEAST_EXPECT(server.msgHandler.processReplayDeltaResponse(reply));
971 
972  {
973  // bad reply
974  // bad header
975  std::string r(reply->ledgerheader());
976  r.back()--;
977  reply->set_ledgerheader(r);
978  BEAST_EXPECT(
979  !server.msgHandler.processReplayDeltaResponse(reply));
980  r.back()++;
981  reply->set_ledgerheader(r);
982  BEAST_EXPECT(
983  server.msgHandler.processReplayDeltaResponse(reply));
984  // bad txns
985  reply->mutable_transaction()->RemoveLast();
986  BEAST_EXPECT(
987  !server.msgHandler.processReplayDeltaResponse(reply));
988  }
989  }
990  }
991 
992  void
994  {
995  testcase("TaskParameter");
996 
997  auto makeSkipList = [](int count) -> std::vector<uint256> const {
998  std::vector<uint256> sList;
999  for (int i = 0; i < count; ++i)
1000  sList.emplace_back(i);
1001  return sList;
1002  };
1003 
1006  BEAST_EXPECT(!tp10.update(uint256(777), 5, makeSkipList(10)));
1007  BEAST_EXPECT(!tp10.update(uint256(10), 5, makeSkipList(8)));
1008  BEAST_EXPECT(tp10.update(uint256(10), 10, makeSkipList(10)));
1009 
1010  // can merge to self
1011  BEAST_EXPECT(tp10.canMergeInto(tp10));
1012 
1013  // smaller task
1016 
1017  BEAST_EXPECT(tp9.canMergeInto(tp10));
1018  BEAST_EXPECT(!tp10.canMergeInto(tp9));
1019 
1020  tp9.totalLedgers_++;
1021  BEAST_EXPECT(!tp9.canMergeInto(tp10));
1022  tp9.totalLedgers_--;
1023  BEAST_EXPECT(tp9.canMergeInto(tp10));
1024 
1026  BEAST_EXPECT(!tp9.canMergeInto(tp10));
1028  BEAST_EXPECT(tp9.canMergeInto(tp10));
1029 
1030  tp9.finishHash_ = uint256(1234);
1031  BEAST_EXPECT(!tp9.canMergeInto(tp10));
1032  tp9.finishHash_ = uint256(9);
1033  BEAST_EXPECT(tp9.canMergeInto(tp10));
1034 
1035  // larger task
1038  BEAST_EXPECT(tp20.update(uint256(20), 20, makeSkipList(20)));
1039  BEAST_EXPECT(tp10.canMergeInto(tp20));
1040  BEAST_EXPECT(tp9.canMergeInto(tp20));
1041  BEAST_EXPECT(!tp20.canMergeInto(tp10));
1042  BEAST_EXPECT(!tp20.canMergeInto(tp9));
1043  }
1044 
1045  void
1047  {
1048  testcase("config test");
1049  {
1050  Config c;
1051  BEAST_EXPECT(c.LEDGER_REPLAY == false);
1052  }
1053 
1054  {
1055  Config c;
1056  std::string toLoad(R"rippleConfig(
1057 [ledger_replay]
1058 1
1059 )rippleConfig");
1060  c.loadFromString(toLoad);
1061  BEAST_EXPECT(c.LEDGER_REPLAY == true);
1062  }
1063 
1064  {
1065  Config c;
1066  std::string toLoad = (R"rippleConfig(
1067 [ledger_replay]
1068 0
1069 )rippleConfig");
1070  c.loadFromString(toLoad);
1071  BEAST_EXPECT(c.LEDGER_REPLAY == false);
1072  }
1073  }
1074 
1075  void
1077  {
1078  testcase("handshake test");
1079  auto handshake = [&](bool client, bool server, bool expecting) -> bool {
1080  auto request =
1081  ripple::makeRequest(true, false, client, false, false);
1082  http_request_type http_request;
1083  http_request.version(request.version());
1084  http_request.base() = request.base();
1085  bool serverResult =
1086  peerFeatureEnabled(http_request, FEATURE_LEDGER_REPLAY, server);
1087  if (serverResult != expecting)
1088  return false;
1089 
1090  beast::IP::Address addr =
1091  boost::asio::ip::address::from_string("172.1.1.100");
1092  jtx::Env serverEnv(*this);
1093  serverEnv.app().config().LEDGER_REPLAY = server;
1094  auto http_resp = ripple::makeResponse(
1095  true,
1096  http_request,
1097  addr,
1098  addr,
1099  uint256{1},
1100  1,
1101  {1, 0},
1102  serverEnv.app());
1103  auto const clientResult =
1104  peerFeatureEnabled(http_resp, FEATURE_LEDGER_REPLAY, client);
1105  if (clientResult != expecting)
1106  return false;
1107 
1108  return true;
1109  };
1110 
1111  BEAST_EXPECT(handshake(false, false, false));
1112  BEAST_EXPECT(handshake(false, true, false));
1113  BEAST_EXPECT(handshake(true, false, false));
1114  BEAST_EXPECT(handshake(true, true, true));
1115  }
1116 
1117  void
1118  testAllLocal(int totalReplay)
1119  {
1120  testcase("local node has all the ledgers");
1121  auto psBhvr = PeerSetBehavior::DropAll;
1122  auto ilBhvr = InboundLedgersBehavior::DropAll;
1123  auto peerFeature = PeerFeature::None;
1124 
1125  NetworkOfTwo net(*this, {totalReplay + 1}, psBhvr, ilBhvr, peerFeature);
1126 
1127  auto l = net.server.ledgerMaster.getClosedLedger();
1128  uint256 finalHash = l->info().hash;
1129  for (int i = 0; i < totalReplay; ++i)
1130  {
1131  BEAST_EXPECT(l);
1132  if (l)
1133  {
1134  net.client.ledgerMaster.storeLedger(l);
1135  l = net.server.ledgerMaster.getLedgerByHash(
1136  l->info().parentHash);
1137  }
1138  else
1139  break;
1140  }
1141 
1142  net.client.replayer.replay(
1143  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1144 
1145  std::vector<TaskStatus> deltaStatuses(
1146  totalReplay - 1, TaskStatus::Completed);
1147  BEAST_EXPECT(net.client.waitAndCheckStatus(
1148  finalHash,
1149  totalReplay,
1152  deltaStatuses));
1153 
1154  // sweep
1155  net.client.replayer.sweep();
1156  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1157  }
1158 
1159  void
1160  testAllInboundLedgers(int totalReplay)
1161  {
1162  testcase("all the ledgers from InboundLedgers");
1163  NetworkOfTwo net(
1164  *this,
1165  {totalReplay + 1},
1169 
1170  auto l = net.server.ledgerMaster.getClosedLedger();
1171  uint256 finalHash = l->info().hash;
1172  net.client.replayer.replay(
1173  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1174 
1175  std::vector<TaskStatus> deltaStatuses(
1176  totalReplay - 1, TaskStatus::Completed);
1177  BEAST_EXPECT(net.client.waitAndCheckStatus(
1178  finalHash,
1179  totalReplay,
1182  deltaStatuses));
1183 
1184  // sweep
1185  net.client.replayer.sweep();
1186  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1187  }
1188 
1189  void
1190  testPeerSetBehavior(PeerSetBehavior peerSetBehavior, int totalReplay = 4)
1191  {
1192  switch (peerSetBehavior)
1193  {
1194  case PeerSetBehavior::Good:
1195  testcase("good network");
1196  break;
1198  testcase("network drops 50% messages");
1199  break;
1201  testcase("network repeats all messages");
1202  break;
1203  default:
1204  return;
1205  }
1206 
1207  NetworkOfTwo net(
1208  *this,
1209  {totalReplay + 1},
1210  peerSetBehavior,
1213 
1214  // feed client with start ledger since InboundLedgers drops all
1215  auto l = net.server.ledgerMaster.getClosedLedger();
1216  uint256 finalHash = l->info().hash;
1217  for (int i = 0; i < totalReplay - 1; ++i)
1218  {
1219  l = net.server.ledgerMaster.getLedgerByHash(l->info().parentHash);
1220  }
1221  net.client.ledgerMaster.storeLedger(l);
1222 
1223  net.client.replayer.replay(
1224  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1225 
1226  std::vector<TaskStatus> deltaStatuses(
1227  totalReplay - 1, TaskStatus::Completed);
1228  BEAST_EXPECT(net.client.waitAndCheckStatus(
1229  finalHash,
1230  totalReplay,
1233  deltaStatuses));
1234  BEAST_EXPECT(net.client.waitForLedgers(finalHash, totalReplay));
1235 
1236  // sweep
1237  net.client.replayer.sweep();
1238  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1239  }
1240 
1241  void
1243  {
1244  testcase("stop before timeout");
1245  int totalReplay = 3;
1246  NetworkOfTwo net(
1247  *this,
1248  {totalReplay + 1},
1252 
1253  auto l = net.server.ledgerMaster.getClosedLedger();
1254  uint256 finalHash = l->info().hash;
1255  net.client.replayer.replay(
1256  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1257 
1258  std::vector<TaskStatus> deltaStatuses;
1259  BEAST_EXPECT(net.client.checkStatus(
1260  finalHash,
1261  totalReplay,
1264  deltaStatuses));
1265 
1266  BEAST_EXPECT(net.client.countsAsExpected(1, 1, 0));
1267  net.client.replayer.stop();
1268  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1269  }
1270 
1271  void
1273  {
1274  testcase("SkipListAcquire bad reply");
1275  int totalReplay = 3;
1276  NetworkOfTwo net(
1277  *this,
1278  {totalReplay + 1 + 1},
1282 
1283  auto l = net.server.ledgerMaster.getClosedLedger();
1284  uint256 finalHash = l->info().hash;
1285  net.client.replayer.replay(
1286  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1287 
1288  auto skipList = net.client.findSkipListAcquire(finalHash);
1289 
1290  std::uint8_t payload[55] = {
1291  0x6A, 0x09, 0xE6, 0x67, 0xF3, 0xBC, 0xC9, 0x08, 0xB2};
1292  auto item = std::make_shared<SHAMapItem>(
1293  uint256(12345), Slice(payload, sizeof(payload)));
1294  skipList->processData(l->seq(), item);
1295 
1296  std::vector<TaskStatus> deltaStatuses;
1297  BEAST_EXPECT(net.client.waitAndCheckStatus(
1298  finalHash,
1299  totalReplay,
1302  deltaStatuses));
1303 
1304  // add another task
1305  net.client.replayer.replay(
1306  InboundLedger::Reason::GENERIC, finalHash, totalReplay + 1);
1307  BEAST_EXPECT(net.client.waitAndCheckStatus(
1308  finalHash,
1309  totalReplay,
1312  deltaStatuses));
1313  BEAST_EXPECT(net.client.countsAsExpected(2, 1, 0));
1314  }
1315 
1316  void
1318  {
1319  testcase("LedgerDeltaAcquire bad reply");
1320  int totalReplay = 3;
1321  NetworkOfTwo net(
1322  *this,
1323  {totalReplay + 1},
1327 
1328  auto l = net.server.ledgerMaster.getClosedLedger();
1329  uint256 finalHash = l->info().hash;
1330  net.client.ledgerMaster.storeLedger(l);
1331  net.client.replayer.replay(
1332  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1333 
1334  auto delta = net.client.findLedgerDeltaAcquire(l->info().parentHash);
1335  delta->processData(
1336  l->info(), // wrong ledger info
1338  BEAST_EXPECT(net.client.taskStatus(delta) == TaskStatus::Failed);
1339  BEAST_EXPECT(
1340  net.client.taskStatus(net.client.findTask(
1341  finalHash, totalReplay)) == TaskStatus::Failed);
1342 
1343  // add another task
1344  net.client.replayer.replay(
1345  InboundLedger::Reason::GENERIC, finalHash, totalReplay + 1);
1346  BEAST_EXPECT(
1347  net.client.taskStatus(net.client.findTask(
1348  finalHash, totalReplay + 1)) == TaskStatus::Failed);
1349  }
1350 
1351  void
1353  {
1354  testcase("Overlap tasks");
1355  int totalReplay = 5;
1356  NetworkOfTwo net(
1357  *this,
1358  {totalReplay * 3 + 1},
1362  auto l = net.server.ledgerMaster.getClosedLedger();
1363  uint256 finalHash = l->info().hash;
1364  net.client.replayer.replay(
1365  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1366  std::vector<TaskStatus> deltaStatuses(
1367  totalReplay - 1, TaskStatus::Completed);
1368  BEAST_EXPECT(net.client.waitAndCheckStatus(
1369  finalHash,
1370  totalReplay,
1373  deltaStatuses));
1374  BEAST_EXPECT(net.client.waitForLedgers(finalHash, totalReplay));
1375 
1376  // same range, same reason
1377  net.client.replayer.replay(
1378  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1379  BEAST_EXPECT(net.client.countsAsExpected(1, 1, totalReplay - 1));
1380  // same range, different reason
1381  net.client.replayer.replay(
1382  InboundLedger::Reason::CONSENSUS, finalHash, totalReplay);
1383  BEAST_EXPECT(net.client.countsAsExpected(2, 1, totalReplay - 1));
1384 
1385  // no overlap
1386  for (int i = 0; i < totalReplay + 2; ++i)
1387  {
1388  l = net.server.ledgerMaster.getLedgerByHash(l->info().parentHash);
1389  }
1390  auto finalHash_early = l->info().hash;
1391  net.client.replayer.replay(
1392  InboundLedger::Reason::GENERIC, finalHash_early, totalReplay);
1393  BEAST_EXPECT(net.client.waitAndCheckStatus(
1394  finalHash_early,
1395  totalReplay,
1398  deltaStatuses)); // deltaStatuses no change
1399  BEAST_EXPECT(net.client.waitForLedgers(finalHash_early, totalReplay));
1400  BEAST_EXPECT(net.client.countsAsExpected(3, 2, 2 * (totalReplay - 1)));
1401 
1402  // partial overlap
1403  l = net.server.ledgerMaster.getLedgerByHash(l->info().parentHash);
1404  auto finalHash_moreEarly = l->info().parentHash;
1405  net.client.replayer.replay(
1406  InboundLedger::Reason::GENERIC, finalHash_moreEarly, totalReplay);
1407  BEAST_EXPECT(net.client.waitAndCheckStatus(
1408  finalHash_moreEarly,
1409  totalReplay,
1412  deltaStatuses)); // deltaStatuses no change
1413  BEAST_EXPECT(
1414  net.client.waitForLedgers(finalHash_moreEarly, totalReplay));
1415  BEAST_EXPECT(
1416  net.client.countsAsExpected(4, 3, 2 * (totalReplay - 1) + 2));
1417 
1418  // cover
1419  net.client.replayer.replay(
1420  InboundLedger::Reason::GENERIC, finalHash, totalReplay * 3);
1421  deltaStatuses =
1422  std::vector<TaskStatus>(totalReplay * 3 - 1, TaskStatus::Completed);
1423  BEAST_EXPECT(net.client.waitAndCheckStatus(
1424  finalHash,
1425  totalReplay * 3,
1428  deltaStatuses)); // deltaStatuses changed
1429  BEAST_EXPECT(net.client.waitForLedgers(finalHash, totalReplay * 3));
1430  BEAST_EXPECT(net.client.countsAsExpected(5, 3, totalReplay * 3 - 1));
1431 
1432  // sweep
1433  net.client.replayer.sweep();
1434  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1435  }
1436 
1437  void
1438  run() override
1439  {
1440  testProofPath();
1441  testReplayDelta();
1442  testTaskParameter();
1443  testConfig();
1444  testHandshake();
1445  testAllLocal(1);
1446  testAllLocal(3);
1447  testAllInboundLedgers(1);
1448  testAllInboundLedgers(4);
1449  testPeerSetBehavior(PeerSetBehavior::Good, 1);
1450  testPeerSetBehavior(PeerSetBehavior::Good);
1451  testPeerSetBehavior(PeerSetBehavior::Drop50);
1452  testPeerSetBehavior(PeerSetBehavior::Repeat);
1453  testStop();
1454  testSkipListBadReply();
1455  testLedgerDeltaBadReply();
1456  testLedgerReplayOverlap();
1457  }
1458 };
1459 
1460 struct LedgerReplayerTimeout_test : public beast::unit_test::suite
1461 {
1462  void
1464  {
1465  testcase("SkipListAcquire timeout");
1466  int totalReplay = 3;
1467  NetworkOfTwo net(
1468  *this,
1469  {totalReplay + 1},
1473 
1474  auto l = net.server.ledgerMaster.getClosedLedger();
1475  uint256 finalHash = l->info().hash;
1476  net.client.replayer.replay(
1477  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1478 
1479  std::vector<TaskStatus> deltaStatuses;
1480  BEAST_EXPECT(net.client.waitAndCheckStatus(
1481  finalHash,
1482  totalReplay,
1485  deltaStatuses));
1486 
1487  // sweep
1488  BEAST_EXPECT(net.client.countsAsExpected(1, 1, 0));
1489  net.client.replayer.sweep();
1490  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1491  }
1492 
1493  void
1495  {
1496  testcase("LedgerDeltaAcquire timeout");
1497  int totalReplay = 3;
1498  NetworkOfTwo net(
1499  *this,
1500  {totalReplay + 1},
1504 
1505  auto l = net.server.ledgerMaster.getClosedLedger();
1506  uint256 finalHash = l->info().hash;
1507  net.client.ledgerMaster.storeLedger(l);
1508  net.client.replayer.replay(
1509  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1510 
1511  std::vector<TaskStatus> deltaStatuses(
1512  totalReplay - 1, TaskStatus::Failed);
1513  deltaStatuses.back() = TaskStatus::Completed; // in client ledgerMaster
1514  BEAST_EXPECT(net.client.waitAndCheckStatus(
1515  finalHash,
1516  totalReplay,
1519  deltaStatuses));
1520 
1521  // sweep
1522  BEAST_EXPECT(net.client.countsAsExpected(1, 1, totalReplay - 1));
1523  net.client.replayer.sweep();
1524  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1525  }
1526 
1527  void
1528  run() override
1529  {
1530  testSkipListTimeout();
1531  testLedgerDeltaTimeout();
1532  }
1533 };
1534 
1535 struct LedgerReplayerLong_test : public beast::unit_test::suite
1536 {
1537  void
1538  run() override
1539  {
1540  testcase("Acquire 1000 ledgers");
1541  int totalReplay = 250;
1542  int rounds = 4;
1543  NetworkOfTwo net(
1544  *this,
1545  {totalReplay * rounds + 1},
1549 
1550  std::vector<uint256> finishHashes;
1551  auto l = net.server.ledgerMaster.getClosedLedger();
1552  for (int i = 0; i < rounds; ++i)
1553  {
1554  finishHashes.push_back(l->info().hash);
1555  for (int j = 0; j < totalReplay; ++j)
1556  {
1557  l = net.server.ledgerMaster.getLedgerByHash(
1558  l->info().parentHash);
1559  }
1560  }
1561  BEAST_EXPECT(finishHashes.size() == rounds);
1562 
1563  for (int i = 0; i < rounds; ++i)
1564  {
1565  net.client.replayer.replay(
1566  InboundLedger::Reason::GENERIC, finishHashes[i], totalReplay);
1567  }
1568 
1569  std::vector<TaskStatus> deltaStatuses(
1570  totalReplay - 1, TaskStatus::Completed);
1571  for (int i = 0; i < rounds; ++i)
1572  {
1573  BEAST_EXPECT(net.client.waitAndCheckStatus(
1574  finishHashes[i],
1575  totalReplay,
1578  deltaStatuses));
1579  }
1580 
1581  BEAST_EXPECT(
1582  net.client.waitForLedgers(finishHashes[0], totalReplay * rounds));
1583  BEAST_EXPECT(net.client.countsAsExpected(
1584  rounds, rounds, rounds * (totalReplay - 1)));
1585 
1586  // sweep
1587  net.client.replayer.sweep();
1588  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1589  }
1590 };
1591 
1594 BEAST_DEFINE_TESTSUITE(LedgerReplayerTimeout, app, ripple);
1595 BEAST_DEFINE_TESTSUITE_MANUAL(LedgerReplayerLong, app, ripple);
1596 
1597 } // namespace test
1598 } // namespace ripple
ripple::test::LedgerReplayClient::waitAndCheckStatus
bool waitAndCheckStatus(uint256 const &hash, int totalReplay, TaskStatus taskExpect, TaskStatus skiplistExpect, std::vector< TaskStatus > const &deltaExpects)
Definition: LedgerReplay_test.cpp:793
ripple::test::LedgerServer::param
Parameter param
Definition: LedgerReplay_test.cpp:543
ripple::test::TestPeer::TestPeer
TestPeer(bool enableLedgerReplay)
Definition: LedgerReplay_test.cpp:194
ripple::test::LedgerServer::Parameter::initLedgers
int initLedgers
Definition: LedgerReplay_test.cpp:451
ripple::test::TestPeer::compressionEnabled
bool compressionEnabled() const override
Definition: LedgerReplay_test.cpp:288
ripple::Application
Definition: Application.h:115
ripple::test::LedgerReplayClient::replayer
LedgerReplayer replayer
Definition: LedgerReplay_test.cpp:813
ripple::test::LedgerReplayer_test::testLedgerReplayOverlap
void testLedgerReplayOverlap()
Definition: LedgerReplay_test.cpp:1352
ripple::test::ledgerHash
static uint256 ledgerHash(LedgerInfo const &info)
Definition: compression_test.cpp:57
ripple::HashPrefix::ledgerMaster
@ ledgerMaster
ledger master data for signing
ripple::test::LedgerReplayClient::countSkipLists
std::size_t countSkipLists()
Definition: LedgerReplay_test.cpp:680
std::this_thread::sleep_for
T sleep_for(T... args)
ripple::test::jtx::XRP
const XRP_t XRP
Converts to XRP Issue or STAmount.
Definition: amount.cpp:105
ripple::test::TestPeer::supportsFeature
bool supportsFeature(ProtocolFeature f) const override
Definition: LedgerReplay_test.cpp:243
ripple::test::NetworkOfTwo::NetworkOfTwo
NetworkOfTwo(beast::unit_test::suite &suite, LedgerServer::Parameter const &param, PeerSetBehavior behavior=PeerSetBehavior::Good, InboundLedgersBehavior inboundBhvr=InboundLedgersBehavior::Good, PeerFeature peerFeature=PeerFeature::LedgerReplayEnabled)
Definition: LedgerReplay_test.cpp:833
ripple::test::LedgerReplayClient::countsAsExpected
bool countsAsExpected(std::size_t tasks, std::size_t skipLists, std::size_t deltas)
Definition: LedgerReplay_test.cpp:687
ripple::test::LedgerReplayer_test::testLedgerDeltaBadReply
void testLedgerDeltaBadReply()
Definition: LedgerReplay_test.cpp:1317
ripple::test::LedgerReplayerTimeout_test::testLedgerDeltaTimeout
void testLedgerDeltaTimeout()
Definition: LedgerReplay_test.cpp:1494
ripple::LedgerReplayTask::TaskParameter::reason_
InboundLedger::Reason reason_
Definition: LedgerReplayTask.h:50
ripple::InboundLedger::Reason::CONSENSUS
@ CONSENSUS
std::string
STL class.
std::shared_ptr
STL class.
ripple::test::NetworkOfTwo::client
LedgerReplayClient client
Definition: LedgerReplay_test.cpp:845
ripple::test::LedgerReplay_test::run
void run() override
Definition: LedgerReplay_test.cpp:43
ripple::test::TestPeer::send
void send(std::shared_ptr< Message > const &m) override
Definition: LedgerReplay_test.cpp:199
ripple::test::jtx::drops
PrettyAmount drops(Integer i)
Returns an XRP PrettyAmount, which is trivially convertible to STAmount.
Definition: amount.h:241
ripple::test::LedgerReplayer_test::testConfig
void testConfig()
Definition: LedgerReplay_test.cpp:1046
ripple::test::TestPeerSetBuilder
Build the TestPeerSet.
Definition: LedgerReplay_test.cpp:414
ripple::test::TaskStatus::NotExist
@ NotExist
ripple::test::TestPeer::hasLedger
bool hasLedger(uint256 const &hash, std::uint32_t seq) const override
Definition: LedgerReplay_test.cpp:265
ripple::test::MagicInboundLedgers::gotStaleData
virtual void gotStaleData(std::shared_ptr< protocol::TMLedgerData > packet) override
Definition: LedgerReplay_test.cpp:125
ripple::test::PeerSetBehavior::Good
@ Good
ripple::Slice
An immutable linear range of bytes.
Definition: Slice.h:44
std::unordered_set
STL class.
ripple::Config::LEDGER_REPLAY
bool LEDGER_REPLAY
Definition: Config.h:207
ripple::LedgerMaster
Definition: LedgerMaster.h:70
ripple::test::TestPeer::addTxQueue
void addTxQueue(const uint256 &) override
Aggregate transaction's hash.
Definition: LedgerReplay_test.cpp:297
ripple::test::TestPeer::isHighLatency
bool isHighLatency() const override
Definition: LedgerReplay_test.cpp:222
ripple::InboundLedger::Reason::GENERIC
@ GENERIC
ripple::test::LedgerServer
Utility class for (1) creating ledgers with txns and (2) providing the ledgers via the ledgerMaster.
Definition: LedgerReplay_test.cpp:447
std::vector
STL class.
std::find_if
T find_if(T... args)
std::unordered_set::size
T size(T... args)
ripple::test::LedgerReplayerLong_test
Definition: LedgerReplay_test.cpp:1535
ripple::test::MagicInboundLedgers::ledgerSource
LedgerMaster & ledgerSource
Definition: LedgerReplay_test.cpp:176
ripple::test::TestPeerSet::addPeers
void addPeers(std::size_t limit, std::function< bool(std::shared_ptr< Peer > const &)> hasItem, std::function< void(std::shared_ptr< Peer > const &)> onPeerAdded) override
Try add more peers.
Definition: LedgerReplay_test.cpp:343
ripple::test::TestPeer::json
Json::Value json() override
Definition: LedgerReplay_test.cpp:238
ripple::test::LedgerServer::sendPayments
void sendPayments(int newTxes)
Definition: LedgerReplay_test.cpp:491
ripple::FEATURE_LEDGER_REPLAY
static constexpr char FEATURE_LEDGER_REPLAY[]
Definition: Handshake.h:148
std::chrono::milliseconds
ripple::test::PeerSetBehavior::Drop50
@ Drop50
ripple::ProtocolFeature::LedgerReplay
@ LedgerReplay
ripple::test::TaskStatus::Failed
@ Failed
ripple::keylet::skip
Keylet const & skip() noexcept
The index of the "short" skip list.
Definition: Indexes.cpp:142
ripple::test::jtx::port_increment
std::unique_ptr< Config > port_increment(std::unique_ptr< Config >, int)
adjust the default configured server ports by a specified value
Definition: envconfig.cpp:98
ripple::test::TestPeer::cluster
bool cluster() const override
Returns true if this connection is a member of the cluster.
Definition: LedgerReplay_test.cpp:217
ripple::test::LedgerServer::createLedgerHistory
void createLedgerHistory()
create ledger history
Definition: LedgerReplay_test.cpp:531
ripple::test::jtx::Env::journal
const beast::Journal journal
Definition: Env.h:144
ripple::test::TestPeer::id
id_t id() const override
Definition: LedgerReplay_test.cpp:212
ripple::test::TaskStatus
TaskStatus
Definition: LedgerReplay_test.cpp:547
beast::severities
A namespace for easy access to logging severity values.
Definition: Journal.h:29
ripple::test::TestPeer::charge
void charge(Resource::Charge const &fee) override
Adjust this peer's load balance based on the type of load imposed.
Definition: LedgerReplay_test.cpp:208
ripple::test::PeerFeature::None
@ None
ripple::test::LedgerReplayer_test::testSkipListBadReply
void testSkipListBadReply()
Definition: LedgerReplay_test.cpp:1272
ripple::test::MagicInboundLedgers::acquire
virtual std::shared_ptr< Ledger const > acquire(uint256 const &hash, std::uint32_t seq, InboundLedger::Reason) override
Definition: LedgerReplay_test.cpp:95
ripple::test::InboundLedgersBehavior::Good
@ Good
ripple::test::jtx::Env::app
Application & app()
Definition: Env.h:241
std::string::back
T back(T... args)
std::function
ripple::test::LedgerReplayer_test::testAllInboundLedgers
void testAllInboundLedgers(int totalReplay)
Definition: LedgerReplay_test.cpp:1160
ripple::test::MagicInboundLedgers::ledgerSink
LedgerMaster & ledgerSink
Definition: LedgerReplay_test.cpp:177
ripple::test::TestPeerSet::behavior
PeerSetBehavior behavior
Definition: LedgerReplay_test.cpp:408
ripple::test::TestPeer::hasTxSet
bool hasTxSet(uint256 const &hash) const override
Definition: LedgerReplay_test.cpp:274
ripple::test::LedgerReplayClient::ledgerMaster
LedgerMaster & ledgerMaster
Definition: LedgerReplay_test.cpp:809
ripple::test::jtx::envconfig
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
Definition: envconfig.h:49
ripple::ProtocolFeature
ProtocolFeature
Definition: ripple/overlay/Peer.h:38
ripple::test::LedgerReplayClient::haveLedgers
bool haveLedgers(uint256 const &finishLedgerHash, int totalReplay)
Definition: LedgerReplay_test.cpp:597
ripple::test::TestPeerSetBuilder::local
LedgerReplayMsgHandler & local
Definition: LedgerReplay_test.cpp:437
ripple::tapNONE
@ tapNONE
Definition: ApplyView.h:30
ripple::test::NetworkOfTwo::server
LedgerServer server
Definition: LedgerReplay_test.cpp:844
ripple::test::LedgerReplayer_test::testAllLocal
void testAllLocal(int totalReplay)
Definition: LedgerReplay_test.cpp:1118
ripple::test::TestPeer::getScore
int getScore(bool) const override
Definition: LedgerReplay_test.cpp:227
ripple::base_uint::data
pointer data()
Definition: base_uint.h:115
ripple::test::BEAST_DEFINE_TESTSUITE_PRIO
BEAST_DEFINE_TESTSUITE_PRIO(AccountDelete, app, ripple, 2)
ripple::test::jtx::autofill
static const autofill_t autofill
Definition: tags.h:42
ripple::test::LedgerReplayClient::waitForDone
bool waitForDone()
Definition: LedgerReplay_test.cpp:626
ripple::test::LedgerServer::LedgerServer
LedgerServer(beast::unit_test::suite &suite, Parameter const &p)
Definition: LedgerReplay_test.cpp:458
ripple::test::LedgerReplayerTimeout_test
Definition: LedgerReplay_test.cpp:1460
ripple::PeerSetBuilder
Definition: PeerSet.h:80
ripple::base_uint::size
constexpr static std::size_t size()
Definition: base_uint.h:498
ripple::LedgerReplayTask::TaskParameter::update
bool update(uint256 const &hash, std::uint32_t seq, std::vector< uint256 > const &sList)
fill all the fields that was not filled during construction
Definition: LedgerReplayTask.cpp:39
ripple::uint256
base_uint< 256 > uint256
Definition: base_uint.h:529
std::vector::push_back
T push_back(T... args)
ripple::test::MagicInboundLedgers::MagicInboundLedgers
MagicInboundLedgers(LedgerMaster &ledgerSource, LedgerMaster &ledgerSink, InboundLedgersBehavior bhvr)
Definition: LedgerReplay_test.cpp:85
ripple::test::TestPeerSet::local
LedgerReplayMsgHandler & local
Definition: LedgerReplay_test.cpp:405
ripple::Keylet::key
uint256 key
Definition: Keylet.h:40
ripple::base_uint< 256 >
ripple::test::TestPeer::ledgerReplayEnabled_
bool ledgerReplayEnabled_
Definition: LedgerReplay_test.cpp:310
ripple::test::LedgerServer::accounts
std::vector< jtx::Account > accounts
Definition: LedgerReplay_test.cpp:544
ripple::test::MagicInboundLedgers::isFailure
virtual bool isFailure(uint256 const &h) override
Definition: LedgerReplay_test.cpp:135
ripple::test::TestPeerSet::sendRequest
void sendRequest(::google::protobuf::Message const &msg, protocol::MessageType type, std::shared_ptr< Peer > const &peer) override
Definition: LedgerReplay_test.cpp:353
ripple::test::MagicInboundLedgers::gotLedgerData
virtual bool gotLedgerData(LedgerHash const &ledgerHash, std::shared_ptr< Peer >, std::shared_ptr< protocol::TMLedgerData >) override
Definition: LedgerReplay_test.cpp:116
ripple::test::TestPeer::getClosedLedgerHash
uint256 const & getClosedLedgerHash() const override
Definition: LedgerReplay_test.cpp:259
ripple::test::MagicInboundLedgers::clearFailures
virtual void clearFailures() override
Definition: LedgerReplay_test.cpp:141
ripple::test::TestPeerSet::getPeerIds
const std::set< Peer::id_t > & getPeerIds() const override
get the set of ids of previously added peers
Definition: LedgerReplay_test.cpp:399
ripple::Config::loadFromString
void loadFromString(std::string const &fileContents)
Load the config from the contents of the string.
Definition: Config.cpp:457
ripple::test::PeerSetBehavior::DropAll
@ DropAll
thread
beast::IP::Address
boost::asio::ip::address Address
Definition: IPAddress.h:41
ripple::test::LedgerReplayClient::asExpected
bool asExpected(uint256 const &hash, int totalReplay, TaskStatus taskExpect, TaskStatus skiplistExpect, std::vector< TaskStatus > const &deltaExpects)
Definition: LedgerReplay_test.cpp:755
ripple::test::InboundLedgersBehavior
InboundLedgersBehavior
Definition: LedgerReplay_test.cpp:72
ripple::Application::getLedgerMaster
virtual LedgerMaster & getLedgerMaster()=0
ripple::PublicKey
A public key.
Definition: PublicKey.h:59
ripple::test::LedgerReplayClient::findTask
std::shared_ptr< LedgerReplayTask > findTask(uint256 const &hash, int totalReplay)
Definition: LedgerReplay_test.cpp:659
ripple::test::LedgerServer::app
Application & app
Definition: LedgerReplay_test.cpp:540
ripple::Config
Definition: Config.h:68
chrono
ripple::test::TestPeer::txReduceRelayEnabled
bool txReduceRelayEnabled() const override
Definition: LedgerReplay_test.cpp:305
ripple::Application::config
virtual Config & config()=0
ripple::test::LedgerReplayerTimeout_test::run
void run() override
Definition: LedgerReplay_test.cpp:1528
ripple::test::TestPeer::hasRange
bool hasRange(std::uint32_t uMin, std::uint32_t uMax) override
Definition: LedgerReplay_test.cpp:283
std::unique_lock
STL class.
std::to_string
T to_string(T... args)
ripple::test::LedgerServer::ledgerMaster
LedgerMaster & ledgerMaster
Definition: LedgerReplay_test.cpp:541
ripple::test::jtx::Env::close
bool close(NetClock::time_point closeTime, std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)
Close and advance the ledger.
Definition: Env.cpp:121
ripple::test::LedgerServer::env
jtx::Env env
Definition: LedgerReplay_test.cpp:539
ripple::test::PeerSetBehavior::DropLedgerDeltaReply
@ DropLedgerDeltaReply
ripple::test::LedgerReplayClient::findLedgerDeltaAcquire
std::shared_ptr< LedgerDeltaAcquire > findLedgerDeltaAcquire(uint256 const &hash)
Definition: LedgerReplay_test.cpp:709
ripple::test::MagicInboundLedgers::getInfo
virtual Json::Value getInfo() override
Definition: LedgerReplay_test.cpp:146
ripple::Application::logs
virtual Logs & logs()=0
ripple::test::LedgerReplayClient::serverMsgHandler
LedgerReplayMsgHandler serverMsgHandler
Definition: LedgerReplay_test.cpp:811
ripple::peerFeatureEnabled
bool peerFeatureEnabled(headers const &request, std::string const &feature, std::string value, bool config)
Check if a feature should be enabled for a peer.
Definition: Handshake.h:199
std::uint32_t
ripple::test::jtx::sig
Set the regular signature on a JTx.
Definition: sig.h:34
ripple::test::MagicInboundLedgers::logFailure
virtual void logFailure(uint256 const &h, std::uint32_t seq) override
Definition: LedgerReplay_test.cpp:130
ripple::test::LedgerReplayer_test::testHandshake
void testHandshake()
Definition: LedgerReplay_test.cpp:1076
ripple::test::TestPeerSetBuilder::remote
LedgerReplayMsgHandler & remote
Definition: LedgerReplay_test.cpp:438
std::map
STL class.
ripple::test::LedgerReplayer_test::testProofPath
void testProofPath()
Definition: LedgerReplay_test.cpp:876
ripple::test::InboundLedgersBehavior::DropAll
@ DropAll
ripple::test::LedgerReplayClient::LedgerReplayClient
LedgerReplayClient(beast::unit_test::suite &suite, LedgerServer &server, PeerSetBehavior behavior=PeerSetBehavior::Good, InboundLedgersBehavior inboundBhvr=InboundLedgersBehavior::Good, PeerFeature peerFeature=PeerFeature::LedgerReplayEnabled)
Definition: LedgerReplay_test.cpp:564
ripple::test::LedgerReplayClient
Ledger replay client side.
Definition: LedgerReplay_test.cpp:561
ripple::test::TaskStatus::NotDone
@ NotDone
ripple::test::TestPeerSetBuilder::behavior
PeerSetBehavior behavior
Definition: LedgerReplay_test.cpp:439
ripple::InboundLedgers
Manages the lifetime of inbound ledgers.
Definition: InboundLedgers.h:33
ripple::test::jtx::fee
Set the fee on a JTx.
Definition: fee.h:35
ripple::LedgerReplayTask::TaskParameter
Definition: LedgerReplayTask.h:46
ripple::test::TestPeerSetBuilder::build
std::unique_ptr< PeerSet > build() override
Definition: LedgerReplay_test.cpp:430
ripple::test::jtx::None
Definition: amount.h:57
ripple::test::jtx::seq
Set the sequence number on a JTx.
Definition: seq.h:33
ripple::test::MagicInboundLedgers
Simulate a network InboundLedgers.
Definition: LedgerReplay_test.cpp:82
ripple::LedgerMaster::getClosedLedger
std::shared_ptr< Ledger const > getClosedLedger()
Definition: LedgerMaster.h:98
ripple::test::LedgerReplayClient::findSkipListAcquire
std::shared_ptr< SkipListAcquire > findSkipListAcquire(uint256 const &hash)
Definition: LedgerReplay_test.cpp:699
ripple::Logs::threshold
beast::severities::Severity threshold() const
Definition: Log.cpp:150
ripple::test::LedgerReplayer_test::testStop
void testStop()
Definition: LedgerReplay_test.cpp:1242
std::vector::emplace_back
T emplace_back(T... args)
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::test::LedgerReplayClient::app
Application & app
Definition: LedgerReplay_test.cpp:808
ripple::LedgerReplayMsgHandler
Definition: LedgerReplayMsgHandler.h:30
ripple::test::MagicInboundLedgers::find
virtual std::shared_ptr< InboundLedger > find(LedgerHash const &hash) override
Definition: LedgerReplay_test.cpp:110
ripple::test::MagicInboundLedgers::fetchRate
virtual std::size_t fetchRate() override
Returns the rate of historical ledger fetches per minute.
Definition: LedgerReplay_test.cpp:152
ripple::test::LedgerReplayer_test
Test cases: LedgerReplayer_test: – process TMProofPathRequest and TMProofPathResponse – process TMRep...
Definition: LedgerReplay_test.cpp:873
ripple::test::logAll
void logAll(LedgerServer &server, LedgerReplayClient &client, beast::severities::Severity level=Severity::kTrace)
Definition: LedgerReplay_test.cpp:818
ripple::test::LedgerReplayClient::checkStatus
bool checkStatus(uint256 const &hash, int totalReplay, TaskStatus taskExpect, TaskStatus skiplistExpect, std::vector< TaskStatus > const &deltaExpects)
Definition: LedgerReplay_test.cpp:774
ripple::test::TestPeer::setPublisherListSequence
void setPublisherListSequence(PublicKey const &, std::size_t const) override
Definition: LedgerReplay_test.cpp:255
ripple::test::jtx::pay
Json::Value pay(Account const &account, Account const &to, AnyAmount amount)
Create a payment.
Definition: pay.cpp:29
ripple::test::LedgerReplayer_test::testPeerSetBehavior
void testPeerSetBehavior(PeerSetBehavior peerSetBehavior, int totalReplay=4)
Definition: LedgerReplay_test.cpp:1190
ripple::test::TestPeer::cycleStatus
void cycleStatus() override
Definition: LedgerReplay_test.cpp:279
ripple::test::TestPeer::publisherListSequence
std::optional< std::size_t > publisherListSequence(PublicKey const &) const override
Definition: LedgerReplay_test.cpp:250
ripple::test::MagicInboundLedgers::sweep
virtual void sweep() override
Definition: LedgerReplay_test.cpp:167
ripple::test::LedgerReplayClient::countDeltas
std::size_t countDeltas()
Definition: LedgerReplay_test.cpp:673
beast::severities::Severity
Severity
Severity level / threshold of a Journal message.
Definition: Journal.h:31
std
STL namespace.
ripple::test::MagicInboundLedgers::onLedgerFetched
virtual void onLedgerFetched() override
Called when a complete ledger is obtained.
Definition: LedgerReplay_test.cpp:158
std::unordered_set::insert
T insert(T... args)
ripple::test::jtx::Env::fund
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
Definition: Env.cpp:225
ripple::test::LedgerServer::createAccounts
void createAccounts(int newAccounts)
Definition: LedgerReplay_test.cpp:475
ripple::PeerSet
Supports data retrieval by managing a set of peers.
Definition: PeerSet.h:44
ripple::test::LedgerReplayClient::clientMsgHandler
LedgerReplayMsgHandler clientMsgHandler
Definition: LedgerReplay_test.cpp:812
ripple::Resource::Charge
A consumption charge.
Definition: Charge.h:30
ripple::buildLedger
std::shared_ptr< Ledger > buildLedger(std::shared_ptr< Ledger const > const &parent, NetClock::time_point closeTime, const bool closeTimeCorrect, NetClock::duration closeResolution, Application &app, CanonicalTXSet &txns, std::set< TxID > &failedTxs, beast::Journal j)
Build a new ledger by applying consensus transactions.
Definition: BuildLedger.cpp:175
ripple::test::LedgerReplayClient::addLedger
void addLedger(std::shared_ptr< Ledger const > const &l)
Definition: LedgerReplay_test.cpp:591
std::unordered_set::count
T count(T... args)
ripple::test::NetworkOfTwo
Definition: LedgerReplay_test.cpp:831
ripple::test::LedgerReplayerLong_test::run
void run() override
Definition: LedgerReplay_test.cpp:1538
ripple::LedgerReplayer
Manages the lifetime of ledger replay tasks.
Definition: LedgerReplayer.h:72
ripple::test::LedgerReplayClient::getTasks
std::vector< std::shared_ptr< LedgerReplayTask > > getTasks()
Definition: LedgerReplay_test.cpp:652
ripple::test::LedgerReplayer_test::run
void run() override
Definition: LedgerReplay_test.cpp:1438
ripple::test::LedgerReplayer_test::testReplayDelta
void testReplayDelta()
Definition: LedgerReplay_test.cpp:940
ripple::test::TestPeerSet::dummyPeer
std::shared_ptr< TestPeer > dummyPeer
Definition: LedgerReplay_test.cpp:407
ripple::test::LedgerServer::msgHandler
LedgerReplayMsgHandler msgHandler
Definition: LedgerReplay_test.cpp:542
ripple::test::TestPeer::getRemoteAddress
beast::IP::Endpoint getRemoteAddress() const override
Definition: LedgerReplay_test.cpp:203
ripple::test::TestPeerSet
Simulate a peerSet that supplies peers to ledger replay subtasks.
Definition: LedgerReplay_test.cpp:328
std::optional< std::size_t >
ripple::LedgerReplayTask::TaskParameter::finishHash_
uint256 finishHash_
Definition: LedgerReplayTask.h:51
std::size_t
ripple::LedgerReplayTask::TaskParameter::totalLedgers_
std::uint32_t totalLedgers_
Definition: LedgerReplayTask.h:52
ripple::test::TestPeerSetBuilder::enableLedgerReplay
bool enableLedgerReplay
Definition: LedgerReplay_test.cpp:440
ripple::test::TestPeerSet::remote
LedgerReplayMsgHandler & remote
Definition: LedgerReplay_test.cpp:406
ripple::test::LedgerServer::Parameter
Definition: LedgerReplay_test.cpp:449
ripple::test::jtx::Account
Immutable cryptographic account descriptor.
Definition: Account.h:37
ripple::test::PeerSetBehavior::Repeat
@ Repeat
beast::IP::Endpoint
A version-independent IP address and port combination.
Definition: IPEndpoint.h:38
ripple::test::MagicInboundLedgers::stop
virtual void stop() override
Definition: LedgerReplay_test.cpp:172
ripple::InboundLedger::Reason
Reason
Definition: InboundLedger.h:46
ripple::test::LedgerReplayClient::env
jtx::Env env
Definition: LedgerReplay_test.cpp:807
ripple::test::LedgerReplayClient::taskStatus
TaskStatus taskStatus(std::shared_ptr< T > const &t)
Definition: LedgerReplay_test.cpp:720
ripple::test::LedgerReplay_test
Definition: LedgerReplay_test.cpp:40
ripple::test::LedgerReplayClient::waitForLedgers
bool waitForLedgers(uint256 const &finishLedgerHash, int totalReplay)
Definition: LedgerReplay_test.cpp:612
ripple::test::LedgerReplayerTimeout_test::testSkipListTimeout
void testSkipListTimeout()
Definition: LedgerReplay_test.cpp:1463
ripple::makeRequest
auto makeRequest(bool crawlPublic, bool comprEnabled, bool ledgerReplayEnabled, bool txReduceRelayEnabled, bool vpReduceRelayEnabled) -> request_type
Make outbound http request.
Definition: Handshake.cpp:369
ripple::test::TestPeerSet::TestPeerSet
TestPeerSet(LedgerReplayMsgHandler &me, LedgerReplayMsgHandler &other, PeerSetBehavior bhvr, bool enableLedgerReplay)
Definition: LedgerReplay_test.cpp:330
ripple::test::PeerSetBehavior
PeerSetBehavior
Definition: LedgerReplay_test.cpp:313
ripple::test::PeerFeature
PeerFeature
Definition: LedgerReplay_test.cpp:181
ripple::makeResponse
http_response_type makeResponse(bool crawlPublic, http_request_type const &req, beast::IP::Address public_ip, beast::IP::Address remote_ip, uint256 const &sharedValue, std::optional< std::uint32_t > networkID, ProtocolVersion protocol, Application &app)
Make http response.
Definition: Handshake.cpp:396
ripple::test::PeerSetBehavior::DropSkipListReply
@ DropSkipListReply
ripple::test::LedgerReplayClient::inboundLedgers
MagicInboundLedgers inboundLedgers
Definition: LedgerReplay_test.cpp:810
ripple::http_request_type
boost::beast::http::request< boost::beast::http::dynamic_body > http_request_type
Definition: Handshake.h:47
ripple::test::PeerFeature::LedgerReplayEnabled
@ LedgerReplayEnabled
ripple::test::TestPeer::removeTxQueue
void removeTxQueue(const uint256 &) override
Remove hash from the transactions' hashes queue.
Definition: LedgerReplay_test.cpp:301
std::unique_ptr
STL class.
ripple::test::MagicInboundLedgers::bhvr
InboundLedgersBehavior bhvr
Definition: LedgerReplay_test.cpp:178
ripple::test::TestPeer
Simulate a network peer.
Definition: LedgerReplay_test.cpp:191
ripple::test::TestPeerSetBuilder::TestPeerSetBuilder
TestPeerSetBuilder(LedgerReplayMsgHandler &me, LedgerReplayMsgHandler &other, PeerSetBehavior bhvr, PeerFeature peerFeature)
Definition: LedgerReplay_test.cpp:417
ripple::test::TaskStatus::Completed
@ Completed
ripple::test::LedgerReplayClient::asExpected
bool asExpected(std::shared_ptr< LedgerReplayTask > const &task, TaskStatus taskExpect, TaskStatus skiplistExpect, std::vector< TaskStatus > const &deltaExpects)
Definition: LedgerReplay_test.cpp:730
std::set
STL class.
ripple::test::TestPeer::ledgerRange
void ledgerRange(std::uint32_t &minSeq, std::uint32_t &maxSeq) const override
Definition: LedgerReplay_test.cpp:270
ripple::test::TestPeer::sendTxQueue
void sendTxQueue() override
Send aggregated transactions' hashes.
Definition: LedgerReplay_test.cpp:293
ripple::LedgerReplayTask::TaskParameter::canMergeInto
bool canMergeInto(TaskParameter const &existingTask) const
check if this task can be merged into an existing task
Definition: LedgerReplayTask.cpp:58
ripple::test::jtx::Env
A transaction testing environment.
Definition: Env.h:116
ripple::test::LedgerReplayer_test::testTaskParameter
void testTaskParameter()
Definition: LedgerReplay_test.cpp:993
ripple::test::BEAST_DEFINE_TESTSUITE_MANUAL
BEAST_DEFINE_TESTSUITE_MANUAL(LedgerReplayerLong, app, ripple)
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::test::TestPeer::getNodePublic
PublicKey const & getNodePublic() const override
Definition: LedgerReplay_test.cpp:232
ripple::Peer
Represents a peer connection in the overlay.
Definition: ripple/overlay/Peer.h:45
ripple::test::MagicInboundLedgers::gotFetchPack
virtual void gotFetchPack() override
Definition: LedgerReplay_test.cpp:163
ripple::test::BEAST_DEFINE_TESTSUITE
BEAST_DEFINE_TESTSUITE(DeliverMin, app, ripple)
ripple::LedgerReplay
Definition: LedgerReplay.h:32