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 
176  virtual size_t
177  cacheSize() override
178  {
179  return 0;
180  }
181 
185 };
186 
187 enum class PeerFeature {
189  None,
190 };
191 
197 class TestPeer : public Peer
198 {
199 public:
200  TestPeer(bool enableLedgerReplay) : ledgerReplayEnabled_(enableLedgerReplay)
201  {
202  }
203 
204  void
205  send(std::shared_ptr<Message> const& m) override
206  {
207  }
209  getRemoteAddress() const override
210  {
211  return {};
212  }
213  void
214  charge(Resource::Charge const& fee) override
215  {
216  }
217  id_t
218  id() const override
219  {
220  return 1234;
221  }
222  bool
223  cluster() const override
224  {
225  return false;
226  }
227  bool
228  isHighLatency() const override
229  {
230  return false;
231  }
232  int
233  getScore(bool) const override
234  {
235  return 0;
236  }
237  PublicKey const&
238  getNodePublic() const override
239  {
240  static PublicKey key{};
241  return key;
242  }
244  json() override
245  {
246  return {};
247  }
248  bool
250  {
251  if (f == ProtocolFeature::LedgerReplay && ledgerReplayEnabled_)
252  return true;
253  return false;
254  }
256  publisherListSequence(PublicKey const&) const override
257  {
258  return {};
259  }
260  void
262  {
263  }
264  uint256 const&
265  getClosedLedgerHash() const override
266  {
267  static uint256 hash{};
268  return hash;
269  }
270  bool
271  hasLedger(uint256 const& hash, std::uint32_t seq) const override
272  {
273  return true;
274  }
275  void
276  ledgerRange(std::uint32_t& minSeq, std::uint32_t& maxSeq) const override
277  {
278  }
279  bool
280  hasTxSet(uint256 const& hash) const override
281  {
282  return false;
283  }
284  void
285  cycleStatus() override
286  {
287  }
288  bool
289  hasRange(std::uint32_t uMin, std::uint32_t uMax) override
290  {
291  return false;
292  }
293  bool
294  compressionEnabled() const override
295  {
296  return false;
297  }
298  void
299  sendTxQueue() override
300  {
301  }
302  void
303  addTxQueue(const uint256&) override
304  {
305  }
306  void
307  removeTxQueue(const uint256&) override
308  {
309  }
310  bool
311  txReduceRelayEnabled() const override
312  {
313  return false;
314  }
315 
317 };
318 
319 enum class PeerSetBehavior {
320  Good,
321  Drop50,
322  DropAll,
325  Repeat,
326 };
327 
334 struct TestPeerSet : public PeerSet
335 {
338  LedgerReplayMsgHandler& other,
339  PeerSetBehavior bhvr,
340  bool enableLedgerReplay)
341  : local(me)
342  , remote(other)
343  , dummyPeer(std::make_shared<TestPeer>(enableLedgerReplay))
344  , behavior(bhvr)
345  {
346  }
347 
348  void
350  std::size_t limit,
351  std::function<bool(std::shared_ptr<Peer> const&)> hasItem,
352  std::function<void(std::shared_ptr<Peer> const&)> onPeerAdded) override
353  {
354  hasItem(dummyPeer);
355  onPeerAdded(dummyPeer);
356  }
357 
358  void
360  ::google::protobuf::Message const& msg,
361  protocol::MessageType type,
362  std::shared_ptr<Peer> const& peer) override
363  {
364  int dropRate = 0;
365  if (behavior == PeerSetBehavior::Drop50)
366  dropRate = 50;
367  else if (behavior == PeerSetBehavior::DropAll)
368  dropRate = 100;
369 
370  if ((rand() % 100 + 1) <= dropRate)
371  return;
372 
373  switch (type)
374  {
375  case protocol::mtPROOF_PATH_REQ: {
376  if (behavior == PeerSetBehavior::DropSkipListReply)
377  return;
378  auto request = std::make_shared<protocol::TMProofPathRequest>(
379  dynamic_cast<protocol::TMProofPathRequest const&>(msg));
380  auto reply = std::make_shared<protocol::TMProofPathResponse>(
381  remote.processProofPathRequest(request));
382  local.processProofPathResponse(reply);
383  if (behavior == PeerSetBehavior::Repeat)
384  local.processProofPathResponse(reply);
385  break;
386  }
387  case protocol::mtREPLAY_DELTA_REQ: {
389  return;
390  auto request = std::make_shared<protocol::TMReplayDeltaRequest>(
391  dynamic_cast<protocol::TMReplayDeltaRequest const&>(msg));
392  auto reply = std::make_shared<protocol::TMReplayDeltaResponse>(
393  remote.processReplayDeltaRequest(request));
394  local.processReplayDeltaResponse(reply);
395  if (behavior == PeerSetBehavior::Repeat)
396  local.processReplayDeltaResponse(reply);
397  break;
398  }
399  default:
400  return;
401  }
402  }
403 
404  const std::set<Peer::id_t>&
405  getPeerIds() const override
406  {
407  static std::set<Peer::id_t> emptyPeers;
408  return emptyPeers;
409  }
410 
415 };
416 
421 {
422 public:
425  LedgerReplayMsgHandler& other,
426  PeerSetBehavior bhvr,
427  PeerFeature peerFeature)
428  : local(me)
429  , remote(other)
430  , behavior(bhvr)
431  , enableLedgerReplay(peerFeature == PeerFeature::LedgerReplayEnabled)
432  {
433  }
434 
436  build() override
437  {
438  return std::make_unique<TestPeerSet>(
439  local, remote, behavior, enableLedgerReplay);
440  }
441 
442 private:
447 };
448 
454 {
455  struct Parameter
456  {
458  int initAccounts = 10;
459  int initAmount = 1'000'000;
460  int numTxPerLedger = 10;
461  int txAmount = 10;
462  };
463 
464  LedgerServer(beast::unit_test::suite& suite, Parameter const& p)
465  : env(suite)
466  , app(env.app())
467  , ledgerMaster(env.app().getLedgerMaster())
468  , msgHandler(env.app(), env.app().getLedgerReplayer())
469  , param(p)
470  {
471  assert(param.initLedgers > 0);
472  createAccounts(param.initAccounts);
473  createLedgerHistory();
474  app.logs().threshold(beast::severities::kWarning);
475  }
476 
480  void
481  createAccounts(int newAccounts)
482  {
483  auto fundedAccounts = accounts.size();
484  for (int i = 0; i < newAccounts; ++i)
485  {
486  accounts.emplace_back(
487  "alice_" + std::to_string(fundedAccounts + i));
488  env.fund(jtx::XRP(param.initAmount), accounts.back());
489  }
490  env.close();
491  }
492 
496  void
497  sendPayments(int newTxes)
498  {
499  int fundedAccounts = accounts.size();
500  assert(fundedAccounts >= newTxes);
501  std::unordered_set<int> senders;
502 
503  // somewhat random but reproducible
504  int r = ledgerMaster.getClosedLedger()->seq() * 7;
505  int fromIdx = 0;
506  int toIdx = 0;
507  auto updateIdx = [&]() {
508  assert(fundedAccounts > senders.size());
509  fromIdx = (fromIdx + r) % fundedAccounts;
510  while (senders.count(fromIdx) != 0)
511  fromIdx = (fromIdx + 1) % fundedAccounts;
512  senders.insert(fromIdx);
513  toIdx = (toIdx + r * 2) % fundedAccounts;
514  if (toIdx == fromIdx)
515  toIdx = (toIdx + 1) % fundedAccounts;
516  };
517 
518  for (int i = 0; i < newTxes; ++i)
519  {
520  updateIdx();
521  env.apply(
522  pay(accounts[fromIdx],
523  accounts[toIdx],
524  jtx::drops(ledgerMaster.getClosedLedger()->fees().base) +
525  jtx::XRP(param.txAmount)),
529  }
530  env.close();
531  }
532 
536  void
538  {
539  for (int i = 0; i < param.initLedgers - 1; ++i)
540  {
541  sendPayments(param.numTxPerLedger);
542  }
543  }
544 
551 };
552 
553 enum class TaskStatus {
554  Failed,
555  Completed,
556  NotDone,
557  NotExist,
558 };
559 
568 {
569 public:
571  beast::unit_test::suite& suite,
572  LedgerServer& server,
576  : env(suite,
577  jtx::envconfig(jtx::port_increment, 3),
578  nullptr,
579  beast::severities::kDisabled)
580  , app(env.app())
581  , ledgerMaster(env.app().getLedgerMaster())
582  , inboundLedgers(
583  server.app.getLedgerMaster(),
584  ledgerMaster,
585  inboundBhvr)
586  , serverMsgHandler(server.app, server.app.getLedgerReplayer())
587  , clientMsgHandler(env.app(), replayer)
588  , replayer(
589  env.app(),
590  inboundLedgers,
591  std::make_unique<TestPeerSetBuilder>(
592  clientMsgHandler,
593  serverMsgHandler,
594  behavior,
595  peerFeature))
596  {
597  }
598 
599  void
601  {
602  ledgerMaster.storeLedger(l);
603  }
604 
605  bool
606  haveLedgers(uint256 const& finishLedgerHash, int totalReplay)
607  {
608  uint256 hash = finishLedgerHash;
609  int i = 0;
610  for (; i < totalReplay; ++i)
611  {
612  auto const l = ledgerMaster.getLedgerByHash(hash);
613  if (!l)
614  return false;
615  hash = l->info().parentHash;
616  }
617  return true;
618  }
619 
620  bool
621  waitForLedgers(uint256 const& finishLedgerHash, int totalReplay)
622  {
623  int totalRound = 100;
624  for (int i = 0; i < totalRound; ++i)
625  {
626  if (haveLedgers(finishLedgerHash, totalReplay))
627  return true;
628  if (i < totalRound - 1)
630  }
631  return false;
632  }
633 
634  bool
636  {
637  int totalRound = 100;
638  for (int i = 0; i < totalRound; ++i)
639  {
640  bool allDone = true;
641  {
642  std::unique_lock<std::mutex> lock(replayer.mtx_);
643  for (auto const& t : replayer.tasks_)
644  {
645  if (!t->finished())
646  {
647  allDone = false;
648  break;
649  }
650  }
651  }
652  if (allDone)
653  return true;
654  if (i < totalRound - 1)
656  }
657  return false;
658  }
659 
662  {
663  std::unique_lock<std::mutex> lock(replayer.mtx_);
664  return replayer.tasks_;
665  }
666 
668  findTask(uint256 const& hash, int totalReplay)
669  {
670  std::unique_lock<std::mutex> lock(replayer.mtx_);
671  auto i = std::find_if(
672  replayer.tasks_.begin(), replayer.tasks_.end(), [&](auto const& t) {
673  return t->parameter_.finishHash_ == hash &&
674  t->parameter_.totalLedgers_ == totalReplay;
675  });
676  if (i == replayer.tasks_.end())
677  return {};
678  return *i;
679  }
680 
683  {
684  std::unique_lock<std::mutex> lock(replayer.mtx_);
685  return replayer.deltas_.size();
686  }
687 
690  {
691  std::unique_lock<std::mutex> lock(replayer.mtx_);
692  return replayer.skipLists_.size();
693  }
694 
695  bool
697  std::size_t tasks,
698  std::size_t skipLists,
699  std::size_t deltas)
700  {
701  std::unique_lock<std::mutex> lock(replayer.mtx_);
702  return replayer.tasks_.size() == tasks &&
703  replayer.skipLists_.size() == skipLists &&
704  replayer.deltas_.size() == deltas;
705  }
706 
709  {
710  std::unique_lock<std::mutex> lock(replayer.mtx_);
711  auto i = replayer.skipLists_.find(hash);
712  if (i == replayer.skipLists_.end())
713  return {};
714  return i->second.lock();
715  }
716 
719  {
720  std::unique_lock<std::mutex> lock(replayer.mtx_);
721  auto i = replayer.deltas_.find(hash);
722  if (i == replayer.deltas_.end())
723  return {};
724  return i->second.lock();
725  }
726 
727  template <typename T>
728  TaskStatus
730  {
731  if (t->failed_)
732  return TaskStatus::Failed;
733  if (t->complete_)
734  return TaskStatus::Completed;
735  return TaskStatus::NotDone;
736  }
737 
738  bool
741  TaskStatus taskExpect,
742  TaskStatus skiplistExpect,
743  std::vector<TaskStatus> const& deltaExpects)
744  {
745  if (taskStatus(task) == taskExpect)
746  {
747  if (taskStatus(task->skipListAcquirer_) == skiplistExpect)
748  {
749  if (task->deltas_.size() == deltaExpects.size())
750  {
751  for (int i = 0; i < deltaExpects.size(); ++i)
752  {
753  if (taskStatus(task->deltas_[i]) != deltaExpects[i])
754  return false;
755  }
756  return true;
757  }
758  }
759  }
760  return false;
761  }
762 
763  bool
765  uint256 const& hash,
766  int totalReplay,
767  TaskStatus taskExpect,
768  TaskStatus skiplistExpect,
769  std::vector<TaskStatus> const& deltaExpects)
770  {
771  auto t = findTask(hash, totalReplay);
772  if (!t)
773  {
774  if (taskExpect == TaskStatus::NotExist)
775  return true;
776  return false;
777  }
778 
779  return asExpected(t, taskExpect, skiplistExpect, deltaExpects);
780  }
781 
782  bool
784  uint256 const& hash,
785  int totalReplay,
786  TaskStatus taskExpect,
787  TaskStatus skiplistExpect,
788  std::vector<TaskStatus> const& deltaExpects)
789  {
790  auto t = findTask(hash, totalReplay);
791  if (!t)
792  {
793  if (taskExpect == TaskStatus::NotExist)
794  return true;
795  return false;
796  }
797 
798  return asExpected(t, taskExpect, skiplistExpect, deltaExpects);
799  }
800 
801  bool
803  uint256 const& hash,
804  int totalReplay,
805  TaskStatus taskExpect,
806  TaskStatus skiplistExpect,
807  std::vector<TaskStatus> const& deltaExpects)
808  {
809  if (!waitForDone())
810  return false;
811 
812  return checkStatus(
813  hash, totalReplay, taskExpect, skiplistExpect, deltaExpects);
814  }
815 
823 };
824 
825 using namespace beast::severities;
826 void
828  LedgerServer& server,
829  LedgerReplayClient& client,
830  beast::severities::Severity level = Severity::kTrace)
831 {
832  server.app.logs().threshold(level);
833  client.app.logs().threshold(level);
834 }
835 // logAll(net.server, net.client);
836 
837 /*
838  * Create a LedgerServer and a LedgerReplayClient
839  */
841 {
843  beast::unit_test::suite& suite,
844  LedgerServer::Parameter const& param,
848  : server(suite, param)
849  , client(suite, server, behavior, inboundBhvr, peerFeature)
850  {
851  // logAll(server, client);
852  }
855 };
856 
882 struct LedgerReplayer_test : public beast::unit_test::suite
883 {
884  void
886  {
887  testcase("ProofPath");
888  LedgerServer server(*this, {1});
889  auto const l = server.ledgerMaster.getClosedLedger();
890 
891  {
892  // request, missing key
893  auto request = std::make_shared<protocol::TMProofPathRequest>();
894  request->set_ledgerhash(
895  l->info().hash.data(), l->info().hash.size());
896  request->set_type(protocol::TMLedgerMapType::lmACCOUNT_STATE);
897  auto reply = std::make_shared<protocol::TMProofPathResponse>(
898  server.msgHandler.processProofPathRequest(request));
899  BEAST_EXPECT(reply->has_error());
900  BEAST_EXPECT(!server.msgHandler.processProofPathResponse(reply));
901  }
902  {
903  // request, wrong hash
904  auto request = std::make_shared<protocol::TMProofPathRequest>();
905  request->set_type(protocol::TMLedgerMapType::lmACCOUNT_STATE);
906  request->set_key(
907  keylet::skip().key.data(), keylet::skip().key.size());
908  uint256 hash(1234567);
909  request->set_ledgerhash(hash.data(), hash.size());
910  auto reply = std::make_shared<protocol::TMProofPathResponse>(
911  server.msgHandler.processProofPathRequest(request));
912  BEAST_EXPECT(reply->has_error());
913  }
914 
915  {
916  // good request
917  auto request = std::make_shared<protocol::TMProofPathRequest>();
918  request->set_ledgerhash(
919  l->info().hash.data(), l->info().hash.size());
920  request->set_type(protocol::TMLedgerMapType::lmACCOUNT_STATE);
921  request->set_key(
922  keylet::skip().key.data(), keylet::skip().key.size());
923  // generate response
924  auto reply = std::make_shared<protocol::TMProofPathResponse>(
925  server.msgHandler.processProofPathRequest(request));
926  BEAST_EXPECT(!reply->has_error());
927  BEAST_EXPECT(server.msgHandler.processProofPathResponse(reply));
928 
929  {
930  // bad reply
931  // bad header
932  std::string r(reply->ledgerheader());
933  r.back()--;
934  reply->set_ledgerheader(r);
935  BEAST_EXPECT(
936  !server.msgHandler.processProofPathResponse(reply));
937  r.back()++;
938  reply->set_ledgerheader(r);
939  BEAST_EXPECT(server.msgHandler.processProofPathResponse(reply));
940  // bad proof path
941  reply->mutable_path()->RemoveLast();
942  BEAST_EXPECT(
943  !server.msgHandler.processProofPathResponse(reply));
944  }
945  }
946  }
947 
948  void
950  {
951  testcase("ReplayDelta");
952  LedgerServer server(*this, {1});
953  auto const l = server.ledgerMaster.getClosedLedger();
954 
955  {
956  // request, missing hash
957  auto request = std::make_shared<protocol::TMReplayDeltaRequest>();
958  auto reply = std::make_shared<protocol::TMReplayDeltaResponse>(
959  server.msgHandler.processReplayDeltaRequest(request));
960  BEAST_EXPECT(reply->has_error());
961  BEAST_EXPECT(!server.msgHandler.processReplayDeltaResponse(reply));
962  // request, wrong hash
963  uint256 hash(1234567);
964  request->set_ledgerhash(hash.data(), hash.size());
965  reply = std::make_shared<protocol::TMReplayDeltaResponse>(
966  server.msgHandler.processReplayDeltaRequest(request));
967  BEAST_EXPECT(reply->has_error());
968  BEAST_EXPECT(!server.msgHandler.processReplayDeltaResponse(reply));
969  }
970 
971  {
972  // good request
973  auto request = std::make_shared<protocol::TMReplayDeltaRequest>();
974  request->set_ledgerhash(
975  l->info().hash.data(), l->info().hash.size());
976  auto reply = std::make_shared<protocol::TMReplayDeltaResponse>(
977  server.msgHandler.processReplayDeltaRequest(request));
978  BEAST_EXPECT(!reply->has_error());
979  BEAST_EXPECT(server.msgHandler.processReplayDeltaResponse(reply));
980 
981  {
982  // bad reply
983  // bad header
984  std::string r(reply->ledgerheader());
985  r.back()--;
986  reply->set_ledgerheader(r);
987  BEAST_EXPECT(
988  !server.msgHandler.processReplayDeltaResponse(reply));
989  r.back()++;
990  reply->set_ledgerheader(r);
991  BEAST_EXPECT(
992  server.msgHandler.processReplayDeltaResponse(reply));
993  // bad txns
994  reply->mutable_transaction()->RemoveLast();
995  BEAST_EXPECT(
996  !server.msgHandler.processReplayDeltaResponse(reply));
997  }
998  }
999  }
1000 
1001  void
1003  {
1004  testcase("TaskParameter");
1005 
1006  auto makeSkipList = [](int count) -> std::vector<uint256> const {
1007  std::vector<uint256> sList;
1008  for (int i = 0; i < count; ++i)
1009  sList.emplace_back(i);
1010  return sList;
1011  };
1012 
1015  BEAST_EXPECT(!tp10.update(uint256(777), 5, makeSkipList(10)));
1016  BEAST_EXPECT(!tp10.update(uint256(10), 5, makeSkipList(8)));
1017  BEAST_EXPECT(tp10.update(uint256(10), 10, makeSkipList(10)));
1018 
1019  // can merge to self
1020  BEAST_EXPECT(tp10.canMergeInto(tp10));
1021 
1022  // smaller task
1025 
1026  BEAST_EXPECT(tp9.canMergeInto(tp10));
1027  BEAST_EXPECT(!tp10.canMergeInto(tp9));
1028 
1029  tp9.totalLedgers_++;
1030  BEAST_EXPECT(!tp9.canMergeInto(tp10));
1031  tp9.totalLedgers_--;
1032  BEAST_EXPECT(tp9.canMergeInto(tp10));
1033 
1035  BEAST_EXPECT(!tp9.canMergeInto(tp10));
1037  BEAST_EXPECT(tp9.canMergeInto(tp10));
1038 
1039  tp9.finishHash_ = uint256(1234);
1040  BEAST_EXPECT(!tp9.canMergeInto(tp10));
1041  tp9.finishHash_ = uint256(9);
1042  BEAST_EXPECT(tp9.canMergeInto(tp10));
1043 
1044  // larger task
1047  BEAST_EXPECT(tp20.update(uint256(20), 20, makeSkipList(20)));
1048  BEAST_EXPECT(tp10.canMergeInto(tp20));
1049  BEAST_EXPECT(tp9.canMergeInto(tp20));
1050  BEAST_EXPECT(!tp20.canMergeInto(tp10));
1051  BEAST_EXPECT(!tp20.canMergeInto(tp9));
1052  }
1053 
1054  void
1056  {
1057  testcase("config test");
1058  {
1059  Config c;
1060  BEAST_EXPECT(c.LEDGER_REPLAY == false);
1061  }
1062 
1063  {
1064  Config c;
1065  std::string toLoad(R"rippleConfig(
1066 [ledger_replay]
1067 1
1068 )rippleConfig");
1069  c.loadFromString(toLoad);
1070  BEAST_EXPECT(c.LEDGER_REPLAY == true);
1071  }
1072 
1073  {
1074  Config c;
1075  std::string toLoad = (R"rippleConfig(
1076 [ledger_replay]
1077 0
1078 )rippleConfig");
1079  c.loadFromString(toLoad);
1080  BEAST_EXPECT(c.LEDGER_REPLAY == false);
1081  }
1082  }
1083 
1084  void
1086  {
1087  testcase("handshake test");
1088  auto handshake = [&](bool client, bool server, bool expecting) -> bool {
1089  auto request =
1090  ripple::makeRequest(true, false, client, false, false);
1091  http_request_type http_request;
1092  http_request.version(request.version());
1093  http_request.base() = request.base();
1094  bool serverResult =
1095  peerFeatureEnabled(http_request, FEATURE_LEDGER_REPLAY, server);
1096  if (serverResult != expecting)
1097  return false;
1098 
1099  beast::IP::Address addr =
1100  boost::asio::ip::address::from_string("172.1.1.100");
1101  jtx::Env serverEnv(*this);
1102  serverEnv.app().config().LEDGER_REPLAY = server;
1103  auto http_resp = ripple::makeResponse(
1104  true,
1105  http_request,
1106  addr,
1107  addr,
1108  uint256{1},
1109  1,
1110  {1, 0},
1111  serverEnv.app());
1112  auto const clientResult =
1113  peerFeatureEnabled(http_resp, FEATURE_LEDGER_REPLAY, client);
1114  if (clientResult != expecting)
1115  return false;
1116 
1117  return true;
1118  };
1119 
1120  BEAST_EXPECT(handshake(false, false, false));
1121  BEAST_EXPECT(handshake(false, true, false));
1122  BEAST_EXPECT(handshake(true, false, false));
1123  BEAST_EXPECT(handshake(true, true, true));
1124  }
1125 
1126  void
1127  testAllLocal(int totalReplay)
1128  {
1129  testcase("local node has all the ledgers");
1130  auto psBhvr = PeerSetBehavior::DropAll;
1131  auto ilBhvr = InboundLedgersBehavior::DropAll;
1132  auto peerFeature = PeerFeature::None;
1133 
1134  NetworkOfTwo net(*this, {totalReplay + 1}, psBhvr, ilBhvr, peerFeature);
1135 
1136  auto l = net.server.ledgerMaster.getClosedLedger();
1137  uint256 finalHash = l->info().hash;
1138  for (int i = 0; i < totalReplay; ++i)
1139  {
1140  BEAST_EXPECT(l);
1141  if (l)
1142  {
1143  net.client.ledgerMaster.storeLedger(l);
1144  l = net.server.ledgerMaster.getLedgerByHash(
1145  l->info().parentHash);
1146  }
1147  else
1148  break;
1149  }
1150 
1151  net.client.replayer.replay(
1152  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1153 
1154  std::vector<TaskStatus> deltaStatuses(
1155  totalReplay - 1, TaskStatus::Completed);
1156  BEAST_EXPECT(net.client.waitAndCheckStatus(
1157  finalHash,
1158  totalReplay,
1161  deltaStatuses));
1162 
1163  // sweep
1164  net.client.replayer.sweep();
1165  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1166  }
1167 
1168  void
1169  testAllInboundLedgers(int totalReplay)
1170  {
1171  testcase("all the ledgers from InboundLedgers");
1172  NetworkOfTwo net(
1173  *this,
1174  {totalReplay + 1},
1178 
1179  auto l = net.server.ledgerMaster.getClosedLedger();
1180  uint256 finalHash = l->info().hash;
1181  net.client.replayer.replay(
1182  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1183 
1184  std::vector<TaskStatus> deltaStatuses(
1185  totalReplay - 1, TaskStatus::Completed);
1186  BEAST_EXPECT(net.client.waitAndCheckStatus(
1187  finalHash,
1188  totalReplay,
1191  deltaStatuses));
1192 
1193  // sweep
1194  net.client.replayer.sweep();
1195  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1196  }
1197 
1198  void
1199  testPeerSetBehavior(PeerSetBehavior peerSetBehavior, int totalReplay = 4)
1200  {
1201  switch (peerSetBehavior)
1202  {
1203  case PeerSetBehavior::Good:
1204  testcase("good network");
1205  break;
1207  testcase("network drops 50% messages");
1208  break;
1210  testcase("network repeats all messages");
1211  break;
1212  default:
1213  return;
1214  }
1215 
1216  NetworkOfTwo net(
1217  *this,
1218  {totalReplay + 1},
1219  peerSetBehavior,
1222 
1223  // feed client with start ledger since InboundLedgers drops all
1224  auto l = net.server.ledgerMaster.getClosedLedger();
1225  uint256 finalHash = l->info().hash;
1226  for (int i = 0; i < totalReplay - 1; ++i)
1227  {
1228  l = net.server.ledgerMaster.getLedgerByHash(l->info().parentHash);
1229  }
1230  net.client.ledgerMaster.storeLedger(l);
1231 
1232  net.client.replayer.replay(
1233  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1234 
1235  std::vector<TaskStatus> deltaStatuses(
1236  totalReplay - 1, TaskStatus::Completed);
1237  BEAST_EXPECT(net.client.waitAndCheckStatus(
1238  finalHash,
1239  totalReplay,
1242  deltaStatuses));
1243  BEAST_EXPECT(net.client.waitForLedgers(finalHash, totalReplay));
1244 
1245  // sweep
1246  net.client.replayer.sweep();
1247  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1248  }
1249 
1250  void
1252  {
1253  testcase("stop before timeout");
1254  int totalReplay = 3;
1255  NetworkOfTwo net(
1256  *this,
1257  {totalReplay + 1},
1261 
1262  auto l = net.server.ledgerMaster.getClosedLedger();
1263  uint256 finalHash = l->info().hash;
1264  net.client.replayer.replay(
1265  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1266 
1267  std::vector<TaskStatus> deltaStatuses;
1268  BEAST_EXPECT(net.client.checkStatus(
1269  finalHash,
1270  totalReplay,
1273  deltaStatuses));
1274 
1275  BEAST_EXPECT(net.client.countsAsExpected(1, 1, 0));
1276  net.client.replayer.stop();
1277  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1278  }
1279 
1280  void
1282  {
1283  testcase("SkipListAcquire bad reply");
1284  int totalReplay = 3;
1285  NetworkOfTwo net(
1286  *this,
1287  {totalReplay + 1 + 1},
1291 
1292  auto l = net.server.ledgerMaster.getClosedLedger();
1293  uint256 finalHash = l->info().hash;
1294  net.client.replayer.replay(
1295  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1296 
1297  auto skipList = net.client.findSkipListAcquire(finalHash);
1298 
1299  std::uint8_t payload[55] = {
1300  0x6A, 0x09, 0xE6, 0x67, 0xF3, 0xBC, 0xC9, 0x08, 0xB2};
1301  auto item =
1302  make_shamapitem(uint256(12345), Slice(payload, sizeof(payload)));
1303  skipList->processData(l->seq(), item);
1304 
1305  std::vector<TaskStatus> deltaStatuses;
1306  BEAST_EXPECT(net.client.waitAndCheckStatus(
1307  finalHash,
1308  totalReplay,
1311  deltaStatuses));
1312 
1313  // add another task
1314  net.client.replayer.replay(
1315  InboundLedger::Reason::GENERIC, finalHash, totalReplay + 1);
1316  BEAST_EXPECT(net.client.waitAndCheckStatus(
1317  finalHash,
1318  totalReplay,
1321  deltaStatuses));
1322  BEAST_EXPECT(net.client.countsAsExpected(2, 1, 0));
1323  }
1324 
1325  void
1327  {
1328  testcase("LedgerDeltaAcquire bad reply");
1329  int totalReplay = 3;
1330  NetworkOfTwo net(
1331  *this,
1332  {totalReplay + 1},
1336 
1337  auto l = net.server.ledgerMaster.getClosedLedger();
1338  uint256 finalHash = l->info().hash;
1339  net.client.ledgerMaster.storeLedger(l);
1340  net.client.replayer.replay(
1341  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1342 
1343  auto delta = net.client.findLedgerDeltaAcquire(l->info().parentHash);
1344  delta->processData(
1345  l->info(), // wrong ledger info
1347  BEAST_EXPECT(net.client.taskStatus(delta) == TaskStatus::Failed);
1348  BEAST_EXPECT(
1349  net.client.taskStatus(net.client.findTask(
1350  finalHash, totalReplay)) == TaskStatus::Failed);
1351 
1352  // add another task
1353  net.client.replayer.replay(
1354  InboundLedger::Reason::GENERIC, finalHash, totalReplay + 1);
1355  BEAST_EXPECT(
1356  net.client.taskStatus(net.client.findTask(
1357  finalHash, totalReplay + 1)) == TaskStatus::Failed);
1358  }
1359 
1360  void
1362  {
1363  testcase("Overlap tasks");
1364  int totalReplay = 5;
1365  NetworkOfTwo net(
1366  *this,
1367  {totalReplay * 3 + 1},
1371  auto l = net.server.ledgerMaster.getClosedLedger();
1372  uint256 finalHash = l->info().hash;
1373  net.client.replayer.replay(
1374  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1375  std::vector<TaskStatus> deltaStatuses(
1376  totalReplay - 1, TaskStatus::Completed);
1377  BEAST_EXPECT(net.client.waitAndCheckStatus(
1378  finalHash,
1379  totalReplay,
1382  deltaStatuses));
1383  BEAST_EXPECT(net.client.waitForLedgers(finalHash, totalReplay));
1384 
1385  // same range, same reason
1386  net.client.replayer.replay(
1387  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1388  BEAST_EXPECT(net.client.countsAsExpected(1, 1, totalReplay - 1));
1389  // same range, different reason
1390  net.client.replayer.replay(
1391  InboundLedger::Reason::CONSENSUS, finalHash, totalReplay);
1392  BEAST_EXPECT(net.client.countsAsExpected(2, 1, totalReplay - 1));
1393 
1394  // no overlap
1395  for (int i = 0; i < totalReplay + 2; ++i)
1396  {
1397  l = net.server.ledgerMaster.getLedgerByHash(l->info().parentHash);
1398  }
1399  auto finalHash_early = l->info().hash;
1400  net.client.replayer.replay(
1401  InboundLedger::Reason::GENERIC, finalHash_early, totalReplay);
1402  BEAST_EXPECT(net.client.waitAndCheckStatus(
1403  finalHash_early,
1404  totalReplay,
1407  deltaStatuses)); // deltaStatuses no change
1408  BEAST_EXPECT(net.client.waitForLedgers(finalHash_early, totalReplay));
1409  BEAST_EXPECT(net.client.countsAsExpected(3, 2, 2 * (totalReplay - 1)));
1410 
1411  // partial overlap
1412  l = net.server.ledgerMaster.getLedgerByHash(l->info().parentHash);
1413  auto finalHash_moreEarly = l->info().parentHash;
1414  net.client.replayer.replay(
1415  InboundLedger::Reason::GENERIC, finalHash_moreEarly, totalReplay);
1416  BEAST_EXPECT(net.client.waitAndCheckStatus(
1417  finalHash_moreEarly,
1418  totalReplay,
1421  deltaStatuses)); // deltaStatuses no change
1422  BEAST_EXPECT(
1423  net.client.waitForLedgers(finalHash_moreEarly, totalReplay));
1424  BEAST_EXPECT(
1425  net.client.countsAsExpected(4, 3, 2 * (totalReplay - 1) + 2));
1426 
1427  // cover
1428  net.client.replayer.replay(
1429  InboundLedger::Reason::GENERIC, finalHash, totalReplay * 3);
1430  deltaStatuses =
1431  std::vector<TaskStatus>(totalReplay * 3 - 1, TaskStatus::Completed);
1432  BEAST_EXPECT(net.client.waitAndCheckStatus(
1433  finalHash,
1434  totalReplay * 3,
1437  deltaStatuses)); // deltaStatuses changed
1438  BEAST_EXPECT(net.client.waitForLedgers(finalHash, totalReplay * 3));
1439  BEAST_EXPECT(net.client.countsAsExpected(5, 3, totalReplay * 3 - 1));
1440 
1441  // sweep
1442  net.client.replayer.sweep();
1443  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1444  }
1445 
1446  void
1447  run() override
1448  {
1449  testProofPath();
1450  testReplayDelta();
1451  testTaskParameter();
1452  testConfig();
1453  testHandshake();
1454  testAllLocal(1);
1455  testAllLocal(3);
1456  testAllInboundLedgers(1);
1457  testAllInboundLedgers(4);
1458  testPeerSetBehavior(PeerSetBehavior::Good, 1);
1459  testPeerSetBehavior(PeerSetBehavior::Good);
1460  testPeerSetBehavior(PeerSetBehavior::Drop50);
1461  testPeerSetBehavior(PeerSetBehavior::Repeat);
1462  testStop();
1463  testSkipListBadReply();
1464  testLedgerDeltaBadReply();
1465  testLedgerReplayOverlap();
1466  }
1467 };
1468 
1469 struct LedgerReplayerTimeout_test : public beast::unit_test::suite
1470 {
1471  void
1473  {
1474  testcase("SkipListAcquire timeout");
1475  int totalReplay = 3;
1476  NetworkOfTwo net(
1477  *this,
1478  {totalReplay + 1},
1482 
1483  auto l = net.server.ledgerMaster.getClosedLedger();
1484  uint256 finalHash = l->info().hash;
1485  net.client.replayer.replay(
1486  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1487 
1488  std::vector<TaskStatus> deltaStatuses;
1489  BEAST_EXPECT(net.client.waitAndCheckStatus(
1490  finalHash,
1491  totalReplay,
1494  deltaStatuses));
1495 
1496  // sweep
1497  BEAST_EXPECT(net.client.countsAsExpected(1, 1, 0));
1498  net.client.replayer.sweep();
1499  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1500  }
1501 
1502  void
1504  {
1505  testcase("LedgerDeltaAcquire timeout");
1506  int totalReplay = 3;
1507  NetworkOfTwo net(
1508  *this,
1509  {totalReplay + 1},
1513 
1514  auto l = net.server.ledgerMaster.getClosedLedger();
1515  uint256 finalHash = l->info().hash;
1516  net.client.ledgerMaster.storeLedger(l);
1517  net.client.replayer.replay(
1518  InboundLedger::Reason::GENERIC, finalHash, totalReplay);
1519 
1520  std::vector<TaskStatus> deltaStatuses(
1521  totalReplay - 1, TaskStatus::Failed);
1522  deltaStatuses.back() = TaskStatus::Completed; // in client ledgerMaster
1523  BEAST_EXPECT(net.client.waitAndCheckStatus(
1524  finalHash,
1525  totalReplay,
1528  deltaStatuses));
1529 
1530  // sweep
1531  BEAST_EXPECT(net.client.countsAsExpected(1, 1, totalReplay - 1));
1532  net.client.replayer.sweep();
1533  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1534  }
1535 
1536  void
1537  run() override
1538  {
1539  testSkipListTimeout();
1540  testLedgerDeltaTimeout();
1541  }
1542 };
1543 
1544 struct LedgerReplayerLong_test : public beast::unit_test::suite
1545 {
1546  void
1547  run() override
1548  {
1549  testcase("Acquire 1000 ledgers");
1550  int totalReplay = 250;
1551  int rounds = 4;
1552  NetworkOfTwo net(
1553  *this,
1554  {totalReplay * rounds + 1},
1558 
1559  std::vector<uint256> finishHashes;
1560  auto l = net.server.ledgerMaster.getClosedLedger();
1561  for (int i = 0; i < rounds; ++i)
1562  {
1563  finishHashes.push_back(l->info().hash);
1564  for (int j = 0; j < totalReplay; ++j)
1565  {
1566  l = net.server.ledgerMaster.getLedgerByHash(
1567  l->info().parentHash);
1568  }
1569  }
1570  BEAST_EXPECT(finishHashes.size() == rounds);
1571 
1572  for (int i = 0; i < rounds; ++i)
1573  {
1574  net.client.replayer.replay(
1575  InboundLedger::Reason::GENERIC, finishHashes[i], totalReplay);
1576  }
1577 
1578  std::vector<TaskStatus> deltaStatuses(
1579  totalReplay - 1, TaskStatus::Completed);
1580  for (int i = 0; i < rounds; ++i)
1581  {
1582  BEAST_EXPECT(net.client.waitAndCheckStatus(
1583  finishHashes[i],
1584  totalReplay,
1587  deltaStatuses));
1588  }
1589 
1590  BEAST_EXPECT(
1591  net.client.waitForLedgers(finishHashes[0], totalReplay * rounds));
1592  BEAST_EXPECT(net.client.countsAsExpected(
1593  rounds, rounds, rounds * (totalReplay - 1)));
1594 
1595  // sweep
1596  net.client.replayer.sweep();
1597  BEAST_EXPECT(net.client.countsAsExpected(0, 0, 0));
1598  }
1599 };
1600 
1603 BEAST_DEFINE_TESTSUITE(LedgerReplayerTimeout, app, ripple);
1604 BEAST_DEFINE_TESTSUITE_MANUAL(LedgerReplayerLong, app, ripple);
1605 
1606 } // namespace test
1607 } // 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:802
ripple::test::LedgerServer::param
Parameter param
Definition: LedgerReplay_test.cpp:549
ripple::test::TestPeer::TestPeer
TestPeer(bool enableLedgerReplay)
Definition: LedgerReplay_test.cpp:200
ripple::test::LedgerServer::Parameter::initLedgers
int initLedgers
Definition: LedgerReplay_test.cpp:457
ripple::test::TestPeer::compressionEnabled
bool compressionEnabled() const override
Definition: LedgerReplay_test.cpp:294
ripple::Application
Definition: Application.h:116
ripple::test::LedgerReplayClient::replayer
LedgerReplayer replayer
Definition: LedgerReplay_test.cpp:822
ripple::test::LedgerReplayer_test::testLedgerReplayOverlap
void testLedgerReplayOverlap()
Definition: LedgerReplay_test.cpp:1361
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:689
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:249
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:842
ripple::test::LedgerReplayClient::countsAsExpected
bool countsAsExpected(std::size_t tasks, std::size_t skipLists, std::size_t deltas)
Definition: LedgerReplay_test.cpp:696
ripple::test::LedgerReplayer_test::testLedgerDeltaBadReply
void testLedgerDeltaBadReply()
Definition: LedgerReplay_test.cpp:1326
ripple::test::LedgerReplayerTimeout_test::testLedgerDeltaTimeout
void testLedgerDeltaTimeout()
Definition: LedgerReplay_test.cpp:1503
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:854
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:205
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:1055
ripple::test::TestPeerSetBuilder
Build the TestPeerSet.
Definition: LedgerReplay_test.cpp:420
ripple::test::TaskStatus::NotExist
@ NotExist
ripple::test::TestPeer::hasLedger
bool hasLedger(uint256 const &hash, std::uint32_t seq) const override
Definition: LedgerReplay_test.cpp:271
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:233
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:303
ripple::test::TestPeer::isHighLatency
bool isHighLatency() const override
Definition: LedgerReplay_test.cpp:228
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:453
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:1544
ripple::test::MagicInboundLedgers::ledgerSource
LedgerMaster & ledgerSource
Definition: LedgerReplay_test.cpp:182
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:349
ripple::test::TestPeer::json
Json::Value json() override
Definition: LedgerReplay_test.cpp:244
ripple::test::LedgerServer::sendPayments
void sendPayments(int newTxes)
Definition: LedgerReplay_test.cpp:497
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:155
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:127
ripple::test::TestPeer::cluster
bool cluster() const override
Returns true if this connection is a member of the cluster.
Definition: LedgerReplay_test.cpp:223
ripple::test::LedgerServer::createLedgerHistory
void createLedgerHistory()
create ledger history
Definition: LedgerReplay_test.cpp:537
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:218
ripple::test::TaskStatus
TaskStatus
Definition: LedgerReplay_test.cpp:553
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:214
ripple::test::PeerFeature::None
@ None
ripple::test::LedgerReplayer_test::testSkipListBadReply
void testSkipListBadReply()
Definition: LedgerReplay_test.cpp:1281
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:1169
ripple::test::MagicInboundLedgers::ledgerSink
LedgerMaster & ledgerSink
Definition: LedgerReplay_test.cpp:183
ripple::test::TestPeerSet::behavior
PeerSetBehavior behavior
Definition: LedgerReplay_test.cpp:414
ripple::test::TestPeer::hasTxSet
bool hasTxSet(uint256 const &hash) const override
Definition: LedgerReplay_test.cpp:280
ripple::test::LedgerReplayClient::ledgerMaster
LedgerMaster & ledgerMaster
Definition: LedgerReplay_test.cpp:818
ripple::test::jtx::envconfig
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
Definition: envconfig.h:54
ripple::ProtocolFeature
ProtocolFeature
Definition: ripple/overlay/Peer.h:38
ripple::test::LedgerReplayClient::haveLedgers
bool haveLedgers(uint256 const &finishLedgerHash, int totalReplay)
Definition: LedgerReplay_test.cpp:606
ripple::test::TestPeerSetBuilder::local
LedgerReplayMsgHandler & local
Definition: LedgerReplay_test.cpp:443
ripple::tapNONE
@ tapNONE
Definition: ApplyView.h:30
ripple::test::NetworkOfTwo::server
LedgerServer server
Definition: LedgerReplay_test.cpp:853
ripple::test::LedgerReplayer_test::testAllLocal
void testAllLocal(int totalReplay)
Definition: LedgerReplay_test.cpp:1127
ripple::test::TestPeer::getScore
int getScore(bool) const override
Definition: LedgerReplay_test.cpp:233
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:635
ripple::test::LedgerServer::LedgerServer
LedgerServer(beast::unit_test::suite &suite, Parameter const &p)
Definition: LedgerReplay_test.cpp:464
ripple::test::LedgerReplayerTimeout_test
Definition: LedgerReplay_test.cpp:1469
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:411
ripple::Keylet::key
uint256 key
Definition: Keylet.h:40
ripple::base_uint< 256 >
ripple::test::TestPeer::ledgerReplayEnabled_
bool ledgerReplayEnabled_
Definition: LedgerReplay_test.cpp:316
ripple::test::LedgerServer::accounts
std::vector< jtx::Account > accounts
Definition: LedgerReplay_test.cpp:550
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:359
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:265
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:405
ripple::Config::loadFromString
void loadFromString(std::string const &fileContents)
Load the config from the contents of the string.
Definition: Config.cpp:447
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:764
ripple::test::InboundLedgersBehavior
InboundLedgersBehavior
Definition: LedgerReplay_test.cpp:72
ripple::Application::getLedgerMaster
virtual LedgerMaster & getLedgerMaster()=0
ripple::PublicKey
A public key.
Definition: PublicKey.h:61
ripple::test::LedgerReplayClient::findTask
std::shared_ptr< LedgerReplayTask > findTask(uint256 const &hash, int totalReplay)
Definition: LedgerReplay_test.cpp:668
ripple::test::LedgerServer::app
Application & app
Definition: LedgerReplay_test.cpp:546
ripple::Config
Definition: Config.h:92
chrono
ripple::test::TestPeer::txReduceRelayEnabled
bool txReduceRelayEnabled() const override
Definition: LedgerReplay_test.cpp:311
ripple::Application::config
virtual Config & config()=0
ripple::test::LedgerReplayerTimeout_test::run
void run() override
Definition: LedgerReplay_test.cpp:1537
ripple::test::TestPeer::hasRange
bool hasRange(std::uint32_t uMin, std::uint32_t uMax) override
Definition: LedgerReplay_test.cpp:289
std::unique_lock
STL class.
std::to_string
T to_string(T... args)
ripple::test::LedgerServer::ledgerMaster
LedgerMaster & ledgerMaster
Definition: LedgerReplay_test.cpp:547
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:545
ripple::test::PeerSetBehavior::DropLedgerDeltaReply
@ DropLedgerDeltaReply
ripple::test::LedgerReplayClient::findLedgerDeltaAcquire
std::shared_ptr< LedgerDeltaAcquire > findLedgerDeltaAcquire(uint256 const &hash)
Definition: LedgerReplay_test.cpp:718
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:820
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:1085
ripple::test::TestPeerSetBuilder::remote
LedgerReplayMsgHandler & remote
Definition: LedgerReplay_test.cpp:444
std::map
STL class.
ripple::test::MagicInboundLedgers::cacheSize
virtual size_t cacheSize() override
Definition: LedgerReplay_test.cpp:177
ripple::test::LedgerReplayer_test::testProofPath
void testProofPath()
Definition: LedgerReplay_test.cpp:885
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:570
ripple::test::LedgerReplayClient
Ledger replay client side.
Definition: LedgerReplay_test.cpp:567
ripple::test::TaskStatus::NotDone
@ NotDone
ripple::test::TestPeerSetBuilder::behavior
PeerSetBehavior behavior
Definition: LedgerReplay_test.cpp:445
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:436
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:708
ripple::Logs::threshold
beast::severities::Severity threshold() const
Definition: Log.cpp:150
ripple::test::LedgerReplayer_test::testStop
void testStop()
Definition: LedgerReplay_test.cpp:1251
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:817
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:882
ripple::test::logAll
void logAll(LedgerServer &server, LedgerReplayClient &client, beast::severities::Severity level=Severity::kTrace)
Definition: LedgerReplay_test.cpp:827
ripple::test::LedgerReplayClient::checkStatus
bool checkStatus(uint256 const &hash, int totalReplay, TaskStatus taskExpect, TaskStatus skiplistExpect, std::vector< TaskStatus > const &deltaExpects)
Definition: LedgerReplay_test.cpp:783
ripple::test::TestPeer::setPublisherListSequence
void setPublisherListSequence(PublicKey const &, std::size_t const) override
Definition: LedgerReplay_test.cpp:261
ripple::test::LedgerReplayer_test::testPeerSetBehavior
void testPeerSetBehavior(PeerSetBehavior peerSetBehavior, int totalReplay=4)
Definition: LedgerReplay_test.cpp:1199
ripple::test::TestPeer::cycleStatus
void cycleStatus() override
Definition: LedgerReplay_test.cpp:285
ripple::test::TestPeer::publisherListSequence
std::optional< std::size_t > publisherListSequence(PublicKey const &) const override
Definition: LedgerReplay_test.cpp:256
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:682
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:481
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:821
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:600
std::unordered_set::count
T count(T... args)
ripple::test::NetworkOfTwo
Definition: LedgerReplay_test.cpp:840
ripple::test::LedgerReplayerLong_test::run
void run() override
Definition: LedgerReplay_test.cpp:1547
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:661
ripple::test::LedgerReplayer_test::run
void run() override
Definition: LedgerReplay_test.cpp:1447
ripple::test::LedgerReplayer_test::testReplayDelta
void testReplayDelta()
Definition: LedgerReplay_test.cpp:949
ripple::test::TestPeerSet::dummyPeer
std::shared_ptr< TestPeer > dummyPeer
Definition: LedgerReplay_test.cpp:413
ripple::test::LedgerServer::msgHandler
LedgerReplayMsgHandler msgHandler
Definition: LedgerReplay_test.cpp:548
ripple::test::TestPeer::getRemoteAddress
beast::IP::Endpoint getRemoteAddress() const override
Definition: LedgerReplay_test.cpp:209
ripple::test::TestPeerSet
Simulate a peerSet that supplies peers to ledger replay subtasks.
Definition: LedgerReplay_test.cpp:334
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:446
ripple::test::TestPeerSet::remote
LedgerReplayMsgHandler & remote
Definition: LedgerReplay_test.cpp:412
ripple::test::LedgerServer::Parameter
Definition: LedgerReplay_test.cpp:455
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:816
ripple::test::LedgerReplayClient::taskStatus
TaskStatus taskStatus(std::shared_ptr< T > const &t)
Definition: LedgerReplay_test.cpp:729
ripple::test::BEAST_DEFINE_TESTSUITE_MANUAL
BEAST_DEFINE_TESTSUITE_MANUAL(AMMCalc, app, ripple)
ripple::test::LedgerReplay_test
Definition: LedgerReplay_test.cpp:40
ripple::test::LedgerReplayClient::waitForLedgers
bool waitForLedgers(uint256 const &finishLedgerHash, int totalReplay)
Definition: LedgerReplay_test.cpp:621
ripple::test::LedgerReplayerTimeout_test::testSkipListTimeout
void testSkipListTimeout()
Definition: LedgerReplay_test.cpp:1472
ripple::makeRequest
auto makeRequest(bool crawlPublic, bool comprEnabled, bool ledgerReplayEnabled, bool txReduceRelayEnabled, bool vpReduceRelayEnabled) -> request_type
Make outbound http request.
Definition: Handshake.cpp:367
ripple::test::TestPeerSet::TestPeerSet
TestPeerSet(LedgerReplayMsgHandler &me, LedgerReplayMsgHandler &other, PeerSetBehavior bhvr, bool enableLedgerReplay)
Definition: LedgerReplay_test.cpp:336
ripple::test::PeerSetBehavior
PeerSetBehavior
Definition: LedgerReplay_test.cpp:319
ripple::test::PeerFeature
PeerFeature
Definition: LedgerReplay_test.cpp:187
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:394
ripple::test::PeerSetBehavior::DropSkipListReply
@ DropSkipListReply
ripple::test::LedgerReplayClient::inboundLedgers
MagicInboundLedgers inboundLedgers
Definition: LedgerReplay_test.cpp:819
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:307
std::unique_ptr
STL class.
ripple::test::MagicInboundLedgers::bhvr
InboundLedgersBehavior bhvr
Definition: LedgerReplay_test.cpp:184
ripple::test::TestPeer
Simulate a network peer.
Definition: LedgerReplay_test.cpp:197
ripple::test::TestPeerSetBuilder::TestPeerSetBuilder
TestPeerSetBuilder(LedgerReplayMsgHandler &me, LedgerReplayMsgHandler &other, PeerSetBehavior bhvr, PeerFeature peerFeature)
Definition: LedgerReplay_test.cpp:423
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:739
std::set
STL class.
ripple::test::TestPeer::ledgerRange
void ledgerRange(std::uint32_t &minSeq, std::uint32_t &maxSeq) const override
Definition: LedgerReplay_test.cpp:276
ripple::test::TestPeer::sendTxQueue
void sendTxQueue() override
Send aggregated transactions' hashes.
Definition: LedgerReplay_test.cpp:299
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:1002
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::test::TestPeer::getNodePublic
PublicKey const & getNodePublic() const override
Definition: LedgerReplay_test.cpp:238
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