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 ripple {
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
236 {
237 }
238
239 virtual ~Env() = default;
240
243 {
244 return *bundle_.app;
245 }
246
247 Application const&
248 app() const
249 {
250 return *bundle_.app;
251 }
252
255 {
256 return *bundle_.timeKeeper;
257 }
258
266 {
267 return timeKeeper().now();
268 }
269
273 {
274 return *bundle_.client;
275 }
276
282 template <class... Args>
284 rpc(unsigned apiVersion,
286 std::string const& cmd,
287 Args&&... args);
288
289 template <class... Args>
291 rpc(unsigned apiVersion, std::string const& cmd, Args&&... args);
292
293 template <class... Args>
296 std::string const& cmd,
297 Args&&... args);
298
299 template <class... Args>
301 rpc(std::string const& cmd, Args&&... args);
302
312 current() const
313 {
314 return app().openLedger().current();
315 }
316
325 closed();
326
346 bool
347 close(
348 NetClock::time_point closeTime,
350
358 template <class Rep, class Period>
359 bool
361 {
362 // VFALCO Is this the correct time?
363 return close(now() + elapsed);
364 }
365
373 bool
375 {
376 // VFALCO Is this the correct time?
377 return close(std::chrono::seconds(5));
378 }
379
383 void
384 trace(int howMany = -1)
385 {
386 trace_ = howMany;
387 }
388
390 void
392 {
393 trace_ = 0;
394 }
395
396 void
401
403 void
405 {
406 app().checkSigs(false);
407 }
408
409 // set rpc retries
410 void
411 set_retries(unsigned r = 5)
412 {
413 retries_ = r;
414 }
415
416 // get rpc retries
417 unsigned
418 retries() const
419 {
420 return retries_;
421 }
422
424 void
425 memoize(Account const& account);
426
429 Account const&
430 lookup(AccountID const& id) const;
431
432 Account const&
433 lookup(std::string const& base58ID) const;
440 balance(Account const& account) const;
441
447 seq(Account const& account) const;
448
452 // VFALCO NOTE This should return a unit-less amount
454 balance(Account const& account, Asset const& asset) const;
455
457 balance(Account const& account, Issue const& issue) const;
458
460 balance(Account const& account, MPTIssue const& mptIssue) const;
461
466 limit(Account const& account, Issue const& issue) const;
467
472 ownerCount(Account const& account) const;
473
478 le(Account const& account) const;
479
484 le(Keylet const& k) const;
485
487 template <class JsonValue, class... FN>
488 JTx
489 jt(JsonValue&& jv, FN const&... fN)
490 {
492 invoke(jt, fN...);
493 autofill(jt);
494 jt.stx = st(jt);
495 return jt;
496 }
497
499 template <class JsonValue, class... FN>
500 JTx
501 jtnofill(JsonValue&& jv, FN const&... fN)
502 {
504 invoke(jt, fN...);
506 jt.stx = st(jt);
507 return jt;
508 }
509
513 template <class JsonValue, class... FN>
515 json(JsonValue&& jv, FN const&... fN)
516 {
517 auto tj = jt(std::forward<JsonValue>(jv), fN...);
518 return std::move(tj.jv);
519 }
520
526 template <class... Args>
527 void
528 require(Args const&... args)
529 {
530 jtx::required(args...)(*this);
531 }
532
535 static ParsedResult
536 parseResult(Json::Value const& jr);
537
541 virtual void
542 submit(JTx const& jt);
543
547 void
549
553 void
555 JTx const& jt,
556 ParsedResult const& parsed,
557 Json::Value const& jr = Json::Value());
558
561 template <class JsonValue, class... FN>
562 Env&
563 apply(JsonValue&& jv, FN const&... fN)
564 {
565 submit(jt(std::forward<JsonValue>(jv), fN...));
566 return *this;
567 }
568
569 template <class JsonValue, class... FN>
570 Env&
571 operator()(JsonValue&& jv, FN const&... fN)
572 {
573 return apply(std::forward<JsonValue>(jv), fN...);
574 }
578 TER
579 ter() const
580 {
581 return ter_;
582 }
583
596 meta();
597
610 tx() const;
611
612 void
613 enableFeature(uint256 const feature);
614
615 void
616 disableFeature(uint256 const feature);
617
618 bool
619 enabled(uint256 feature) const
620 {
621 return current()->rules().enabled(feature);
622 }
623
624private:
625 void
626 fund(bool setDefaultRipple, STAmount const& amount, Account const& account);
627
628 void
629 fund_arg(STAmount const& amount, Account const& account)
630 {
631 fund(true, amount, account);
632 }
633
634 template <std::size_t N>
635 void
636 fund_arg(STAmount const& amount, std::array<Account, N> const& list)
637 {
638 for (auto const& account : list)
639 fund(false, amount, account);
640 }
641
642public:
669 template <class Arg, class... Args>
670 void
671 fund(STAmount const& amount, Arg const& arg, Args const&... args)
672 {
673 fund_arg(amount, arg);
674 if constexpr (sizeof...(args) > 0)
675 fund(amount, args...);
676 }
677
696 void
697 trust(STAmount const& amount, Account const& account);
698
699 template <class... Accounts>
700 void
702 STAmount const& amount,
703 Account const& to0,
704 Account const& to1,
705 Accounts const&... toN)
706 {
707 trust(amount, to0);
708 trust(amount, to1, toN...);
709 }
717 ust(JTx const& jt);
718
719protected:
720 int trace_ = 0;
725 unsigned retries_ = 5;
726
728 do_rpc(
729 unsigned apiVersion,
730 std::vector<std::string> const& args,
732
733 void
735
736 virtual void
737 autofill(JTx& jt);
738
747 st(JTx const& jt);
748
749 // Invoke funclets on stx
750 // Note: The STTx may not be modified
751 template <class... FN>
752 void
753 invoke(STTx& stx, FN const&... fN)
754 {
755 (fN(*this, stx), ...);
756 }
757
758 // Invoke funclets on jt
759 template <class... FN>
760 void
761 invoke(JTx& jt, FN const&... fN)
762 {
763 (fN(*this, jt), ...);
764 }
765
766 // Map of account IDs to Account
768};
769
770template <class... Args>
773 unsigned apiVersion,
775 std::string const& cmd,
776 Args&&... args)
777{
778 return do_rpc(
779 apiVersion,
781 headers);
782}
783
784template <class... Args>
786Env::rpc(unsigned apiVersion, std::string const& cmd, Args&&... args)
787{
788 return rpc(
789 apiVersion,
791 cmd,
792 std::forward<Args>(args)...);
793}
794
795template <class... Args>
799 std::string const& cmd,
800 Args&&... args)
801{
802 return do_rpc(
805 headers);
806}
807
808template <class... Args>
810Env::rpc(std::string const& cmd, Args&&... args)
811{
812 return rpc(
814 cmd,
815 std::forward<Args>(args)...);
816}
817
818} // namespace jtx
819} // namespace test
820} // namespace ripple
821
822#endif
Represents a JSON value.
Definition json_value.h:130
A generic endpoint for log messages.
Definition Journal.h:41
A testsuite class.
Definition suite.h:52
virtual OpenLedger & openLedger()=0
virtual bool checkSigs() const =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
void fund_arg(STAmount const &amount, std::array< Account, N > const &list)
Definition Env.h:636
Json::Value json(JsonValue &&jv, FN const &... fN)
Create JSON from parameters.
Definition Env.h:515
std::shared_ptr< ReadView const > closed()
Returns the last closed ledger.
Definition Env.cpp:97
void trace(int howMany=-1)
Turn on JSON tracing.
Definition Env.h:384
void disableFeature(uint256 const feature)
Definition Env.cpp:664
bool parseFailureExpected_
Definition Env.h:724
static ParsedResult parseResult(Json::Value const &jr)
Gets the TER result and didApply flag from a RPC Json result object.
Definition Env.cpp:319
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:241
std::unordered_map< AccountID, Account > map_
Definition Env.h:767
void notrace()
Turn off JSON tracing.
Definition Env.h:391
void require(Args const &... args)
Check a set of requirements.
Definition Env.h:528
void trust(STAmount const &amount, Account const &to0, Account const &to1, Accounts const &... toN)
Definition Env.h:701
unsigned retries() const
Definition Env.h:418
TER ter() const
Return the TER for the last JTx.
Definition Env.h:579
beast::unit_test::suite & test
Definition Env.h:104
virtual ~Env()=default
bool close(std::chrono::duration< Rep, Period > const &elapsed)
Close and advance the ledger.
Definition Env.h:360
PrettyAmount limit(Account const &account, Issue const &issue) const
Returns the IOU limit on an account.
Definition Env.cpp:229
AppBundle bundle_
Definition Env.h:140
std::shared_ptr< STTx const > tx() const
Return the tx data for the last JTx.
Definition Env.cpp:507
void invoke(JTx &jt, FN const &... fN)
Definition Env.h:761
Env & operator=(Env const &)=delete
Env & operator()(JsonValue &&jv, FN const &... fN)
Definition Env.h:571
Env(Env const &)=delete
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
Definition Env.h:312
void postconditions(JTx const &jt, ParsedResult const &parsed, Json::Value const &jr=Json::Value())
Check expected postconditions of JTx submission.
Definition Env.cpp:425
bool enabled(uint256 feature) const
Definition Env.h:619
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:387
AbstractClient & client()
Returns the connected client.
Definition Env.h:272
void autofill_sig(JTx &jt)
Definition Env.cpp:513
void trust(STAmount const &amount, Account const &account)
Establish trust lines.
Definition Env.cpp:302
void fund(STAmount const &amount, Arg const &arg, Args const &... args)
Create a new account with some XRP.
Definition Env.h:671
Json::Value do_rpc(unsigned apiVersion, std::vector< std::string > const &args, std::unordered_map< std::string, std::string > const &headers={})
Definition Env.cpp:633
void invoke(STTx &stx, FN const &... fN)
Definition Env.h:753
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:581
void enableFeature(uint256 const feature)
Definition Env.cpp:656
Env(beast::unit_test::suite &suite_)
Create Env with only the current test suite.
Definition Env.h:235
Account const & master
Definition Env.h:106
Account const & lookup(AccountID const &id) const
Returns the Account given the AccountID.
Definition Env.cpp:144
unsigned retries_
Definition Env.h:725
JTx jt(JsonValue &&jv, FN const &... fN)
Create a JTx from parameters.
Definition Env.h:489
NetClock::time_point now()
Returns the current network time.
Definition Env.h:265
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:607
Application & app()
Definition Env.h:242
beast::Journal const journal
Definition Env.h:143
ManualTimeKeeper & timeKeeper()
Definition Env.h:254
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:772
virtual void submit(JTx const &jt)
Submit an existing JTx.
Definition Env.cpp:357
Env & apply(JsonValue &&jv, FN const &... fN)
Apply funclets and submit.
Definition Env.h:563
void disable_sigs()
Turn off signature checks.
Definition Env.h:404
void set_retries(unsigned r=5)
Definition Env.h:411
bool close()
Close and advance the ledger.
Definition Env.h:374
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
Definition Env.cpp:271
TestStopwatch stopwatch_
Definition Env.h:721
Application const & app() const
Definition Env.h:248
std::shared_ptr< STObject const > meta()
Return metadata for the last JTx.
Definition Env.cpp:485
JTx jtnofill(JsonValue &&jv, FN const &... fN)
Create a JTx from parameters.
Definition Env.h:501
void set_parse_failure_expected(bool b)
Definition Env.h:397
void memoize(Account const &account)
Associate AccountID with account.
Definition Env.cpp:138
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
std::shared_ptr< SLE const > le(Account const &account) const
Return an account root.
Definition Env.cpp:259
void fund_arg(STAmount const &amount, Account const &account)
Definition Env.h:629
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
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
~SuiteLogs() override=default
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:19
Severity
Severity level / threshold of a Journal message.
Definition Journal.h:13
static constexpr auto apiCommandLineVersion
Definition ApiVersion.h:45
static autofill_t const autofill
Definition tags.h:23
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
Definition envconfig.h:35
require_t required(Args const &... args)
Compose many condition functors into one.
Definition require.h:30
FeatureBitset testable_amendments()
Definition Env.h:55
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
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
void foreachFeature(FeatureBitset bs, F &&f)
Definition Feature.h:331
STL namespace.
T push_back(T... args)
T reserve(T... args)
A pair of SHAMap key and LedgerEntryType.
Definition Keylet.h:20
std::unique_ptr< Application > owned
Definition Env.h:126
ManualTimeKeeper * timeKeeper
Definition Env.h:127
std::unique_ptr< AbstractClient > client
Definition Env.h:129
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