3#include <test/jtx/AbstractClient.h>
4#include <test/jtx/Account.h>
5#include <test/jtx/JTx.h>
6#include <test/jtx/ManualTimeKeeper.h>
7#include <test/jtx/amount.h>
8#include <test/jtx/envconfig.h>
9#include <test/jtx/require.h>
10#include <test/jtx/vault.h>
11#include <test/unit_test/SuiteJournal.h>
13#include <xrpld/app/ledger/OpenLedger.h>
14#include <xrpld/app/main/Application.h>
15#include <xrpld/core/Config.h>
16#include <xrpld/rpc/detail/Pathfinder.h>
18#include <xrpl/basics/Log.h>
19#include <xrpl/basics/base_uint.h>
20#include <xrpl/basics/chrono.h>
21#include <xrpl/basics/contract.h>
22#include <xrpl/beast/unit_test/suite.h>
23#include <xrpl/beast/utility/Journal.h>
24#include <xrpl/beast/utility/instrumentation.h>
25#include <xrpl/json/json_value.h>
26#include <xrpl/ledger/OpenView.h>
27#include <xrpl/ledger/ReadView.h>
28#include <xrpl/protocol/AccountID.h>
29#include <xrpl/protocol/ApiVersion.h>
30#include <xrpl/protocol/Asset.h>
31#include <xrpl/protocol/ErrorCodes.h>
32#include <xrpl/protocol/Feature.h>
33#include <xrpl/protocol/Issue.h>
34#include <xrpl/protocol/Keylet.h>
35#include <xrpl/protocol/STAmount.h>
36#include <xrpl/protocol/STObject.h>
37#include <xrpl/protocol/STTx.h>
38#include <xrpl/protocol/TER.h>
48#include <source_location>
84template <
class... Args>
88 return {{account, args...}};
98 for (
auto const& [s, vote] : sa)
126 for (
auto const& f : features)
128 auto const n = result.
size();
347 template <
class... Args>
349 rpc(
unsigned apiVersion,
354 template <
class... Args>
358 template <
class... Args>
364 template <
class... Args>
426 template <
class Rep,
class Period>
482 app().getNumberOfThreads() == 1,
483 "syncClose() is only useful on an application with a single thread");
484 auto const result =
close();
517 app().getNumberOfThreads() == 1,
518 "disconnectClient() is only useful on an application with a single "
530 return reaped && toreDown;
572 self_.setParseFailureExpected(b);
618 [[nodiscard]]
unsigned
721 template <
class JsonValue,
class... FN>
723 jt(JsonValue&& jv, FN
const&... fN)
735 template <
class JsonValue,
class... FN>
750 template <
class JsonValue,
class... FN>
752 json(JsonValue&& jv, FN
const&... fN)
755 return std::move(tj.jv);
764 template <
class... Args>
801 ParsedResult
const& parsed,
809 template <
class... FN>
817 template <
class... FN>
825 template <
class... FN>
829 return apply(std::move(jv), fN...);
832 template <
class... FN>
836 return apply(std::move(jv), fN...);
888 return current()->rules().enabled(feature);
906 auto future = barrier->get_future();
907 boost::asio::post(
app().getIOContext(), [barrier]() { barrier->set_value(); });
908 return future.wait_for(timeout) == std::future_status::ready;
917 fund(
true, amount, account);
920 template <std::
size_t N>
924 for (
auto const& account : list)
925 fund(
false, amount, account);
956 template <
class Arg,
class... Args>
961 if constexpr (
sizeof...(args) > 0)
962 fund(amount, args...);
987 template <
class... Accounts>
992 trust(amount, to1, toN...);
1014 unsigned apiVersion,
1037 template <
class... FN>
1041 (fN(*
this, stx), ...);
1045 template <
class... FN>
1049 (fN(*
this,
jt), ...);
1056template <
class... Args>
1059 unsigned apiVersion,
1067template <
class... Args>
1078template <
class... Args>
1091template <
class... Args>
A generic endpoint for log messages.
virtual bool checkSigs() const =0
A currency issued by an account.
beast::Severity threshold() const
Logs(beast::Severity level)
std::chrono::time_point< NetClock > time_point
std::shared_ptr< OpenView const > current() const
Returns a view to the current open ledger.
static void initPathTable()
std::shared_ptr< STLedgerEntry const > const_pointer
virtual OpenLedger & getOpenLedger()=0
time_point now() const override
Returns the current time.
Immutable cryptographic account descriptor.
static Account const kMaster
The master account.
RAII class to set and restore the parse failure flag (setParseFailureExpected).
ParseFailureGuard & operator=(ParseFailureGuard const &)=delete
ParseFailureGuard & operator=(ParseFailureGuard &&)=delete
ParseFailureGuard(ParseFailureGuard &&other)=delete
ParseFailureGuard(ParseFailureGuard const &)=delete
ParseFailureGuard(Env &self, bool b)
A transaction testing environment.
bool close(std::chrono::duration< Rep, Period > const &elapsed)
Close and advance the ledger.
void notrace()
Turn off JSON tracing.
bool syncClose(std::chrono::steady_clock::duration timeout=std::chrono::seconds{1})
Close and advance the ledger, then synchronize with the server's io_context to ensure all async opera...
std::shared_ptr< STTx const > st(JTx const &jt)
Create a STTx from a JTx The framework requires that JSON is valid.
TER ter() const
Return the TER for the last JTx.
std::uint32_t sponsoringAccountCount(Account const &account) const
Return the number of sponsoring accounts owned by an account.
void invoke(JTx &jt, FN const &... fN)
void setRetries(unsigned r=5)
void disableSigs()
Turn off signature checks.
std::uint32_t sponsoringOwnerCount(Account const &account) const
Return the number of sponsoring objects owned by an account.
void fund(STAmount const &amount, Arg const &arg, Args const &... args)
Create a new account with some XRP.
Env(beast::unit_test::Suite &suite, FeatureBitset features, std::unique_ptr< Logs > logs=nullptr)
Create Env with default config and specified features.
Env(beast::unit_test::Suite &suite, beast::Severity thresh=beast::Severity::Error)
Create Env with only the current test suite.
Env(beast::unit_test::Suite &suite, std::unique_ptr< Config > config, std::unique_ptr< Logs > logs=nullptr, beast::Severity thresh=beast::Severity::Error)
Create Env using suite and Config pointer.
Env & operator()(WithSourceLocation< JTx > jv, FN const &... fN)
json::Value json(JsonValue &&jv, FN const &... fN)
Create JSON from parameters.
SLE::const_pointer le(Account const &account) const
Return an account root.
std::uint32_t ownerCount(Account const &account) const
Return the number of objects owned by an account.
bool enabled(UInt256 feature) const
void fundArg(STAmount const &amount, std::array< Account, N > const &list)
std::shared_ptr< ReadView const > closed()
Returns the last closed ledger.
static ParsedResult parseResult(json::Value const &jr)
Gets the TER result and didApply flag from a RPC Json result object.
Account const & lookup(AccountID const &id) const
Returns the Account given the AccountID.
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
virtual void submit(JTx const &jt, std::source_location const &loc=std::source_location::current())
Submit an existing JTx.
Env(beast::unit_test::Suite &suite, std::unique_ptr< Config > config, FeatureBitset features, std::unique_ptr< Logs > logs=nullptr, beast::Severity thresh=beast::Severity::Error)
Create Env using suite, Config pointer, and explicit features.
ParseFailureGuard getParseFailureGuard(bool b)
Gets an RAII guard to set and restore the parse failure flag.
Env & apply(WithSourceLocation< JTx > jv, FN const &... fN)
bool disconnectClient(std::chrono::steady_clock::duration timeout=std::chrono::seconds{1})
Disconnect the Env's built-in client and wait for the server to register the dropped connection.
PrettyAmount limit(Account const &account, Issue const &issue) const
Returns the IOU limit on an account.
json::Value doRpc(unsigned apiVersion, std::vector< std::string > const &args, std::unordered_map< std::string, std::string > const &headers={})
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
virtual void autofill(JTx &jt)
void postconditions(JTx const &jt, ParsedResult const &parsed, json::Value const &jr=json::Value(), std::source_location const &loc=std::source_location::current())
Check expected postconditions of JTx submission.
bool close()
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 setParseFailureExpected(bool b)
Application const & app() const
void autofillSig(JTx &jt)
void signAndSubmit(JTx const &jt, json::Value params=json::ValueType::Null, std::source_location const &loc=std::source_location::current())
Use the submit RPC command with a provided JTx object.
Env & operator()(WithSourceLocation< json::Value > jv, FN const &... fN)
JTx jt(JsonValue &&jv, FN const &... fN)
Create a JTx from parameters.
std::uint32_t sponsoredOwnerCount(Account const &account) const
Return the number of sponsored objects owned by an account.
PrettyAmount balance(Account const &account) const
Returns the XRP balance on an account.
beast::unit_test::Suite & test
void trust(STAmount const &amount, Account const &to0, Account const &to1, Accounts const &... toN)
void disableFeature(UInt256 const feature)
void trust(STAmount const &amount, Account const &account)
Establish trust lines.
void enableFeature(UInt256 const feature)
std::shared_ptr< STTx const > ust(JTx const &jt)
Create a STTx from a JTx without sanitizing Use to inject bogus values into test transactions by firs...
std::shared_ptr< STObject const > meta()
Return metadata for the last JTx.
Env & apply(WithSourceLocation< json::Value > jv, FN const &... fN)
Apply funclets and submit.
JTx jtnofill(JsonValue &&jv, FN const &... fN)
Create a JTx from parameters.
void invoke(STTx &stx, FN const &... fN)
std::unordered_map< AccountID, Account > map_
void fundArg(STAmount const &amount, Account const &account)
ManualTimeKeeper & timeKeeper()
bool parseFailureExpected_
std::shared_ptr< STTx const > tx() const
Return the tx data for the last JTx.
bool drainServerIo(std::chrono::steady_clock::duration timeout)
Drain the (single) server io_context thread once.
Env & operator=(Env const &)=delete
void memoize(Account const &account)
Associate AccountID with account.
beast::Journal const journal
AbstractClient & client()
Returns the connected client.
void require(Args const &... args)
Check a set of requirements.
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
NetClock::time_point now()
Returns the current network time.
void trace(int howMany=-1)
Turn on JSON tracing.
~SuiteLogs() override=default
beast::unit_test::Suite & suite_
SuiteLogs(beast::unit_test::Suite &suite)
std::unique_ptr< beast::Journal::Sink > makeSink(std::string const &partition, beast::Severity threshold) override
Severity
Severity level / threshold of a Journal message.
API version numbers used in later API versions.
static constexpr auto kApiCommandLineVersion
RequireT required(Args const &... args)
Compose many condition functors into one.
std::vector< FeatureBitset > amendmentCombinations(std::initializer_list< UInt256 > features, FeatureBitset seed)
Returns all 2^N permutations of a seed FeatureBitset with each subset of the given features excluded.
FeatureBitset testableAmendments()
std::array< Account, 1+sizeof...(Args)> noripple(Account const &account, Args const &... args)
Designate accounts as no-ripple in Env::fund.
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
std::optional< UInt256 > getRegisteredFeature(std::string const &name)
void foreachFeature(FeatureBitset bs, F &&f)
BaseUInt< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
std::map< std::string, AmendmentSupport > const & allAmendments()
All amendments libxrpl knows about.
TERSubset< CanCvtToTER > TER
beast::ManualClock< std::chrono::steady_clock > TestStopwatch
A manual Stopwatch for unit tests.
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)
A pair of SHAMap key and LedgerEntryType.
ManualTimeKeeper * timeKeeper
std::unique_ptr< AbstractClient > client
std::unique_ptr< Application > owned
Used by parseResult() and postConditions().
std::optional< ErrorCodeI > rpcCode
Execution context for applying a JSON transaction.
Represents an XRP, IOU, or MPT quantity This customizes the string conversion and supports XRP conver...
Wrapper that captures std::source_location when implicitly constructed.
WithSourceLocation(T v, std::source_location l=std::source_location::current())