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,
63  : AppBundle()
64 {
65  using namespace beast::severities;
66  // Use kFatal threshold to reduce noise from STObject.
67  setDebugLogSink(std::make_unique<SuiteJournalSink>("Debug", kFatal, suite));
68  auto timeKeeper_ = std::make_unique<ManualTimeKeeper>();
69  timeKeeper = timeKeeper_.get();
70  // Hack so we don't have to call Config::setup
73  std::move(config), std::move(logs), std::move(timeKeeper_));
74  app = owned.get();
76  if (!app->setup())
77  Throw<std::runtime_error>("Env::AppBundle: setup failed");
78  timeKeeper->set(app->getLedgerMaster().getClosedLedger()->info().closeTime);
79  app->doStart(false /*don't start timers*/);
80  thread = std::thread([&]() { app->run(); });
81 
83 }
84 
86 {
87  client.reset();
88  // Make sure all jobs finish, otherwise tests
89  // might not get the coverage they expect.
90  if (app)
91  {
93  app->signalStop();
94  }
95  if (thread.joinable())
96  thread.join();
97 
98  // Remove the debugLogSink before the suite goes out of scope.
99  setDebugLogSink(nullptr);
100 }
101 
102 //------------------------------------------------------------------------------
103 
106 {
107  return app().getLedgerMaster().getClosedLedger();
108 }
109 
110 void
112  NetClock::time_point closeTime,
113  boost::optional<std::chrono::milliseconds> consensusDelay)
114 {
115  // Round up to next distinguishable value
116  using namespace std::chrono_literals;
117  closeTime += closed()->info().closeTimeResolution - 1s;
118  timeKeeper().set(closeTime);
119  // Go through the rpc interface unless we need to simulate
120  // a specific consensus delay.
121  if (consensusDelay)
122  app().getOPs().acceptLedger(consensusDelay);
123  else
124  {
125  rpc("ledger_accept");
126  // VFALCO No error check?
127  }
128  timeKeeper().set(closed()->info().closeTime);
129 }
130 
131 void
132 Env::memoize(Account const& account)
133 {
134  map_.emplace(account.id(), account);
135 }
136 
137 Account const&
138 Env::lookup(AccountID const& id) const
139 {
140  auto const iter = map_.find(id);
141  if (iter == map_.end())
142  Throw<std::runtime_error>("Env::lookup:: unknown account ID");
143  return iter->second;
144 }
145 
146 Account const&
147 Env::lookup(std::string const& base58ID) const
148 {
149  auto const account = parseBase58<AccountID>(base58ID);
150  if (!account)
151  Throw<std::runtime_error>("Env::lookup: invalid account ID");
152  return lookup(*account);
153 }
154 
156 Env::balance(Account const& account) const
157 {
158  auto const sle = le(account);
159  if (!sle)
160  return XRP(0);
161  return {sle->getFieldAmount(sfBalance), ""};
162 }
163 
165 Env::balance(Account const& account, Issue const& issue) const
166 {
167  if (isXRP(issue.currency))
168  return balance(account);
169  auto const sle = le(keylet::line(account.id(), issue));
170  if (!sle)
171  return {STAmount(issue, 0), account.name()};
172  auto amount = sle->getFieldAmount(sfBalance);
173  amount.setIssuer(issue.account);
174  if (account.id() > issue.account)
175  amount.negate();
176  return {amount, lookup(issue.account).name()};
177 }
178 
180 Env::seq(Account const& account) const
181 {
182  auto const sle = le(account);
183  if (!sle)
184  Throw<std::runtime_error>("missing account root");
185  return sle->getFieldU32(sfSequence);
186 }
187 
189 Env::le(Account const& account) const
190 {
191  return le(keylet::account(account.id()));
192 }
193 
195 Env::le(Keylet const& k) const
196 {
197  return current()->read(k);
198 }
199 
200 void
201 Env::fund(bool setDefaultRipple, STAmount const& amount, Account const& account)
202 {
203  memoize(account);
204  if (setDefaultRipple)
205  {
206  // VFALCO NOTE Is the fee formula correct?
207  apply(
208  pay(master, account, amount + drops(current()->fees().base)),
211  sig(jtx::autofill));
212  apply(
213  fset(account, asfDefaultRipple),
216  sig(jtx::autofill));
217  require(flags(account, asfDefaultRipple));
218  }
219  else
220  {
221  apply(
222  pay(master, account, amount),
225  sig(jtx::autofill));
226  require(nflags(account, asfDefaultRipple));
227  }
228  require(jtx::balance(account, amount));
229 }
230 
231 void
232 Env::trust(STAmount const& amount, Account const& account)
233 {
234  auto const start = balance(account);
235  apply(
236  jtx::trust(account, amount),
239  sig(jtx::autofill));
240  apply(
241  pay(master, account, drops(current()->fees().base)),
244  sig(jtx::autofill));
245  test.expect(balance(account) == start);
246 }
247 
250 {
251  TER ter;
252  if (jr.isObject() && jr.isMember(jss::result) &&
253  jr[jss::result].isMember(jss::engine_result_code))
254  ter = TER::fromInt(jr[jss::result][jss::engine_result_code].asInt());
255  else
256  ter = temINVALID;
258 }
259 
260 void
262 {
263  bool didApply;
264  if (jt.stx)
265  {
266  txid_ = jt.stx->getTransactionID();
267  Serializer s;
268  jt.stx->add(s);
269  auto const jr = rpc("submit", strHex(s.slice()));
270 
271  std::tie(ter_, didApply) = parseResult(jr);
272  }
273  else
274  {
275  // Parsing failed or the JTx is
276  // otherwise missing the stx field.
277  ter_ = temMALFORMED;
278  didApply = false;
279  }
280  return postconditions(jt, ter_, didApply);
281 }
282 
283 void
285 {
286  bool didApply;
287 
288  auto const account = lookup(jt.jv[jss::Account].asString());
289  auto const& passphrase = account.name();
290 
291  Json::Value jr;
292  if (params.isNull())
293  {
294  // Use the command line interface
295  auto const jv = boost::lexical_cast<std::string>(jt.jv);
296  jr = rpc("submit", passphrase, jv);
297  }
298  else
299  {
300  // Use the provided parameters, and go straight
301  // to the (RPC) client.
302  assert(params.isObject());
303  if (!params.isMember(jss::secret) && !params.isMember(jss::key_type) &&
304  !params.isMember(jss::seed) && !params.isMember(jss::seed_hex) &&
305  !params.isMember(jss::passphrase))
306  {
307  params[jss::secret] = passphrase;
308  }
309  params[jss::tx_json] = jt.jv;
310  jr = client().invoke("submit", params);
311  }
312  txid_.SetHex(jr[jss::result][jss::tx_json][jss::hash].asString());
313 
314  std::tie(ter_, didApply) = parseResult(jr);
315 
316  return postconditions(jt, ter_, didApply);
317 }
318 
319 void
320 Env::postconditions(JTx const& jt, TER ter, bool didApply)
321 {
322  if (jt.ter &&
323  !test.expect(
324  ter == *jt.ter,
325  "apply: " + transToken(ter) + " (" + transHuman(ter) + ") != " +
326  transToken(*jt.ter) + " (" + transHuman(*jt.ter) + ")"))
327  {
328  test.log << pretty(jt.jv) << std::endl;
329  // Don't check postconditions if
330  // we didn't get the expected result.
331  return;
332  }
333  if (trace_)
334  {
335  if (trace_ > 0)
336  --trace_;
337  test.log << pretty(jt.jv) << std::endl;
338  }
339  for (auto const& f : jt.requires)
340  f(*this);
341 }
342 
345 {
346  close();
347  auto const item = closed()->txRead(txid_);
348  return item.second;
349 }
350 
352 Env::tx() const
353 {
354  return current()->txRead(txid_).first;
355 }
356 
357 void
359 {
360  auto& jv = jt.jv;
361  if (jt.signer)
362  return jt.signer(*this, jt);
363  if (!jt.fill_sig)
364  return;
365  auto const account = lookup(jv[jss::Account].asString());
366  if (!app().checkSigs())
367  {
368  jv[jss::SigningPubKey] = strHex(account.pk().slice());
369  // dummy sig otherwise STTx is invalid
370  jv[jss::TxnSignature] = "00";
371  return;
372  }
373  auto const ar = le(account);
374  if (ar && ar->isFieldPresent(sfRegularKey))
375  jtx::sign(jv, lookup(ar->getAccountID(sfRegularKey)));
376  else
377  jtx::sign(jv, account);
378 }
379 
380 void
382 {
383  auto& jv = jt.jv;
384  if (jt.fill_fee)
385  jtx::fill_fee(jv, *current());
386  if (jt.fill_seq)
387  jtx::fill_seq(jv, *current());
388  // Must come last
389  try
390  {
391  autofill_sig(jt);
392  }
393  catch (parse_error const&)
394  {
395  test.log << "parse failed:\n" << pretty(jv) << std::endl;
396  Rethrow();
397  }
398 }
399 
401 Env::st(JTx const& jt)
402 {
403  // The parse must succeed, since we
404  // generated the JSON ourselves.
405  boost::optional<STObject> obj;
406  try
407  {
408  obj = jtx::parse(jt.jv);
409  }
410  catch (jtx::parse_error const&)
411  {
412  test.log << "Exception: parse_error\n" << pretty(jt.jv) << std::endl;
413  Rethrow();
414  }
415 
416  try
417  {
418  return sterilize(STTx{std::move(*obj)});
419  }
420  catch (std::exception const&)
421  {
422  }
423  return nullptr;
424 }
425 
428  std::vector<std::string> const& args,
430 {
431  return rpcClient(args, app().config(), app().logs(), headers).second;
432 }
433 
434 void
436 {
437  // Env::close() must be called for feature
438  // enable to take place.
439  app().config().features.insert(feature);
440 }
441 
442 } // namespace jtx
443 
444 } // namespace test
445 } // namespace ripple
ripple::test::jtx::Env::AppBundle::app
Application * app
Definition: Env.h:124
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:358
ripple::sfRegularKey
const SF_Account sfRegularKey(access, STI_ACCOUNT, 8, "RegularKey")
Definition: SField.h:481
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:671
ripple::test::jtx::Env::ter_
TER ter_
Definition: Env.h:630
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:128
ripple::test::jtx::Env::tx
std::shared_ptr< STTx const > tx() const
Return the tx data for the last JTx.
Definition: Env.cpp:352
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:458
ripple::test::jtx::Env::apply
void apply(JsonValue &&jv, FN const &... fN)
Apply funclets and submit.
Definition: Env.h:490
ripple::test::jtx::Env::closed
std::shared_ptr< ReadView const > closed()
Returns the last closed ledger.
Definition: Env.cpp:105
std::pair
ripple::test::jtx::Env::close
void close()
Close and advance the ledger.
Definition: Env.h:354
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:435
ripple::test::jtx::Env::AppBundle::timeKeeper
ManualTimeKeeper * timeKeeper
Definition: Env.h:126
ripple::sfSequence
const SF_U32 sfSequence(access, STI_UINT32, 4, "Sequence")
Definition: SField.h:355
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:629
ripple::test::jtx::Env::AppBundle::~AppBundle
~AppBundle()
Definition: Env.cpp:85
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:431
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:279
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:151
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:284
ripple::test::jtx::Env::AppBundle::thread
std::thread thread
Definition: Env.h:127
ripple::test::jtx::Env::balance
PrettyAmount balance(Account const &account) const
Returns the XRP balance on an account.
Definition: Env.cpp:156
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:505
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:232
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:401
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:249
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:344
ripple::keylet::line
static const line_t line
Definition: Indexes.h:190
std::thread
STL class.
ripple::Application::getLedgerMaster
virtual LedgerMaster & getLedgerMaster()=0
ripple::keylet::account
static const account_t account
Definition: Indexes.h:120
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:320
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:261
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:67
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:138
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::test::jtx::Env::seq
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
Definition: Env.cpp:180
ripple::test::jtx::Env::test
beast::unit_test::suite & test
Definition: Env.h:117
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:288
ripple::test::jtx::fee
Set the fee on a JTx.
Definition: fee.h:34
ripple::Serializer
Definition: Serializer.h:43
beast::severities::kError
@ kError
Definition: Journal.h:38
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:179
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:381
ripple::sfBalance
const SF_Amount sfBalance(access, STI_AMOUNT, 2, "Balance")
Definition: SField.h:438
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:427
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::JTx::requires
requires_t requires
Definition: JTx.h:44
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:201
ripple::test::jtx::Env::le
std::shared_ptr< SLE const > le(Account const &account) const
Return an account root.
Definition: Env.cpp:189
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:1513
ripple::test::jtx::Env::AppBundle::owned
std::unique_ptr< Application > owned
Definition: Env.h:125
ripple::test::jtx::Env::master
Account const & master
Definition: Env.h:119
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:132
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:297
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:2359
ripple::test::jtx::Env::AppBundle
Definition: Env.h:122
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:676
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:627
Json::Value::asString
std::string asString() const
Returns the unquoted string value.
Definition: json_value.cpp:469