21#include <test/jtx/Env.h>
22#include <xrpld/rpc/detail/RPCHelpers.h>
23#include <xrpl/json/json_reader.h>
24#include <xrpl/json/json_value.h>
25#include <xrpl/protocol/jss.h>
37 using namespace test::jtx;
43 env.client().invoke(
"transaction_entry", {})[jss::result];
44 BEAST_EXPECT(result[jss::error] ==
"fieldNotFoundTransaction");
45 BEAST_EXPECT(result[jss::status] ==
"error");
50 params[jss::ledger] = 20;
52 env.client().invoke(
"transaction_entry", params)[jss::result];
53 BEAST_EXPECT(result[jss::error] ==
"lgrNotFound");
54 BEAST_EXPECT(result[jss::status] ==
"error");
59 params[jss::ledger] =
"current";
60 params[jss::tx_hash] =
"DEADBEEF";
62 env.client().invoke(
"transaction_entry", params)[jss::result];
63 BEAST_EXPECT(result[jss::error] ==
"notYetImplemented");
64 BEAST_EXPECT(result[jss::status] ==
"error");
69 params[jss::ledger] =
"closed";
70 params[jss::tx_hash] =
"DEADBEEF";
72 env.client().invoke(
"transaction_entry", params)[jss::result];
73 BEAST_EXPECT(!result[jss::ledger_hash].asString().empty());
74 BEAST_EXPECT(result[jss::error] ==
"malformedRequest");
75 BEAST_EXPECT(result[jss::status] ==
"error");
79 "E2FE8D4AF3FCC3944DDF6CD8CDDC5E3F0AD50863EF8919AFEF10CB6408CD4D05"};
84 Json::Value const result{env.rpc(
"transaction_entry")};
85 BEAST_EXPECT(result[jss::ledger_hash].asString().empty());
86 BEAST_EXPECT(result[jss::error] ==
"badSyntax");
87 BEAST_EXPECT(result[jss::status] ==
"error");
92 Json::Value const result{env.rpc(
"transaction_entry", txHash)};
93 BEAST_EXPECT(result[jss::error] ==
"badSyntax");
94 BEAST_EXPECT(result[jss::status] ==
"error");
100 env.rpc(
"transaction_entry", txHash.substr(1),
"closed")};
101 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
102 BEAST_EXPECT(result[jss::status] ==
"error");
108 env.rpc(
"transaction_entry", txHash +
"A",
"closed")};
109 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
110 BEAST_EXPECT(result[jss::status] ==
"error");
116 env.rpc(
"transaction_entry", txHash,
"closer")};
117 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
118 BEAST_EXPECT(result[jss::status] ==
"error");
123 Json::Value const result{env.rpc(
"transaction_entry", txHash,
"0")};
124 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
125 BEAST_EXPECT(result[jss::status] ==
"error");
131 env.rpc(
"transaction_entry", txHash,
"closed",
"extra")};
132 BEAST_EXPECT(result[jss::error] ==
"badSyntax");
133 BEAST_EXPECT(result[jss::status] ==
"error");
139 env.rpc(
"transaction_entry", txHash,
"closed")};
141 !result[jss::result][jss::ledger_hash].asString().empty());
143 result[jss::result][jss::error] ==
"transactionNotFound");
144 BEAST_EXPECT(result[jss::result][jss::status] ==
"error");
152 using namespace test::jtx;
155 auto check_tx = [
this, &env, apiVersion](
162 Json::Value const resIndex{[&env, index, &txhash, apiVersion]() {
164 params[jss::ledger_index] = index;
165 params[jss::tx_hash] = txhash;
166 params[jss::api_version] = apiVersion;
167 return env.client().invoke(
168 "transaction_entry", params)[jss::result];
171 if (!BEAST_EXPECT(resIndex.isMember(jss::tx_json)))
174 BEAST_EXPECT(resIndex[jss::validated] ==
true);
175 BEAST_EXPECT(resIndex[jss::ledger_index] == index);
176 BEAST_EXPECT(resIndex[jss::ledger_hash] == expected_ledger_hash);
179 BEAST_EXPECT(resIndex[jss::hash] == txhash);
180 BEAST_EXPECT(!resIndex[jss::tx_json].isMember(jss::hash));
181 BEAST_EXPECT(!resIndex[jss::tx_json].isMember(jss::Amount));
183 if (BEAST_EXPECT(!close_time_iso.
empty()))
185 resIndex[jss::close_time_iso] == close_time_iso);
189 BEAST_EXPECT(resIndex[jss::tx_json][jss::hash] == txhash);
190 BEAST_EXPECT(!resIndex.isMember(jss::hash));
191 BEAST_EXPECT(!resIndex.isMember(jss::close_time_iso));
194 if (!expected_json.empty())
199 Throw<std::runtime_error>(
200 "Internal JSONRPC_test error. Bad test JSON.");
202 for (
auto memberIt = expected.
begin();
203 memberIt != expected.
end();
206 auto const name = memberIt.memberName();
207 if (BEAST_EXPECT(resIndex[jss::tx_json].isMember(name)))
209 auto const received = resIndex[jss::tx_json][name];
211 received == *memberIt,
212 txhash +
" contains \n\"" + name +
"\": "
224 params[jss::ledger_hash] = resIndex[jss::ledger_hash];
225 params[jss::tx_hash] = txhash;
226 params[jss::api_version] = apiVersion;
228 "transaction_entry", params)[jss::result];
229 BEAST_EXPECT(resHash == resIndex);
238 BEAST_EXPECT(clIndex[
"result"] == resIndex);
245 resIndex[jss::ledger_hash].asString())};
246 BEAST_EXPECT(clHash[
"result"] == resIndex);
252 env.fund(XRP(10000), A1);
254 boost::lexical_cast<std::string>(env.tx()->getTransactionID());
257 "F4E9DF90D829A9E8B423FF68C34413E240D8D8BB0EFD080DF08114ED398E2506");
259 env.fund(XRP(10000), A2);
261 boost::lexical_cast<std::string>(env.tx()->getTransactionID());
264 "6853CD8226A05068C951CB1F54889FF4E40C5B440DC1C5BA38F114C4E0B1E705");
274 "Account" : "r4nmQNH4Fhjfh6cHDbvVSsBv7KySbj4cBf",
278 "SigningPubKey" : "0324CAAFA2212D2AEAB9D42D481535614AED486293E1FB1380FF070C3DD7FB4264",
279 "TransactionType" : "AccountSet",
280 "TxnSignature" : "3044022007B35E3B99460534FF6BC3A66FBBA03591C355CC38E38588968E87CCD01BE229022071A443026DE45041B55ABB1CC76812A87EA701E475BBB7E165513B4B242D3474",
282 "ADB727BCC74B29421BB01B847740B179B8A0ED3248D76A89ED2E39B02C427784",
283 "2000-01-01T00:00:10Z");
288 "Account" : "rGpeQzUWFu4fMhJHZ1Via5aqFC3A5twZUD",
292 "SigningPubKey" : "03CFF28E067A2CCE6CC5A598C0B845CBD3F30A7863BE9C0DD55F4960EFABCCF4D0",
293 "TransactionType" : "AccountSet",
294 "TxnSignature" : "3045022100C8857FC0759A2AC0D2F320684691A66EAD252EAED9EF88C79791BC58BFCC9D860220421722286487DD0ED6BBA626CE6FCBDD14289F7F4726870C3465A4054C2702D7",
296 "ADB727BCC74B29421BB01B847740B179B8A0ED3248D76A89ED2E39B02C427784",
297 "2000-01-01T00:00:10Z");
299 env.trust(A2[
"USD"](1000), A1);
304 boost::lexical_cast<std::string>(env.tx()->getTransactionID());
307 "C992D97D88FF444A1AB0C06B27557EC54B7F7DA28254778E60238BEA88E0C101");
309 env(pay(A2, A1, A2[
"USD"](5)));
311 boost::lexical_cast<std::string>(env.tx()->getTransactionID());
315 "988046D484ACE9F5F6A8C792D89C6EA2DB307B5DDA9864AEBA88E6782ABD0865");
321 "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
323 "Destination" : "r4nmQNH4Fhjfh6cHDbvVSsBv7KySbj4cBf",
325 "Flags" : 2147483648,
327 "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020",
328 "TransactionType" : "Payment",
329 "TxnSignature" : "3044022033D9EBF7F02950AF2F6B13C07AEE641C8FEBDD540A338FCB9027A965A4AED35B02206E4E227DCC226A3456C0FEF953449D21645A24EB63CA0BB7C5B62470147FD1D1",
331 "3A6E375BFDFF029A571AFBB3BC46C4F52963FAF043B406D0E59A7194C1A8F98E",
332 "2000-01-01T00:00:20Z");
338 "Account" : "rGpeQzUWFu4fMhJHZ1Via5aqFC3A5twZUD",
342 "issuer" : "rGpeQzUWFu4fMhJHZ1Via5aqFC3A5twZUD",
345 "Destination" : "r4nmQNH4Fhjfh6cHDbvVSsBv7KySbj4cBf",
347 "Flags" : 2147483648,
349 "SigningPubKey" : "03CFF28E067A2CCE6CC5A598C0B845CBD3F30A7863BE9C0DD55F4960EFABCCF4D0",
350 "TransactionType" : "Payment",
351 "TxnSignature" : "30450221008A722B7F16EDB2348886E88ED4EC682AE9973CC1EE0FF37C93BB2CEC821D3EDF022059E464472031BA5E0D88A93E944B6A8B8DB3E1D5E5D1399A805F615789DB0BED",
353 "3A6E375BFDFF029A571AFBB3BC46C4F52963FAF043B406D0E59A7194C1A8F98E",
354 "2000-01-01T00:00:20Z");
356 env(offer(A2, XRP(100), A2[
"USD"](1)));
358 boost::lexical_cast<std::string>(env.tx()->getTransactionID());
361 "5FCC1A27A7664F82A0CC4BE5766FBBB7C560D52B93AA7B550CD33B27AEC7EFFB");
368 "Account" : "rGpeQzUWFu4fMhJHZ1Via5aqFC3A5twZUD",
371 "SigningPubKey" : "03CFF28E067A2CCE6CC5A598C0B845CBD3F30A7863BE9C0DD55F4960EFABCCF4D0",
375 "issuer" : "rGpeQzUWFu4fMhJHZ1Via5aqFC3A5twZUD",
378 "TakerPays" : "100000000",
379 "TransactionType" : "OfferCreate",
380 "TxnSignature" : "304502210093FC93ACB77B4E3DE3315441BD010096734859080C1797AB735EB47EBD541BD102205020BB1A7C3B4141279EE4C287C13671E2450EA78914EFD0C6DB2A18344CD4F2",
382 "73D6C8E66E0DC22F3E6F7D39BF795A6831BEB412823A986C7CC19470C93557C0",
383 "2000-01-01T00:00:30Z");
396BEAST_DEFINE_TESTSUITE(TransactionEntry, rpc,
ripple);
Unserialize a JSON document into a Value.
bool parse(std::string const &document, Value &root)
Read a Value from a JSON document.
const_iterator begin() const
const_iterator end() const
testcase_t testcase
Memberspace for declaring test cases.
void testRequest(unsigned apiVersion)
void run() override
Runs the suite.
@ objectValue
object value (collection of name/value pairs).
bool contains_error(Json::Value const &json)
Returns true if the json contains an rpc error specification.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
void forAllApiVersions(Fn const &fn, Args &&... args)
std::string to_string(base_uint< Bits, Tag > const &a)