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