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()));
423 auto [status, reply] =
424 grpcLedgerData(env.closed()->seq(),
"bad marker");
425 BEAST_EXPECT(!status.ok());
427 status.error_code() == grpc::StatusCode::INVALID_ARGUMENT);
432 for (
auto i = 0; i < num_accounts; i++)
435 env.fund(
XRP(1000), cat);
442 auto [status, reply] = grpcLedgerData(env.closed()->seq());
443 BEAST_EXPECT(status.ok());
446 BEAST_EXPECT(reply.ledger_objects().objects_size() == maxLimit);
447 BEAST_EXPECT(reply.marker().size() != 0);
449 auto [status2, reply2] =
450 grpcLedgerData(env.closed()->seq(), reply.marker());
451 BEAST_EXPECT(status2.ok());
452 BEAST_EXPECT(reply2.marker().size() == 0);
454 auto ledger = env.closed();
456 for (
auto& sle : ledger->sles)
458 auto& obj = idx < maxLimit
459 ? reply.ledger_objects().objects(idx)
460 : reply2.ledger_objects().objects(idx - maxLimit);
463 sle->getSerializer().slice() ==
makeSlice(obj.data()));
468 reply.ledger_objects().objects_size() +
469 reply2.ledger_objects().objects_size());
477 org::xrpl::rpc::v1::GetLedgerDiffRequest
request;
478 org::xrpl::rpc::v1::GetLedgerDiffResponse
reply;
495 testcase(
"GetLedgerDiff");
496 using namespace test::jtx;
499 Env env(*
this, std::move(config));
501 auto grpcLedgerDiff = [&grpcPort](
502 auto baseSequence,
auto desiredSequence) {
505 grpcClient.request.mutable_base_ledger()->set_sequence(
507 grpcClient.request.mutable_desired_ledger()->set_sequence(
509 grpcClient.request.set_include_blobs(
true);
511 grpcClient.GetLedgerDiff();
515 int num_accounts = 20;
516 for (
auto i = 0; i < num_accounts; i++)
519 env.fund(
XRP(1000), cat);
525 auto compareDiffs = [&](
auto baseSequence,
auto desiredSequence) {
526 auto [status, reply] =
527 grpcLedgerDiff(baseSequence, desiredSequence);
529 BEAST_EXPECT(status.ok());
531 env.app().getLedgerMaster().getLedgerBySeq(desiredSequence);
534 env.app().getLedgerMaster().getLedgerBySeq(baseSequence);
540 bool res = base->stateMap().compare(
541 desired->stateMap(), differences, maxDifferences);
542 if (!BEAST_EXPECT(res))
546 for (
auto& [k, v] : differences)
551 reply.ledger_objects().objects(idx).key().data())))
558 reply.ledger_objects().objects(idx).data())))
569 compareDiffs(env.closed()->seq() - 1, env.closed()->seq()));
573 compareDiffs(env.closed()->seq() - 3, env.closed()->seq() - 2));
577 compareDiffs(env.closed()->seq() - 5, env.closed()->seq() - 1));
581 compareDiffs(env.closed()->seq(), env.closed()->seq() - 1));
585 compareDiffs(env.closed()->seq() - 1, env.closed()->seq() - 5));
592 org::xrpl::rpc::v1::GetLedgerEntryRequest
request;
593 org::xrpl::rpc::v1::GetLedgerEntryResponse
reply;
610 testcase(
"GetLedgerDiff");
611 using namespace test::jtx;
614 Env env(*
this, std::move(config));
616 auto grpcLedgerEntry = [&grpcPort](
auto sequence,
auto key) {
619 grpcClient.request.mutable_ledger()->set_sequence(sequence);
620 grpcClient.request.set_key(key.data(), key.size());
622 grpcClient.GetLedgerEntry();
627 env.fund(
XRP(1000), alice);
630 for (
auto& sle : env.closed()->sles)
632 auto [status, reply] =
633 grpcLedgerEntry(env.closed()->seq(), sle->key());
635 BEAST_EXPECT(status.ok());
641 makeSlice(reply.ledger_object().data()) ==
642 sle->getSerializer().slice());
649 testcase(
"NeedCurrentOrClosed");
651 org::xrpl::rpc::v1::GetAccountInfoRequest request;
652 request.mutable_ledger()->set_sequence(1);
654 request.mutable_ledger()->set_hash(
"");
656 request.mutable_ledger()->set_shortcut(
657 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
659 request.mutable_ledger()->set_shortcut(
660 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_UNSPECIFIED);
662 request.mutable_ledger()->set_shortcut(
663 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CURRENT);
665 request.mutable_ledger()->set_shortcut(
666 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CLOSED);
671 org::xrpl::rpc::v1::GetLedgerRequest request;
672 request.mutable_ledger()->set_sequence(1);
674 request.mutable_ledger()->set_hash(
"");
676 request.mutable_ledger()->set_shortcut(
677 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
679 request.mutable_ledger()->set_shortcut(
680 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_UNSPECIFIED);
682 request.mutable_ledger()->set_shortcut(
683 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CURRENT);
685 request.mutable_ledger()->set_shortcut(
686 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CLOSED);
691 org::xrpl::rpc::v1::GetLedgerDataRequest request;
692 request.mutable_ledger()->set_sequence(1);
694 request.mutable_ledger()->set_hash(
"");
696 request.mutable_ledger()->set_shortcut(
697 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
699 request.mutable_ledger()->set_shortcut(
700 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_UNSPECIFIED);
702 request.mutable_ledger()->set_shortcut(
703 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CURRENT);
705 request.mutable_ledger()->set_shortcut(
706 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CLOSED);
711 org::xrpl::rpc::v1::GetLedgerEntryRequest request;
712 request.mutable_ledger()->set_sequence(1);
714 request.mutable_ledger()->set_hash(
"");
716 request.mutable_ledger()->set_shortcut(
717 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
719 request.mutable_ledger()->set_shortcut(
720 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_UNSPECIFIED);
722 request.mutable_ledger()->set_shortcut(
723 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CURRENT);
725 request.mutable_ledger()->set_shortcut(
726 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CLOSED);
731 org::xrpl::rpc::v1::GetLedgerDiffRequest request;
735 request.mutable_base_ledger()->set_shortcut(
736 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
738 request.mutable_base_ledger()->set_sequence(1);
740 request.mutable_base_ledger()->set_hash(
"");
742 request.mutable_base_ledger()->set_shortcut(
743 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
745 request.mutable_base_ledger()->set_shortcut(
746 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_UNSPECIFIED);
748 request.mutable_base_ledger()->set_shortcut(
749 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CURRENT);
751 request.mutable_base_ledger()->set_shortcut(
752 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CLOSED);
756 request.mutable_base_ledger()->set_shortcut(
757 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
759 request.mutable_desired_ledger()->set_sequence(1);
761 request.mutable_desired_ledger()->set_hash(
"");
763 request.mutable_desired_ledger()->set_shortcut(
764 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_VALIDATED);
766 request.mutable_desired_ledger()->set_shortcut(
767 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_UNSPECIFIED);
769 request.mutable_desired_ledger()->set_shortcut(
770 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CURRENT);
772 request.mutable_desired_ledger()->set_shortcut(
773 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CLOSED);
777 request.mutable_base_ledger()->set_shortcut(
778 org::xrpl::rpc::v1::LedgerSpecifier::SHORTCUT_CURRENT);
783 org::xrpl::rpc::v1::GetFeeRequest feeRequest;
786 org::xrpl::rpc::v1::GetAccountTransactionHistoryRequest
790 org::xrpl::rpc::v1::GetTransactionRequest txRequest;
798 testcase(
"SecureGateway");
799 using namespace test::jtx;
805 Env env(*
this, std::move(config));
809 auto ledger = env.app().getLedgerMaster().getLedgerBySeq(3);
811 BEAST_EXPECT(env.current()->info().seq == 4);
813 auto grpcLedger = [&grpcPort](
819 grpcClient.request.mutable_ledger()->set_sequence(sequence);
820 grpcClient.request.set_client_ip(clientIp);
821 grpcClient.request.set_user(user);
823 grpcClient.GetLedger();
828 auto [status, reply] =
829 grpcLedger(env.current()->info().seq,
"",
"");
830 BEAST_EXPECT(!reply.is_unlimited());
831 BEAST_EXPECT(status.ok());
834 auto [status, reply] =
835 grpcLedger(env.current()->info().seq,
"",
"ETL");
836 BEAST_EXPECT(reply.is_unlimited());
837 BEAST_EXPECT(status.ok());
840 auto [status, reply] =
841 grpcLedger(env.current()->info().seq,
"",
"Reporting");
842 BEAST_EXPECT(reply.is_unlimited());
843 BEAST_EXPECT(status.ok());
846 auto [status, reply] =
847 grpcLedger(env.current()->info().seq,
"127.0.0.1",
"ETL");
848 BEAST_EXPECT(!reply.is_unlimited());
849 BEAST_EXPECT(status.ok());
852 auto [status, reply] =
853 grpcLedger(env.current()->info().seq,
"127.0.0.1",
"");
854 BEAST_EXPECT(!reply.is_unlimited());
855 BEAST_EXPECT(status.ok());
865 Env env(*
this, std::move(config));
869 auto ledger = env.app().getLedgerMaster().getLedgerBySeq(3);
871 BEAST_EXPECT(env.current()->info().seq == 4);
873 auto grpcLedger = [&grpcPort](
879 grpcClient.request.mutable_ledger()->set_sequence(sequence);
880 grpcClient.request.set_client_ip(clientIp);
881 grpcClient.request.set_user(user);
883 grpcClient.GetLedger();
888 auto [status, reply] =
889 grpcLedger(env.current()->info().seq,
"",
"");
890 BEAST_EXPECT(!reply.is_unlimited());
891 BEAST_EXPECT(status.ok());
894 auto [status, reply] =
895 grpcLedger(env.current()->info().seq,
"",
"ETL");
896 BEAST_EXPECT(!reply.is_unlimited());
897 BEAST_EXPECT(status.ok());
900 auto [status, reply] = grpcLedger(
901 env.current()->info().seq, secureGatewayIp,
"ETL");
902 BEAST_EXPECT(!reply.is_unlimited());
903 BEAST_EXPECT(status.ok());
906 auto [status, reply] =
907 grpcLedger(env.current()->info().seq, secureGatewayIp,
"");
908 BEAST_EXPECT(!reply.is_unlimited());
909 BEAST_EXPECT(status.ok());
918 Env env(*
this, std::move(config));
922 auto ledger = env.app().getLedgerMaster().getLedgerBySeq(3);
924 BEAST_EXPECT(env.current()->info().seq == 4);
925 auto grpcLedgerData = [&grpcPort](
931 grpcClient.request.mutable_ledger()->set_sequence(sequence);
932 grpcClient.request.set_client_ip(clientIp);
933 grpcClient.request.set_user(user);
935 grpcClient.GetLedgerData();
939 auto [status, reply] =
940 grpcLedgerData(env.current()->info().seq,
"",
"");
941 BEAST_EXPECT(!reply.is_unlimited());
942 BEAST_EXPECT(status.ok());
945 auto [status, reply] =
946 grpcLedgerData(env.current()->info().seq,
"",
"ETL");
947 BEAST_EXPECT(reply.is_unlimited());
948 BEAST_EXPECT(status.ok());
951 auto [status, reply] =
952 grpcLedgerData(env.current()->info().seq,
"",
"Reporting");
953 BEAST_EXPECT(reply.is_unlimited());
954 BEAST_EXPECT(status.ok());
957 auto [status, reply] = grpcLedgerData(
958 env.current()->info().seq,
"127.0.0.1",
"ETL");
959 BEAST_EXPECT(!reply.is_unlimited());
960 BEAST_EXPECT(status.ok());
963 auto [status, reply] =
964 grpcLedgerData(env.current()->info().seq,
"127.0.0.1",
"");
965 BEAST_EXPECT(!reply.is_unlimited());
966 BEAST_EXPECT(status.ok());
975 Env env(*
this, std::move(config));
979 auto ledger = env.app().getLedgerMaster().getLedgerBySeq(3);
981 BEAST_EXPECT(env.current()->info().seq == 4);
983 auto grpcLedgerData = [&grpcPort](
989 grpcClient.request.mutable_ledger()->set_sequence(sequence);
990 grpcClient.request.set_client_ip(clientIp);
991 grpcClient.request.set_user(user);
993 grpcClient.GetLedgerData();
998 auto [status, reply] =
999 grpcLedgerData(env.current()->info().seq,
"",
"");
1000 BEAST_EXPECT(!reply.is_unlimited());
1001 BEAST_EXPECT(status.ok());
1004 auto [status, reply] =
1005 grpcLedgerData(env.current()->info().seq,
"",
"ETL");
1006 BEAST_EXPECT(!reply.is_unlimited());
1007 BEAST_EXPECT(status.ok());
1010 auto [status, reply] = grpcLedgerData(
1011 env.current()->info().seq, secureGatewayIp,
"ETL");
1012 BEAST_EXPECT(!reply.is_unlimited());
1013 BEAST_EXPECT(status.ok());
1016 auto [status, reply] = grpcLedgerData(
1017 env.current()->info().seq, secureGatewayIp,
"");
1018 BEAST_EXPECT(!reply.is_unlimited());
1019 BEAST_EXPECT(status.ok());