22#include <xrpl/basics/StringUtilities.h>
23#include <xrpl/protocol/jss.h>
41 using namespace test::jtx;
44 auto const USD = gw[
"USD"];
45 env.fund(
XRP(100000), gw);
47 int const max_limit = 256;
50 for (
auto i = 0; i < max_limit + 10; i++)
53 env.fund(
XRP(1000), bob);
62 jvParams[jss::ledger_index] =
"current";
63 jvParams[jss::binary] =
false;
65 auto const jrr = env.rpc(
68 boost::lexical_cast<std::string>(jvParams))[jss::result];
70 jrr[jss::ledger_current_index].isIntegral() &&
71 jrr[jss::ledger_current_index].asInt() > 0);
77 for (
auto delta = -1; delta <= 1; delta++)
79 jvParams[jss::limit] = max_limit + delta;
80 auto const jrr = env.rpc(
83 boost::lexical_cast<std::string>(jvParams))[jss::result];
86 (delta > 0 && !asAdmin) ? max_limit : max_limit + delta));
93 using namespace test::jtx;
96 auto const USD = gw[
"USD"];
97 env.fund(
XRP(100000), gw);
99 int const num_accounts = 10;
101 for (
auto i = 0; i < num_accounts; i++)
104 env.fund(
XRP(1000), bob);
110 jvParams[jss::ledger_index] =
"current";
111 jvParams[jss::binary] =
true;
112 auto const jrr = env.rpc(
115 boost::lexical_cast<std::string>(jvParams))[jss::result];
117 jrr[jss::ledger_current_index].isIntegral() &&
118 jrr[jss::ledger_current_index].asInt() > 0);
119 BEAST_EXPECT(!jrr.isMember(jss::marker));
126 using namespace test::jtx;
129 auto const USD = gw[
"USD"];
132 env.fund(
XRP(10000), gw, bob);
133 env.trust(USD(1000), bob);
138 jvParams[jss::limit] =
"0";
139 auto const jrr = env.rpc(
142 boost::lexical_cast<std::string>(jvParams))[jss::result];
143 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
144 BEAST_EXPECT(jrr[jss::status] ==
"error");
146 jrr[jss::error_message] ==
147 "Invalid field 'limit', not integer.");
153 jvParams[jss::marker] =
"NOT_A_MARKER";
154 auto const jrr = env.rpc(
157 boost::lexical_cast<std::string>(jvParams))[jss::result];
158 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
159 BEAST_EXPECT(jrr[jss::status] ==
"error");
161 jrr[jss::error_message] ==
162 "Invalid field 'marker', not valid.");
168 jvParams[jss::marker] = 1;
169 auto const jrr = env.rpc(
172 boost::lexical_cast<std::string>(jvParams))[jss::result];
173 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
174 BEAST_EXPECT(jrr[jss::status] ==
"error");
176 jrr[jss::error_message] ==
177 "Invalid field 'marker', not valid.");
183 jvParams[jss::ledger_index] = 10u;
184 auto const jrr = env.rpc(
187 boost::lexical_cast<std::string>(jvParams))[jss::result];
188 BEAST_EXPECT(jrr[jss::error] ==
"lgrNotFound");
189 BEAST_EXPECT(jrr[jss::status] ==
"error");
190 BEAST_EXPECT(jrr[jss::error_message] ==
"ledgerNotFound");
197 using namespace test::jtx;
200 auto const USD = gw[
"USD"];
201 env.fund(
XRP(100000), gw);
203 int const num_accounts = 20;
205 for (
auto i = 0; i < num_accounts; i++)
208 env.fund(
XRP(1000), bob);
214 jvParams[jss::ledger_index] =
"current";
215 jvParams[jss::binary] =
false;
219 boost::lexical_cast<std::string>(jvParams))[jss::result];
220 auto const total_count = jrr[jss::state].
size();
223 jvParams[jss::limit] = 5;
227 boost::lexical_cast<std::string>(jvParams))[jss::result];
229 auto running_total = jrr[jss::state].size();
230 while (jrr.isMember(jss::marker))
232 jvParams[jss::marker] = jrr[jss::marker];
236 boost::lexical_cast<std::string>(jvParams))[jss::result];
237 running_total += jrr[jss::state].
size();
239 BEAST_EXPECT(running_total == total_count);
245 using namespace test::jtx;
247 env.
fund(
XRP(100000),
"alice");
254 jvParams[jss::ledger_index] =
"closed";
258 boost::lexical_cast<std::string>(jvParams))[jss::result];
259 if (BEAST_EXPECT(jrr.isMember(jss::ledger)))
261 jrr[jss::ledger][jss::ledger_hash] ==
267 jvParams[jss::ledger_index] =
"closed";
268 jvParams[jss::binary] =
true;
272 boost::lexical_cast<std::string>(jvParams))[jss::result];
273 if (BEAST_EXPECT(jrr.isMember(jss::ledger)))
276 strUnHex(jrr[jss::ledger][jss::ledger_data].asString());
277 if (BEAST_EXPECT(data))
282 BEAST_EXPECT(
seq == 3);
289 jvParams[jss::binary] =
true;
293 boost::lexical_cast<std::string>(jvParams))[jss::result];
294 BEAST_EXPECT(jrr.isMember(jss::ledger));
295 BEAST_EXPECT(!jrr[jss::ledger].isMember(jss::ledger_data));
303 using namespace test::jtx;
314 auto const USD = gw[
"USD"];
315 env.fund(
XRP(100000), gw);
319 jvParams[jss::ledger_index] =
"current";
320 jvParams[jss::type] = type;
324 boost::lexical_cast<std::string>(jvParams))[jss::result];
328 for (
auto const& type :
337 jss::payment_channel,
338 jss::deposit_preauth})
344 int const num_accounts = 10;
346 for (
auto i = 0; i < num_accounts; i++)
349 env.fund(
XRP(1000), bob);
355 for (
int i = 0; i <= 256; ++i)
359 if (!majorities.empty())
371 jv[jss::TransactionType] = jss::EscrowCreate;
375 jv[sfFinishAfter.fieldName] =
384 jv[jss::TransactionType] = jss::PaymentChannelCreate;
389 jv[sfPublicKey.fieldName] =
391 jv[sfCancelAfter.fieldName] =
410 for (
auto const& j : jrr[jss::state])
411 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::AccountRoot);
417 for (
auto const& j : jrr[jss::state])
418 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Amendments);
424 for (
auto const& j : jrr[jss::state])
425 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Check);
431 for (
auto const& j : jrr[jss::state])
432 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::DirectoryNode);
438 for (
auto const& j : jrr[jss::state])
439 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::FeeSettings);
445 for (
auto const& j : jrr[jss::state])
446 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::LedgerHashes);
452 for (
auto const& j : jrr[jss::state])
453 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Offer);
459 for (
auto const& j : jrr[jss::state])
460 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::SignerList);
466 for (
auto const& j : jrr[jss::state])
467 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::RippleState);
473 for (
auto const& j : jrr[jss::state])
474 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Ticket);
480 for (
auto const& j : jrr[jss::state])
481 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::Escrow);
485 auto const jrr =
makeRequest(jss::payment_channel);
487 for (
auto const& j : jrr[jss::state])
488 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::PayChannel);
492 auto const jrr =
makeRequest(jss::deposit_preauth);
494 for (
auto const& j : jrr[jss::state])
495 BEAST_EXPECT(j[
"LedgerEntryType"] == jss::DepositPreauth);
500 jvParams[jss::ledger_index] =
"current";
501 jvParams[jss::type] =
"misspelling";
502 auto const jrr = env.rpc(
505 boost::lexical_cast<std::string>(jvParams))[jss::result];
506 BEAST_EXPECT(jrr.isMember(
"error"));
507 BEAST_EXPECT(jrr[
"error"] ==
"invalidParams");
508 BEAST_EXPECT(jrr[
"error_message"] ==
"Invalid field 'type'.");
526BEAST_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(char const *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)
Immutable cryptographic account descriptor.
PublicKey const & pk() const
Return the public key.
std::string const & human() const
Returns the human readable public key.
A transaction testing environment.
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
Json::Value create(A const &account, A const &dest, STAmount const &sendMax)
Create a check.
Json::Value auth(Account const &account, Account const &auth)
Preauthorize for deposit.
Json::Value create(Account const &account, std::uint32_t count)
Create one of more tickets.
std::unique_ptr< Config > validator(std::unique_ptr< Config >, std::string const &)
adjust configuration with params needed to be a validator
bool checkArraySize(Json::Value const &val, unsigned int size)
Json::Value signers(Account const &account, std::uint32_t quorum, std::vector< signer > const &v)
std::unique_ptr< Config > no_admin(std::unique_ptr< Config >)
adjust config so no admin ports are enabled
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
Json::Value offer(Account const &account, STAmount const &takerPays, STAmount const &takerGets, std::uint32_t flags)
Create an offer.
XRP_t const XRP
Converts to XRP Issue or STAmount.
FeatureBitset supported_amendments()
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)
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.
Set the sequence number on a JTx.
T time_since_epoch(T... args)