rippled
Transaction_ordering_test.cpp
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5  Permission to use, copy, modify, and/or distribute this software for any
6  purpose with or without fee is hereby granted, provided that the above
7  copyright notice and this permission notice appear in all copies.
8  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16 //==============================================================================
17 
18 #include <ripple/core/JobQueue.h>
19 #include <ripple/protocol/ErrorCodes.h>
20 #include <test/jtx.h>
21 
22 namespace ripple {
23 namespace test {
24 
25 struct Transaction_ordering_test : public beast::unit_test::suite
26 {
28  {
29  using namespace jtx;
30 
31  Env env(*this);
32  auto const alice = Account("alice");
33  env.fund(XRP(1000), noripple(alice));
34 
35  auto const aliceSequence = env.seq(alice);
36 
37  auto const tx1 = env.jt(noop(alice), seq(aliceSequence));
38  auto const tx2 = env.jt(noop(alice), seq(aliceSequence + 1),
39  json(R"({"LastLedgerSequence":7})"));
40 
41  env(tx1);
42  env.close();
43  BEAST_EXPECT(env.seq(alice) == aliceSequence + 1);
44  env(tx2);
45  env.close();
46  BEAST_EXPECT(env.seq(alice) == aliceSequence + 2);
47 
48  env.close();
49 
50  {
51  auto const result = env.rpc("tx", to_string(tx1.stx->getTransactionID()));
52  BEAST_EXPECT(result["result"]["meta"]["TransactionResult"] == "tesSUCCESS");
53  }
54  {
55  auto const result = env.rpc("tx", to_string(tx2.stx->getTransactionID()));
56  BEAST_EXPECT(result["result"]["meta"]["TransactionResult"] == "tesSUCCESS");
57  }
58  }
59 
61  {
62  using namespace jtx;
63 
64  Env env(*this);
65  env.app().getJobQueue().setThreadCount(0, false);
66  auto const alice = Account("alice");
67  env.fund(XRP(1000), noripple(alice));
68 
69  auto const aliceSequence = env.seq(alice);
70 
71  auto const tx1 = env.jt(noop(alice), seq(aliceSequence));
72  auto const tx2 = env.jt(noop(alice), seq(aliceSequence + 1),
73  json(R"({"LastLedgerSequence":7})"));
74 
75  env(tx2, ter(terPRE_SEQ));
76  BEAST_EXPECT(env.seq(alice) == aliceSequence);
77  env(tx1);
78  env.app().getJobQueue().rendezvous();
79  BEAST_EXPECT(env.seq(alice) == aliceSequence + 2);
80 
81  env.close();
82 
83  {
84  auto const result = env.rpc("tx", to_string(tx1.stx->getTransactionID()));
85  BEAST_EXPECT(result["result"]["meta"]["TransactionResult"] == "tesSUCCESS");
86  }
87  {
88  auto const result = env.rpc("tx", to_string(tx2.stx->getTransactionID()));
89  BEAST_EXPECT(result["result"]["meta"]["TransactionResult"] == "tesSUCCESS");
90  }
91  }
92 
94  {
95  using namespace jtx;
96 
97  Env env(*this);
98  env.app().getJobQueue().setThreadCount(0, false);
99  auto const alice = Account("alice");
100  env.fund(XRP(1000), noripple(alice));
101 
102  auto const aliceSequence = env.seq(alice);
103 
104  std::vector<JTx> tx;
105  for (auto i = 0; i < 5; ++i)
106  {
107  tx.emplace_back(
108  env.jt(noop(alice), seq(aliceSequence + i),
109  json(R"({"LastLedgerSequence":7})"))
110  );
111  }
112 
113  for (auto i = 1; i < 5; ++i)
114  {
115  env(tx[i], ter(terPRE_SEQ));
116  BEAST_EXPECT(env.seq(alice) == aliceSequence);
117  }
118 
119  env(tx[0]);
120  env.app().getJobQueue().rendezvous();
121  BEAST_EXPECT(env.seq(alice) == aliceSequence + 5);
122 
123  env.close();
124 
125  for (auto i = 0; i < 5; ++i)
126  {
127  auto const result = env.rpc("tx", to_string(tx[i].stx->getTransactionID()));
128  BEAST_EXPECT(result["result"]["meta"]["TransactionResult"] == "tesSUCCESS");
129  }
130  }
131 
132  void run() override
133  {
137  }
138 };
139 
140 BEAST_DEFINE_TESTSUITE(Transaction_ordering,app,ripple);
141 
142 } // test
143 } // ripple
ripple::test::jtx::json
Inject raw JSON.
Definition: jtx_json.h:31
ripple::test::jtx::noop
Json::Value noop(Account const &account)
The null transaction.
Definition: noop.h:32
ripple::test::jtx::XRP
const XRP_t XRP
Converts to XRP Issue or STAmount.
Definition: amount.cpp:109
ripple::test::BEAST_DEFINE_TESTSUITE
BEAST_DEFINE_TESTSUITE(AccountDelete, app, ripple)
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
std::vector
STL class.
ripple::test::jtx::Env::jt
JTx jt(JsonValue &&jv, FN const &... fN)
Create a JTx from parameters.
Definition: Env.h:431
ripple::test::jtx::Env::app
Application & app()
Definition: Env.h:237
ripple::to_string
std::string to_string(ListDisposition disposition)
Definition: ValidatorList.cpp:41
ripple::test::Transaction_ordering_test::testIncorrectOrder
void testIncorrectOrder()
Definition: Transaction_ordering_test.cpp:60
ripple::Application::getJobQueue
virtual JobQueue & getJobQueue()=0
ripple::test::Transaction_ordering_test::testIncorrectOrderMultipleIntermediaries
void testIncorrectOrderMultipleIntermediaries()
Definition: Transaction_ordering_test.cpp:93
ripple::test::jtx::Env::seq
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
Definition: Env.cpp:192
ripple::JobQueue::rendezvous
void rendezvous()
Block until no tasks running.
Definition: JobQueue.cpp:277
ripple::test::Transaction_ordering_test::testCorrectOrder
void testCorrectOrder()
Definition: Transaction_ordering_test.cpp:27
ripple::test::jtx::seq
Set the sequence number on a JTx.
Definition: seq.h:32
std::vector::emplace_back
T emplace_back(T... args)
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::test::jtx::noripple
std::array< Account, 1+sizeof...(Args)> noripple(Account const &account, Args const &... args)
Designate accounts as no-ripple in Env::fund.
Definition: Env.h:64
ripple::test::jtx::Env::close
void close(NetClock::time_point closeTime, boost::optional< std::chrono::milliseconds > consensusDelay=boost::none)
Close and advance the ledger.
Definition: Env.cpp:114
ripple::JobQueue::setThreadCount
void setThreadCount(int c, bool const standaloneMode)
Set the number of thread serving the job queue to precisely this number.
Definition: JobQueue.cpp:158
ripple::test::jtx::Env::fund
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
Definition: Env.cpp:214
ripple::test::Transaction_ordering_test::run
void run() override
Definition: Transaction_ordering_test.cpp:132
ripple::test::Transaction_ordering_test
Definition: Transaction_ordering_test.cpp:25
ripple::terPRE_SEQ
@ terPRE_SEQ
Definition: TER.h:199
ripple::test::jtx::Account
Immutable cryptographic account descriptor.
Definition: Account.h:37
ripple::test::jtx::Env
A transaction testing environment.
Definition: Env.h:117
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:688