20#ifndef RIPPLE_TEST_JTX_TESTHELPERS_H_INCLUDED
21#define RIPPLE_TEST_JTX_TESTHELPERS_H_INCLUDED
23#include <test/jtx/Env.h>
25#include <xrpl/basics/base_uint.h>
26#include <xrpl/beast/unit_test/suite.h>
27#include <xrpl/json/json_value.h>
28#include <xrpl/protocol/AccountID.h>
29#include <xrpl/protocol/Quality.h>
30#include <xrpl/protocol/TxFlags.h>
31#include <xrpl/protocol/jss.h>
35#if (defined(__clang_major__) && __clang_major__ < 15)
36#include <experimental/source_location>
39#include <source_location>
40using std::source_location;
51template <
typename Input>
54 requires requires(Input& v) {
81template <
typename...
IOU>
87 for (
auto const& line : jrr[jss::lines])
89 for (
auto const& iou : {ious...})
91 if (line[jss::currency].asString() ==
to_string(iou.currency))
94 v[jss::currency] = line[jss::currency];
95 v[jss::balance] = line[jss::balance];
96 v[jss::limit] = line[jss::limit];
97 v[jss::account] = line[jss::account];
129template <
class T,
class... Args>
134 if constexpr (
sizeof...(args) > 0)
138template <
class... Args>
143 if constexpr (
sizeof...(args) > 0)
154template <
class... Args>
163template <
class... Args>
172 for (
auto const& p : st2)
193 bool defaultLimits =
false);
195template <
typename... Amts>
203 return expectLine(env, account, value,
false) &&
245 return escrow(account.id(), to.
id(), amount);
267 {0xA0, 0x25, 0x80, 0x20, 0xE3, 0xB0, 0xC4, 0x42, 0x98, 0xFC,
268 0x1C, 0x14, 0x9A, 0xFB, 0xF4, 0xC8, 0x99, 0x6F, 0xB9, 0x24,
269 0x27, 0xAE, 0x41, 0xE4, 0x64, 0x9B, 0x93, 0x4C, 0xA4, 0x95,
270 0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55, 0x81, 0x01, 0x00}};
330 jt.
jv[sfCondition.jsonName] =
value_;
353 jt.
jv[sfFulfillment.jsonName] =
value_;
381 account.id(), to.
id(), amount, settleDelay, pk, cancelAfter, dstTag);
409 return channel(account.id(), dst.
id(), seqProxyValue);
448 requires std::is_same_v<A, AccountID>
453 jv[sfAccount.jsonName] =
to_string(account);
455 jv[sfDestination.jsonName] =
to_string(dest);
456 jv[sfTransactionType.jsonName] = jss::CheckCreate;
467 return create(account.id(), dest.
id(), sendMax);
475template <
class Suite>
486 source_location
const location = source_location::current())
488 int line = location.line();
489 char const* file = location.file_name();
490 FeeLevel64 const expectedMin{expectedMinFeeLevel};
491 FeeLevel64 const expectedMed{expectedMedFeeLevel};
493 using namespace std::string_literals;
504 metrics.txCount == expectedCount
512 metrics.txQMaxSize == expectedMaxCount
515 "txQMaxSize: "s +
std::to_string(metrics.txQMaxSize.value_or(0)) +
520 metrics.txInLedger == expectedInLedger
528 metrics.txPerLedger == expectedPerLedger
536 metrics.minProcessingFeeLevel == expectedMin
539 "minProcessingFeeLevel: "s +
545 metrics.medFeeLevel == expectedMed
553 auto const expectedCurFeeLevel = expectedInLedger > expectedPerLedger
554 ? expectedMed * expectedInLedger * expectedInLedger /
555 (expectedPerLedger * expectedPerLedger)
556 : metrics.referenceFeeLevel;
558 metrics.openLedgerFeeLevel == expectedCurFeeLevel
561 "openLedgerFeeLevel: "s +
Value & append(Value const &value)
Append value to array at the end.
bool isNull() const
isNull() tests to see if this field is null.
A currency issued by an account.
Json::Value getJson(JsonOptions=JsonOptions::none) const override
std::vector< STPath >::const_iterator end() const
void push_back(STPath const &e)
std::vector< STPath >::const_iterator begin() const
std::vector< STPath >::size_type size() const
An immutable linear range of bytes.
Metrics getMetrics(OpenView const &view) const
Returns fee metrics in reference fee level units.
constexpr value_type value() const
Returns the underlying value.
constexpr value_type fee() const
Returns the number of drops.
Immutable cryptographic account descriptor.
AccountID id() const
Returns the Account ID.
A transaction testing environment.
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
Converts to IOU Issue or STAmount.
Json::Value create(A const &account, A const &dest, STAmount const &sendMax)
Create a check.
static constexpr FeeLevel64 minEscalationFeeLevel
bool checkArraySize(Json::Value const &val, unsigned int size)
std::uint32_t ownerCount(Env const &env, Account const &account)
Json::Value ledgerEntryRoot(Env &env, Account const &acct)
auto make_vector(Input const &input)
Json::Value escrow(AccountID const &account, AccountID const &to, STAmount const &amount)
bool expectOffers(Env &env, AccountID const &account, std::uint16_t size, std::vector< Amounts > const &toMatch)
STAmount channelBalance(ReadView const &view, uint256 const &chan)
uint256 channel(AccountID const &account, AccountID const &dst, std::uint32_t seqProxyValue)
PrettyAmount xrpMinusFee(Env const &env, std::int64_t xrpAmount)
bool expectLine(Env &env, AccountID const &account, STAmount const &value, bool defaultLimits)
bool equal(STAmount const &sa1, STAmount const &sa2)
Json::Value getAccountLines(Env &env, AccountID const &acctId)
bool same(STPathSet const &st1, Args const &... args)
Json::Value ledgerEntryState(Env &env, Account const &acct_a, Account const &acct_b, std::string const ¤cy)
std::array< std::uint8_t, 4 > const fb1
void stpath_append_one(STPath &st, Account const &account)
void fund(jtx::Env &env, jtx::Account const &gw, std::vector< jtx::Account > const &accounts, std::vector< STAmount > const &amts, Fund how)
void stpath_append(STPath &st, T const &t, Args const &... args)
void n_offers(Env &env, std::size_t n, Account const &account, STAmount const &in, STAmount const &out)
Json::Value accountBalance(Env &env, Account const &acct)
Json::Value cancel(AccountID const &account, Account const &from, std::uint32_t seq)
STPathElement IPE(Issue const &iss)
void checkMetrics(Suite &test, jtx::Env &env, std::size_t expectedCount, std::optional< std::size_t > expectedMaxCount, std::size_t expectedInLedger, std::size_t expectedPerLedger, std::uint64_t expectedMinFeeLevel=baseFeeLevel.fee(), std::uint64_t expectedMedFeeLevel=minEscalationFeeLevel.fee(), source_location const location=source_location::current())
Json::Value claim(AccountID const &account, uint256 const &channel, std::optional< STAmount > const &balance, std::optional< STAmount > const &amount, std::optional< Slice > const &signature, std::optional< PublicKey > const &pk)
Json::Value finish(AccountID const &account, AccountID const &from, std::uint32_t seq)
std::array< std::uint8_t, 39 > constexpr cb1
static constexpr FeeLevel64 baseFeeLevel
Json::Value create(AccountID const &account, AccountID const &to, STAmount const &amount, NetClock::duration const &settleDelay, PublicKey const &pk, std::optional< NetClock::time_point > const &cancelAfter, std::optional< std::uint32_t > const &dstTag)
void stpathset_append(STPathSet &st, STPath const &p, Args const &... args)
STPathElement cpe(Currency const &c)
bool expectLedgerEntryRoot(Env &env, Account const &acct, STAmount const &expectedValue)
STPathElement allpe(AccountID const &a, Issue const &iss)
bool channelExists(ReadView const &view, uint256 const &chan)
XRPAmount txfee(Env const &env, std::uint16_t n)
STPath stpath(Args const &... args)
Json::Value getAccountOffers(Env &env, AccountID const &acct, bool current)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
@ current
This was a new validation and was added.
std::string strHex(FwdIt begin, FwdIt end)
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
std::string to_string(base_uint< Bits, Tag > const &a)
FeeLevel64 referenceFeeLevel
Reference transaction fee level.
Execution context for applying a JSON transaction.
Represents an XRP or IOU quantity This customizes the string conversion and supports XRP conversions ...
Set the "CancelAfter" time tag on a JTx.
NetClock::time_point value_
cancel_time(NetClock::time_point const &value)
void operator()(jtx::Env &, jtx::JTx &jt) const
void operator()(Env &, JTx &jt) const
condition(Slice const &cond)
condition(std::array< std::uint8_t, N > const &c)
Set the "FinishAfter" time tag on a JTx.
finish_time(NetClock::time_point const &value)
void operator()(Env &, JTx &jt) const
NetClock::time_point value_
fulfillment(Slice condition)
fulfillment(std::array< std::uint8_t, N > f)
void operator()(Env &, JTx &jt) const
Set the sequence number on a JTx.
T time_since_epoch(T... args)