rippled
Env.cpp
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #include <ripple/app/ledger/LedgerMaster.h>
21 #include <ripple/app/misc/NetworkOPs.h>
22 #include <ripple/app/misc/TxQ.h>
23 #include <ripple/basics/Slice.h>
24 #include <ripple/basics/contract.h>
25 #include <ripple/consensus/LedgerTiming.h>
26 #include <ripple/json/to_string.h>
27 #include <ripple/net/HTTPClient.h>
28 #include <ripple/net/RPCCall.h>
29 #include <ripple/protocol/ErrorCodes.h>
30 #include <ripple/protocol/Feature.h>
31 #include <ripple/protocol/HashPrefix.h>
32 #include <ripple/protocol/Indexes.h>
33 #include <ripple/protocol/LedgerFormats.h>
34 #include <ripple/protocol/Serializer.h>
35 #include <ripple/protocol/SystemParameters.h>
36 #include <ripple/protocol/TER.h>
37 #include <ripple/protocol/TxFlags.h>
38 #include <ripple/protocol/UintTypes.h>
39 #include <ripple/protocol/jss.h>
40 #include <memory>
41 #include <test/jtx/Env.h>
42 #include <test/jtx/JSONRPCClient.h>
43 #include <test/jtx/balance.h>
44 #include <test/jtx/fee.h>
45 #include <test/jtx/flags.h>
46 #include <test/jtx/pay.h>
47 #include <test/jtx/require.h>
48 #include <test/jtx/seq.h>
49 #include <test/jtx/sig.h>
50 #include <test/jtx/trust.h>
51 #include <test/jtx/utility.h>
52 
53 namespace ripple {
54 namespace test {
55 namespace jtx {
56 
57 //------------------------------------------------------------------------------
58 
60  beast::unit_test::suite& suite,
64  : AppBundle()
65 {
66  using namespace beast::severities;
67  if (logs)
68  {
69  setDebugLogSink(logs->makeSink("Debug", kFatal));
70  }
71  else
72  {
73  logs = std::make_unique<SuiteLogs>(suite);
74  // Use kFatal threshold to reduce noise from STObject.
76  std::make_unique<SuiteJournalSink>("Debug", kFatal, suite));
77  }
78  auto timeKeeper_ = std::make_unique<ManualTimeKeeper>();
79  timeKeeper = timeKeeper_.get();
80  // Hack so we don't have to call Config::setup
83  std::move(config), std::move(logs), std::move(timeKeeper_));
84  app = owned.get();
85  app->logs().threshold(thresh);
86  if (!app->setup())
87  Throw<std::runtime_error>("Env::AppBundle: setup failed");
88  timeKeeper->set(app->getLedgerMaster().getClosedLedger()->info().closeTime);
89  app->doStart(false /*don't start timers*/);
90  thread = std::thread([&]() { app->run(); });
91 
93 }
94 
96 {
97  client.reset();
98  // Make sure all jobs finish, otherwise tests
99  // might not get the coverage they expect.
100  if (app)
101  {
103  app->signalStop();
104  }
105  if (thread.joinable())
106  thread.join();
107 
108  // Remove the debugLogSink before the suite goes out of scope.
109  setDebugLogSink(nullptr);
110 }
111 
112 //------------------------------------------------------------------------------
113 
116 {
117  return app().getLedgerMaster().getClosedLedger();
118 }
119 
120 bool
122  NetClock::time_point closeTime,
123  boost::optional<std::chrono::milliseconds> consensusDelay)
124 {
125  // Round up to next distinguishable value
126  using namespace std::chrono_literals;
127  bool res = true;
128  closeTime += closed()->info().closeTimeResolution - 1s;
129  timeKeeper().set(closeTime);
130  // Go through the rpc interface unless we need to simulate
131  // a specific consensus delay.
132  if (consensusDelay)
133  app().getOPs().acceptLedger(consensusDelay);
134  else
135  {
136  auto resp = rpc("ledger_accept");
137  if (resp["result"]["status"] != std::string("success"))
138  {
139  JLOG(journal.error())
140  << "Env::close() failed: " << resp["result"]["status"]
141  << std::endl;
142  res = false;
143  }
144  }
145  timeKeeper().set(closed()->info().closeTime);
146  return res;
147 }
148 
149 void
150 Env::memoize(Account const& account)
151 {
152  map_.emplace(account.id(), account);
153 }
154 
155 Account const&
156 Env::lookup(AccountID const& id) const
157 {
158  auto const iter = map_.find(id);
159  if (iter == map_.end())
160  Throw<std::runtime_error>("Env::lookup:: unknown account ID");
161  return iter->second;
162 }
163 
164 Account const&
165 Env::lookup(std::string const& base58ID) const
166 {
167  auto const account = parseBase58<AccountID>(base58ID);
168  if (!account)
169  Throw<std::runtime_error>("Env::lookup: invalid account ID");
170  return lookup(*account);
171 }
172 
174 Env::balance(Account const& account) const
175 {
176  auto const sle = le(account);
177  if (!sle)
178  return XRP(0);
179  return {sle->getFieldAmount(sfBalance), ""};
180 }
181 
183 Env::balance(Account const& account, Issue const& issue) const
184 {
185  if (isXRP(issue.currency))
186  return balance(account);
187  auto const sle = le(keylet::line(account.id(), issue));
188  if (!sle)
189  return {STAmount(issue, 0), account.name()};
190  auto amount = sle->getFieldAmount(sfBalance);
191  amount.setIssuer(issue.account);
192  if (account.id() > issue.account)
193  amount.negate();
194  return {amount, lookup(issue.account).name()};
195 }
196 
198 Env::seq(Account const& account) const
199 {
200  auto const sle = le(account);
201  if (!sle)
202  Throw<std::runtime_error>("missing account root");
203  return sle->getFieldU32(sfSequence);
204 }
205 
207 Env::le(Account const& account) const
208 {
209  return le(keylet::account(account.id()));
210 }
211 
213 Env::le(Keylet const& k) const
214 {
215  return current()->read(k);
216 }
217 
218 void
219 Env::fund(bool setDefaultRipple, STAmount const& amount, Account const& account)
220 {
221  memoize(account);
222  if (setDefaultRipple)
223  {
224  // VFALCO NOTE Is the fee formula correct?
225  apply(
226  pay(master, account, amount + drops(current()->fees().base)),
229  sig(jtx::autofill));
230  apply(
231  fset(account, asfDefaultRipple),
234  sig(jtx::autofill));
235  require(flags(account, asfDefaultRipple));
236  }
237  else
238  {
239  apply(
240  pay(master, account, amount),
243  sig(jtx::autofill));
244  require(nflags(account, asfDefaultRipple));
245  }
246  require(jtx::balance(account, amount));
247 }
248 
249 void
250 Env::trust(STAmount const& amount, Account const& account)
251 {
252  auto const start = balance(account);
253  apply(
254  jtx::trust(account, amount),
257  sig(jtx::autofill));
258  apply(
259  pay(master, account, drops(current()->fees().base)),
262  sig(jtx::autofill));
263  test.expect(balance(account) == start);
264 }
265 
268 {
269  TER ter;
270  if (jr.isObject() && jr.isMember(jss::result) &&
271  jr[jss::result].isMember(jss::engine_result_code))
272  ter = TER::fromInt(jr[jss::result][jss::engine_result_code].asInt());
273  else
274  ter = temINVALID;
276 }
277 
278 void
280 {
281  bool didApply;
282  if (jt.stx)
283  {
284  txid_ = jt.stx->getTransactionID();
285  Serializer s;
286  jt.stx->add(s);
287  auto const jr = rpc("submit", strHex(s.slice()));
288 
289  std::tie(ter_, didApply) = parseResult(jr);
290  }
291  else
292  {
293  // Parsing failed or the JTx is
294  // otherwise missing the stx field.
295  ter_ = temMALFORMED;
296  didApply = false;
297  }
298  return postconditions(jt, ter_, didApply);
299 }
300 
301 void
303 {
304  bool didApply;
305 
306  auto const account = lookup(jt.jv[jss::Account].asString());
307  auto const& passphrase = account.name();
308 
309  Json::Value jr;
310  if (params.isNull())
311  {
312  // Use the command line interface
313  auto const jv = boost::lexical_cast<std::string>(jt.jv);
314  jr = rpc("submit", passphrase, jv);
315  }
316  else
317  {
318  // Use the provided parameters, and go straight
319  // to the (RPC) client.
320  assert(params.isObject());
321  if (!params.isMember(jss::secret) && !params.isMember(jss::key_type) &&
322  !params.isMember(jss::seed) && !params.isMember(jss::seed_hex) &&
323  !params.isMember(jss::passphrase))
324  {
325  params[jss::secret] = passphrase;
326  }
327  params[jss::tx_json] = jt.jv;
328  jr = client().invoke("submit", params);
329  }
330  txid_.SetHex(jr[jss::result][jss::tx_json][jss::hash].asString());
331 
332  std::tie(ter_, didApply) = parseResult(jr);
333 
334  return postconditions(jt, ter_, didApply);
335 }
336 
337 void
338 Env::postconditions(JTx const& jt, TER ter, bool didApply)
339 {
340  if (jt.ter &&
341  !test.expect(
342  ter == *jt.ter,
343  "apply: " + transToken(ter) + " (" + transHuman(ter) + ") != " +
344  transToken(*jt.ter) + " (" + transHuman(*jt.ter) + ")"))
345  {
346  test.log << pretty(jt.jv) << std::endl;
347  // Don't check postconditions if
348  // we didn't get the expected result.
349  return;
350  }
351  if (trace_)
352  {
353  if (trace_ > 0)
354  --trace_;
355  test.log << pretty(jt.jv) << std::endl;
356  }
357  for (auto const& f : jt.requires)
358  f(*this);
359 }
360 
363 {
364  close();
365  auto const item = closed()->txRead(txid_);
366  return item.second;
367 }
368 
370 Env::tx() const
371 {
372  return current()->txRead(txid_).first;
373 }
374 
375 void
377 {
378  auto& jv = jt.jv;
379  if (jt.signer)
380  return jt.signer(*this, jt);
381  if (!jt.fill_sig)
382  return;
383  auto const account = lookup(jv[jss::Account].asString());
384  if (!app().checkSigs())
385  {
386  jv[jss::SigningPubKey] = strHex(account.pk().slice());
387  // dummy sig otherwise STTx is invalid
388  jv[jss::TxnSignature] = "00";
389  return;
390  }
391  auto const ar = le(account);
392  if (ar && ar->isFieldPresent(sfRegularKey))
393  jtx::sign(jv, lookup(ar->getAccountID(sfRegularKey)));
394  else
395  jtx::sign(jv, account);
396 }
397 
398 void
400 {
401  auto& jv = jt.jv;
402  if (jt.fill_fee)
403  jtx::fill_fee(jv, *current());
404  if (jt.fill_seq)
405  jtx::fill_seq(jv, *current());
406  // Must come last
407  try
408  {
409  autofill_sig(jt);
410  }
411  catch (parse_error const&)
412  {
413  test.log << "parse failed:\n" << pretty(jv) << std::endl;
414  Rethrow();
415  }
416 }
417 
419 Env::st(JTx const& jt)
420 {
421  // The parse must succeed, since we
422  // generated the JSON ourselves.
423  boost::optional<STObject> obj;
424  try
425  {
426  obj = jtx::parse(jt.jv);
427  }
428  catch (jtx::parse_error const&)
429  {
430  test.log << "Exception: parse_error\n" << pretty(jt.jv) << std::endl;
431  Rethrow();
432  }
433 
434  try
435  {
436  return sterilize(STTx{std::move(*obj)});
437  }
438  catch (std::exception const&)
439  {
440  }
441  return nullptr;
442 }
443 
446  std::vector<std::string> const& args,
448 {
449  return rpcClient(args, app().config(), app().logs(), headers).second;
450 }
451 
452 void
454 {
455  // Env::close() must be called for feature
456  // enable to take place.
457  app().config().features.insert(feature);
458 }
459 
460 } // namespace jtx
461 
462 } // namespace test
463 } // namespace ripple
ripple::test::jtx::Env::AppBundle::app
Application * app
Definition: Env.h:125
ripple::test::jtx::Account::name
std::string const & name() const
Return the name.
Definition: Account.h:78
ripple::test::jtx::Env::autofill_sig
void autofill_sig(JTx &jt)
Definition: Env.cpp:376
ripple::sfRegularKey
const SF_Account sfRegularKey(access, STI_ACCOUNT, 8, "RegularKey")
Definition: SField.h:487
ripple::test::jtx::XRP
const XRP_t XRP
Converts to XRP Issue or STAmount.
Definition: amount.cpp:105
ripple::test::jtx::parse_error
Thrown when parse fails.
Definition: utility.h:34
ripple::Keylet
A pair of SHAMap key and LedgerEntryType.
Definition: Keylet.h:38
ripple::Issue
A currency issued by an account.
Definition: Issue.h:34
Json::Value::isObject
bool isObject() const
Definition: json_value.cpp:1027
std::string
STL class.
std::shared_ptr
STL class.
std::exception
STL class.
ripple::test::jtx::Env::map_
std::unordered_map< AccountID, Account > map_
Definition: Env.h:679
ripple::test::jtx::Env::ter_
TER ter_
Definition: Env.h:638
ripple::test::jtx::drops
PrettyAmount drops(Integer i)
Returns an XRP PrettyAmount, which is trivially convertible to STAmount.
Definition: amount.h:241
ripple::test::jtx::Env::AppBundle::client
std::unique_ptr< AbstractClient > client
Definition: Env.h:129
ripple::test::jtx::Env::tx
std::shared_ptr< STTx const > tx() const
Return the tx data for the last JTx.
Definition: Env.cpp:370
ripple::test::jtx::ter
Set the expected result code for a JTx The test will fail if the code doesn't match.
Definition: ter.h:33
ripple::isTesSuccess
bool isTesSuccess(TER x)
Definition: TER.h:576
ripple::test::jtx::Env::require
void require(Args const &... args)
Check a set of requirements.
Definition: Env.h:466
ripple::test::jtx::Env::apply
void apply(JsonValue &&jv, FN const &... fN)
Apply funclets and submit.
Definition: Env.h:498
ripple::test::jtx::Env::closed
std::shared_ptr< ReadView const > closed()
Returns the last closed ledger.
Definition: Env.cpp:115
std::pair
ripple::test::jtx::balance
A balance matches.
Definition: balance.h:38
ripple::test::jtx::Env::AppBundle::AppBundle
AppBundle()=default
std::vector< std::string >
ripple::test::jtx::Env::enableFeature
void enableFeature(uint256 const feature)
Definition: Env.cpp:453
ripple::test::jtx::Env::AppBundle::timeKeeper
ManualTimeKeeper * timeKeeper
Definition: Env.h:127
ripple::sfSequence
const SF_U32 sfSequence(access, STI_UINT32, 4, "Sequence")
Definition: SField.h:356
ripple::test::jtx::trust
Json::Value trust(Account const &account, STAmount const &amount, std::uint32_t flags)
Modify a trust line.
Definition: trust.cpp:30
ripple::test::jtx::Env::txid_
uint256 txid_
Definition: Env.h:637
ripple::test::jtx::Env::AppBundle::~AppBundle
~AppBundle()
Definition: Env.cpp:95
ripple::test::jtx::JTx::stx
std::shared_ptr< STTx const > stx
Definition: JTx.h:49
ripple::asfDefaultRipple
const std::uint32_t asfDefaultRipple
Definition: TxFlags.h:72
ripple::test::jtx::Env::jt
JTx jt(JsonValue &&jv, FN const &... fN)
Create a JTx from parameters.
Definition: Env.h:439
ripple::test::jtx::fill_seq
void fill_seq(Json::Value &jv, ReadView const &view)
Set the sequence number automatically.
Definition: utility.cpp:63
ripple::Issue::currency
Currency currency
Definition: Issue.h:37
ripple::transToken
std::string transToken(TER code)
Definition: TER.cpp:193
ripple::test::jtx::Env::journal
const beast::Journal journal
Definition: Env.h:143
ripple::test::makeJSONRPCClient
std::unique_ptr< AbstractClient > makeJSONRPCClient(Config const &cfg, unsigned rpc_version)
Returns a client using JSON-RPC over HTTP/S.
Definition: JSONRPCClient.cpp:155
beast::severities
A namespace for easy access to logging severity values.
Definition: Journal.h:29
ripple::test::jtx::Env::sign_and_submit
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:302
ripple::test::jtx::Env::AppBundle::thread
std::thread thread
Definition: Env.h:128
ripple::test::jtx::Env::balance
PrettyAmount balance(Account const &account) const
Returns the XRP balance on an account.
Definition: Env.cpp:174
Json::Value::isNull
bool isNull() const
isNull() tests to see if this field is null.
Definition: json_value.cpp:967
ripple::test::jtx::sign
void sign(Json::Value &jv, Account const &account)
Sign automatically.
Definition: utility.cpp:44
ripple::test::jtx::Env::ter
TER ter() const
Return the TER for the last JTx.
Definition: Env.h:513
ripple::isTecClaim
bool isTecClaim(TER x)
Definition: TER.h:582
ripple::test::jtx::Env::trust
void trust(STAmount const &amount, Account const &account)
Establish trust lines.
Definition: Env.cpp:250
ripple::debugLog
beast::Journal debugLog()
Returns a debug journal.
Definition: Log.cpp:452
ripple::Application::getOPs
virtual NetworkOPs & getOPs()=0
ripple::test::jtx::autofill
static const autofill_t autofill
Definition: tags.h:42
ripple::test::jtx::Env::st
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:419
ripple::test::jtx::Env::parseResult
static std::pair< TER, bool > parseResult(Json::Value const &jr)
Gets the TER result and didApply flag from a RPC Json result object.
Definition: Env.cpp:267
std::tie
T tie(T... args)
ripple::base_uint< 160, detail::AccountIDTag >
std::thread::joinable
T joinable(T... args)
ripple::test::jtx::Env::meta
std::shared_ptr< STObject const > meta()
Return metadata for the last JTx.
Definition: Env.cpp:362
std::thread
STL class.
ripple::Application::getLedgerMaster
virtual LedgerMaster & getLedgerMaster()=0
ripple::keylet::account
Keylet account(AccountID const &id) noexcept
AccountID root.
Definition: Indexes.cpp:121
ripple::Rethrow
void Rethrow()
Rethrow the exception currently being handled.
Definition: contract.h:48
ripple::test::jtx::Env::postconditions
void postconditions(JTx const &jt, TER ter, bool didApply)
Check expected postconditions of JTx submission.
Definition: Env.cpp:338
ripple::Application::config
virtual Config & config()=0
ripple::TERSubset< CanCvtToTER >
ripple::test::jtx::JTx
Execution context for applying a JSON transaction.
Definition: JTx.h:41
ripple::setDebugLogSink
std::unique_ptr< beast::Journal::Sink > setDebugLogSink(std::unique_ptr< beast::Journal::Sink > sink)
Set the sink for the debug journal.
Definition: Log.cpp:446
ripple::test::jtx::JTx::jv
Json::Value jv
Definition: JTx.h:43
ripple::test::jtx::fill_fee
void fill_fee(Json::Value &jv, ReadView const &view)
Set the fee automatically.
Definition: utility.cpp:55
ripple::test::jtx::fset
Json::Value fset(Account const &account, std::uint32_t on, std::uint32_t off=0)
Add and/or remove flag.
Definition: flags.cpp:28
ripple::Application::getJobQueue
virtual JobQueue & getJobQueue()=0
ripple::test::jtx::Env::submit
virtual void submit(JTx const &jt)
Submit an existing JTx.
Definition: Env.cpp:279
ripple::STAmount
Definition: STAmount.h:42
ripple::base_uint::SetHex
bool SetHex(const char *psz, bool bStrict=false)
Parse a hex string into a base_uint The input can be:
Definition: base_uint.h:406
ripple::Serializer::slice
Slice slice() const noexcept
Definition: Serializer.h:63
beast::Journal::error
Stream error() const
Definition: Journal.h:333
std::chrono::time_point
ripple::Application::logs
virtual Logs & logs()=0
ripple::test::jtx::JTx::ter
boost::optional< TER > ter
Definition: JTx.h:45
ripple::Application::doStart
virtual void doStart(bool withTimers)=0
ripple::STTx
Definition: STTx.h:42
ripple::test::jtx::Env::lookup
Account const & lookup(AccountID const &id) const
Returns the Account given the AccountID.
Definition: Env.cpp:156
ripple::isXRP
bool isXRP(AccountID const &c)
Definition: AccountID.h:118
Json::Value::isMember
bool isMember(const char *key) const
Return true if the object has a member named key.
Definition: json_value.cpp:932
std::uint32_t
ripple::test::jtx::sig
Set the regular signature on a JTx.
Definition: sig.h:33
ripple::keylet::line
Keylet line(AccountID const &id0, AccountID const &id1, Currency const &currency) noexcept
The index of a trust line for a given currency.
Definition: Indexes.cpp:181
ripple::test::jtx::Env::seq
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
Definition: Env.cpp:198
ripple::test::jtx::Env::test
beast::unit_test::suite & test
Definition: Env.h:118
ripple::test::jtx::JTx::signer
std::function< void(Env &, JTx &)> signer
Definition: JTx.h:50
ripple::JobQueue::rendezvous
void rendezvous()
Block until no tasks running.
Definition: JobQueue.cpp:276
memory
ripple::transHuman
std::string transHuman(TER code)
Definition: TER.cpp:202
ripple::test::jtx::fee
Set the fee on a JTx.
Definition: fee.h:34
ripple::Serializer
Definition: Serializer.h:39
ripple::test::jtx::seq
Set the sequence number on a JTx.
Definition: seq.h:32
ripple::LedgerMaster::getClosedLedger
std::shared_ptr< Ledger const > getClosedLedger()
Definition: LedgerMaster.h:87
ripple::Logs::threshold
beast::severities::Severity threshold() const
Definition: Log.cpp:150
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::sterilize
std::shared_ptr< STTx const > sterilize(STTx const &stx)
Sterilize a transaction.
Definition: STTx.cpp:515
ripple::Config::features
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:185
ripple::test::jtx::flags
Match set account flags.
Definition: flags.h:108
std::endl
T endl(T... args)
ripple::test::jtx::Env::autofill
virtual void autofill(JTx &jt)
Definition: Env.cpp:399
ripple::sfBalance
const SF_Amount sfBalance(access, STI_AMOUNT, 2, "Balance")
Definition: SField.h:441
ripple::test::jtx::Env::do_rpc
Json::Value do_rpc(std::vector< std::string > const &args, std::unordered_map< std::string, std::string > const &headers={})
Definition: Env.cpp:445
ripple::test::jtx::pay
Json::Value pay(Account const &account, Account const &to, AnyAmount amount)
Create a payment.
Definition: pay.cpp:29
ripple::test::jtx::JTx::fill_seq
bool fill_seq
Definition: JTx.h:47
ripple::test::jtx::JTx::fill_sig
bool fill_sig
Definition: JTx.h:48
ripple::test::jtx::Env::close
bool close()
Close and advance the ledger.
Definition: Env.h:362
ripple::test::jtx::JTx::requires
requires_t requires
Definition: JTx.h:44
beast::severities::Severity
Severity
Severity level / threshold of a Journal message.
Definition: Journal.h:31
ripple::TERSubset< CanCvtToTER >::fromInt
static constexpr TERSubset fromInt(int from)
Definition: TER.h:341
ripple::test::jtx::Env::fund
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
Definition: Env.cpp:219
ripple::test::jtx::Env::le
std::shared_ptr< SLE const > le(Account const &account) const
Return an account root.
Definition: Env.cpp:207
ripple::rpcClient
std::pair< int, Json::Value > rpcClient(std::vector< std::string > const &args, Config const &config, Logs &logs, std::unordered_map< std::string, std::string > const &headers)
Internal invocation of RPC client.
Definition: RPCCall.cpp:1519
ripple::test::jtx::Env::AppBundle::owned
std::unique_ptr< Application > owned
Definition: Env.h:126
ripple::test::jtx::Env::master
Account const & master
Definition: Env.h:120
ripple::test::jtx::nflags
Match clear account flags.
Definition: flags.h:125
ripple::Application::signalStop
virtual void signalStop()=0
ripple::test::jtx::Account
Immutable cryptographic account descriptor.
Definition: Account.h:37
std::make_pair
T make_pair(T... args)
ripple::strHex
std::string strHex(FwdIt begin, FwdIt end)
Definition: strHex.h:67
ripple::NetworkOPs::acceptLedger
virtual std::uint32_t acceptLedger(boost::optional< std::chrono::milliseconds > consensusDelay=boost::none)=0
Accepts the current transaction tree, return the new ledger's sequence.
ripple::temMALFORMED
@ temMALFORMED
Definition: TER.h:82
beast::severities::kFatal
@ kFatal
Definition: Journal.h:39
ripple::test::ManualTimeKeeper::set
void set(time_point now)
Definition: ManualTimeKeeper.cpp:81
ripple::test::jtx::parse
STObject parse(Json::Value const &jv)
Convert JSON to STObject.
Definition: utility.cpp:35
ripple::test::jtx::Env::memoize
void memoize(Account const &account)
Associate AccountID with account.
Definition: Env.cpp:150
std::unique_ptr
STL class.
ripple::test::jtx::JTx::fill_fee
bool fill_fee
Definition: JTx.h:46
std::unordered_map
STL class.
ripple::Application::setup
virtual bool setup()=0
ripple::HTTPClient::initializeSSLContext
static void initializeSSLContext(Config const &config, beast::Journal j)
Definition: HTTPClient.cpp:38
ripple::test::jtx::Env::current
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
Definition: Env.h:299
ripple::make_Application
std::unique_ptr< Application > make_Application(std::unique_ptr< Config > config, std::unique_ptr< Logs > logs, std::unique_ptr< TimeKeeper > timeKeeper)
Definition: Application.cpp:2222
ripple::test::jtx::Env::AppBundle
Definition: Env.h:123
ripple::Application::run
virtual void run()=0
ripple::Issue::account
AccountID account
Definition: Issue.h:38
ripple::temINVALID
@ temINVALID
Definition: TER.h:105
std::thread::join
T join(T... args)
ripple::test::jtx::Env::rpc
Json::Value rpc(std::unordered_map< std::string, std::string > const &headers, std::string const &cmd, Args &&... args)
Execute an RPC command.
Definition: Env.h:684
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::test::jtx::PrettyAmount
Represents an XRP or IOU quantity This customizes the string conversion and supports XRP conversions ...
Definition: amount.h:73
ripple::test::jtx::Env::trace_
int trace_
Definition: Env.h:635
Json::Value::asString
std::string asString() const
Returns the unquoted string value.
Definition: json_value.cpp:469