rippled
Loading...
Searching...
No Matches
Env.h
1#ifndef XRPL_TEST_JTX_ENV_H_INCLUDED
2#define XRPL_TEST_JTX_ENV_H_INCLUDED
3
4#include <test/jtx/AbstractClient.h>
5#include <test/jtx/Account.h>
6#include <test/jtx/JTx.h>
7#include <test/jtx/ManualTimeKeeper.h>
8#include <test/jtx/amount.h>
9#include <test/jtx/envconfig.h>
10#include <test/jtx/require.h>
11#include <test/jtx/tags.h>
12#include <test/jtx/vault.h>
13#include <test/unit_test/SuiteJournal.h>
14
15#include <xrpld/app/ledger/Ledger.h>
16#include <xrpld/app/ledger/OpenLedger.h>
17#include <xrpld/app/main/Application.h>
18#include <xrpld/app/paths/Pathfinder.h>
19#include <xrpld/core/Config.h>
20
21#include <xrpl/basics/Log.h>
22#include <xrpl/basics/chrono.h>
23#include <xrpl/beast/utility/Journal.h>
24#include <xrpl/json/json_value.h>
25#include <xrpl/json/to_string.h>
26#include <xrpl/protocol/ApiVersion.h>
27#include <xrpl/protocol/Feature.h>
28#include <xrpl/protocol/Indexes.h>
29#include <xrpl/protocol/Issue.h>
30#include <xrpl/protocol/STAmount.h>
31#include <xrpl/protocol/STObject.h>
32#include <xrpl/protocol/STTx.h>
33
34#include <functional>
35#include <string>
36#include <tuple>
37#include <type_traits>
38#include <unordered_map>
39#include <utility>
40#include <vector>
41
42namespace xrpl {
43namespace test {
44namespace jtx {
45
47template <class... Args>
48std::array<Account, 1 + sizeof...(Args)>
49noripple(Account const& account, Args const&... args)
50{
51 return {{account, args...}};
52}
53
54inline FeatureBitset
56{
57 static FeatureBitset const ids = [] {
58 auto const& sa = allAmendments();
60 feats.reserve(sa.size());
61 for (auto const& [s, vote] : sa)
62 {
63 (void)vote;
64 if (auto const f = getRegisteredFeature(s))
65 feats.push_back(*f);
66 else
67 Throw<std::runtime_error>(
68 "Unknown feature: " + s + " in allAmendments.");
69 }
70 return FeatureBitset(feats);
71 }();
72 return ids;
73}
74
75//------------------------------------------------------------------------------
76
77class SuiteLogs : public Logs
78{
80
81public:
83 : Logs(beast::severities::kError), suite_(suite)
84 {
85 }
86
87 ~SuiteLogs() override = default;
88
91 std::string const& partition,
93 {
95 }
96};
97
98//------------------------------------------------------------------------------
99
101class Env
102{
103public:
105
107
110 {
112 // RPC errors tend to return either a "code" and a "message" (sometimes
113 // with an "error" that corresponds to the "code"), or with an "error"
114 // and an "exception". However, this structure allows all possible
115 // combinations.
120 };
121
122private:
139
141
142public:
144
145 Env() = delete;
146 Env&
147 operator=(Env const&) = delete;
148 Env(Env const&) = delete;
149
164 // VFALCO Could wrap the suite::log in a Journal here
167 FeatureBitset features,
168 std::unique_ptr<Logs> logs = nullptr,
170 : test(suite_)
171 , bundle_(suite_, std::move(config), std::move(logs), thresh)
172 , journal{bundle_.app->journal("Env")}
173 {
177 features, [&appFeats = app().config().features](uint256 const& f) {
178 appFeats.insert(f);
179 });
180 }
181
196 FeatureBitset features,
197 std::unique_ptr<Logs> logs = nullptr)
198 : Env(suite_, envconfig(), features, std::move(logs))
199 {
200 }
201
216 std::unique_ptr<Logs> logs = nullptr,
218 : Env(suite_,
219 std::move(config),
221 std::move(logs),
222 thresh)
223 {
224 }
225
237 : Env(suite_, envconfig(), nullptr, thresh)
238 {
239 }
240
241 virtual ~Env() = default;
242
245 {
246 return *bundle_.app;
247 }
248
249 Application const&
250 app() const
251 {
252 return *bundle_.app;
253 }
254
257 {
258 return *bundle_.timeKeeper;
259 }
260
268 {
269 return timeKeeper().now();
270 }
271
275 {
276 return *bundle_.client;
277 }
278
284 template <class... Args>
286 rpc(unsigned apiVersion,
288 std::string const& cmd,
289 Args&&... args);
290
291 template <class... Args>
293 rpc(unsigned apiVersion, std::string const& cmd, Args&&... args);
294
295 template <class... Args>
298 std::string const& cmd,
299 Args&&... args);
300
301 template <class... Args>
303 rpc(std::string const& cmd, Args&&... args);
304
314 current() const
315 {
316 return app().openLedger().current();
317 }
318
327 closed();
328
348 bool
349 close(
350 NetClock::time_point closeTime,
352
360 template <class Rep, class Period>
361 bool
363 {
364 // VFALCO Is this the correct time?
365 return close(now() + elapsed);
366 }
367
375 bool
377 {
378 // VFALCO Is this the correct time?
379 return close(std::chrono::seconds(5));
380 }
381
385 void
386 trace(int howMany = -1)
387 {
388 trace_ = howMany;
389 }
390
392 void
394 {
395 trace_ = 0;
396 }
397
398 void
403
405 void
407 {
408 app().checkSigs(false);
409 }
410
411 // set rpc retries
412 void
413 set_retries(unsigned r = 5)
414 {
415 retries_ = r;
416 }
417
418 // get rpc retries
419 unsigned
420 retries() const
421 {
422 return retries_;
423 }
424
426 void
427 memoize(Account const& account);
428
431 Account const&
432 lookup(AccountID const& id) const;
433
434 Account const&
435 lookup(std::string const& base58ID) const;
442 balance(Account const& account) const;
443
449 seq(Account const& account) const;
450
454 // VFALCO NOTE This should return a unit-less amount
456 balance(Account const& account, Asset const& asset) const;
457
459 balance(Account const& account, Issue const& issue) const;
460
462 balance(Account const& account, MPTIssue const& mptIssue) const;
463
468 limit(Account const& account, Issue const& issue) const;
469
474 ownerCount(Account const& account) const;
475
480 le(Account const& account) const;
481
486 le(Keylet const& k) const;
487
489 template <class JsonValue, class... FN>
490 JTx
491 jt(JsonValue&& jv, FN const&... fN)
492 {
494 invoke(jt, fN...);
495 autofill(jt);
496 jt.stx = st(jt);
497 return jt;
498 }
499
501 template <class JsonValue, class... FN>
502 JTx
503 jtnofill(JsonValue&& jv, FN const&... fN)
504 {
506 invoke(jt, fN...);
508 jt.stx = st(jt);
509 return jt;
510 }
511
515 template <class JsonValue, class... FN>
517 json(JsonValue&& jv, FN const&... fN)
518 {
519 auto tj = jt(std::forward<JsonValue>(jv), fN...);
520 return std::move(tj.jv);
521 }
522
528 template <class... Args>
529 void
530 require(Args const&... args)
531 {
532 jtx::required(args...)(*this);
533 }
534
537 static ParsedResult
538 parseResult(Json::Value const& jr);
539
543 virtual void
544 submit(JTx const& jt);
545
549 void
551
555 void
557 JTx const& jt,
558 ParsedResult const& parsed,
559 Json::Value const& jr = Json::Value());
560
563 template <class JsonValue, class... FN>
564 Env&
565 apply(JsonValue&& jv, FN const&... fN)
566 {
567 submit(jt(std::forward<JsonValue>(jv), fN...));
568 return *this;
569 }
570
571 template <class JsonValue, class... FN>
572 Env&
573 operator()(JsonValue&& jv, FN const&... fN)
574 {
575 return apply(std::forward<JsonValue>(jv), fN...);
576 }
580 TER
581 ter() const
582 {
583 return ter_;
584 }
585
598 meta();
599
612 tx() const;
613
614 void
615 enableFeature(uint256 const feature);
616
617 void
618 disableFeature(uint256 const feature);
619
620 bool
621 enabled(uint256 feature) const
622 {
623 return current()->rules().enabled(feature);
624 }
625
626private:
627 void
628 fund(bool setDefaultRipple, STAmount const& amount, Account const& account);
629
630 void
631 fund_arg(STAmount const& amount, Account const& account)
632 {
633 fund(true, amount, account);
634 }
635
636 template <std::size_t N>
637 void
639 {
640 for (auto const& account : list)
641 fund(false, amount, account);
642 }
643
644public:
671 template <class Arg, class... Args>
672 void
673 fund(STAmount const& amount, Arg const& arg, Args const&... args)
674 {
675 fund_arg(amount, arg);
676 if constexpr (sizeof...(args) > 0)
677 fund(amount, args...);
678 }
679
698 void
699 trust(STAmount const& amount, Account const& account);
700
701 template <class... Accounts>
702 void
704 STAmount const& amount,
705 Account const& to0,
706 Account const& to1,
707 Accounts const&... toN)
708 {
709 trust(amount, to0);
710 trust(amount, to1, toN...);
711 }
719 ust(JTx const& jt);
720
721protected:
722 int trace_ = 0;
727 unsigned retries_ = 5;
728
730 do_rpc(
731 unsigned apiVersion,
732 std::vector<std::string> const& args,
734
735 void
737
738 virtual void
739 autofill(JTx& jt);
740
749 st(JTx const& jt);
750
751 // Invoke funclets on stx
752 // Note: The STTx may not be modified
753 template <class... FN>
754 void
755 invoke(STTx& stx, FN const&... fN)
756 {
757 (fN(*this, stx), ...);
758 }
759
760 // Invoke funclets on jt
761 template <class... FN>
762 void
763 invoke(JTx& jt, FN const&... fN)
764 {
765 (fN(*this, jt), ...);
766 }
767
768 // Map of account IDs to Account
770};
771
772template <class... Args>
775 unsigned apiVersion,
777 std::string const& cmd,
778 Args&&... args)
779{
780 return do_rpc(
781 apiVersion,
783 headers);
784}
785
786template <class... Args>
788Env::rpc(unsigned apiVersion, std::string const& cmd, Args&&... args)
789{
790 return rpc(
791 apiVersion,
793 cmd,
794 std::forward<Args>(args)...);
795}
796
797template <class... Args>
801 std::string const& cmd,
802 Args&&... args)
803{
804 return do_rpc(
807 headers);
808}
809
810template <class... Args>
812Env::rpc(std::string const& cmd, Args&&... args)
813{
814 return rpc(
816 cmd,
817 std::forward<Args>(args)...);
818}
819
820} // namespace jtx
821} // namespace test
822} // namespace xrpl
823
824#endif
Represents a JSON value.
Definition json_value.h:131
A generic endpoint for log messages.
Definition Journal.h:41
A testsuite class.
Definition suite.h:52
virtual bool checkSigs() const =0
virtual OpenLedger & openLedger()=0
A currency issued by an account.
Definition Issue.h:14
Manages partitions for logging.
Definition Log.h:33
beast::severities::Severity threshold() const
Definition Log.cpp:147
std::shared_ptr< OpenView const > current() const
Returns a view to the current open ledger.
static void initPathTable()
time_point now() const override
Returns the current time.
Immutable cryptographic account descriptor.
Definition Account.h:20
static Account const master
The master account.
Definition Account.h:29
A transaction testing environment.
Definition Env.h:102
Application & app()
Definition Env.h:244
bool close(std::chrono::duration< Rep, Period > const &elapsed)
Close and advance the ledger.
Definition Env.h:362
void notrace()
Turn off JSON tracing.
Definition Env.h:393
static ParsedResult parseResult(Json::Value const &jr)
Gets the TER result and didApply flag from a RPC Json result object.
Definition Env.cpp:320
std::shared_ptr< STTx const > st(JTx const &jt)
Create a STTx from a JTx The framework requires that JSON is valid.
Definition Env.cpp:584
TER ter() const
Return the TER for the last JTx.
Definition Env.h:581
void invoke(JTx &jt, FN const &... fN)
Definition Env.h:763
Env(beast::unit_test::suite &suite_, std::unique_ptr< Config > config, FeatureBitset features, std::unique_ptr< Logs > logs=nullptr, beast::severities::Severity thresh=beast::severities::kError)
Create Env using suite, Config pointer, and explicit features.
Definition Env.h:165
Env(beast::unit_test::suite &suite_, beast::severities::Severity thresh=beast::severities::kError)
Create Env with only the current test suite.
Definition Env.h:235
Env(Env const &)=delete
void fund(STAmount const &amount, Arg const &arg, Args const &... args)
Create a new account with some XRP.
Definition Env.h:673
void fund_arg(STAmount const &amount, std::array< Account, N > const &list)
Definition Env.h:638
Env(beast::unit_test::suite &suite_, std::unique_ptr< Config > config, std::unique_ptr< Logs > logs=nullptr, beast::severities::Severity thresh=beast::severities::kError)
Create Env using suite and Config pointer.
Definition Env.h:214
std::uint32_t ownerCount(Account const &account) const
Return the number of objects owned by an account.
Definition Env.cpp:242
void set_parse_failure_expected(bool b)
Definition Env.h:399
void autofill_sig(JTx &jt)
Definition Env.cpp:516
void sign_and_submit(JTx const &jt, Json::Value params=Json::nullValue)
Use the submit RPC command with a provided JTx object.
Definition Env.cpp:388
AppBundle bundle_
Definition Env.h:140
std::shared_ptr< ReadView const > closed()
Returns the last closed ledger.
Definition Env.cpp:98
std::shared_ptr< SLE const > le(Account const &account) const
Return an account root.
Definition Env.cpp:260
Account const & lookup(AccountID const &id) const
Returns the Account given the AccountID.
Definition Env.cpp:145
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
Definition Env.cpp:272
void disable_sigs()
Turn off signature checks.
Definition Env.h:406
void enableFeature(uint256 const feature)
Definition Env.cpp:659
virtual void submit(JTx const &jt)
Submit an existing JTx.
Definition Env.cpp:358
PrettyAmount limit(Account const &account, Issue const &issue) const
Returns the IOU limit on an account.
Definition Env.cpp:230
void disableFeature(uint256 const feature)
Definition Env.cpp:667
void postconditions(JTx const &jt, ParsedResult const &parsed, Json::Value const &jr=Json::Value())
Check expected postconditions of JTx submission.
Definition Env.cpp:426
void set_retries(unsigned r=5)
Definition Env.h:413
Env & operator()(JsonValue &&jv, FN const &... fN)
Definition Env.h:573
bool close()
Close and advance the ledger.
Definition Env.h:376
Account const & master
Definition Env.h:106
Application const & app() const
Definition Env.h:250
Json::Value do_rpc(unsigned apiVersion, std::vector< std::string > const &args, std::unordered_map< std::string, std::string > const &headers={})
Definition Env.cpp:636
JTx jt(JsonValue &&jv, FN const &... fN)
Create a JTx from parameters.
Definition Env.h:491
virtual ~Env()=default
void fund_arg(STAmount const &amount, Account const &account)
Definition Env.h:631
unsigned retries_
Definition Env.h:727
Env & apply(JsonValue &&jv, FN const &... fN)
Apply funclets and submit.
Definition Env.h:565
void trust(STAmount const &amount, Account const &to0, Account const &to1, Accounts const &... toN)
Definition Env.h:703
uint256 txid_
Definition Env.h:724
unsigned retries() const
Definition Env.h:420
Json::Value json(JsonValue &&jv, FN const &... fN)
Create JSON from parameters.
Definition Env.h:517
beast::unit_test::suite & test
Definition Env.h:104
void trust(STAmount const &amount, Account const &account)
Establish trust lines.
Definition Env.cpp:303
Json::Value rpc(unsigned apiVersion, std::unordered_map< std::string, std::string > const &headers, std::string const &cmd, Args &&... args)
Execute an RPC command.
Definition Env.h:774
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...
Definition Env.cpp:610
std::shared_ptr< STObject const > meta()
Return metadata for the last JTx.
Definition Env.cpp:488
JTx jtnofill(JsonValue &&jv, FN const &... fN)
Create a JTx from parameters.
Definition Env.h:503
void invoke(STTx &stx, FN const &... fN)
Definition Env.h:755
std::unordered_map< AccountID, Account > map_
Definition Env.h:769
Env(beast::unit_test::suite &suite_, FeatureBitset features, std::unique_ptr< Logs > logs=nullptr)
Create Env with default config and specified features.
Definition Env.h:195
TestStopwatch stopwatch_
Definition Env.h:723
ManualTimeKeeper & timeKeeper()
Definition Env.h:256
bool parseFailureExpected_
Definition Env.h:726
std::shared_ptr< STTx const > tx() const
Return the tx data for the last JTx.
Definition Env.cpp:510
bool enabled(uint256 feature) const
Definition Env.h:621
Env & operator=(Env const &)=delete
void memoize(Account const &account)
Associate AccountID with account.
Definition Env.cpp:139
beast::Journal const journal
Definition Env.h:143
AbstractClient & client()
Returns the connected client.
Definition Env.h:274
void require(Args const &... args)
Check a set of requirements.
Definition Env.h:530
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
Definition Env.h:314
NetClock::time_point now()
Returns the current network time.
Definition Env.h:267
void trace(int howMany=-1)
Turn on JSON tracing.
Definition Env.h:386
~SuiteLogs() override=default
SuiteLogs(beast::unit_test::suite &suite)
Definition Env.h:82
beast::unit_test::suite & suite_
Definition Env.h:79
std::unique_ptr< beast::Journal::Sink > makeSink(std::string const &partition, beast::severities::Severity threshold) override
Definition Env.h:90
A balance matches.
Definition balance.h:20
Set the expected result code for a JTx The test will fail if the code doesn't match.
Definition rpc.h:16
Set the expected result code for a JTx The test will fail if the code doesn't match.
Definition ter.h:16
T is_same_v
@ nullValue
'null' value
Definition json_value.h:20
Severity
Severity level / threshold of a Journal message.
Definition Journal.h:13
STL namespace.
static constexpr auto apiCommandLineVersion
Definition ApiVersion.h:45
require_t required(Args const &... args)
Compose many condition functors into one.
Definition require.h:30
static autofill_t const autofill
Definition tags.h:23
FeatureBitset testable_amendments()
Definition Env.h:55
auto const amount
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
Definition envconfig.h:35
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
void foreachFeature(FeatureBitset bs, F &&f)
Definition Feature.h:336
std::map< std::string, AmendmentSupport > const & allAmendments()
All amendments libxrpl knows about.
Definition Feature.cpp:332
std::optional< uint256 > getRegisteredFeature(std::string const &name)
Definition Feature.cpp:363
@ tesSUCCESS
Definition TER.h:226
T push_back(T... args)
T reserve(T... args)
A pair of SHAMap key and LedgerEntryType.
Definition Keylet.h:20
ManualTimeKeeper * timeKeeper
Definition Env.h:127
std::unique_ptr< AbstractClient > client
Definition Env.h:129
std::unique_ptr< Application > owned
Definition Env.h:126
Used by parseResult() and postConditions()
Definition Env.h:110
std::optional< error_code_i > rpcCode
Definition Env.h:116
Execution context for applying a JSON transaction.
Definition JTx.h:26
std::shared_ptr< STTx const > stx
Definition JTx.h:37
Represents an XRP or IOU quantity This customizes the string conversion and supports XRP conversions ...
Set the sequence number on a JTx.
Definition seq.h:15