21#include <test/jtx/envconfig.h>
22#include <xrpld/app/main/Application.h>
23#include <xrpld/app/misc/SHAMapStore.h>
24#include <xrpld/app/rdb/backend/SQLiteDatabase.h>
25#include <xrpld/core/ConfigSections.h>
26#include <xrpl/protocol/jss.h>
59 auto good =
json.isMember(jss::result) &&
61 json[jss::result][jss::ledger][jss::ledger_index] == ledgerID;
62 if (!good || !checkDB)
65 auto const seq =
json[jss::result][jss::ledger_index].asUInt();
87 auto const& ledger =
json[jss::result][jss::ledger];
88 return outHash == ledger[jss::ledger_hash].asString() &&
90 outParentHash == ledger[jss::parent_hash].asString() &&
91 outDrops == ledger[jss::total_coins].asString() &&
92 outCloseTime == ledger[jss::close_time].asUInt() &&
93 outParentCloseTime == ledger[jss::parent_close_time].asUInt() &&
94 outCloseTimeResolution ==
95 ledger[jss::close_time_resolution].asUInt() &&
96 outCloseFlags == ledger[jss::close_flags].asUInt() &&
97 outAccountHash == ledger[jss::account_hash].asString() &&
98 outTxHash == ledger[jss::transaction_hash].asString();
104 return json.isMember(jss::result) &&
106 json[jss::result][jss::error_code] == error;
113 json.isMember(jss::result) &&
114 json[jss::result].isMember(jss::ledger) &&
115 json[jss::result][jss::ledger].isMember(jss::ledger_hash) &&
116 json[jss::result][jss::ledger][jss::ledger_hash].isString());
117 return json[jss::result][jss::ledger][jss::ledger_hash].asString();
123 const auto [actualRows, actualFirst, actualLast] =
125 ->getLedgerCountMinMax();
127 BEAST_EXPECT(actualRows == rows);
128 BEAST_EXPECT(actualFirst == first);
129 BEAST_EXPECT(actualLast == first + rows - 1);
151 using namespace std::chrono_literals;
157 BEAST_EXPECT(!store.getLastRotated());
162 auto ledger = env.
rpc(
"ledger",
"validated");
165 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
173 using namespace std::chrono_literals;
189 auto ledgerTmp = env.
rpc(
"ledger",
"0");
190 BEAST_EXPECT(
bad(ledgerTmp));
193 BEAST_EXPECT(
goodLedger(env, ledgers[1],
"1"));
196 BEAST_EXPECT(
goodLedger(env, ledgers[2],
"2"));
198 ledgerTmp = env.
rpc(
"ledger",
"current");
199 BEAST_EXPECT(
goodLedger(env, ledgerTmp,
"3"));
201 ledgerTmp = env.
rpc(
"ledger",
"4");
202 BEAST_EXPECT(
bad(ledgerTmp));
204 ledgerTmp = env.
rpc(
"ledger",
"100");
205 BEAST_EXPECT(
bad(ledgerTmp));
208 auto lastRotated = firstSeq - 1;
215 ledgerTmp = env.
rpc(
"ledger",
"current");
218 BEAST_EXPECT(store.getLastRotated() == lastRotated);
237 auto ledger = env.
rpc(
"ledger",
"current");
245 lastRotated = store.getLastRotated();
246 BEAST_EXPECT(lastRotated == 11);
254 for (
auto i = lastRotated - 1; i < lastRotated +
deleteInterval - 1;
259 ledgerTmp = env.
rpc(
"ledger",
"current");
265 store.getLastRotated() == lastRotated ||
274 BEAST_EXPECT(store.getLastRotated() ==
deleteInterval + lastRotated);
284 testcase(
"automatic online_delete");
286 using namespace std::chrono_literals;
292 auto lastRotated = ledgerSeq - 1;
293 BEAST_EXPECT(store.getLastRotated() == lastRotated);
294 BEAST_EXPECT(lastRotated != 2);
298 auto const canDelete = env.
rpc(
"can_delete");
306 auto ledger = env.
rpc(
"ledger",
"validated");
316 BEAST_EXPECT(lastRotated == store.getLastRotated());
322 auto ledger = env.
rpc(
"ledger",
"validated");
329 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
330 BEAST_EXPECT(lastRotated != store.getLastRotated());
332 lastRotated = store.getLastRotated();
339 auto ledger = env.
rpc(
"ledger",
"validated");
347 BEAST_EXPECT(lastRotated != store.getLastRotated());
353 testcase(
"online_delete with advisory_delete");
355 using namespace std::chrono_literals;
362 auto lastRotated = ledgerSeq - 1;
363 BEAST_EXPECT(store.getLastRotated() == lastRotated);
364 BEAST_EXPECT(lastRotated != 2);
366 auto canDelete = env.
rpc(
"can_delete");
368 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == 0);
370 canDelete = env.
rpc(
"can_delete",
"never");
372 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == 0);
375 for (; ledgerSeq < firstBatch; ++ledgerSeq)
379 auto ledger = env.
rpc(
"ledger",
"validated");
387 BEAST_EXPECT(lastRotated == store.getLastRotated());
394 canDelete[jss::result][jss::can_delete] ==
400 BEAST_EXPECT(store.getLastRotated() == lastRotated);
406 auto ledger = env.
rpc(
"ledger",
"validated");
413 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
415 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
416 lastRotated = ledgerSeq - 1;
423 auto ledger = env.
rpc(
"ledger",
"validated");
430 BEAST_EXPECT(store.getLastRotated() == lastRotated);
436 auto ledger = env.
rpc(
"ledger",
"validated");
443 ledgerCheck(env, ledgerSeq - firstBatch, firstBatch);
445 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
446 lastRotated = ledgerSeq - 1;
449 canDelete = env.
rpc(
"can_delete",
"always");
452 canDelete[jss::result][jss::can_delete] ==
460 auto ledger = env.
rpc(
"ledger",
"validated");
467 BEAST_EXPECT(store.getLastRotated() == lastRotated);
473 auto ledger = env.
rpc(
"ledger",
"validated");
480 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
482 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
483 lastRotated = ledgerSeq - 1;
486 canDelete = env.
rpc(
"can_delete",
"now");
488 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == ledgerSeq - 1);
495 auto ledger = env.
rpc(
"ledger",
"validated");
502 BEAST_EXPECT(store.getLastRotated() == lastRotated);
508 auto ledger = env.
rpc(
"ledger",
"validated");
515 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
517 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
518 lastRotated = ledgerSeq - 1;
testcase_t testcase
Memberspace for declaring test cases.
virtual SHAMapStore & getSHAMapStore()=0
virtual RelationalDatabase & getRelationalDatabase()=0
virtual std::optional< LedgerInfo > getLedgerInfoByIndex(LedgerIndex ledgerSeq)=0
getLedgerInfoByIndex Returns a ledger by its sequence.
class to create database, launch online delete thread, and related SQLite database
virtual void rendezvous() const =0
virtual std::size_t getAccountTransactionCount()=0
getAccountTransactionCount Returns the number of account transactions.
virtual std::size_t getTransactionCount()=0
getTransactionCount Returns the number of transactions.
void ledgerCheck(jtx::Env &env, int const rows, int const first)
std::string getHash(Json::Value const &json)
static auto advisoryDelete(std::unique_ptr< Config > cfg)
int waitForReady(jtx::Env &env)
bool bad(Json::Value const &json, error_code_i error=rpcLGR_NOT_FOUND)
void run() override
Runs the suite.
void accountTransactionCheck(jtx::Env &env, int const rows)
static auto onlineDelete(std::unique_ptr< Config > cfg)
void transactionCheck(jtx::Env &env, int const rows)
static auto const deleteInterval
bool goodLedger(jtx::Env &env, Json::Value const &json, std::string ledgerID, bool checkDB=false)
A transaction testing environment.
bool close(NetClock::time_point closeTime, std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)
Close and advance the ledger.
Json::Value rpc(unsigned apiVersion, std::unordered_map< std::string, std::string > const &headers, std::string const &cmd, Args &&... args)
Execute an RPC command.
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
bool contains_error(Json::Value const &json)
Returns true if the json contains an rpc error specification.
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
XRP_t const XRP
Converts to XRP Issue or STAmount.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::string to_string(base_uint< Bits, Tag > const &a)
static std::string nodeDatabase()
Set the sequence number on a JTx.
T time_since_epoch(T... args)