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);
201 "\"jsonrpc\": \"2.0\", "
202 "\"ripplerpc\": \"2.0\", "
204 "\"method\": \"account_info\", "
207 alice.human() +
"\"}}";
210 "\"jsonrpc\": \"2.0\", "
211 "\"ripplerpc\": \"2.0\", "
213 "\"method\": \"account_info\", "
216 alice.human() +
"\", " +
"\"signer_lists\": true }}";
220 auto const info = env.
rpc(
"json2", withoutSigners);
222 info.isMember(jss::result) &&
223 info[jss::result].isMember(jss::account_data));
224 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
227 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
229 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
230 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
234 auto const info = env.
rpc(
"json2", withSigners);
236 info.isMember(jss::result) &&
237 info[jss::result].isMember(jss::account_data));
238 auto const& data = info[jss::result][jss::account_data];
239 BEAST_EXPECT(data.isMember(jss::signer_lists));
240 auto const& signerLists = data[jss::signer_lists];
241 BEAST_EXPECT(signerLists.isArray());
242 BEAST_EXPECT(signerLists.size() == 0);
244 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
246 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
247 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
251 auto const info = env.
rpc(
252 "json2",
'[' + withoutSigners +
", " + withSigners +
']');
254 info[0u].isMember(jss::result) &&
255 info[0u][jss::result].isMember(jss::account_data));
256 BEAST_EXPECT(!info[0u][jss::result][jss::account_data].isMember(
259 info[0u].isMember(jss::jsonrpc) &&
260 info[0u][jss::jsonrpc] ==
"2.0");
262 info[0u].isMember(jss::ripplerpc) &&
263 info[0u][jss::ripplerpc] ==
"2.0");
264 BEAST_EXPECT(info[0u].isMember(jss::id) && info[0u][jss::id] == 5);
267 info[1u].isMember(jss::result) &&
268 info[1u][jss::result].isMember(jss::account_data));
269 auto const& data = info[1u][jss::result][jss::account_data];
270 BEAST_EXPECT(data.isMember(jss::signer_lists));
271 auto const& signerLists = data[jss::signer_lists];
272 BEAST_EXPECT(signerLists.isArray());
273 BEAST_EXPECT(signerLists.size() == 0);
275 info[1u].isMember(jss::jsonrpc) &&
276 info[1u][jss::jsonrpc] ==
"2.0");
278 info[1u].isMember(jss::ripplerpc) &&
279 info[1u][jss::ripplerpc] ==
"2.0");
280 BEAST_EXPECT(info[1u].isMember(jss::id) && info[1u][jss::id] == 6);
286 Json::Value const smallSigners = signers(alice, 2, {{bogie, 3}});
290 auto const info = env.rpc(
"json2", withoutSigners);
292 info.isMember(jss::result) &&
293 info[jss::result].isMember(jss::account_data));
294 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
297 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
299 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
300 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
304 auto const info = env.rpc(
"json2", withSigners);
306 info.isMember(jss::result) &&
307 info[jss::result].isMember(jss::account_data));
308 auto const& data = info[jss::result][jss::account_data];
309 BEAST_EXPECT(data.isMember(jss::signer_lists));
310 auto const& signerLists = data[jss::signer_lists];
311 BEAST_EXPECT(signerLists.isArray());
312 BEAST_EXPECT(signerLists.size() == 1);
313 auto const& signers = signerLists[0u];
314 BEAST_EXPECT(signers.isObject());
317 BEAST_EXPECT(signerEntries.size() == 1);
321 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
323 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
324 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
352 auto const info = env.rpc(
"json2", withSigners);
354 info.isMember(jss::result) &&
355 info[jss::result].isMember(jss::account_data));
356 auto const& data = info[jss::result][jss::account_data];
357 BEAST_EXPECT(data.isMember(jss::signer_lists));
358 auto const& signerLists = data[jss::signer_lists];
359 BEAST_EXPECT(signerLists.isArray());
360 BEAST_EXPECT(signerLists.size() == 1);
361 auto const& signers = signerLists[0u];
362 BEAST_EXPECT(signers.isObject());
365 BEAST_EXPECT(signerEntries.size() == 8);
366 for (
unsigned i = 0u; i < 8; ++i)
369 BEAST_EXPECT(entry.size() == 2);
374 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
376 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
377 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
385 org::xrpl::rpc::v1::GetAccountInfoRequest
request;
386 org::xrpl::rpc::v1::GetAccountInfoResponse
reply;
403 testcase(
"gRPC simple");
408 Env env(*
this, std::move(config));
410 env.fund(
drops(1000 * 1000 * 1000), alice);
415 client.
request.mutable_account()->set_address(alice.human());
417 if (!BEAST_EXPECT(client.
status.ok()))
422 client.
reply.account_data().account().value().address() ==
427 client.
request.mutable_account()->set_address(alice.human());
428 client.
request.set_queue(
true);
429 client.
request.mutable_ledger()->set_sequence(3);
431 if (!BEAST_EXPECT(client.
status.ok()))
434 client.
reply.account_data()
438 .drops() == 1000 * 1000 * 1000);
440 client.
reply.account_data().account().value().address() ==
443 client.
reply.account_data().sequence().value() ==
445 BEAST_EXPECT(client.
reply.queue_data().txn_count() == 0);
452 testcase(
"gRPC errors");
457 Env env(*
this, std::move(config));
458 auto getClient = [&grpcPort]() {
462 env.fund(
drops(1000 * 1000 * 1000), alice);
466 auto client = getClient();
467 client.request.mutable_account()->set_address(
"deadbeef");
468 client.GetAccountInfo();
469 BEAST_EXPECT(!client.status.ok());
474 auto client = getClient();
475 client.request.mutable_account()->set_address(bogie.human());
476 client.GetAccountInfo();
477 BEAST_EXPECT(!client.status.ok());
481 auto client = getClient();
482 client.request.mutable_account()->set_address(alice.human());
483 client.request.mutable_ledger()->set_sequence(0);
484 client.GetAccountInfo();
485 BEAST_EXPECT(!client.status.ok());
492 testcase(
"gRPC singer lists");
497 Env env(*
this, std::move(config));
498 auto getClient = [&grpcPort]() {
503 env.fund(
drops(1000 * 1000 * 1000), alice);
506 auto client = getClient();
507 client.request.mutable_account()->set_address(alice.human());
508 client.request.set_signer_lists(
true);
509 client.GetAccountInfo();
510 if (!BEAST_EXPECT(client.status.ok()))
512 BEAST_EXPECT(client.reply.signer_list().signer_entries_size() == 0);
517 Json::Value const smallSigners = signers(alice, 2, {{bogie, 3}});
520 auto client = getClient();
521 client.request.mutable_account()->set_address(alice.human());
522 client.request.set_signer_lists(
false);
523 client.GetAccountInfo();
524 if (!BEAST_EXPECT(client.status.ok()))
526 BEAST_EXPECT(client.reply.signer_list().signer_entries_size() == 0);
529 auto client = getClient();
530 client.request.mutable_account()->set_address(alice.human());
531 client.request.set_signer_lists(
true);
532 client.GetAccountInfo();
533 if (!BEAST_EXPECT(client.status.ok()))
538 client.reply.account_data().owner_count().value() == 1);
539 BEAST_EXPECT(client.reply.signer_list().signer_entries_size() == 1);
566 accounts.
insert(bogie.human());
567 accounts.
insert(demon.human());
568 accounts.
insert(ghost.human());
569 accounts.
insert(haunt.human());
570 accounts.
insert(jinni.human());
571 accounts.
insert(phase.human());
572 accounts.
insert(shade.human());
573 accounts.
insert(spook.human());
575 auto client = getClient();
576 client.request.mutable_account()->set_address(alice.human());
577 client.request.set_signer_lists(
true);
578 client.GetAccountInfo();
579 if (!BEAST_EXPECT(client.status.ok()))
584 client.reply.account_data().owner_count().value() == 1);
585 auto& signerList = client.reply.signer_list();
586 BEAST_EXPECT(signerList.signer_quorum().value() == 4);
587 BEAST_EXPECT(signerList.signer_entries_size() == 8);
588 for (
int i = 0; i < 8; ++i)
591 signerList.signer_entries(i).signer_weight().value() == 1);
593 accounts.
erase(signerList.signer_entries(i)
598 BEAST_EXPECT(accounts.
size() == 0);