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::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,
571  jtx::envconfig(jtx::port_increment, 3),
572  nullptr,
573  beast::severities::kDisabled)
574  , app(env.app())
575  , ledgerMaster(env.app().getLedgerMaster())
576  , inboundLedgers(
577  server.app.getLedgerMaster(),
578  ledgerMaster,
579  inboundBhvr)
580  , serverMsgHandler(server.app, server.app.getLedgerReplayer())
581  , clientMsgHandler(env.app(), replayer)
582  , replayer(
583  env.app(),
584  inboundLedgers,
585  std::make_unique<TestPeerSetBuilder>(
586  clientMsgHandler,
587  serverMsgHandler,
588  behavior,
589  peerFeature))
590  {
591  }
592 
593  void
595  {
596  ledgerMaster.storeLedger(l);
597  }
598 
599  bool
600  haveLedgers(uint256 const& finishLedgerHash, int totalReplay)
601  {
602  uint256 hash = finishLedgerHash;
603  int i = 0;
604  for (; i < totalReplay; ++i)
605  {
606  auto const l = ledgerMaster.getLedgerByHash(hash);
607  if (!l)
608  return false;
609  hash = l->info().parentHash;
610  }
611  return true;
612  }
613 
614  bool
615  waitForLedgers(uint256 const& finishLedgerHash, int totalReplay)
616  {
617  int totalRound = 100;
618  for (int i = 0; i < totalRound; ++i)
619  {
620  if (haveLedgers(finishLedgerHash, totalReplay))
621  return true;
622  if (i < totalRound - 1)
624  }
625  return false;
626  }
627 
628  bool
630  {
631  int totalRound = 100;
632  for (int i = 0; i < totalRound; ++i)
633  {
634  bool allDone = true;
635  {
636  std::unique_lock<std::mutex> lock(replayer.mtx_);
637  for (auto const& t : replayer.tasks_)
638  {
639  if (!t->finished())
640  {
641  allDone = false;
642  break;
643  }
644  }
645  }
646  if (allDone)
647  return true;
648  if (i < totalRound - 1)
650  }
651  return false;
652  }
653 
656  {
657  std::unique_lock<std::mutex> lock(replayer.mtx_);
658  return replayer.tasks_;
659  }
660 
662  findTask(uint256 const& hash, int totalReplay)
663  {
664  std::unique_lock<std::mutex> lock(replayer.mtx_);
665  auto i = std::find_if(
666  replayer.tasks_.begin(), replayer.tasks_.end(), [&](auto const& t) {
667  return t->parameter_.finishHash_ == hash &&
668  t->parameter_.totalLedgers_ == totalReplay;
669  });
670  if (i == replayer.tasks_.end())
671  return {};
672  return *i;
673  }
674 
677  {
678  std::unique_lock<std::mutex> lock(replayer.mtx_);
679  return replayer.deltas_.size();
680  }
681 
684  {
685  std::unique_lock<std::mutex> lock(replayer.mtx_);
686  return replayer.skipLists_.size();
687  }
688 
689  bool
691  std::size_t tasks,
692  std::size_t skipLists,
693  std::size_t deltas)
694  {
695  std::unique_lock<std::mutex> lock(replayer.mtx_);
696  return replayer.tasks_.size() == tasks &&
697  replayer.skipLists_.size() == skipLists &&
698  replayer.deltas_.size() == deltas;
699  }
700 
703  {
704  std::unique_lock<std::mutex> lock(replayer.mtx_);
705  auto i = replayer.skipLists_.find(hash);
706  if (i == replayer.skipLists_.end())
707  return {};
708  return i->second.lock();
709  }
710 
713  {
714  std::unique_lock<std::mutex> lock(replayer.mtx_);
715  auto i = replayer.deltas_.find(hash);
716  if (i == replayer.deltas_.end())
717  return {};
718  return i->second.lock();
719  }
720 
721  template <typename T>
722  TaskStatus
724  {
725  if (t->failed_)
726  return TaskStatus::Failed;
727  if (t->complete_)
728  return TaskStatus::Completed;
729  return TaskStatus::NotDone;
730  }
731 
732  bool
735  TaskStatus taskExpect,
736  TaskStatus skiplistExpect,
737  std::vector<TaskStatus> const& deltaExpects)
738  {
739  if (taskStatus(task) == taskExpect)
740  {
741  if (taskStatus(task->skipListAcquirer_) == skiplistExpect)
742  {
743  if (task->deltas_.size() == deltaExpects.size())
744  {
745  for (int i = 0; i < deltaExpects.size(); ++i)
746  {
747  if (taskStatus(task->deltas_[i]) != deltaExpects[i])
748  return false;
749  }
750  return true;
751  }
752  }
753  }
754  return false;
755  }
756 
757  bool
759  uint256 const& hash,
760  int totalReplay,
761  TaskStatus taskExpect,
762  TaskStatus skiplistExpect,
763  std::vector<TaskStatus> const& deltaExpects)
764  {
765  auto t = findTask(hash, totalReplay);
766  if (!t)
767  {
768  if (taskExpect == TaskStatus::NotExist)
769  return true;
770  return false;
771  }
772 
773  return asExpected(t, taskExpect, skiplistExpect, deltaExpects);
774  }
775 
776  bool
778  uint256 const& hash,
779  int totalReplay,
780  TaskStatus taskExpect,
781  TaskStatus skiplistExpect,
782  std::vector<TaskStatus> const& deltaExpects)
783  {
784  auto t = findTask(hash, totalReplay);
785  if (!t)
786  {
787  if (taskExpect == TaskStatus::NotExist)
788  return true;
789  return false;
790  }
791 
792  return asExpected(t, taskExpect, skiplistExpect, deltaExpects);
793  }
794 
795  bool
797  uint256 const& hash,
798  int totalReplay,
799  TaskStatus taskExpect,
800  TaskStatus skiplistExpect,
801  std::vector<TaskStatus> const& deltaExpects)
802  {
803  if (!waitForDone())
804  return false;
805 
806  return checkStatus(
807  hash, totalReplay, taskExpect, skiplistExpect, deltaExpects);
808  }
809 
817 };
818 
819 using namespace beast::severities;
820 void
822  LedgerServer& server,
823  LedgerReplayClient& client,
824  beast::severities::Severity level = Severity::kTrace)
825 {
826  server.app.logs().threshold(level);
827  client.app.logs().threshold(level);
828 }
829 // logAll(net.server, net.client);
830 
831 /*
832  * Create a LedgerServer and a LedgerReplayClient
833  */
835 {
837  beast::unit_test::suite& suite,
838  LedgerServer::Parameter const& param,
842  : server(suite, param)
843  , client(suite, server, behavior, inboundBhvr, peerFeature)
844  {
845  // logAll(server, client);
846  }
849 };
850 
876 struct LedgerReplayer_test : public beast::unit_test::suite
877 {
878  void
880  {
881  testcase("ProofPath");
882  LedgerServer server(*this, {1});
883  auto const l = server.ledgerMaster.getClosedLedger();
884 
885  {
886  // request, missing key
887  auto request = std::make_shared<protocol::TMProofPathRequest>();
888  request->set_ledgerhash(
889  l->info().hash.data(), l->info().hash.size());
890  request->set_type(protocol::TMLedgerMapType::lmACCOUNT_STATE);
891  auto reply = std::make_shared<protocol::TMProofPathResponse>(
892  server.msgHandler.processProofPathRequest(request));
893  BEAST_EXPECT(reply->has_error());
894  BEAST_EXPECT(!server.msgHandler.processProofPathResponse(reply));
895  }
896  {
897  // request, wrong hash
898  auto request = std::make_shared<protocol::TMProofPathRequest>();
899  request->set_type(protocol::TMLedgerMapType::lmACCOUNT_STATE);
900  request->set_key(
901  keylet::skip().key.data(), keylet::skip().key.size());
902  uint256 hash(1234567);
903  request->set_ledgerhash(hash.data(), hash.size());
904  auto reply = std::make_shared<protocol::TMProofPathResponse>(
905  server.msgHandler.processProofPathRequest(request));
906  BEAST_EXPECT(reply->has_error());
907  }
908 
909  {
910  // good request
911  auto request = std::make_shared<protocol::TMProofPathRequest>();
912  request->set_ledgerhash(
913  l->info().hash.data(), l->info().hash.size());
914  request->set_type(protocol::TMLedgerMapType::lmACCOUNT_STATE);
915  request->set_key(
916  keylet::skip().key.data(), keylet::skip().key.size());
917  // generate response
918  auto reply = std::make_shared<protocol::TMProofPathResponse>(
919  server.msgHandler.processProofPathRequest(request));
920  BEAST_EXPECT(!reply->has_error());
921  BEAST_EXPECT(server.msgHandler.processProofPathResponse(reply));
922 
923  {
924  // bad reply
925  // bad header
926  std::string r(reply->ledgerheader());
927  r.back()--;
928  reply->set_ledgerheader(r);
929  BEAST_EXPECT(
930  !server.msgHandler.processProofPathResponse(reply));
931  r.back()++;
932  reply->set_ledgerheader(r);
933  BEAST_EXPECT(server.msgHandler.processProofPathResponse(reply));
934  // bad proof path
935  reply->mutable_path()->RemoveLast();
936  BEAST_EXPECT(
937  !server.msgHandler.processProofPathResponse(reply));
938  }
939  }
940  }
941 
942  void
944  {
945  testcase("ReplayDelta");
946  LedgerServer server(*this, {1});
947  auto const l = server.ledgerMaster.getClosedLedger();
948 
949  {
950  // request, missing hash
951  auto request = std::make_shared<protocol::TMReplayDeltaRequest>();
952  auto reply = std::make_shared<protocol::TMReplayDeltaResponse>(
953  server.msgHandler.processReplayDeltaRequest(request));
954  BEAST_EXPECT(reply->has_error());
955  BEAST_EXPECT(!server.msgHandler.processReplayDeltaResponse(reply));
956  // request, wrong hash
957  uint256 hash(1234567);
958  request->set_ledgerhash(hash.data(), hash.size());
959  reply = std::make_shared<protocol::TMReplayDeltaResponse>(
960  server.msgHandler.processReplayDeltaRequest(request));
961  BEAST_EXPECT(reply->has_error());
962  BEAST_EXPECT(!server.msgHandler.processReplayDeltaResponse(reply));
963  }
964 
965  {
966  // good request
967  auto request = std::make_shared<protocol::TMReplayDeltaRequest>();
968  request->set_ledgerhash(
969  l->info().hash.data(), l->info().hash.size());
970  auto reply = std::make_shared<protocol::TMReplayDeltaResponse>(
971  server.msgHandler.processReplayDeltaRequest(request));
972  BEAST_EXPECT(!reply->has_error());
973  BEAST_EXPECT(server.msgHandler.processReplayDeltaResponse(reply));
974 
975  {
976  // bad reply
977  // bad header
978  std::string r(reply->ledgerheader());
979  r.back()--;
980  reply->set_ledgerheader(r);
981  BEAST_EXPECT(
982  !server.msgHandler.processReplayDeltaResponse(reply));
983  r.back()++;
984  reply->set_ledgerheader(r);
985  BEAST_EXPECT(
986  server.msgHandler.processReplayDeltaResponse(reply));
987  // bad txns
988  reply->mutable_transaction()->RemoveLast();
989  BEAST_EXPECT(
990  !server.msgHandler.processReplayDeltaResponse(reply));
991  }
992  }
993  }
994 
995  void
997  {
998  testcase("TaskParameter");
999 
1000  auto makeSkipList = [](int count) -> std::vector<uint256> const {
1001  std::vector<uint256> sList;
1002  for (int i = 0; i < count; ++i)
1003  sList.emplace_back(i);
1004  return sList;
1005  };
1006 
1009  BEAST_EXPECT(!tp10.update(uint256(777), 5, makeSkipList(10)));
1010  BEAST_EXPECT(!tp10.update(uint256(10), 5, makeSkipList(8)));
1011  BEAST_EXPECT(tp10.update(uint256(10), 10, makeSkipList(10)));
1012 
1013  // can merge to self
1014  BEAST_EXPECT(tp10.canMergeInto(tp10));
1015 
1016  // smaller task
1019 
1020  BEAST_EXPECT(tp9.canMergeInto(tp10));
1021  BEAST_EXPECT(!tp10.canMergeInto(tp9));
1022 
1023  tp9.totalLedgers_++;
1024  BEAST_EXPECT(!tp9.canMergeInto(tp10));
1025  tp9.totalLedgers_--;
1026  BEAST_EXPECT(tp9.canMergeInto(tp10));
1027 
1029  BEAST_EXPECT(!tp9.canMergeInto(tp10));
1031  BEAST_EXPECT(tp9.canMergeInto(tp10));
1032 
1033  tp9.finishHash_ = uint256(1234);
1034  BEAST_EXPECT(!tp9.canMergeInto(tp10));
1035  tp9.finishHash_ = uint256(9);
1036  BEAST_EXPECT(tp9.canMergeInto(tp10));
1037 
1038  // larger task
1041  BEAST_EXPECT(tp20.update(uint256(20), 20, makeSkipList(20)));
1042  BEAST_EXPECT(tp10.canMergeInto(tp20));
1043  BEAST_EXPECT(tp9.canMergeInto(tp20));
1044  BEAST_EXPECT(!tp20.canMergeInto(tp10));
1045  BEAST_EXPECT(!tp20.canMergeInto(tp9));
1046  }
1047 
1048  void
1050  {
1051  testcase("config test");
1052  {
1053  Config c;
1054  BEAST_EXPECT(c.LEDGER_REPLAY == false);
1055  }
1056 
1057  {
1058  Config c;
1059  std::string toLoad(R"rippleConfig(
1060 [ledger_replay]
1061 1
1062 )rippleConfig");
1063  c.loadFromString(toLoad);
1064  BEAST_EXPECT(c.LEDGER_REPLAY == true);
1065  }
1066 
1067  {
1068  Config c;
1069  std::string toLoad = (R"rippleConfig(
1070 [ledger_replay]
1071 0
1072 )rippleConfig");
1073  c.loadFromString(toLoad);
1074  BEAST_EXPECT(c.LEDGER_REPLAY == false);
1075  }
1076  }
1077 
1078  void
1080  {
1081  testcase("handshake test");
1082  auto handshake = [&](bool client, bool server, bool expecting) -> bool {
1083  auto request =
1084  ripple::makeRequest(true, false, client, false, false);
1085  http_request_type http_request;
1086  http_request.version(request.version());
1087  http_request.base() = request.base();
1088  bool serverResult =
1089  peerFeatureEnabled(http_request, FEATURE_LEDGER_REPLAY, server);
1090  if (serverResult != expecting)
1091  return false;
1092 
1093  beast::IP::Address addr =
1094  boost::asio::ip::address::from_string("172.1.1.100");
1095  jtx::Env serverEnv(*this);
1096  serverEnv.app().config().LEDGER_REPLAY = server;
1097  auto http_resp = ripple::makeResponse(
1098  true,
1099  http_request,
1100  addr,
1101  addr,
1102  uint256{1},
1103  1,
1104  {1, 0},
1105  serverEnv.app());
1106  auto const clientResult =
1107  peerFeatureEnabled(http_resp, FEATURE_LEDGER_REPLAY, client);
1108  if (clientResult != expecting)
1109  return false;
1110 
1111  return true;
1112  };
1113 
1114  BEAST_EXPECT(handshake(false, false, false));
1115  BEAST_EXPECT(handshake(false, true, false));
1116  BEAST_EXPECT(handshake(true, false, false));
1117  BEAST_EXPECT(handshake(true, true, true));
1118  }
1119 
1120  void
1121  testAllLocal(int totalReplay)
1122  {
1123  testcase("local node has all the ledgers");
1124  auto psBhvr = PeerSetBehavior::DropAll;
1125  auto ilBhvr = InboundLedgersBehavior::DropAll;
1126  auto peerFeature = PeerFeature::None;
1127 
1128  NetworkOfTwo net(*this, {totalReplay + 1}, psBhvr, ilBhvr, peerFeature);
1129 
1130  auto l = net.server.ledgerMaster.getClosedLedger();
1131  uint256 finalHash = l->info().hash;
1132  for (int i = 0; i < totalReplay; ++i)
1133  {
1134  BEAST_EXPECT(l);
1135  if (l)
1136  {
1137  net.client.ledgerMaster.storeLedger(l);
1138  l = net.server.ledgerMaster.getLedgerByHash(
1139  l->info().parentHash);
1140  }
1141  else
1142  break;
1143  }
1144 
1145  net.client.replayer.replay(
1146  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1147 
1148  std::vector<TaskStatus> deltaStatuses(
1149  totalReplay - 1, TaskStatus::Completed);
1150  BEAST_EXPECT(net.client.waitAndCheckStatus(
1151  finalHash,
1152  totalReplay,
1155  deltaStatuses));
1156 
1157  // sweep
1158  net.client.replayer.sweep();
1159  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1160  }
1161 
1162  void
1163  testAllInboundLedgers(int totalReplay)
1164  {
1165  testcase("all the ledgers from InboundLedgers");
1166  NetworkOfTwo net(
1167  *this,
1168  {totalReplay + 1},
1172 
1173  auto l = net.server.ledgerMaster.getClosedLedger();
1174  uint256 finalHash = l->info().hash;
1175  net.client.replayer.replay(
1176  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1177 
1178  std::vector<TaskStatus> deltaStatuses(
1179  totalReplay - 1, TaskStatus::Completed);
1180  BEAST_EXPECT(net.client.waitAndCheckStatus(
1181  finalHash,
1182  totalReplay,
1185  deltaStatuses));
1186 
1187  // sweep
1188  net.client.replayer.sweep();
1189  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1190  }
1191 
1192  void
1193  testPeerSetBehavior(PeerSetBehavior peerSetBehavior, int totalReplay = 4)
1194  {
1195  switch (peerSetBehavior)
1196  {
1197  case PeerSetBehavior::Good:
1198  testcase("good network");
1199  break;
1201  testcase("network drops 50% messages");
1202  break;
1204  testcase("network repeats all messages");
1205  break;
1206  default:
1207  return;
1208  }
1209 
1210  NetworkOfTwo net(
1211  *this,
1212  {totalReplay + 1},
1213  peerSetBehavior,
1216 
1217  // feed client with start ledger since InboundLedgers drops all
1218  auto l = net.server.ledgerMaster.getClosedLedger();
1219  uint256 finalHash = l->info().hash;
1220  for (int i = 0; i < totalReplay - 1; ++i)
1221  {
1222  l = net.server.ledgerMaster.getLedgerByHash(l->info().parentHash);
1223  }
1224  net.client.ledgerMaster.storeLedger(l);
1225 
1226  net.client.replayer.replay(
1227  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1228 
1229  std::vector<TaskStatus> deltaStatuses(
1230  totalReplay - 1, TaskStatus::Completed);
1231  BEAST_EXPECT(net.client.waitAndCheckStatus(
1232  finalHash,
1233  totalReplay,
1236  deltaStatuses));
1237  BEAST_EXPECT(net.client.waitForLedgers(finalHash, totalReplay));
1238 
1239  // sweep
1240  net.client.replayer.sweep();
1241  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1242  }
1243 
1244  void
1246  {
1247  testcase("stop before timeout");
1248  int totalReplay = 3;
1249  NetworkOfTwo net(
1250  *this,
1251  {totalReplay + 1},
1255 
1256  auto l = net.server.ledgerMaster.getClosedLedger();
1257  uint256 finalHash = l->info().hash;
1258  net.client.replayer.replay(
1259  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1260 
1261  std::vector<TaskStatus> deltaStatuses;
1262  BEAST_EXPECT(net.client.checkStatus(
1263  finalHash,
1264  totalReplay,
1267  deltaStatuses));
1268 
1269  BEAST_EXPECT(net.client.countsAsExpected(1, 1, 0));
1270  net.client.replayer.stop();
1271  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1272  }
1273 
1274  void
1276  {
1277  testcase("SkipListAcquire bad reply");
1278  int totalReplay = 3;
1279  NetworkOfTwo net(
1280  *this,
1281  {totalReplay + 1 + 1},
1285 
1286  auto l = net.server.ledgerMaster.getClosedLedger();
1287  uint256 finalHash = l->info().hash;
1288  net.client.replayer.replay(
1289  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1290 
1291  auto skipList = net.client.findSkipListAcquire(finalHash);
1292 
1293  std::uint8_t payload[55] = {
1294  0x6A, 0x09, 0xE6, 0x67, 0xF3, 0xBC, 0xC9, 0x08, 0xB2};
1295  auto item =
1296  make_shamapitem(uint256(12345), Slice(payload, sizeof(payload)));
1297  skipList->processData(l->seq(), item);
1298 
1299  std::vector<TaskStatus> deltaStatuses;
1300  BEAST_EXPECT(net.client.waitAndCheckStatus(
1301  finalHash,
1302  totalReplay,
1305  deltaStatuses));
1306 
1307  // add another task
1308  net.client.replayer.replay(
1309  InboundLedger::Reason::GENERIC, finalHash, totalReplay + 1);
1310  BEAST_EXPECT(net.client.waitAndCheckStatus(
1311  finalHash,
1312  totalReplay,
1315  deltaStatuses));
1316  BEAST_EXPECT(net.client.countsAsExpected(2, 1, 0));
1317  }
1318 
1319  void
1321  {
1322  testcase("LedgerDeltaAcquire bad reply");
1323  int totalReplay = 3;
1324  NetworkOfTwo net(
1325  *this,
1326  {totalReplay + 1},
1330 
1331  auto l = net.server.ledgerMaster.getClosedLedger();
1332  uint256 finalHash = l->info().hash;
1333  net.client.ledgerMaster.storeLedger(l);
1334  net.client.replayer.replay(
1335  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1336 
1337  auto delta = net.client.findLedgerDeltaAcquire(l->info().parentHash);
1338  delta->processData(
1339  l->info(), // wrong ledger info
1341  BEAST_EXPECT(net.client.taskStatus(delta) == TaskStatus::Failed);
1342  BEAST_EXPECT(
1343  net.client.taskStatus(net.client.findTask(
1344  finalHash, totalReplay)) == TaskStatus::Failed);
1345 
1346  // add another task
1347  net.client.replayer.replay(
1348  InboundLedger::Reason::GENERIC, finalHash, totalReplay + 1);
1349  BEAST_EXPECT(
1350  net.client.taskStatus(net.client.findTask(
1351  finalHash, totalReplay + 1)) == TaskStatus::Failed);
1352  }
1353 
1354  void
1356  {
1357  testcase("Overlap tasks");
1358  int totalReplay = 5;
1359  NetworkOfTwo net(
1360  *this,
1361  {totalReplay * 3 + 1},
1365  auto l = net.server.ledgerMaster.getClosedLedger();
1366  uint256 finalHash = l->info().hash;
1367  net.client.replayer.replay(
1368  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1369  std::vector<TaskStatus> deltaStatuses(
1370  totalReplay - 1, TaskStatus::Completed);
1371  BEAST_EXPECT(net.client.waitAndCheckStatus(
1372  finalHash,
1373  totalReplay,
1376  deltaStatuses));
1377  BEAST_EXPECT(net.client.waitForLedgers(finalHash, totalReplay));
1378 
1379  // same range, same reason
1380  net.client.replayer.replay(
1381  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1382  BEAST_EXPECT(net.client.countsAsExpected(1, 1, totalReplay - 1));
1383  // same range, different reason
1384  net.client.replayer.replay(
1385  InboundLedger::Reason::CONSENSUS, finalHash, totalReplay);
1386  BEAST_EXPECT(net.client.countsAsExpected(2, 1, totalReplay - 1));
1387 
1388  // no overlap
1389  for (int i = 0; i < totalReplay + 2; ++i)
1390  {
1391  l = net.server.ledgerMaster.getLedgerByHash(l->info().parentHash);
1392  }
1393  auto finalHash_early = l->info().hash;
1394  net.client.replayer.replay(
1395  InboundLedger::Reason::GENERIC, finalHash_early, totalReplay);
1396  BEAST_EXPECT(net.client.waitAndCheckStatus(
1397  finalHash_early,
1398  totalReplay,
1401  deltaStatuses)); // deltaStatuses no change
1402  BEAST_EXPECT(net.client.waitForLedgers(finalHash_early, totalReplay));
1403  BEAST_EXPECT(net.client.countsAsExpected(3, 2, 2 * (totalReplay - 1)));
1404 
1405  // partial overlap
1406  l = net.server.ledgerMaster.getLedgerByHash(l->info().parentHash);
1407  auto finalHash_moreEarly = l->info().parentHash;
1408  net.client.replayer.replay(
1409  InboundLedger::Reason::GENERIC, finalHash_moreEarly, totalReplay);
1410  BEAST_EXPECT(net.client.waitAndCheckStatus(
1411  finalHash_moreEarly,
1412  totalReplay,
1415  deltaStatuses)); // deltaStatuses no change
1416  BEAST_EXPECT(
1417  net.client.waitForLedgers(finalHash_moreEarly, totalReplay));
1418  BEAST_EXPECT(
1419  net.client.countsAsExpected(4, 3, 2 * (totalReplay - 1) + 2));
1420 
1421  // cover
1422  net.client.replayer.replay(
1423  InboundLedger::Reason::GENERIC, finalHash, totalReplay * 3);
1424  deltaStatuses =
1425  std::vector<TaskStatus>(totalReplay * 3 - 1, TaskStatus::Completed);
1426  BEAST_EXPECT(net.client.waitAndCheckStatus(
1427  finalHash,
1428  totalReplay * 3,
1431  deltaStatuses)); // deltaStatuses changed
1432  BEAST_EXPECT(net.client.waitForLedgers(finalHash, totalReplay * 3));
1433  BEAST_EXPECT(net.client.countsAsExpected(5, 3, totalReplay * 3 - 1));
1434 
1435  // sweep
1436  net.client.replayer.sweep();
1437  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1438  }
1439 
1440  void
1441  run() override
1442  {
1443  testProofPath();
1444  testReplayDelta();
1445  testTaskParameter();
1446  testConfig();
1447  testHandshake();
1448  testAllLocal(1);
1449  testAllLocal(3);
1450  testAllInboundLedgers(1);
1451  testAllInboundLedgers(4);
1452  testPeerSetBehavior(PeerSetBehavior::Good, 1);
1453  testPeerSetBehavior(PeerSetBehavior::Good);
1454  testPeerSetBehavior(PeerSetBehavior::Drop50);
1455  testPeerSetBehavior(PeerSetBehavior::Repeat);
1456  testStop();
1457  testSkipListBadReply();
1458  testLedgerDeltaBadReply();
1459  testLedgerReplayOverlap();
1460  }
1461 };
1462 
1463 struct LedgerReplayerTimeout_test : public beast::unit_test::suite
1464 {
1465  void
1467  {
1468  testcase("SkipListAcquire timeout");
1469  int totalReplay = 3;
1470  NetworkOfTwo net(
1471  *this,
1472  {totalReplay + 1},
1476 
1477  auto l = net.server.ledgerMaster.getClosedLedger();
1478  uint256 finalHash = l->info().hash;
1479  net.client.replayer.replay(
1480  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1481 
1482  std::vector<TaskStatus> deltaStatuses;
1483  BEAST_EXPECT(net.client.waitAndCheckStatus(
1484  finalHash,
1485  totalReplay,
1488  deltaStatuses));
1489 
1490  // sweep
1491  BEAST_EXPECT(net.client.countsAsExpected(1, 1, 0));
1492  net.client.replayer.sweep();
1493  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1494  }
1495 
1496  void
1498  {
1499  testcase("LedgerDeltaAcquire timeout");
1500  int totalReplay = 3;
1501  NetworkOfTwo net(
1502  *this,
1503  {totalReplay + 1},
1507 
1508  auto l = net.server.ledgerMaster.getClosedLedger();
1509  uint256 finalHash = l->info().hash;
1510  net.client.ledgerMaster.storeLedger(l);
1511  net.client.replayer.replay(
1512  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1513 
1514  std::vector<TaskStatus> deltaStatuses(
1515  totalReplay - 1, TaskStatus::Failed);
1516  deltaStatuses.back() = TaskStatus::Completed; // in client ledgerMaster
1517  BEAST_EXPECT(net.client.waitAndCheckStatus(
1518  finalHash,
1519  totalReplay,
1522  deltaStatuses));
1523 
1524  // sweep
1525  BEAST_EXPECT(net.client.countsAsExpected(1, 1, totalReplay - 1));
1526  net.client.replayer.sweep();
1527  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1528  }
1529 
1530  void
1531  run() override
1532  {
1533  testSkipListTimeout();
1534  testLedgerDeltaTimeout();
1535  }
1536 };
1537 
1538 struct LedgerReplayerLong_test : public beast::unit_test::suite
1539 {
1540  void
1541  run() override
1542  {
1543  testcase("Acquire 1000 ledgers");
1544  int totalReplay = 250;
1545  int rounds = 4;
1546  NetworkOfTwo net(
1547  *this,
1548  {totalReplay * rounds + 1},
1552 
1553  std::vector<uint256> finishHashes;
1554  auto l = net.server.ledgerMaster.getClosedLedger();
1555  for (int i = 0; i < rounds; ++i)
1556  {
1557  finishHashes.push_back(l->info().hash);
1558  for (int j = 0; j < totalReplay; ++j)
1559  {
1560  l = net.server.ledgerMaster.getLedgerByHash(
1561  l->info().parentHash);
1562  }
1563  }
1564  BEAST_EXPECT(finishHashes.size() == rounds);
1565 
1566  for (int i = 0; i < rounds; ++i)
1567  {
1568  net.client.replayer.replay(
1569  InboundLedger::Reason::GENERIC, finishHashes[i], totalReplay);
1570  }
1571 
1572  std::vector<TaskStatus> deltaStatuses(
1573  totalReplay - 1, TaskStatus::Completed);
1574  for (int i = 0; i < rounds; ++i)
1575  {
1576  BEAST_EXPECT(net.client.waitAndCheckStatus(
1577  finishHashes[i],
1578  totalReplay,
1581  deltaStatuses));
1582  }
1583 
1584  BEAST_EXPECT(
1585  net.client.waitForLedgers(finishHashes[0], totalReplay * rounds));
1586  BEAST_EXPECT(net.client.countsAsExpected(
1587  rounds, rounds, rounds * (totalReplay - 1)));
1588 
1589  // sweep
1590  net.client.replayer.sweep();
1591  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1592  }
1593 };
1594 
1597 BEAST_DEFINE_TESTSUITE(LedgerReplayerTimeout, app, ripple);
1598 BEAST_DEFINE_TESTSUITE_MANUAL(LedgerReplayerLong, app, ripple);
1599 
1600 } // namespace test
1601 } // 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:796
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:816
ripple::test::LedgerReplayer_test::testLedgerReplayOverlap
void testLedgerReplayOverlap()
Definition: LedgerReplay_test.cpp:1355
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:683
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:836
ripple::test::LedgerReplayClient::countsAsExpected
bool countsAsExpected(std::size_t tasks, std::size_t skipLists, std::size_t deltas)
Definition: LedgerReplay_test.cpp:690
ripple::test::LedgerReplayer_test::testLedgerDeltaBadReply
void testLedgerDeltaBadReply()
Definition: LedgerReplay_test.cpp:1320
ripple::test::LedgerReplayerTimeout_test::testLedgerDeltaTimeout
void testLedgerDeltaTimeout()
Definition: LedgerReplay_test.cpp:1497
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:848
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
beast::severities::kDisabled
@ kDisabled
Definition: Journal.h:41
ripple::test::LedgerReplayer_test::testConfig
void testConfig()
Definition: LedgerReplay_test.cpp:1049
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:228
ripple::make_shamapitem
boost::intrusive_ptr< SHAMapItem > make_shamapitem(uint256 const &tag, Slice data)
Definition: SHAMapItem.h:160
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:1538
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:145
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:125
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:1275
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:1163
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:812
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:600
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:847
ripple::test::LedgerReplayer_test::testAllLocal
void testAllLocal(int totalReplay)
Definition: LedgerReplay_test.cpp:1121
ripple::test::TestPeer::getScore
int getScore(bool) const override
Definition: LedgerReplay_test.cpp:227
ripple::base_uint::data
pointer data()
Definition: base_uint.h:122
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:629
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:1463
ripple::PeerSetBuilder
Definition: PeerSet.h:80
ripple::base_uint::size
constexpr static std::size_t size()
Definition: base_uint.h:519
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:550
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:758
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:662
ripple::test::LedgerServer::app
Application & app
Definition: LedgerReplay_test.cpp:540
ripple::Config
Definition: Config.h:89
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:1531
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:712
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:814
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:1079
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:879
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:702
ripple::Logs::threshold
beast::severities::Severity threshold() const
Definition: Log.cpp:150
ripple::test::LedgerReplayer_test::testStop
void testStop()
Definition: LedgerReplay_test.cpp:1245
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:811
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:876
ripple::test::logAll
void logAll(LedgerServer &server, LedgerReplayClient &client, beast::severities::Severity level=Severity::kTrace)
Definition: LedgerReplay_test.cpp:821
ripple::test::LedgerReplayClient::checkStatus
bool checkStatus(uint256 const &hash, int totalReplay, TaskStatus taskExpect, TaskStatus skiplistExpect, std::vector< TaskStatus > const &deltaExpects)
Definition: LedgerReplay_test.cpp:777
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:1193
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:676
beast::severities::Severity
Severity
Severity level / threshold of a Journal message.
Definition: Journal.h:31
std
STL namespace.
beast::severities::kWarning
@ kWarning
Definition: Journal.h:37
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:228
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:815
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:178
ripple::test::LedgerReplayClient::addLedger
void addLedger(std::shared_ptr< Ledger const > const &l)
Definition: LedgerReplay_test.cpp:594
std::unordered_set::count
T count(T... args)
ripple::test::NetworkOfTwo
Definition: LedgerReplay_test.cpp:834
ripple::test::LedgerReplayerLong_test::run
void run() override
Definition: LedgerReplay_test.cpp:1541
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:655
ripple::test::LedgerReplayer_test::run
void run() override
Definition: LedgerReplay_test.cpp:1441
ripple::test::LedgerReplayer_test::testReplayDelta
void testReplayDelta()
Definition: LedgerReplay_test.cpp:943
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:43
ripple::test::LedgerReplayClient::env
jtx::Env env
Definition: LedgerReplay_test.cpp:810
ripple::test::LedgerReplayClient::taskStatus
TaskStatus taskStatus(std::shared_ptr< T > const &t)
Definition: LedgerReplay_test.cpp:723
ripple::test::LedgerReplay_test
Definition: LedgerReplay_test.cpp:40
ripple::test::LedgerReplayClient::waitForLedgers
bool waitForLedgers(uint256 const &finishLedgerHash, int totalReplay)
Definition: LedgerReplay_test.cpp:615
ripple::test::LedgerReplayerTimeout_test::testSkipListTimeout
void testSkipListTimeout()
Definition: LedgerReplay_test.cpp:1466
ripple::makeRequest
auto makeRequest(bool crawlPublic, bool comprEnabled, bool ledgerReplayEnabled, bool txReduceRelayEnabled, bool vpReduceRelayEnabled) -> request_type
Make outbound http request.
Definition: Handshake.cpp:365
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:392
ripple::test::PeerSetBehavior::DropSkipListReply
@ DropSkipListReply
ripple::test::LedgerReplayClient::inboundLedgers
MagicInboundLedgers inboundLedgers
Definition: LedgerReplay_test.cpp:813
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:733
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:996
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:33
beast
Definition: base_uint.h:641