20 #include <ripple/basics/StringUtilities.h>
21 #include <ripple/protocol/Feature.h>
22 #include <ripple/protocol/jss.h>
48 using namespace test::jtx;
49 Env env{*
this, asAdmin ? envconfig() : envconfig(no_admin)};
50 Account
const gw{
"gateway"};
51 auto const USD = gw[
"USD"];
52 env.fund(XRP(100000), gw);
54 int const max_limit = 256;
57 for (
auto i = 0; i < max_limit + 10; i++)
60 env.fund(XRP(1000), bob);
67 jvParams[jss::ledger_index] =
"current";
68 jvParams[jss::binary] =
false;
70 auto const jrr = env.rpc(
73 boost::lexical_cast<std::string>(jvParams))[jss::result];
75 jrr[jss::ledger_current_index].isIntegral() &&
76 jrr[jss::ledger_current_index].asInt() > 0);
82 for (
auto delta = -1; delta <= 1; delta++)
84 jvParams[jss::limit] = max_limit + delta;
85 auto const jrr = env.rpc(
88 boost::lexical_cast<std::string>(jvParams))[jss::result];
91 (delta > 0 && !asAdmin) ? max_limit : max_limit + delta));
98 using namespace test::jtx;
99 Env env{*
this, envconfig(no_admin)};
100 Account
const gw{
"gateway"};
101 auto const USD = gw[
"USD"];
102 env.fund(XRP(100000), gw);
104 int const num_accounts = 10;
106 for (
auto i = 0; i < num_accounts; i++)
109 env.fund(XRP(1000), bob);
116 jvParams[jss::ledger_index] =
"current";
117 jvParams[jss::binary] =
true;
118 auto const jrr = env.rpc(
121 boost::lexical_cast<std::string>(jvParams))[jss::result];
123 jrr[jss::ledger_current_index].isIntegral() &&
124 jrr[jss::ledger_current_index].asInt() > 0);
125 BEAST_EXPECT(!jrr.isMember(jss::marker));
132 using namespace test::jtx;
134 Account
const gw{
"gateway"};
135 auto const USD = gw[
"USD"];
136 Account
const bob{
"bob"};
138 env.fund(XRP(10000), gw, bob);
139 env.trust(USD(1000), bob);
144 jvParams[jss::limit] =
"0";
145 auto const jrr = env.rpc(
148 boost::lexical_cast<std::string>(jvParams))[jss::result];
149 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
150 BEAST_EXPECT(jrr[jss::status] ==
"error");
152 jrr[jss::error_message] ==
153 "Invalid field 'limit', not integer.");
159 jvParams[jss::marker] =
"NOT_A_MARKER";
160 auto const jrr = env.rpc(
163 boost::lexical_cast<std::string>(jvParams))[jss::result];
164 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
165 BEAST_EXPECT(jrr[jss::status] ==
"error");
167 jrr[jss::error_message] ==
168 "Invalid field 'marker', not valid.");
174 jvParams[jss::marker] = 1;
175 auto const jrr = env.rpc(
178 boost::lexical_cast<std::string>(jvParams))[jss::result];
179 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
180 BEAST_EXPECT(jrr[jss::status] ==
"error");
182 jrr[jss::error_message] ==
183 "Invalid field 'marker', not valid.");
189 jvParams[jss::ledger_index] = 10u;
190 auto const jrr = env.rpc(
193 boost::lexical_cast<std::string>(jvParams))[jss::result];
194 BEAST_EXPECT(jrr[jss::error] ==
"lgrNotFound");
195 BEAST_EXPECT(jrr[jss::status] ==
"error");
196 BEAST_EXPECT(jrr[jss::error_message] ==
"ledgerNotFound");
203 using namespace test::jtx;
204 Env env{*
this, envconfig(no_admin)};
205 Account
const gw{
"gateway"};
206 auto const USD = gw[
"USD"];
207 env.fund(XRP(100000), gw);
209 int const num_accounts = 20;
211 for (
auto i = 0; i < num_accounts; i++)
214 env.fund(XRP(1000), bob);
221 jvParams[jss::ledger_index] =
"current";
222 jvParams[jss::binary] =
false;
226 boost::lexical_cast<std::string>(jvParams))[jss::result];
227 auto const total_count = jrr[jss::state].
size();
230 jvParams[jss::limit] = 5;
234 boost::lexical_cast<std::string>(jvParams))[jss::result];
236 auto running_total = jrr[jss::state].size();
237 while (jrr.isMember(jss::marker))
239 jvParams[jss::marker] = jrr[jss::marker];
243 boost::lexical_cast<std::string>(jvParams))[jss::result];
244 running_total += jrr[jss::state].
size();
246 BEAST_EXPECT(running_total == total_count);
252 using namespace test::jtx;
254 env.fund(XRP(100000),
"alice");
261 jvParams[jss::ledger_index] =
"closed";
265 boost::lexical_cast<std::string>(jvParams))[jss::result];
266 if (BEAST_EXPECT(jrr.isMember(jss::ledger)))
268 jrr[jss::ledger][jss::ledger_hash] ==
274 jvParams[jss::ledger_index] =
"closed";
275 jvParams[jss::binary] =
true;
279 boost::lexical_cast<std::string>(jvParams))[jss::result];
280 if (BEAST_EXPECT(jrr.isMember(jss::ledger)))
283 strUnHex(jrr[jss::ledger][jss::ledger_data].asString());
284 if (BEAST_EXPECT(data))
289 BEAST_EXPECT(seq == 3);
296 jvParams[jss::binary] =
true;
300 boost::lexical_cast<std::string>(jvParams))[jss::result];
301 BEAST_EXPECT(jrr.isMember(jss::ledger));
302 BEAST_EXPECT(!jrr[jss::ledger].isMember(jss::ledger_data));
310 using namespace test::jtx;
314 envconfig(validator,
""),
317 Account
const gw{
"gateway"};
318 auto const USD = gw[
"USD"];
319 env.fund(XRP(100000), gw);
321 int const num_accounts = 10;
323 for (
auto i = 0; i < num_accounts; i++)
326 env.fund(XRP(1000), bob);
328 env(offer(Account{
"bob0"}, USD(100), XRP(100)));
329 env.trust(Account{
"bob2"}[
"USD"](100), Account{
"bob3"});
332 for (
int i = 0; i <= 256; ++i)
336 if (!majorities.empty())
340 Account{
"bob0"}, 1, {{Account{
"bob1"}, 1}, {Account{
"bob2"}, 1}}));
341 env(ticket::create(env.master, 1));
345 jv[jss::TransactionType] = jss::EscrowCreate;
347 jv[jss::Account] = Account{
"bob5"}.human();
348 jv[jss::Destination] = Account{
"bob6"}.human();
358 jv[jss::TransactionType] = jss::PaymentChannelCreate;
360 jv[jss::Account] = Account{
"bob6"}.human();
361 jv[jss::Destination] = Account{
"bob7"}.human();
371 env(check::create(
"bob6",
"bob7", XRP(100)));
374 env(deposit::auth(Account{
"bob9"}, Account{
"bob4"}));
375 env(deposit::auth(Account{
"bob9"}, Account{
"bob8"}));
381 jvParams[jss::ledger_index] =
"current";
382 jvParams[jss::type] = t;
386 boost::lexical_cast<std::string>(jvParams))[jss::result];
390 auto const jrr = makeRequest(jss::account);
392 for (
auto const& j : jrr[jss::state])
393 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::AccountRoot);
397 auto const jrr = makeRequest(jss::amendments);
399 for (
auto const& j : jrr[jss::state])
400 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Amendments);
404 auto const jrr = makeRequest(jss::check);
406 for (
auto const& j : jrr[jss::state])
407 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Check);
411 auto const jrr = makeRequest(jss::directory);
413 for (
auto const& j : jrr[jss::state])
414 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::DirectoryNode);
418 auto const jrr = makeRequest(jss::fee);
420 for (
auto const& j : jrr[jss::state])
421 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::FeeSettings);
425 auto const jrr = makeRequest(jss::hashes);
427 for (
auto const& j : jrr[jss::state])
428 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::LedgerHashes);
432 auto const jrr = makeRequest(jss::offer);
434 for (
auto const& j : jrr[jss::state])
435 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Offer);
439 auto const jrr = makeRequest(jss::signer_list);
441 for (
auto const& j : jrr[jss::state])
442 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::SignerList);
446 auto const jrr = makeRequest(jss::state);
448 for (
auto const& j : jrr[jss::state])
449 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::RippleState);
453 auto const jrr = makeRequest(jss::ticket);
455 for (
auto const& j : jrr[jss::state])
456 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Ticket);
460 auto const jrr = makeRequest(jss::escrow);
462 for (
auto const& j : jrr[jss::state])
463 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Escrow);
467 auto const jrr = makeRequest(jss::payment_channel);
469 for (
auto const& j : jrr[jss::state])
470 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::PayChannel);
474 auto const jrr = makeRequest(jss::deposit_preauth);
476 for (
auto const& j : jrr[jss::state])
477 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::DepositPreauth);
482 jvParams[jss::ledger_index] =
"current";
483 jvParams[jss::type] =
"misspelling";
484 auto const jrr = env.rpc(
487 boost::lexical_cast<std::string>(jvParams))[jss::result];
488 BEAST_EXPECT(jrr.isMember(
"error"));
489 BEAST_EXPECT(jrr[
"error"] ==
"invalidParams");
490 BEAST_EXPECT(jrr[
"error_message"] ==
"Invalid field 'type'.");