21 #include <ripple/app/ledger/LedgerMaster.h>
22 #include <ripple/app/reporting/P2pProxy.h>
23 #include <ripple/beast/unit_test.h>
24 #include <ripple/rpc/impl/Tuning.h>
27 #include <test/jtx/Env.h>
28 #include <test/jtx/envconfig.h>
29 #include <test/rpc/GRPCTestClientBase.h>
40 org::xrpl::rpc::v1::GetLedgerRequest
request;
41 org::xrpl::rpc::v1::GetLedgerResponse
reply;
57 testcase(
"GetLedger");
58 using namespace test::jtx;
61 Env env(*
this, std::move(config));
65 auto ledger = env.app().getLedgerMaster().getLedgerBySeq(3);
67 BEAST_EXPECT(env.current()->info().seq == 4);
69 auto grpcLedger = [&grpcPort](
76 grpcClient.request.mutable_ledger()->set_sequence(sequence);
77 grpcClient.request.set_transactions(transactions);
78 grpcClient.request.set_expand(expand);
79 grpcClient.request.set_get_objects(get_objects);
81 grpcClient.GetLedger();
86 auto [status, reply] = grpcLedger(3,
false,
false,
false);
88 BEAST_EXPECT(status.ok());
89 BEAST_EXPECT(reply.validated());
90 BEAST_EXPECT(!reply.has_hashes_list());
91 BEAST_EXPECT(!reply.has_transactions_list());
92 BEAST_EXPECT(!reply.skiplist_included());
93 BEAST_EXPECT(reply.ledger_objects().objects_size() == 0);
96 addRaw(ledger->info(), s,
true);
102 env.fund(
XRP(10000), alice);
103 env.fund(
XRP(10000), bob);
106 ledger = env.app().getLedgerMaster().getLedgerBySeq(4);
111 for (
auto& [sttx, meta] : ledger->txs)
113 hashes.
push_back(sttx->getTransactionID());
119 addRaw(ledger->info(), s,
true);
122 auto [status, reply] = grpcLedger(4,
true,
false,
false);
123 BEAST_EXPECT(status.ok());
124 BEAST_EXPECT(reply.validated());
125 BEAST_EXPECT(reply.has_hashes_list());
126 BEAST_EXPECT(reply.hashes_list().hashes_size() == hashes.
size());
140 BEAST_EXPECT(!reply.has_transactions_list());
141 BEAST_EXPECT(!reply.skiplist_included());
142 BEAST_EXPECT(reply.ledger_objects().objects_size() == 0);
148 auto [status, reply] = grpcLedger(4,
true,
true,
false);
150 BEAST_EXPECT(status.ok());
151 BEAST_EXPECT(reply.validated());
152 BEAST_EXPECT(!reply.has_hashes_list());
154 BEAST_EXPECT(reply.has_transactions_list());
155 BEAST_EXPECT(reply.transactions_list().transactions_size() == 4);
160 .transaction_blob()) ==
161 transactions[0]->getSerializer().slice());
167 metas[0]->getSerializer().slice());
172 .transaction_blob()) ==
173 transactions[1]->getSerializer().slice());
179 metas[1]->getSerializer().slice());
184 .transaction_blob()) ==
185 transactions[2]->getSerializer().slice());
191 metas[2]->getSerializer().slice());
196 .transaction_blob()) ==
197 transactions[3]->getSerializer().slice());
203 metas[3]->getSerializer().slice());
205 BEAST_EXPECT(!reply.skiplist_included());
206 BEAST_EXPECT(reply.ledger_objects().objects_size() == 0);
212 auto [status, reply] = grpcLedger(4,
true,
true,
true);
214 BEAST_EXPECT(status.ok());
215 BEAST_EXPECT(reply.validated());
216 BEAST_EXPECT(!reply.has_hashes_list());
218 BEAST_EXPECT(reply.has_transactions_list());
219 BEAST_EXPECT(reply.transactions_list().transactions_size() == 4);
224 .transaction_blob()) ==
225 transactions[0]->getSerializer().slice());
231 metas[0]->getSerializer().slice());
236 .transaction_blob()) ==
237 transactions[1]->getSerializer().slice());
243 metas[1]->getSerializer().slice());
248 .transaction_blob()) ==
249 transactions[2]->getSerializer().slice());
255 metas[2]->getSerializer().slice());
260 .transaction_blob()) ==
261 transactions[3]->getSerializer().slice());
267 metas[3]->getSerializer().slice());
268 BEAST_EXPECT(reply.skiplist_included());
272 auto parent = env.app().getLedgerMaster().getLedgerBySeq(3);
278 bool res = parent->stateMap().compare(
279 ledger->stateMap(), differences, maxDifferences);
283 for (
auto& [k, v] : differences)
288 reply.ledger_objects().objects(idx).key().data()));
293 makeSlice(reply.ledger_objects().objects(idx).data()));
304 env.current()->seq() + 257 - env.seq(alice)};
309 auto const acctDelFee{
drops(env.current()->fees().increment)};
314 auto [status, reply] =
315 grpcLedger(env.closed()->seq(),
true,
true,
true);
317 BEAST_EXPECT(status.ok());
318 BEAST_EXPECT(reply.validated());
320 env.app().getLedgerMaster().getLedgerBySeq(env.closed()->seq());
322 auto parent = env.app().getLedgerMaster().getLedgerBySeq(
323 env.closed()->seq() - 1);
329 bool res = parent->stateMap().compare(
330 base->stateMap(), differences, maxDifferences);
334 for (
auto& [k, v] : differences)
339 reply.ledger_objects().objects(idx).key().data()));
344 makeSlice(reply.ledger_objects().objects(idx).data()));
356 org::xrpl::rpc::v1::GetLedgerDataRequest
request;
357 org::xrpl::rpc::v1::GetLedgerDataResponse
reply;
373 testcase(
"GetLedgerData");
374 using namespace test::jtx;
377 Env env(*
this, std::move(config));
378 auto grpcLedgerData = [&grpcPort](
382 grpcClient.request.mutable_ledger()->set_sequence(sequence);
385 grpcClient.request.set_marker(marker);
388 grpcClient.GetLedgerData();
393 env.fund(
XRP(100000), alice);
395 int num_accounts = 10;
397 for (
auto i = 0; i < num_accounts; i++)
400 env.fund(
XRP(1000), bob);
405 auto [status, reply] = grpcLedgerData(env.closed()->seq());
406 BEAST_EXPECT(status.ok());
409 reply.ledger_objects().objects_size() == num_accounts + 3);
410 BEAST_EXPECT(reply.marker().size() == 0);
411 auto ledger = env.closed();
413 for (
auto& sle : ledger->sles)
416 sle->getSerializer().slice() ==
417 makeSlice(reply.ledger_objects().objects(idx).data()));
424 for (
auto i = 0; i < num_accounts; i++)
427 env.fund(
XRP(1000), cat);
434 auto [status, reply] = grpcLedgerData(env.closed()->seq());
435 BEAST_EXPECT(status.ok());
438 BEAST_EXPECT(reply.ledger_objects().objects_size() == maxLimit);
439 BEAST_EXPECT(reply.marker().size() != 0);
441 auto [status2, reply2] =
442 grpcLedgerData(env.closed()->seq(), reply.marker());
443 BEAST_EXPECT(status2.ok());
444 BEAST_EXPECT(reply2.marker().size() == 0);
446 auto ledger = env.closed();
448 for (
auto& sle : ledger->sles)
450 auto& obj = idx < maxLimit
451 ? reply.ledger_objects().objects(idx)
452 : reply2.ledger_objects().objects(idx - maxLimit);
455 sle->getSerializer().slice() ==
makeSlice(obj.data()));
460 reply.ledger_objects().objects_size() +
461 reply2.ledger_objects().objects_size());
469 org::xrpl::rpc::v1::GetLedgerDiffRequest
request;
470 org::xrpl::rpc::v1::GetLedgerDiffResponse
reply;
487 testcase(
"GetLedgerDiff");
488 using namespace test::jtx;
491 Env env(*
this, std::move(config));
493 auto grpcLedgerDiff = [&grpcPort](
494 auto baseSequence,
auto desiredSequence) {
497 grpcClient.request.mutable_base_ledger()->set_sequence(
499 grpcClient.request.mutable_desired_ledger()->set_sequence(
501 grpcClient.request.set_include_blobs(
true);
503 grpcClient.GetLedgerDiff();
507 int num_accounts = 20;
508 for (
auto i = 0; i < num_accounts; i++)
511 env.fund(
XRP(1000), cat);
517 auto compareDiffs = [&](
auto baseSequence,
auto desiredSequence) {
518 auto [status, reply] =
519 grpcLedgerDiff(baseSequence, desiredSequence);
521 BEAST_EXPECT(status.ok());
523 env.app().getLedgerMaster().getLedgerBySeq(desiredSequence);
526 env.app().getLedgerMaster().getLedgerBySeq(baseSequence);
532 bool res = base->stateMap().compare(
533 desired->stateMap(), differences, maxDifferences);
534 if (!BEAST_EXPECT(res))
538 for (
auto& [k, v] : differences)
543 reply.ledger_objects().objects(idx).key().data())))
550 reply.ledger_objects().objects(idx).data())))
561 compareDiffs(env.closed()->seq() - 1, env.closed()->seq()));
565 compareDiffs(env.closed()->seq() - 3, env.closed()->seq() - 2));
569 compareDiffs(env.closed()->seq() - 5, env.closed()->seq() - 1));
573 compareDiffs(env.closed()->seq(), env.closed()->seq() - 1));
577 compareDiffs(env.closed()->seq() - 1, env.closed()->seq() - 5));
584 org::xrpl::rpc::v1::GetLedgerEntryRequest
request;
585 org::xrpl::rpc::v1::GetLedgerEntryResponse
reply;
602 testcase(
"GetLedgerDiff");
603 using namespace test::jtx;
606 Env env(*
this, std::move(config));
608 auto grpcLedgerEntry = [&grpcPort](
auto sequence,
auto key) {
611 grpcClient.request.mutable_ledger()->set_sequence(sequence);
612 grpcClient.request.set_key(key.data(), key.size());
614 grpcClient.GetLedgerEntry();
619 env.fund(
XRP(1000), alice);
622 for (
auto& sle : env.closed()->sles)
624 auto [status, reply] =
625 grpcLedgerEntry(env.closed()->seq(), sle->key());
627 BEAST_EXPECT(status.ok());
633 makeSlice(reply.ledger_object().data()) ==
634 sle->getSerializer().slice());
641 testcase(
"NeedCurrentOrClosed");
643 org::xrpl::rpc::v1::GetAccountInfoRequest request;
644 request.mutable_ledger()->set_sequence(1);
646 request.mutable_ledger()->set_hash(
"");
648 request.mutable_ledger()->set_shortcut(
649 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
651 request.mutable_ledger()->set_shortcut(
652 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_UNSPECIFIED);
654 request.mutable_ledger()->set_shortcut(
655 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CURRENT);
657 request.mutable_ledger()->set_shortcut(
658 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CLOSED);
663 org::xrpl::rpc::v1::GetLedgerRequest request;
664 request.mutable_ledger()->set_sequence(1);
666 request.mutable_ledger()->set_hash(
"");
668 request.mutable_ledger()->set_shortcut(
669 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
671 request.mutable_ledger()->set_shortcut(
672 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_UNSPECIFIED);
674 request.mutable_ledger()->set_shortcut(
675 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CURRENT);
677 request.mutable_ledger()->set_shortcut(
678 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CLOSED);
683 org::xrpl::rpc::v1::GetLedgerDataRequest request;
684 request.mutable_ledger()->set_sequence(1);
686 request.mutable_ledger()->set_hash(
"");
688 request.mutable_ledger()->set_shortcut(
689 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
691 request.mutable_ledger()->set_shortcut(
692 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_UNSPECIFIED);
694 request.mutable_ledger()->set_shortcut(
695 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CURRENT);
697 request.mutable_ledger()->set_shortcut(
698 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CLOSED);
703 org::xrpl::rpc::v1::GetLedgerEntryRequest request;
704 request.mutable_ledger()->set_sequence(1);
706 request.mutable_ledger()->set_hash(
"");
708 request.mutable_ledger()->set_shortcut(
709 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
711 request.mutable_ledger()->set_shortcut(
712 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_UNSPECIFIED);
714 request.mutable_ledger()->set_shortcut(
715 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CURRENT);
717 request.mutable_ledger()->set_shortcut(
718 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CLOSED);
723 org::xrpl::rpc::v1::GetLedgerDiffRequest request;
727 request.mutable_base_ledger()->set_shortcut(
728 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
730 request.mutable_base_ledger()->set_sequence(1);
732 request.mutable_base_ledger()->set_hash(
"");
734 request.mutable_base_ledger()->set_shortcut(
735 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
737 request.mutable_base_ledger()->set_shortcut(
738 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_UNSPECIFIED);
740 request.mutable_base_ledger()->set_shortcut(
741 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CURRENT);
743 request.mutable_base_ledger()->set_shortcut(
744 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CLOSED);
748 request.mutable_base_ledger()->set_shortcut(
749 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
751 request.mutable_desired_ledger()->set_sequence(1);
753 request.mutable_desired_ledger()->set_hash(
"");
755 request.mutable_desired_ledger()->set_shortcut(
756 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
758 request.mutable_desired_ledger()->set_shortcut(
759 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_UNSPECIFIED);
761 request.mutable_desired_ledger()->set_shortcut(
762 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CURRENT);
764 request.mutable_desired_ledger()->set_shortcut(
765 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CLOSED);
769 request.mutable_base_ledger()->set_shortcut(
770 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CURRENT);
775 org::xrpl::rpc::v1::GetFeeRequest feeRequest;
778 org::xrpl::rpc::v1::GetAccountTransactionHistoryRequest
782 org::xrpl::rpc::v1::GetTransactionRequest txRequest;
790 testcase(
"SecureGateway");
791 using namespace test::jtx;
797 Env env(*
this, std::move(config));
801 auto ledger = env.app().getLedgerMaster().getLedgerBySeq(3);
803 BEAST_EXPECT(env.current()->info().seq == 4);
805 auto grpcLedger = [&grpcPort](
811 grpcClient.request.mutable_ledger()->set_sequence(sequence);
812 grpcClient.request.set_client_ip(clientIp);
813 grpcClient.request.set_user(user);
815 grpcClient.GetLedger();
820 auto [status, reply] =
821 grpcLedger(env.current()->info().seq,
"",
"");
822 BEAST_EXPECT(!reply.is_unlimited());
823 BEAST_EXPECT(status.ok());
826 auto [status, reply] =
827 grpcLedger(env.current()->info().seq,
"",
"ETL");
828 BEAST_EXPECT(reply.is_unlimited());
829 BEAST_EXPECT(status.ok());
832 auto [status, reply] =
833 grpcLedger(env.current()->info().seq,
"",
"Reporting");
834 BEAST_EXPECT(reply.is_unlimited());
835 BEAST_EXPECT(status.ok());
838 auto [status, reply] =
839 grpcLedger(env.current()->info().seq,
"127.0.0.1",
"ETL");
840 BEAST_EXPECT(!reply.is_unlimited());
841 BEAST_EXPECT(status.ok());
844 auto [status, reply] =
845 grpcLedger(env.current()->info().seq,
"127.0.0.1",
"");
846 BEAST_EXPECT(!reply.is_unlimited());
847 BEAST_EXPECT(status.ok());
857 Env env(*
this, std::move(config));
861 auto ledger = env.app().getLedgerMaster().getLedgerBySeq(3);
863 BEAST_EXPECT(env.current()->info().seq == 4);
865 auto grpcLedger = [&grpcPort](
871 grpcClient.request.mutable_ledger()->set_sequence(sequence);
872 grpcClient.request.set_client_ip(clientIp);
873 grpcClient.request.set_user(user);
875 grpcClient.GetLedger();
880 auto [status, reply] =
881 grpcLedger(env.current()->info().seq,
"",
"");
882 BEAST_EXPECT(!reply.is_unlimited());
883 BEAST_EXPECT(status.ok());
886 auto [status, reply] =
887 grpcLedger(env.current()->info().seq,
"",
"ETL");
888 BEAST_EXPECT(!reply.is_unlimited());
889 BEAST_EXPECT(status.ok());
892 auto [status, reply] = grpcLedger(
893 env.current()->info().seq, secureGatewayIp,
"ETL");
894 BEAST_EXPECT(!reply.is_unlimited());
895 BEAST_EXPECT(status.ok());
898 auto [status, reply] =
899 grpcLedger(env.current()->info().seq, secureGatewayIp,
"");
900 BEAST_EXPECT(!reply.is_unlimited());
901 BEAST_EXPECT(status.ok());
910 Env env(*
this, std::move(config));
914 auto ledger = env.app().getLedgerMaster().getLedgerBySeq(3);
916 BEAST_EXPECT(env.current()->info().seq == 4);
917 auto grpcLedgerData = [&grpcPort](
923 grpcClient.request.mutable_ledger()->set_sequence(sequence);
924 grpcClient.request.set_client_ip(clientIp);
925 grpcClient.request.set_user(user);
927 grpcClient.GetLedgerData();
931 auto [status, reply] =
932 grpcLedgerData(env.current()->info().seq,
"",
"");
933 BEAST_EXPECT(!reply.is_unlimited());
934 BEAST_EXPECT(status.ok());
937 auto [status, reply] =
938 grpcLedgerData(env.current()->info().seq,
"",
"ETL");
939 BEAST_EXPECT(reply.is_unlimited());
940 BEAST_EXPECT(status.ok());
943 auto [status, reply] =
944 grpcLedgerData(env.current()->info().seq,
"",
"Reporting");
945 BEAST_EXPECT(reply.is_unlimited());
946 BEAST_EXPECT(status.ok());
949 auto [status, reply] = grpcLedgerData(
950 env.current()->info().seq,
"127.0.0.1",
"ETL");
951 BEAST_EXPECT(!reply.is_unlimited());
952 BEAST_EXPECT(status.ok());
955 auto [status, reply] =
956 grpcLedgerData(env.current()->info().seq,
"127.0.0.1",
"");
957 BEAST_EXPECT(!reply.is_unlimited());
958 BEAST_EXPECT(status.ok());
967 Env env(*
this, std::move(config));
971 auto ledger = env.app().getLedgerMaster().getLedgerBySeq(3);
973 BEAST_EXPECT(env.current()->info().seq == 4);
975 auto grpcLedgerData = [&grpcPort](
981 grpcClient.request.mutable_ledger()->set_sequence(sequence);
982 grpcClient.request.set_client_ip(clientIp);
983 grpcClient.request.set_user(user);
985 grpcClient.GetLedgerData();
990 auto [status, reply] =
991 grpcLedgerData(env.current()->info().seq,
"",
"");
992 BEAST_EXPECT(!reply.is_unlimited());
993 BEAST_EXPECT(status.ok());
996 auto [status, reply] =
997 grpcLedgerData(env.current()->info().seq,
"",
"ETL");
998 BEAST_EXPECT(!reply.is_unlimited());
999 BEAST_EXPECT(status.ok());
1002 auto [status, reply] = grpcLedgerData(
1003 env.current()->info().seq, secureGatewayIp,
"ETL");
1004 BEAST_EXPECT(!reply.is_unlimited());
1005 BEAST_EXPECT(status.ok());
1008 auto [status, reply] = grpcLedgerData(
1009 env.current()->info().seq, secureGatewayIp,
"");
1010 BEAST_EXPECT(!reply.is_unlimited());
1011 BEAST_EXPECT(status.ok());