20 #include <ripple/basics/StringUtilities.h>
21 #include <ripple/protocol/jss.h>
47 using namespace test::jtx;
48 Env env{*
this, asAdmin ? envconfig() : envconfig(no_admin)};
49 Account
const gw{
"gateway"};
50 auto const USD = gw[
"USD"];
51 env.fund(XRP(100000), gw);
53 int const max_limit = 256;
56 for (
auto i = 0; i < max_limit + 10; i++)
59 env.fund(XRP(1000), bob);
66 jvParams[jss::ledger_index] =
"current";
67 jvParams[jss::binary] =
false;
69 auto const jrr = env.rpc(
72 boost::lexical_cast<std::string>(jvParams))[jss::result];
74 jrr[jss::ledger_current_index].isIntegral() &&
75 jrr[jss::ledger_current_index].asInt() > 0);
81 for (
auto delta = -1; delta <= 1; delta++)
83 jvParams[jss::limit] = max_limit + delta;
84 auto const jrr = env.rpc(
87 boost::lexical_cast<std::string>(jvParams))[jss::result];
90 (delta > 0 && !asAdmin) ? max_limit : max_limit + delta));
97 using namespace test::jtx;
98 Env env{*
this, envconfig(no_admin)};
99 Account
const gw{
"gateway"};
100 auto const USD = gw[
"USD"];
101 env.fund(XRP(100000), gw);
103 int const num_accounts = 10;
105 for (
auto i = 0; i < num_accounts; i++)
108 env.fund(XRP(1000), bob);
115 jvParams[jss::ledger_index] =
"current";
116 jvParams[jss::binary] =
true;
117 auto const jrr = env.rpc(
120 boost::lexical_cast<std::string>(jvParams))[jss::result];
122 jrr[jss::ledger_current_index].isIntegral() &&
123 jrr[jss::ledger_current_index].asInt() > 0);
124 BEAST_EXPECT(!jrr.isMember(jss::marker));
131 using namespace test::jtx;
133 Account
const gw{
"gateway"};
134 auto const USD = gw[
"USD"];
135 Account
const bob{
"bob"};
137 env.fund(XRP(10000), gw, bob);
138 env.trust(USD(1000), bob);
143 jvParams[jss::limit] =
"0";
144 auto const jrr = env.rpc(
147 boost::lexical_cast<std::string>(jvParams))[jss::result];
148 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
149 BEAST_EXPECT(jrr[jss::status] ==
"error");
151 jrr[jss::error_message] ==
152 "Invalid field 'limit', not integer.");
158 jvParams[jss::marker] =
"NOT_A_MARKER";
159 auto const jrr = env.rpc(
162 boost::lexical_cast<std::string>(jvParams))[jss::result];
163 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
164 BEAST_EXPECT(jrr[jss::status] ==
"error");
166 jrr[jss::error_message] ==
167 "Invalid field 'marker', not valid.");
173 jvParams[jss::marker] = 1;
174 auto const jrr = env.rpc(
177 boost::lexical_cast<std::string>(jvParams))[jss::result];
178 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
179 BEAST_EXPECT(jrr[jss::status] ==
"error");
181 jrr[jss::error_message] ==
182 "Invalid field 'marker', not valid.");
188 jvParams[jss::ledger_index] = 10u;
189 auto const jrr = env.rpc(
192 boost::lexical_cast<std::string>(jvParams))[jss::result];
193 BEAST_EXPECT(jrr[jss::error] ==
"lgrNotFound");
194 BEAST_EXPECT(jrr[jss::status] ==
"error");
195 BEAST_EXPECT(jrr[jss::error_message] ==
"ledgerNotFound");
202 using namespace test::jtx;
203 Env env{*
this, envconfig(no_admin)};
204 Account
const gw{
"gateway"};
205 auto const USD = gw[
"USD"];
206 env.fund(XRP(100000), gw);
208 int const num_accounts = 20;
210 for (
auto i = 0; i < num_accounts; i++)
213 env.fund(XRP(1000), bob);
220 jvParams[jss::ledger_index] =
"current";
221 jvParams[jss::binary] =
false;
225 boost::lexical_cast<std::string>(jvParams))[jss::result];
226 auto const total_count = jrr[jss::state].
size();
229 jvParams[jss::limit] = 5;
233 boost::lexical_cast<std::string>(jvParams))[jss::result];
235 auto running_total = jrr[jss::state].size();
236 while (jrr.isMember(jss::marker))
238 jvParams[jss::marker] = jrr[jss::marker];
242 boost::lexical_cast<std::string>(jvParams))[jss::result];
243 running_total += jrr[jss::state].
size();
245 BEAST_EXPECT(running_total == total_count);
251 using namespace test::jtx;
253 env.fund(XRP(100000),
"alice");
260 jvParams[jss::ledger_index] =
"closed";
264 boost::lexical_cast<std::string>(jvParams))[jss::result];
265 if (BEAST_EXPECT(jrr.isMember(jss::ledger)))
267 jrr[jss::ledger][jss::ledger_hash] ==
273 jvParams[jss::ledger_index] =
"closed";
274 jvParams[jss::binary] =
true;
278 boost::lexical_cast<std::string>(jvParams))[jss::result];
279 if (BEAST_EXPECT(jrr.isMember(jss::ledger)))
282 strUnHex(jrr[jss::ledger][jss::ledger_data].asString());
283 if (BEAST_EXPECT(data))
288 BEAST_EXPECT(seq == 3);
295 jvParams[jss::binary] =
true;
299 boost::lexical_cast<std::string>(jvParams))[jss::result];
300 BEAST_EXPECT(jrr.isMember(jss::ledger));
301 BEAST_EXPECT(!jrr[jss::ledger].isMember(jss::ledger_data));
309 using namespace test::jtx;
311 Env env{*
this, envconfig(validator,
"")};
313 Account
const gw{
"gateway"};
314 auto const USD = gw[
"USD"];
315 env.fund(XRP(100000), gw);
317 int const num_accounts = 10;
319 for (
auto i = 0; i < num_accounts; i++)
322 env.fund(XRP(1000), bob);
324 env(offer(Account{
"bob0"}, USD(100), XRP(100)));
325 env.trust(Account{
"bob2"}[
"USD"](100), Account{
"bob3"});
328 for (
int i = 0; i <= 256; ++i)
332 if (!majorities.empty())
336 Account{
"bob0"}, 1, {{Account{
"bob1"}, 1}, {Account{
"bob2"}, 1}}));
337 env(ticket::create(env.master, 1));
341 jv[jss::TransactionType] = jss::EscrowCreate;
343 jv[jss::Account] = Account{
"bob5"}.human();
344 jv[jss::Destination] = Account{
"bob6"}.human();
354 jv[jss::TransactionType] = jss::PaymentChannelCreate;
356 jv[jss::Account] = Account{
"bob6"}.human();
357 jv[jss::Destination] = Account{
"bob7"}.human();
367 env(check::create(
"bob6",
"bob7", XRP(100)));
370 env(deposit::auth(Account{
"bob9"}, Account{
"bob4"}));
371 env(deposit::auth(Account{
"bob9"}, Account{
"bob8"}));
377 jvParams[jss::ledger_index] =
"current";
378 jvParams[jss::type] = t;
382 boost::lexical_cast<std::string>(jvParams))[jss::result];
388 for (
auto const& j : jrr[jss::state])
389 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::AccountRoot);
395 for (
auto const& j : jrr[jss::state])
396 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Amendments);
402 for (
auto const& j : jrr[jss::state])
403 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Check);
409 for (
auto const& j : jrr[jss::state])
410 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::DirectoryNode);
416 for (
auto const& j : jrr[jss::state])
417 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::FeeSettings);
423 for (
auto const& j : jrr[jss::state])
424 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::LedgerHashes);
430 for (
auto const& j : jrr[jss::state])
431 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Offer);
437 for (
auto const& j : jrr[jss::state])
438 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::SignerList);
444 for (
auto const& j : jrr[jss::state])
445 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::RippleState);
451 for (
auto const& j : jrr[jss::state])
452 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Ticket);
458 for (
auto const& j : jrr[jss::state])
459 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Escrow);
463 auto const jrr =
makeRequest(jss::payment_channel);
465 for (
auto const& j : jrr[jss::state])
466 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::PayChannel);
470 auto const jrr =
makeRequest(jss::deposit_preauth);
472 for (
auto const& j : jrr[jss::state])
473 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::DepositPreauth);
478 jvParams[jss::ledger_index] =
"current";
479 jvParams[jss::type] =
"misspelling";
480 auto const jrr = env.rpc(
483 boost::lexical_cast<std::string>(jvParams))[jss::result];
484 BEAST_EXPECT(jrr.isMember(
"error"));
485 BEAST_EXPECT(jrr[
"error"] ==
"invalidParams");
486 BEAST_EXPECT(jrr[
"error_message"] ==
"Invalid field 'type'.");