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",
"{ }");
44 BEAST_EXPECT(info[jss::result][jss::error_message] ==
45 "Missing field 'account'.");
49 auto const info = env.
rpc (
"json",
"account_info",
"{\"account\": "
50 "\"n94JNrQYkDrpt62bbSR7nVEhdyAvcJXRAsjEkFYyqRkh9SUTYEqV\"}");
51 BEAST_EXPECT(info[jss::result][jss::error_message] ==
57 auto const info = env.
rpc (
"json",
"account_info",
58 std::string (
"{ ") +
"\"account\": \"" + bogie.human() +
"\"}");
59 BEAST_EXPECT(info[jss::result][jss::error_message] ==
60 "Account not found.");
73 "\"account\": \"" + alice.human() +
"\"}";
76 "\"account\": \"" + alice.human() +
"\", " +
77 "\"signer_lists\": true }";
82 auto const info = env.
rpc (
"json",
"account_info", withoutSigners);
83 BEAST_EXPECT(info.isMember(jss::result) &&
84 info[jss::result].isMember(jss::account_data));
85 BEAST_EXPECT(! info[jss::result][jss::account_data].
86 isMember (jss::signer_lists));
90 auto const info = env.
rpc (
"json",
"account_info", withSigners);
91 BEAST_EXPECT(info.isMember(jss::result) &&
92 info[jss::result].isMember(jss::account_data));
93 auto const& data = info[jss::result][jss::account_data];
94 BEAST_EXPECT(data.isMember (jss::signer_lists));
95 auto const& signerLists = data[jss::signer_lists];
96 BEAST_EXPECT(signerLists.isArray());
97 BEAST_EXPECT(signerLists.size() == 0);
107 auto const info = env.rpc (
"json",
"account_info", withoutSigners);
108 BEAST_EXPECT(info.isMember(jss::result) &&
109 info[jss::result].isMember(jss::account_data));
110 BEAST_EXPECT(! info[jss::result][jss::account_data].
111 isMember (jss::signer_lists));
115 auto const info = env.rpc (
"json",
"account_info", withSigners);
116 BEAST_EXPECT(info.isMember(jss::result) &&
117 info[jss::result].isMember(jss::account_data));
118 auto const& data = info[jss::result][jss::account_data];
119 BEAST_EXPECT(data.isMember (jss::signer_lists));
120 auto const& signerLists = data[jss::signer_lists];
121 BEAST_EXPECT(signerLists.isArray());
122 BEAST_EXPECT(signerLists.size() == 1);
123 auto const&
signers = signerLists[0u];
127 BEAST_EXPECT(signerEntries.size() == 1);
142 {bogie, 1}, {demon, 1}, {ghost, 1}, {haunt, 1},
143 {jinni, 1}, {phase, 1}, {shade, 1}, {spook, 1}, });
147 auto const info = env.rpc (
"json",
"account_info", withSigners);
148 BEAST_EXPECT(info.isMember(jss::result) &&
149 info[jss::result].isMember(jss::account_data));
150 auto const& data = info[jss::result][jss::account_data];
151 BEAST_EXPECT(data.isMember (jss::signer_lists));
152 auto const& signerLists = data[jss::signer_lists];
153 BEAST_EXPECT(signerLists.isArray());
154 BEAST_EXPECT(signerLists.size() == 1);
155 auto const&
signers = signerLists[0u];
159 BEAST_EXPECT(signerEntries.size() == 8);
160 for (
unsigned i = 0u; i < 8; ++i)
163 BEAST_EXPECT(entry.size() == 2);
179 "\"jsonrpc\": \"2.0\", "
180 "\"ripplerpc\": \"2.0\", "
182 "\"method\": \"account_info\", "
184 "\"account\": \"" + alice.human() +
"\"}}";
187 "\"jsonrpc\": \"2.0\", "
188 "\"ripplerpc\": \"2.0\", "
190 "\"method\": \"account_info\", "
192 "\"account\": \"" + alice.human() +
"\", " +
193 "\"signer_lists\": true }}";
197 auto const info = env.
rpc (
"json2", withoutSigners);
198 BEAST_EXPECT(info.isMember(jss::result) &&
199 info[jss::result].isMember(jss::account_data));
200 BEAST_EXPECT(! info[jss::result][jss::account_data].
201 isMember (jss::signer_lists));
202 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
203 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
204 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
208 auto const info = env.
rpc (
"json2", withSigners);
209 BEAST_EXPECT(info.isMember(jss::result) &&
210 info[jss::result].isMember(jss::account_data));
211 auto const& data = info[jss::result][jss::account_data];
212 BEAST_EXPECT(data.isMember (jss::signer_lists));
213 auto const& signerLists = data[jss::signer_lists];
214 BEAST_EXPECT(signerLists.isArray());
215 BEAST_EXPECT(signerLists.size() == 0);
216 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
217 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
218 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
222 auto const info = env.
rpc (
"json2",
'[' + withoutSigners +
", "
223 + withSigners +
']');
224 BEAST_EXPECT(info[0u].isMember(jss::result) &&
225 info[0u][jss::result].isMember(jss::account_data));
226 BEAST_EXPECT(! info[0u][jss::result][jss::account_data].
227 isMember (jss::signer_lists));
228 BEAST_EXPECT(info[0u].isMember(jss::jsonrpc) && info[0u][jss::jsonrpc] ==
"2.0");
229 BEAST_EXPECT(info[0u].isMember(jss::ripplerpc) && info[0u][jss::ripplerpc] ==
"2.0");
230 BEAST_EXPECT(info[0u].isMember(jss::id) && info[0u][jss::id] == 5);
232 BEAST_EXPECT(info[1u].isMember(jss::result) &&
233 info[1u][jss::result].isMember(jss::account_data));
234 auto const& data = info[1u][jss::result][jss::account_data];
235 BEAST_EXPECT(data.isMember (jss::signer_lists));
236 auto const& signerLists = data[jss::signer_lists];
237 BEAST_EXPECT(signerLists.isArray());
238 BEAST_EXPECT(signerLists.size() == 0);
239 BEAST_EXPECT(info[1u].isMember(jss::jsonrpc) && info[1u][jss::jsonrpc] ==
"2.0");
240 BEAST_EXPECT(info[1u].isMember(jss::ripplerpc) && info[1u][jss::ripplerpc] ==
"2.0");
241 BEAST_EXPECT(info[1u].isMember(jss::id) && info[1u][jss::id] == 6);
251 auto const info = env.rpc (
"json2", withoutSigners);
252 BEAST_EXPECT(info.isMember(jss::result) &&
253 info[jss::result].isMember(jss::account_data));
254 BEAST_EXPECT(! info[jss::result][jss::account_data].
255 isMember (jss::signer_lists));
256 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
257 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
258 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
262 auto const info = env.rpc (
"json2", withSigners);
263 BEAST_EXPECT(info.isMember(jss::result) &&
264 info[jss::result].isMember(jss::account_data));
265 auto const& data = info[jss::result][jss::account_data];
266 BEAST_EXPECT(data.isMember (jss::signer_lists));
267 auto const& signerLists = data[jss::signer_lists];
268 BEAST_EXPECT(signerLists.isArray());
269 BEAST_EXPECT(signerLists.size() == 1);
270 auto const&
signers = signerLists[0u];
274 BEAST_EXPECT(signerEntries.size() == 1);
277 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
278 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
279 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
292 {bogie, 1}, {demon, 1}, {ghost, 1}, {haunt, 1},
293 {jinni, 1}, {phase, 1}, {shade, 1}, {spook, 1}, });
297 auto const info = env.rpc (
"json2", withSigners);
298 BEAST_EXPECT(info.isMember(jss::result) &&
299 info[jss::result].isMember(jss::account_data));
300 auto const& data = info[jss::result][jss::account_data];
301 BEAST_EXPECT(data.isMember (jss::signer_lists));
302 auto const& signerLists = data[jss::signer_lists];
303 BEAST_EXPECT(signerLists.isArray());
304 BEAST_EXPECT(signerLists.size() == 1);
305 auto const&
signers = signerLists[0u];
309 BEAST_EXPECT(signerEntries.size() == 8);
310 for (
unsigned i = 0u; i < 8; ++i)
313 BEAST_EXPECT(entry.size() == 2);
317 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
318 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
319 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
327 org::xrpl::rpc::v1::GetAccountInfoRequest
request;
328 org::xrpl::rpc::v1::GetAccountInfoResponse
reply;
345 testcase(
"gRPC simple");
350 Env env(*
this, std::move(config));
352 env.fund(
drops(1000 * 1000 * 1000), alice);
357 client.
request.mutable_account()->set_address(alice.human());
359 if (!BEAST_EXPECT(client.
status.ok()))
364 client.
reply.account_data().account().value().address() ==
369 client.
request.mutable_account()->set_address(alice.human());
370 client.
request.set_queue(
true);
371 client.
request.mutable_ledger()->set_sequence(3);
373 if (!BEAST_EXPECT(client.
status.ok()))
376 client.
reply.account_data().balance().value().xrp_amount().drops() ==
379 client.
reply.account_data().account().value().address() ==
382 client.
reply.account_data().sequence().value() == env.seq(alice));
383 BEAST_EXPECT(client.
reply.queue_data().txn_count() == 0);
390 testcase(
"gRPC errors");
395 Env env(*
this, std::move(config));
396 auto getClient = [&grpcPort]() {
400 env.fund(
drops(1000 * 1000 * 1000), alice);
404 auto client = getClient();
405 client.request.mutable_account()->set_address(
"deadbeef");
406 client.GetAccountInfo();
407 BEAST_EXPECT(!client.status.ok());
412 auto client = getClient();
413 client.request.mutable_account()->set_address(bogie.human());
414 client.GetAccountInfo();
415 BEAST_EXPECT(!client.status.ok());
419 auto client = getClient();
420 client.request.mutable_account()->set_address(alice.human());
421 client.request.mutable_ledger()->set_sequence(0);
422 client.GetAccountInfo();
423 BEAST_EXPECT(!client.status.ok());
430 testcase(
"gRPC singer lists");
435 Env env(*
this, std::move(config));
436 auto getClient = [&grpcPort]() {
441 env.fund(
drops(1000 * 1000 * 1000), alice);
444 auto client = getClient();
445 client.request.mutable_account()->set_address(alice.human());
446 client.request.set_signer_lists(
true);
447 client.GetAccountInfo();
448 if (!BEAST_EXPECT(client.status.ok()))
450 BEAST_EXPECT(client.reply.signer_list().signer_entries_size() == 0);
458 auto client = getClient();
459 client.request.mutable_account()->set_address(alice.human());
460 client.request.set_signer_lists(
false);
461 client.GetAccountInfo();
462 if (!BEAST_EXPECT(client.status.ok()))
464 BEAST_EXPECT(client.reply.signer_list().signer_entries_size() == 0);
467 auto client = getClient();
468 client.request.mutable_account()->set_address(alice.human());
469 client.request.set_signer_lists(
true);
470 client.GetAccountInfo();
471 if (!BEAST_EXPECT(client.status.ok()))
475 BEAST_EXPECT(client.reply.account_data().owner_count().value() == 1);
476 BEAST_EXPECT(client.reply.signer_list().signer_entries_size() == 1);
503 accounts.
insert(bogie.human());
504 accounts.
insert(demon.human());
505 accounts.
insert(ghost.human());
506 accounts.
insert(haunt.human());
507 accounts.
insert(jinni.human());
508 accounts.
insert(phase.human());
509 accounts.
insert(shade.human());
510 accounts.
insert(spook.human());
512 auto client = getClient();
513 client.request.mutable_account()->set_address(alice.human());
514 client.request.set_signer_lists(
true);
515 client.GetAccountInfo();
516 if (!BEAST_EXPECT(client.status.ok()))
520 BEAST_EXPECT(client.reply.account_data().owner_count().value() == 1);
521 auto& signerList = client.reply.signer_list();
522 BEAST_EXPECT(signerList.signer_quorum().value() == 4);
523 BEAST_EXPECT(signerList.signer_entries_size() == 8);
524 for (
int i = 0; i < 8; ++i)
526 BEAST_EXPECT(signerList.signer_entries(i).signer_weight().value() == 1);
529 signerList.signer_entries(i).account().value().address()) == 1);
531 BEAST_EXPECT(accounts.
size() == 0);