21#include <xrpl/basics/StringUtilities.h>
22#include <xrpl/protocol/jss.h>
40 using namespace test::jtx;
41 Env env{*
this, asAdmin ? envconfig() : envconfig(no_admin)};
42 Account
const gw{
"gateway"};
43 auto const USD = gw[
"USD"];
44 env.fund(XRP(100000), gw);
46 int const max_limit = 256;
49 for (
auto i = 0; i < max_limit + 10; i++)
52 env.fund(XRP(1000), bob);
61 jvParams[jss::ledger_index] =
"current";
62 jvParams[jss::binary] =
false;
64 auto const jrr = env.rpc(
67 boost::lexical_cast<std::string>(jvParams))[jss::result];
69 jrr[jss::ledger_current_index].isIntegral() &&
70 jrr[jss::ledger_current_index].asInt() > 0);
72 BEAST_EXPECT(checkArraySize(jrr[jss::state], max_limit));
76 for (
auto delta = -1; delta <= 1; delta++)
78 jvParams[jss::limit] = max_limit + delta;
79 auto const jrr = env.rpc(
82 boost::lexical_cast<std::string>(jvParams))[jss::result];
83 BEAST_EXPECT(checkArraySize(
85 (delta > 0 && !asAdmin) ? max_limit : max_limit + delta));
92 using namespace test::jtx;
93 Env env{*
this, envconfig(no_admin)};
94 Account
const gw{
"gateway"};
95 auto const USD = gw[
"USD"];
96 env.fund(XRP(100000), gw);
98 int const num_accounts = 10;
100 for (
auto i = 0; i < num_accounts; i++)
103 env.fund(XRP(1000), bob);
109 jvParams[jss::ledger_index] =
"current";
110 jvParams[jss::binary] =
true;
111 auto const jrr = env.rpc(
114 boost::lexical_cast<std::string>(jvParams))[jss::result];
116 jrr[jss::ledger_current_index].isIntegral() &&
117 jrr[jss::ledger_current_index].asInt() > 0);
118 BEAST_EXPECT(!jrr.isMember(jss::marker));
119 BEAST_EXPECT(checkArraySize(jrr[jss::state], num_accounts + 4));
125 using namespace test::jtx;
127 Account
const gw{
"gateway"};
128 auto const USD = gw[
"USD"];
129 Account
const bob{
"bob"};
131 env.fund(XRP(10000), gw, bob);
132 env.trust(USD(1000), bob);
137 jvParams[jss::limit] =
"0";
138 auto const jrr = env.rpc(
141 boost::lexical_cast<std::string>(jvParams))[jss::result];
142 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
143 BEAST_EXPECT(jrr[jss::status] ==
"error");
145 jrr[jss::error_message] ==
146 "Invalid field 'limit', not integer.");
152 jvParams[jss::marker] =
"NOT_A_MARKER";
153 auto const jrr = env.rpc(
156 boost::lexical_cast<std::string>(jvParams))[jss::result];
157 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
158 BEAST_EXPECT(jrr[jss::status] ==
"error");
160 jrr[jss::error_message] ==
161 "Invalid field 'marker', not valid.");
167 jvParams[jss::marker] = 1;
168 auto const jrr = env.rpc(
171 boost::lexical_cast<std::string>(jvParams))[jss::result];
172 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
173 BEAST_EXPECT(jrr[jss::status] ==
"error");
175 jrr[jss::error_message] ==
176 "Invalid field 'marker', not valid.");
182 jvParams[jss::ledger_index] = 10u;
183 auto const jrr = env.rpc(
186 boost::lexical_cast<std::string>(jvParams))[jss::result];
187 BEAST_EXPECT(jrr[jss::error] ==
"lgrNotFound");
188 BEAST_EXPECT(jrr[jss::status] ==
"error");
189 BEAST_EXPECT(jrr[jss::error_message] ==
"ledgerNotFound");
196 using namespace test::jtx;
197 Env env{*
this, envconfig(no_admin)};
198 Account
const gw{
"gateway"};
199 auto const USD = gw[
"USD"];
200 env.fund(XRP(100000), gw);
202 int const num_accounts = 20;
204 for (
auto i = 0; i < num_accounts; i++)
207 env.fund(XRP(1000), bob);
213 jvParams[jss::ledger_index] =
"current";
214 jvParams[jss::binary] =
false;
218 boost::lexical_cast<std::string>(jvParams))[jss::result];
219 auto const total_count = jrr[jss::state].
size();
222 jvParams[jss::limit] = 5;
226 boost::lexical_cast<std::string>(jvParams))[jss::result];
228 auto running_total = jrr[jss::state].size();
229 while (jrr.isMember(jss::marker))
231 jvParams[jss::marker] = jrr[jss::marker];
235 boost::lexical_cast<std::string>(jvParams))[jss::result];
236 running_total += jrr[jss::state].
size();
238 BEAST_EXPECT(running_total == total_count);
244 using namespace test::jtx;
246 env.fund(XRP(100000),
"alice");
253 jvParams[jss::ledger_index] =
"closed";
257 boost::lexical_cast<std::string>(jvParams))[jss::result];
258 if (BEAST_EXPECT(jrr.isMember(jss::ledger)))
260 jrr[jss::ledger][jss::ledger_hash] ==
266 jvParams[jss::ledger_index] =
"closed";
267 jvParams[jss::binary] =
true;
271 boost::lexical_cast<std::string>(jvParams))[jss::result];
272 if (BEAST_EXPECT(jrr.isMember(jss::ledger)))
275 strUnHex(jrr[jss::ledger][jss::ledger_data].asString());
276 if (BEAST_EXPECT(data))
281 BEAST_EXPECT(seq == 3);
288 jvParams[jss::binary] =
true;
292 boost::lexical_cast<std::string>(jvParams))[jss::result];
293 BEAST_EXPECT(jrr.isMember(jss::ledger));
294 BEAST_EXPECT(!jrr[jss::ledger].isMember(jss::ledger_data));
302 using namespace test::jtx;
306 {supported_amendments() - fixInnerObjTemplate2,
307 supported_amendments() | fixInnerObjTemplate2})
310 Env env{*
this, envconfig(validator,
""), features};
312 Account
const gw{
"gateway"};
313 auto const USD = gw[
"USD"];
314 env.fund(XRP(100000), gw);
318 jvParams[jss::ledger_index] =
"current";
319 jvParams[jss::type] = type;
323 boost::lexical_cast<std::string>(jvParams))[jss::result];
327 for (
auto const& type :
336 jss::payment_channel,
337 jss::deposit_preauth})
340 BEAST_EXPECT(checkArraySize(jrr[jss::state], 0));
343 int const num_accounts = 10;
345 for (
auto i = 0; i < num_accounts; i++)
348 env.fund(XRP(1000), bob);
350 env(offer(Account{
"bob0"}, USD(100), XRP(100)));
351 env.trust(Account{
"bob2"}[
"USD"](100), Account{
"bob3"});
354 for (
int i = 0; i <= 256; ++i)
358 if (!majorities.empty())
365 {{Account{
"bob1"}, 1}, {Account{
"bob2"}, 1}}));
366 env(ticket::create(env.master, 1));
370 jv[jss::TransactionType] = jss::EscrowCreate;
372 jv[jss::Account] = Account{
"bob5"}.human();
373 jv[jss::Destination] = Account{
"bob6"}.human();
375 jv[sfFinishAfter.fieldName] =
384 jv[jss::TransactionType] = jss::PaymentChannelCreate;
386 jv[jss::Account] = Account{
"bob6"}.human();
387 jv[jss::Destination] = Account{
"bob7"}.human();
390 jv[sfPublicKey.fieldName] =
392 jv[sfCancelAfter.fieldName] =
399 env(check::create(
"bob6",
"bob7", XRP(100)));
402 env(deposit::auth(Account{
"bob9"}, Account{
"bob4"}));
403 env(deposit::auth(Account{
"bob9"}, Account{
"bob8"}));
410 BEAST_EXPECT(checkArraySize(jrr[jss::state], 12));
411 for (
auto const& j : jrr[jss::state])
412 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::AccountRoot);
417 BEAST_EXPECT(checkArraySize(jrr[jss::state], 1));
418 for (
auto const& j : jrr[jss::state])
419 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Amendments);
424 BEAST_EXPECT(checkArraySize(jrr[jss::state], 1));
425 for (
auto const& j : jrr[jss::state])
426 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Check);
431 BEAST_EXPECT(checkArraySize(jrr[jss::state], 9));
432 for (
auto const& j : jrr[jss::state])
433 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::DirectoryNode);
438 BEAST_EXPECT(checkArraySize(jrr[jss::state], 1));
439 for (
auto const& j : jrr[jss::state])
440 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::FeeSettings);
445 BEAST_EXPECT(checkArraySize(jrr[jss::state], 2));
446 for (
auto const& j : jrr[jss::state])
447 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::LedgerHashes);
452 BEAST_EXPECT(checkArraySize(jrr[jss::state], 1));
453 for (
auto const& j : jrr[jss::state])
454 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Offer);
459 BEAST_EXPECT(checkArraySize(jrr[jss::state], 1));
460 for (
auto const& j : jrr[jss::state])
461 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::SignerList);
466 BEAST_EXPECT(checkArraySize(jrr[jss::state], 1));
467 for (
auto const& j : jrr[jss::state])
468 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::RippleState);
473 BEAST_EXPECT(checkArraySize(jrr[jss::state], 1));
474 for (
auto const& j : jrr[jss::state])
475 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Ticket);
480 BEAST_EXPECT(checkArraySize(jrr[jss::state], 1));
481 for (
auto const& j : jrr[jss::state])
482 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Escrow);
486 auto const jrr =
makeRequest(jss::payment_channel);
487 BEAST_EXPECT(checkArraySize(jrr[jss::state], 1));
488 for (
auto const& j : jrr[jss::state])
489 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::PayChannel);
493 auto const jrr =
makeRequest(jss::deposit_preauth);
494 BEAST_EXPECT(checkArraySize(jrr[jss::state], 2));
495 for (
auto const& j : jrr[jss::state])
496 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::DepositPreauth);
501 jvParams[jss::ledger_index] =
"current";
502 jvParams[jss::type] =
"misspelling";
503 auto const jrr = env.rpc(
506 boost::lexical_cast<std::string>(jvParams))[jss::result];
507 BEAST_EXPECT(jrr.isMember(
"error"));
508 BEAST_EXPECT(jrr[
"error"] ==
"invalidParams");
509 BEAST_EXPECT(jrr[
"error_message"] ==
"Invalid field 'type'.");
527BEAST_DEFINE_TESTSUITE_PRIO(LedgerData, app,
ripple, 1);
Lightweight wrapper to tag static string.
UInt size() const
Number of values in array or object.
std::string asString() const
Returns the unquoted string value.
bool isMember(const char *key) const
Return true if the object has a member named key.
void testCurrentLedgerToLimits(bool asAdmin)
void testCurrentLedgerBinary()
static bool checkMarker(Json::Value const &val)
void run() override
Runs the suite.
bool getInteger(Integer &number, int offset)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::optional< Blob > strUnHex(std::size_t strSize, Iterator begin, Iterator end)
std::string strHex(FwdIt begin, FwdIt end)
constexpr std::uint32_t tfUniversal
majorityAmendments_t getMajorityAmendments(ReadView const &view)
std::string to_string(base_uint< Bits, Tag > const &a)
auto makeRequest(bool crawlPublic, bool comprEnabled, bool ledgerReplayEnabled, bool txReduceRelayEnabled, bool vpReduceRelayEnabled) -> request_type
Make outbound http request.
T time_since_epoch(T... args)