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
719 template <
class JsonValue,
class... FN>
721 jt(JsonValue&& jv, FN
const&... fN)
733 template <
class JsonValue,
class... FN>
748 template <
class JsonValue,
class... FN>
750 json(JsonValue&& jv, FN
const&... fN)
753 return std::move(tj.jv);
762 template <
class... Args>
799 ParsedResult
const& parsed,
807 template <
class... FN>
815 template <
class... FN>
823 template <
class... FN>
827 return apply(std::move(jv), fN...);
830 template <
class... FN>
834 return apply(std::move(jv), fN...);
886 return current()->rules().enabled(feature);
904 auto future = barrier->get_future();
905 boost::asio::post(
app().getIOContext(), [barrier]() { barrier->set_value(); });
906 return future.wait_for(timeout) == std::future_status::ready;
915 fund(
true, amount, account);
918 template <std::
size_t N>
922 for (
auto const& account : list)
923 fund(
false, amount, account);
954 template <
class Arg,
class... Args>
959 if constexpr (
sizeof...(args) > 0)
960 fund(amount, args...);
985 template <
class... Accounts>
990 trust(amount, to1, toN...);
1012 unsigned apiVersion,
1035 template <
class... FN>
1039 (fN(*
this, stx), ...);
1043 template <
class... FN>
1047 (fN(*
this,
jt), ...);
1054template <
class... Args>
1057 unsigned apiVersion,
1065template <
class... Args>
1076template <
class... Args>
1089template <
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.
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.
void enableFeature(uint256 const feature)
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.
void disableFeature(uint256 const feature)
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 trust(STAmount const &amount, Account const &account)
Establish trust lines.
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 enabled(uint256 feature) const
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
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.
require_t required(Args const &... args)
Compose many condition functors into one.
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
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.
std::optional< uint256 > getRegisteredFeature(std::string const &name)
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())