20 #include <ripple/protocol/Feature.h>
21 #include <ripple/protocol/jss.h>
24 #include <ripple/resource/Charge.h>
25 #include <ripple/resource/Fees.h>
26 #include <ripple/rpc/GRPCHandlers.h>
27 #include <test/jtx/WSClient.h>
28 #include <test/rpc/GRPCTestClientBase.h>
43 auto const info = env.
rpc(
"json",
"account_info",
"{ }");
45 info[jss::result][jss::error_message] ==
46 "Missing field 'account'.");
50 auto const info = env.
rpc(
54 "\"n94JNrQYkDrpt62bbSR7nVEhdyAvcJXRAsjEkFYyqRkh9SUTYEqV\"}");
56 info[jss::result][jss::error_message] ==
"Disallowed seed.");
61 auto const info = env.
rpc(
64 std::string(
"{ ") +
"\"account\": \"" + bogie.human() +
"\"}");
66 info[jss::result][jss::error_message] ==
"Account not found.");
79 auto const withoutSigners =
80 std::string(
"{ ") +
"\"account\": \"" + alice.human() +
"\"}";
82 auto const withSigners =
std::string(
"{ ") +
"\"account\": \"" +
83 alice.human() +
"\", " +
"\"signer_lists\": true }";
88 auto const info = env.
rpc(
"json",
"account_info", withoutSigners);
90 info.isMember(jss::result) &&
91 info[jss::result].isMember(jss::account_data));
92 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
97 auto const info = env.
rpc(
"json",
"account_info", withSigners);
99 info.isMember(jss::result) &&
100 info[jss::result].isMember(jss::account_data));
101 auto const& data = info[jss::result][jss::account_data];
102 BEAST_EXPECT(data.isMember(jss::signer_lists));
103 auto const& signerLists = data[jss::signer_lists];
104 BEAST_EXPECT(signerLists.isArray());
105 BEAST_EXPECT(signerLists.size() == 0);
111 Json::Value const smallSigners = signers(alice, 2, {{bogie, 3}});
115 auto const info = env.rpc(
"json",
"account_info", withoutSigners);
117 info.isMember(jss::result) &&
118 info[jss::result].isMember(jss::account_data));
119 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
124 auto const info = env.rpc(
"json",
"account_info", withSigners);
126 info.isMember(jss::result) &&
127 info[jss::result].isMember(jss::account_data));
128 auto const& data = info[jss::result][jss::account_data];
129 BEAST_EXPECT(data.isMember(jss::signer_lists));
130 auto const& signerLists = data[jss::signer_lists];
131 BEAST_EXPECT(signerLists.isArray());
132 BEAST_EXPECT(signerLists.size() == 1);
133 auto const& signers = signerLists[0u];
134 BEAST_EXPECT(signers.isObject());
137 BEAST_EXPECT(signerEntries.size() == 1);
167 auto const info = env.rpc(
"json",
"account_info", withSigners);
169 info.isMember(jss::result) &&
170 info[jss::result].isMember(jss::account_data));
171 auto const& data = info[jss::result][jss::account_data];
172 BEAST_EXPECT(data.isMember(jss::signer_lists));
173 auto const& signerLists = data[jss::signer_lists];
174 BEAST_EXPECT(signerLists.isArray());
175 BEAST_EXPECT(signerLists.size() == 1);
176 auto const& signers = signerLists[0u];
177 BEAST_EXPECT(signers.isObject());
180 BEAST_EXPECT(signerEntries.size() == 8);
181 for (
unsigned i = 0u; i < 8; ++i)
184 BEAST_EXPECT(entry.size() == 2);
197 c->loadFromString(
"\n[beta_rpc_api]\n1\n");
201 env.fund(
XRP(1000), alice);
204 "\"api_version\": 2, \"account\": \"" + alice.human() +
"\"}";
207 "\"api_version\": 2, \"account\": \"" + alice.human() +
"\", " +
208 "\"signer_lists\": true }";
213 auto const info = env.rpc(
"json",
"account_info", withoutSigners);
214 BEAST_EXPECT(info.isMember(jss::result));
215 BEAST_EXPECT(!info[jss::result].isMember(jss::signer_lists));
219 auto const info = env.rpc(
"json",
"account_info", withSigners);
220 BEAST_EXPECT(info.isMember(jss::result));
221 auto const& data = info[jss::result];
222 BEAST_EXPECT(data.isMember(jss::signer_lists));
223 auto const& signerLists = data[jss::signer_lists];
224 BEAST_EXPECT(signerLists.isArray());
225 BEAST_EXPECT(signerLists.size() == 0);
231 Json::Value const smallSigners = signers(alice, 2, {{bogie, 3}});
235 auto const info = env.rpc(
"json",
"account_info", withoutSigners);
236 BEAST_EXPECT(info.isMember(jss::result));
237 BEAST_EXPECT(!info[jss::result].isMember(jss::signer_lists));
241 auto const info = env.rpc(
"json",
"account_info", withSigners);
242 BEAST_EXPECT(info.isMember(jss::result));
243 auto const& data = info[jss::result];
244 BEAST_EXPECT(data.isMember(jss::signer_lists));
245 auto const& signerLists = data[jss::signer_lists];
246 BEAST_EXPECT(signerLists.isArray());
247 BEAST_EXPECT(signerLists.size() == 1);
248 auto const& signers = signerLists[0u];
249 BEAST_EXPECT(signers.isObject());
252 BEAST_EXPECT(signerEntries.size() == 1);
282 auto const info = env.rpc(
"json",
"account_info", withSigners);
283 BEAST_EXPECT(info.isMember(jss::result));
284 auto const& data = info[jss::result];
285 BEAST_EXPECT(data.isMember(jss::signer_lists));
286 auto const& signerLists = data[jss::signer_lists];
287 BEAST_EXPECT(signerLists.isArray());
288 BEAST_EXPECT(signerLists.size() == 1);
289 auto const& signers = signerLists[0u];
290 BEAST_EXPECT(signers.isObject());
293 BEAST_EXPECT(signerEntries.size() == 8);
294 for (
unsigned i = 0u; i < 8; ++i)
297 BEAST_EXPECT(entry.size() == 2);
314 "\"jsonrpc\": \"2.0\", "
315 "\"ripplerpc\": \"2.0\", "
317 "\"method\": \"account_info\", "
320 alice.human() +
"\"}}";
323 "\"jsonrpc\": \"2.0\", "
324 "\"ripplerpc\": \"2.0\", "
326 "\"method\": \"account_info\", "
329 alice.human() +
"\", " +
"\"signer_lists\": true }}";
333 auto const info = env.
rpc(
"json2", withoutSigners);
335 info.isMember(jss::result) &&
336 info[jss::result].isMember(jss::account_data));
337 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
340 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
342 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
343 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
347 auto const info = env.
rpc(
"json2", withSigners);
349 info.isMember(jss::result) &&
350 info[jss::result].isMember(jss::account_data));
351 auto const& data = info[jss::result][jss::account_data];
352 BEAST_EXPECT(data.isMember(jss::signer_lists));
353 auto const& signerLists = data[jss::signer_lists];
354 BEAST_EXPECT(signerLists.isArray());
355 BEAST_EXPECT(signerLists.size() == 0);
357 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
359 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
360 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
364 auto const info = env.
rpc(
365 "json2",
'[' + withoutSigners +
", " + withSigners +
']');
367 info[0u].isMember(jss::result) &&
368 info[0u][jss::result].isMember(jss::account_data));
369 BEAST_EXPECT(!info[0u][jss::result][jss::account_data].isMember(
372 info[0u].isMember(jss::jsonrpc) &&
373 info[0u][jss::jsonrpc] ==
"2.0");
375 info[0u].isMember(jss::ripplerpc) &&
376 info[0u][jss::ripplerpc] ==
"2.0");
377 BEAST_EXPECT(info[0u].isMember(jss::id) && info[0u][jss::id] == 5);
380 info[1u].isMember(jss::result) &&
381 info[1u][jss::result].isMember(jss::account_data));
382 auto const& data = info[1u][jss::result][jss::account_data];
383 BEAST_EXPECT(data.isMember(jss::signer_lists));
384 auto const& signerLists = data[jss::signer_lists];
385 BEAST_EXPECT(signerLists.isArray());
386 BEAST_EXPECT(signerLists.size() == 0);
388 info[1u].isMember(jss::jsonrpc) &&
389 info[1u][jss::jsonrpc] ==
"2.0");
391 info[1u].isMember(jss::ripplerpc) &&
392 info[1u][jss::ripplerpc] ==
"2.0");
393 BEAST_EXPECT(info[1u].isMember(jss::id) && info[1u][jss::id] == 6);
399 Json::Value const smallSigners = signers(alice, 2, {{bogie, 3}});
403 auto const info = env.rpc(
"json2", withoutSigners);
405 info.isMember(jss::result) &&
406 info[jss::result].isMember(jss::account_data));
407 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
410 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
412 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
413 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
417 auto const info = env.rpc(
"json2", withSigners);
419 info.isMember(jss::result) &&
420 info[jss::result].isMember(jss::account_data));
421 auto const& data = info[jss::result][jss::account_data];
422 BEAST_EXPECT(data.isMember(jss::signer_lists));
423 auto const& signerLists = data[jss::signer_lists];
424 BEAST_EXPECT(signerLists.isArray());
425 BEAST_EXPECT(signerLists.size() == 1);
426 auto const& signers = signerLists[0u];
427 BEAST_EXPECT(signers.isObject());
430 BEAST_EXPECT(signerEntries.size() == 1);
434 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
436 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
437 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
465 auto const info = env.rpc(
"json2", withSigners);
467 info.isMember(jss::result) &&
468 info[jss::result].isMember(jss::account_data));
469 auto const& data = info[jss::result][jss::account_data];
470 BEAST_EXPECT(data.isMember(jss::signer_lists));
471 auto const& signerLists = data[jss::signer_lists];
472 BEAST_EXPECT(signerLists.isArray());
473 BEAST_EXPECT(signerLists.size() == 1);
474 auto const& signers = signerLists[0u];
475 BEAST_EXPECT(signers.isObject());
478 BEAST_EXPECT(signerEntries.size() == 8);
479 for (
unsigned i = 0u; i < 8; ++i)
482 BEAST_EXPECT(entry.size() == 2);
487 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
489 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
490 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
498 org::xrpl::rpc::v1::GetAccountInfoRequest
request;
499 org::xrpl::rpc::v1::GetAccountInfoResponse
reply;
516 testcase(
"gRPC simple");
521 Env env(*
this, std::move(config));
523 env.fund(
drops(1000 * 1000 * 1000), alice);
528 client.
request.mutable_account()->set_address(alice.human());
530 if (!BEAST_EXPECT(client.
status.ok()))
535 client.
reply.account_data().account().value().address() ==
540 client.
request.mutable_account()->set_address(alice.human());
541 client.
request.set_queue(
true);
542 client.
request.mutable_ledger()->set_sequence(3);
544 if (!BEAST_EXPECT(client.
status.ok()))
547 client.
reply.account_data()
551 .drops() == 1000 * 1000 * 1000);
553 client.
reply.account_data().account().value().address() ==
556 client.
reply.account_data().sequence().value() ==
558 BEAST_EXPECT(client.
reply.queue_data().txn_count() == 0);
565 testcase(
"gRPC errors");
570 Env env(*
this, std::move(config));
571 auto getClient = [&grpcPort]() {
575 env.fund(
drops(1000 * 1000 * 1000), alice);
579 auto client = getClient();
580 client.request.mutable_account()->set_address(
"deadbeef");
581 client.GetAccountInfo();
582 BEAST_EXPECT(!client.status.ok());
587 auto client = getClient();
588 client.request.mutable_account()->set_address(bogie.human());
589 client.GetAccountInfo();
590 BEAST_EXPECT(!client.status.ok());
594 auto client = getClient();
595 client.request.mutable_account()->set_address(alice.human());
596 client.request.mutable_ledger()->set_sequence(0);
597 client.GetAccountInfo();
598 BEAST_EXPECT(!client.status.ok());
605 testcase(
"gRPC singer lists");
610 Env env(*
this, std::move(config));
611 auto getClient = [&grpcPort]() {
616 env.fund(
drops(1000 * 1000 * 1000), alice);
619 auto client = getClient();
620 client.request.mutable_account()->set_address(alice.human());
621 client.request.set_signer_lists(
true);
622 client.GetAccountInfo();
623 if (!BEAST_EXPECT(client.status.ok()))
625 BEAST_EXPECT(client.reply.signer_list().signer_entries_size() == 0);
630 Json::Value const smallSigners = signers(alice, 2, {{bogie, 3}});
633 auto client = getClient();
634 client.request.mutable_account()->set_address(alice.human());
635 client.request.set_signer_lists(
false);
636 client.GetAccountInfo();
637 if (!BEAST_EXPECT(client.status.ok()))
639 BEAST_EXPECT(client.reply.signer_list().signer_entries_size() == 0);
642 auto client = getClient();
643 client.request.mutable_account()->set_address(alice.human());
644 client.request.set_signer_lists(
true);
645 client.GetAccountInfo();
646 if (!BEAST_EXPECT(client.status.ok()))
651 client.reply.account_data().owner_count().value() == 1);
652 BEAST_EXPECT(client.reply.signer_list().signer_entries_size() == 1);
679 accounts.
insert(bogie.human());
680 accounts.
insert(demon.human());
681 accounts.
insert(ghost.human());
682 accounts.
insert(haunt.human());
683 accounts.
insert(jinni.human());
684 accounts.
insert(phase.human());
685 accounts.
insert(shade.human());
686 accounts.
insert(spook.human());
688 auto client = getClient();
689 client.request.mutable_account()->set_address(alice.human());
690 client.request.set_signer_lists(
true);
691 client.GetAccountInfo();
692 if (!BEAST_EXPECT(client.status.ok()))
697 client.reply.account_data().owner_count().value() == 1);
698 auto& signerList = client.reply.signer_list();
699 BEAST_EXPECT(signerList.signer_quorum().value() == 4);
700 BEAST_EXPECT(signerList.signer_entries_size() == 8);
701 for (
int i = 0; i < 8; ++i)
704 signerList.signer_entries(i).signer_weight().value() == 1);
706 accounts.
erase(signerList.signer_entries(i)
711 BEAST_EXPECT(accounts.
size() == 0);