From 110b2225795d82a82cfb0eca53f868e762f47f07 Mon Sep 17 00:00:00 2001 From: tequ Date: Mon, 15 Sep 2025 18:52:42 +0900 Subject: [PATCH] add MaxFee test --- src/test/app/Sponsor_test.cpp | 73 +++++++++++++++++++++++++---------- src/test/jtx/impl/sponsor.cpp | 40 ++++++++++++++++++- src/test/jtx/sponsor.h | 18 ++++++++- 3 files changed, 108 insertions(+), 23 deletions(-) diff --git a/src/test/app/Sponsor_test.cpp b/src/test/app/Sponsor_test.cpp index dd3607cc17..2d13b3a0fb 100644 --- a/src/test/app/Sponsor_test.cpp +++ b/src/test/app/Sponsor_test.cpp @@ -118,24 +118,25 @@ public: env(sponsor::set(sponsor, sponsor, 0), ter(temMALFORMED)); // Invalid feeAmount - env(sponsor::set( - sponsor, alice, tfSponsorshipClearRequireSignForFee, 0, XRP(1)), + env(sponsor::set_fee( + sponsor, alice, tfSponsorshipClearRequireSignForFee, XRP(1)), ter(temMALFORMED)); for (auto amt : {XRP(-1), XRP(0), USD(1)}) { - env(sponsor::set(sponsor, alice, 0, 1, amt), ter(temBAD_AMOUNT)); + env(sponsor::set_fee(sponsor, alice, 0, amt), ter(temBAD_AMOUNT)); } // Invalid reserveCount - env(sponsor::set( + env(sponsor::set_reserve( sponsor, alice, tfSponsorshipClearRequireSignForReserve, 1), ter(temMALFORMED)); - env(sponsor::set(sponsor, alice, 0, 0), ter(temMALFORMED)); + env(sponsor::set_reserve(sponsor, alice, 0, 0), ter(temMALFORMED)); // Invalid Delete operation - env(sponsor::set(sponsor, alice, tfDeleteObject, 1), ter(temMALFORMED)); - env(sponsor::set(sponsor, alice, tfDeleteObject, std::nullopt, XRP(1)), + env(sponsor::set_reserve(sponsor, alice, tfDeleteObject, 1), + ter(temMALFORMED)); + env(sponsor::set_fee(sponsor, alice, tfDeleteObject, XRP(1)), ter(temMALFORMED)); // TODO: test MaxFee with tfDeleteObject @@ -590,7 +591,7 @@ public: BEAST_EXPECT(env.balance(sponsor) == sponsorBalance); } - env(sponsor::set(sponsor, alice, 0, std::nullopt, XRP(100))); + env(sponsor::set_fee(sponsor, alice, 0, XRP(100))); env.close(); { @@ -616,21 +617,51 @@ public: { // insufficient balance to pay fee - auto aliceBalance = env.balance(alice); - auto bobBalance = env.balance(bob); - auto sponsorBalance = env.balance(sponsor); - auto sponsorFee = sponsorFeeBalance(sponsor, alice); + { + // > FeeAmount + auto aliceBalance = env.balance(alice); + auto bobBalance = env.balance(bob); + auto sponsorBalance = env.balance(sponsor); + auto sponsorFee = sponsorFeeBalance(sponsor, alice); - env(pay(alice, bob, XRP(100)), - fee(XRP(2000)), - sponsor::as(sponsor, tfSponsorFee), - ter(terINSUF_FEE_B)); + env(pay(alice, bob, XRP(100)), + fee(XRP(100) + drops(1)), + sponsor::as(sponsor, tfSponsorFee), + ter(terINSUF_FEE_B)); + env.close(); + + BEAST_EXPECT(env.balance(alice) == aliceBalance); + BEAST_EXPECT(env.balance(bob) == bobBalance); + BEAST_EXPECT(env.balance(sponsor) == sponsorBalance); + BEAST_EXPECT( + sponsorFeeBalance(sponsor, alice) == sponsorFee); + } + + // reset FeeAmount and MaxFee + env(sponsor::del(sponsor, alice)); + env.close(); + env(sponsor::set_fee(sponsor, alice, 0, XRP(10), XRP(1))); env.close(); - BEAST_EXPECT(env.balance(alice) == aliceBalance); - BEAST_EXPECT(env.balance(bob) == bobBalance); - BEAST_EXPECT(env.balance(sponsor) == sponsorBalance); - BEAST_EXPECT(sponsorFeeBalance(sponsor, alice) == sponsorFee); + { + // > MaxFee + auto aliceBalance = env.balance(alice); + auto bobBalance = env.balance(bob); + auto sponsorBalance = env.balance(sponsor); + auto sponsorFee = sponsorFeeBalance(sponsor, alice); + + env(pay(alice, bob, XRP(100)), + fee(XRP(1) + drops(1)), + sponsor::as(sponsor, tfSponsorFee), + ter(terINSUF_FEE_B)); + env.close(); + + BEAST_EXPECT(env.balance(alice) == aliceBalance); + BEAST_EXPECT(env.balance(bob) == bobBalance); + BEAST_EXPECT(env.balance(sponsor) == sponsorBalance); + BEAST_EXPECT( + sponsorFeeBalance(sponsor, alice) == sponsorFee); + } } { @@ -640,7 +671,7 @@ public: auto bobBalance = env.balance(bob); auto sponsorBalance = env.balance(sponsor); auto sponsorFee = sponsorFeeBalance(sponsor, alice); - auto const feeAmt = XRP(10); + auto const feeAmt = XRP(1); env(pay(alice, bob, XRP(20000)), fee(feeAmt), diff --git a/src/test/jtx/impl/sponsor.cpp b/src/test/jtx/impl/sponsor.cpp index 6bfe074c16..8286b52cc8 100644 --- a/src/test/jtx/impl/sponsor.cpp +++ b/src/test/jtx/impl/sponsor.cpp @@ -36,7 +36,8 @@ set(jtx::Account const& account, jtx::Account const& sponsee, uint32_t flags, std::optional reserveCount, - std::optional feeAmount) + std::optional feeAmount, + std::optional maxFee) { Json::Value jv; jv[jss::TransactionType] = jss::SponsorshipSet; @@ -47,6 +48,43 @@ set(jtx::Account const& account, jv[sfReserveCount.jsonName] = *reserveCount; if (feeAmount) jv[sfFeeAmount.jsonName] = feeAmount->getJson(JsonOptions::none); + if (maxFee) + jv[sfMaxFee.jsonName] = maxFee->getJson(JsonOptions::none); + return jv; +} + +Json::Value +set_fee( + jtx::Account const& account, + jtx::Account const& sponsee, + uint32_t flags, + STAmount feeAmount, + std::optional maxFee) +{ + Json::Value jv; + jv[jss::TransactionType] = jss::SponsorshipSet; + jv[jss::Account] = account.human(); + jv[sfSponsee.jsonName] = sponsee.human(); + jv[sfFlags.jsonName] = flags; + jv[sfFeeAmount.jsonName] = feeAmount.getJson(JsonOptions::none); + if (maxFee) + jv[sfMaxFee.jsonName] = maxFee->getJson(JsonOptions::none); + return jv; +} + +Json::Value +set_reserve( + jtx::Account const& account, + jtx::Account const& sponsee, + uint32_t flags, + uint32_t reserveCount) +{ + Json::Value jv; + jv[jss::TransactionType] = jss::SponsorshipSet; + jv[jss::Account] = account.human(); + jv[sfSponsee.jsonName] = sponsee.human(); + jv[sfFlags.jsonName] = flags; + jv[sfReserveCount.jsonName] = reserveCount; return jv; } diff --git a/src/test/jtx/sponsor.h b/src/test/jtx/sponsor.h index bd603c0d41..a5dcc88872 100644 --- a/src/test/jtx/sponsor.h +++ b/src/test/jtx/sponsor.h @@ -34,7 +34,23 @@ set(jtx::Account const& account, jtx::Account const& sponsee, std::uint32_t flags, std::optional reserveCount = std::nullopt, - std::optional feeAmount = std::nullopt); + std::optional feeAmount = std::nullopt, + std::optional maxFee = std::nullopt); + +Json::Value +set_fee( + jtx::Account const& account, + jtx::Account const& sponsee, + std::uint32_t flags, + STAmount feeAmount, + std::optional maxFee = std::nullopt); + +Json::Value +set_reserve( + jtx::Account const& account, + jtx::Account const& sponsee, + std::uint32_t flags, + std::uint32_t reserveCount); Json::Value del(jtx::Account const& account, jtx::Account const& sponsee);