2#include <test/jtx/WSClient.h>
4#include <xrpl/beast/unit_test.h>
5#include <xrpl/beast/unit_test/suite.h>
6#include <xrpl/protocol/jss.h>
85 if (t[jss::TransactionType].asString() != jss::Payment)
88 bool isSet = metaData.
isMember(jss::delivered_amount);
89 bool isSetUnavailable =
false;
90 bool isSetAvailable =
false;
93 if (metaData[jss::delivered_amount] !=
"unavailable")
94 isSetAvailable =
true;
96 isSetUnavailable =
true;
100 else if (isSetUnavailable)
107 if (metaData.
isMember(sfDeliveredAmount.jsonName))
109 if (metaData[jss::delivered_amount] != metaData[sfDeliveredAmount.jsonName])
116 if (metaData[jss::delivered_amount] != t[jss::Amount])
121 if (metaData[jss::delivered_amount] !=
"unavailable")
127 if (metaData[sfTransactionResult.jsonName] !=
"tesSUCCESS")
141 if (metaData.
isMember(sfDeliveredAmount.jsonName))
148 if (!isSetUnavailable)
162 testcase(
"Ledger Request Subscribe DeliveredAmount");
164 using namespace test::jtx;
165 using namespace std::chrono_literals;
170 auto const gw =
Account(
"gateway");
171 auto const USD = gw[
"USD"];
173 for (
bool const afterSwitchTime : {
true,
false})
176 cfg->FEES.reference_fee = 10;
177 Env env(*
this, std::move(cfg));
178 env.
fund(
XRP(10000), alice, bob, carol, gw);
179 env.
trust(USD(1000), alice, bob, carol);
190 env(
pay(gw, alice, USD(50)));
191 checkDeliveredAmount.adjCountersSuccess();
192 env(
pay(gw, alice,
XRP(50)));
193 checkDeliveredAmount.adjCountersSuccess();
197 checkDeliveredAmount.adjCountersPartialPayment();
202 checkDeliveredAmount.adjCountersFail();
212 stream[jss::streams].append(
"ledger");
214 stream[jss::accounts].append(
toBase58(alice.
id()));
215 stream[jss::accounts].append(
toBase58(bob.
id()));
216 stream[jss::accounts].append(
toBase58(carol.
id()));
217 auto jv = wsc->invoke(
"subscribe", stream);
218 if (wsc->version() == 2)
220 BEAST_EXPECT(jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
221 BEAST_EXPECT(jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
222 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
224 BEAST_EXPECT(jv[jss::result][jss::ledger_index] == 3);
231 auto const r = wsc->findMsg(1s, [&](
auto const& jv) {
return jv[jss::ledger_index] == 4; });
235 if (!r->isMember(jss::transaction))
238 BEAST_EXPECT(checkDeliveredAmount.checkTxn((*r)[jss::transaction], (*r)[jss::meta]));
241 BEAST_EXPECT(checkDeliveredAmount.checkExpectedCounters());
247 testcase(
"Ledger Request RPC DeliveredAmount");
249 using namespace test::jtx;
250 using namespace std::chrono_literals;
255 auto const gw =
Account(
"gateway");
256 auto const USD = gw[
"USD"];
258 for (
bool const afterSwitchTime : {
true,
false})
261 cfg->FEES.reference_fee = 10;
262 Env env(*
this, std::move(cfg));
263 env.
fund(
XRP(10000), alice, bob, carol, gw);
264 env.
trust(USD(1000), alice, bob, carol);
272 env(
pay(gw, alice, USD(50)));
273 checkDeliveredAmount.adjCountersSuccess();
274 env(
pay(gw, alice,
XRP(50)));
275 checkDeliveredAmount.adjCountersSuccess();
279 checkDeliveredAmount.adjCountersPartialPayment();
284 checkDeliveredAmount.adjCountersFail();
290 jvParams[jss::ledger_index] = 4u;
291 jvParams[jss::transactions] =
true;
292 jvParams[jss::expand] =
true;
294 env.
rpc(
"json",
"ledger",
to_string(jvParams))[jss::result][jss::ledger][jss::transactions];
295 for (
auto const& t : jtxn)
296 BEAST_EXPECT(checkDeliveredAmount.checkTxn(t, t[jss::metaData]));
297 BEAST_EXPECT(checkDeliveredAmount.checkExpectedCounters());
310 Env env{*
this, features};
312 MPTTester mptAlice(env, alice, {.holders = {bob, carol}, .close =
false});
315 auto const MPT = mptAlice[
"MPT"];
317 mptAlice.authorize({.account = bob});
318 mptAlice.authorize({.account = carol});
321 mptAlice.pay(alice, bob, 10000);
329 Json::Value meta = env.rpc(
"tx", txHash)[jss::result][jss::meta];
331 if (features[fixMPTDeliveredAmount])
338 BEAST_EXPECT(!meta.
isMember(sfDeliveredAmount.jsonName));
339 BEAST_EXPECT(meta[jss::delivered_amount] =
Json::Value(
"unavailable"));
346 meta = env.rpc(
"tx", txHash)[jss::result][jss::meta];
348 if (features[fixMPTDeliveredAmount])
355 BEAST_EXPECT(!meta.
isMember(sfDeliveredAmount.jsonName));
356 BEAST_EXPECT(meta[jss::delivered_amount] =
Json::Value(
"unavailable"));
364 using namespace test::jtx;
375BEAST_DEFINE_TESTSUITE(DeliveredAmount,
rpc,
xrpl);
bool isMember(char const *key) const
Return true if the object has a member named key.
testcase_t testcase
Memberspace for declaring test cases.
virtual Config & config()=0
Json::Value getJson(JsonOptions=JsonOptions::none) const override
bool checkTxn(Json::Value const &t, Json::Value const &metaData)
void adjCountersSuccess()
CheckDeliveredAmount(bool afterSwitchTime)
bool checkExpectedCounters() const
int numExpectedSetUnavailable_
int numExpectedAvailable_
void adjCountersPartialPayment()
void adjCounters(bool success, bool partial)
void run() override
Runs the suite.
void testAccountDeliveredAmountSubscribe()
void testMPTDeliveredAmountRPC(FeatureBitset features)
void testTxDeliveredAmountRPC()
Immutable cryptographic account descriptor.
AccountID id() const
Returns the Account ID.
A transaction testing environment.
bool close(NetClock::time_point closeTime, std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)
Close and advance the ledger.
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
void trust(STAmount const &amount, Account const &account)
Establish trust lines.
Json::Value rpc(unsigned apiVersion, std::unordered_map< std::string, std::string > const &headers, std::string const &cmd, Args &&... args)
Execute an RPC command.
void require(Args const &... args)
Check a set of requirements.
void create(MPTCreate const &arg=MPTCreate{})
Converts to MPT Issue or STAmount.
Set the expected result code for a JTx The test will fail if the code doesn't match.
Sets the SendMax on a JTx.
Set the expected result code for a JTx The test will fail if the code doesn't match.
@ arrayValue
array value (ordered list)
XRP_t const XRP
Converts to XRP Issue or STAmount.
Json::Value pay(AccountID const &account, AccountID const &to, AnyAmount amount)
Create a payment.
FeatureBitset testable_amendments()
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
std::unique_ptr< WSClient > makeWSClient(Config const &cfg, bool v2, unsigned rpc_version, std::unordered_map< std::string, std::string > const &headers)
Returns a client operating through WebSockets/S.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
constexpr std::uint32_t const tfMPTCanTransfer
std::string to_string(base_uint< Bits, Tag > const &a)
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
constexpr std::uint32_t tfPartialPayment