add tests

This commit is contained in:
tequ
2025-11-10 12:11:42 +09:00
parent fbf403aaa4
commit a49cb91c73
3 changed files with 107 additions and 22 deletions

View File

@@ -138,6 +138,13 @@ public:
sponsor::sponseeAcc(alice),
ter(temBAD_AMOUNT));
}
// Invalid MaxFee
for (auto amt : {XRP(-1), XRP(0), USD(1)})
{
env(sponsor::set_fee(sponsor, 0, XRP(1), amt),
sponsor::sponseeAcc(alice),
ter(temBAD_AMOUNT));
}
// Invalid reserveCount
env(sponsor::set_reserve(sponsor, 0, 0),
@@ -153,6 +160,14 @@ public:
ter(temMALFORMED));
// TODO: test MaxFee with tfDeleteObject
// Invalid SponsorAccount with non-Delete operation
env(sponsor::set_reserve(sponsor, 0, 100),
sponsor::sponsorAcc(alice),
ter(temMALFORMED));
env(sponsor::set_fee(sponsor, 0, XRP(1), XRP(1)),
sponsor::sponsorAcc(alice),
ter(temMALFORMED));
//
// preclaim
//
@@ -162,14 +177,21 @@ public:
sponsor::sponseeAcc(noFunded),
ter(tecNO_DST));
// Invalid Delete operation (not found)
// Invalid Delete operation (sponsorship not found)
env(sponsor::set(sponsor, tfDeleteObject),
sponsor::sponseeAcc(alice),
ter(tecNO_ENTRY));
// DisallowIncomingSponsor: tested in other testcase
// insufficent reserve to create sponsorship
adjustAccountXRPBalance(env, sponsor, reserve(env, 1) - drops(1));
env(sponsor::set(sponsor, 0, 100, XRP(100)),
sponsor::sponseeAcc(alice),
ter(tecUNFUNDED));
// create sponsor to use above tests
adjustAccountXRPBalance(env, sponsor, reserve(env, 1));
env(sponsor::set(sponsor, 0, 100, XRP(100)),
sponsor::sponseeAcc(alice),
ter(tesSUCCESS));
@@ -612,14 +634,12 @@ public:
Account const bob("bob");
Account const sponsor1("sponsor1");
Account const sponsor2("sponsor2");
env.fund(XRP(10000), alice, bob);
env.fund(
env.current()->fees().reserve +
env.current()->fees().increment - drops(1),
sponsor1,
sponsor2);
env.fund(XRP(10000), alice, bob, sponsor1, sponsor2);
env.close();
adjustAccountXRPBalance(env, sponsor1, reserve(env, 1) - drops(1));
adjustAccountXRPBalance(env, sponsor2, reserve(env, 1) - drops(1));
auto const seq = env.seq(alice);
env(check::create(alice, bob, XRP(1)));
env.close();
@@ -636,6 +656,13 @@ public:
env(pay(alice, sponsor1, drops(1)));
env.close();
// Invalid ObjectID (not found)
env(sponsor::transfer(alice, keylet::check(alice, 0).key),
sponsor::as(sponsor1, tfSponsorReserve),
sig(sfSponsorSignature, sponsor1),
ter(tecNO_ENTRY));
env.close();
// Invalid Owner
env(sponsor::transfer(bob, checkId),
sponsor::as(sponsor1, tfSponsorReserve),
@@ -688,20 +715,26 @@ public:
BEAST_EXPECT(sle2->getAccountID(sfSponsorAccount) == sponsor2.id());
// dissolve sponsor
env(pay(alice,
sponsor2,
(env.balance(alice).value() -
env.current()->fees().reserve -
env.current()->fees().increment - XRP(1) + drops(1))),
fee(XRP(1)));
env.close();
adjustAccountXRPBalance(env, alice, reserve(env, 1) - drops(1));
env(sponsor::transfer(alice, checkId),
ter(tecINSUFFICIENT_RESERVE));
env.close();
env(pay(sponsor2, alice, XRP(1)));
adjustAccountXRPBalance(env, alice, reserve(env, 1));
// object doesn't sponsored
auto const ticketSeq = env.seq(alice);
env(ticket::create(alice, 1));
env.close();
auto ticketId = keylet::ticket(alice, ticketSeq + 1).key;
BEAST_EXPECT(env.le(keylet::unchecked(ticketId)));
env(sponsor::transfer(alice, ticketId), ter(tecNO_PERMISSION));
env.close();
env(noop(alice), ticket::use(ticketSeq + 1));
env.close();
adjustAccountXRPBalance(env, alice, reserve(env, 1));
env(sponsor::transfer(alice, checkId));
env.close();
@@ -4351,6 +4384,59 @@ public:
Account const bob("bob");
Account const carol("carol");
//
// SponsorshipTransfer
//
{
Env env{*this, testable_amendments()};
env.fund(XRP(1000000), alice, bob, carol);
env.close();
auto const seq = env.seq(alice);
env(check::create(alice, bob, XRP(1)));
env.close();
auto const keylet = keylet::check(alice, seq);
env(sponsor::transfer(alice, keylet.key),
sponsor::as(bob, tfSponsorReserve),
sig(sfSponsorSignature, bob),
delegate::as(carol),
ter(terNO_DELEGATE_PERMISSION));
env(delegate::set(alice, carol, {"SponsorshipTransfer"}));
env.close();
env(sponsor::transfer(alice, keylet.key),
sponsor::as(bob, tfSponsorReserve),
sig(sfSponsorSignature, bob),
delegate::as(carol),
ter(tesSUCCESS));
env.close();
}
//
// SponsorshipSet
//
{
Env env{*this, testable_amendments()};
env.fund(XRP(1000000), alice, bob, carol);
env.close();
env(sponsor::set(alice, 0, 100, XRP(100)),
sponsor::sponseeAcc(bob),
delegate::as(carol),
ter(terNO_DELEGATE_PERMISSION));
env(delegate::set(alice, carol, {"SponsorshipSet"}));
env.close();
env(sponsor::set(alice, 0, 100, XRP(100)),
sponsor::sponseeAcc(bob),
delegate::as(carol),
ter(tesSUCCESS));
env.close();
}
//
// Permission SponsorFee
//

View File

@@ -43,10 +43,6 @@ SponsorshipSet::preflight(PreflightContext const& ctx)
!ctx.tx.isFieldPresent(sfSponsee)))
return temMALFORMED;
// if (ctx.tx.isFieldPresent(sfSponsorAccount) &&
// !ctx.tx.isFlag(tfDeleteObject))
// return temMALFORMED;
auto const sponsor = ctx.tx.isFieldPresent(sfSponsorAccount)
? ctx.tx.getAccountID(sfSponsorAccount)
: ctx.tx.getAccountID(sfAccount);
@@ -186,7 +182,7 @@ SponsorshipSet::doApply()
auto const sponsorAccSle = ctx_.view().peek(keylet::account(sponsorAcc));
if (!sponsorAccSle)
return tecINTERNAL;
return tecINTERNAL; // LCOV_EXCL_LINE
auto const sponsorObjSle = ctx_.view().peek(keylet);
@@ -345,7 +341,7 @@ SponsorshipSet::deleteSponsorship(
// adjust balance
auto const sponsorAccSle = view.peek(keylet::account(sponsor));
if (!sponsorAccSle)
return tecINTERNAL;
return tecINTERNAL; // LCOV_EXCL_LINE
auto const feeAmount = sle->getFieldAmount(sfFeeAmount);
(*sponsorAccSle)[sfBalance] += feeAmount;

View File

@@ -134,10 +134,12 @@ getLedgerEntrySponsorField(T const& sle, AccountID const& owner)
if (lowAccount == owner)
return sfLowSponsorAccount;
}
// LCOV_EXCL_START
XRPL_ASSERT(
false,
"Should not happen. Owner should be checked before calling "
"this function.");
// LCOV_EXCL_END
}
default:
return sfSponsorAccount;
@@ -178,7 +180,8 @@ SponsorshipTransfer::preclaim(PreclaimContext const& ctx)
// transfer sponsor
// check if the object owner isn't the same as the new sponsor
if ((*newSponsor)->getAccountID(sfAccount) == owner)
return tecNO_PERMISSION;
// checked in above
return tecINTERNAL; // LCOV_EXCL_LINE
}
}
else