fix: incorrect set HighDeepFreeze flag (#1978)

fixes #1977
This commit is contained in:
Peter Chen
2025-04-02 09:53:35 -04:00
committed by GitHub
parent e61ee30180
commit 8a3e71e91f
3 changed files with 88 additions and 6 deletions

View File

@@ -86,8 +86,9 @@ AccountLinesHandler::addLine(
bool const lineNoRipplePeer = (flags & (not viewLowest ? ripple::lsfLowNoRipple : ripple::lsfHighNoRipple)) != 0u;
bool const lineFreeze = (flags & (viewLowest ? ripple::lsfLowFreeze : ripple::lsfHighFreeze)) != 0u;
bool const lineFreezePeer = (flags & (not viewLowest ? ripple::lsfLowFreeze : ripple::lsfHighFreeze)) != 0u;
bool const lineDeepFreeze = (flags & (viewLowest ? ripple::lsfLowDeepFreeze : ripple::lsfHighFreeze)) != 0u;
bool const lineDeepFreezePeer = (flags & (not viewLowest ? ripple::lsfLowDeepFreeze : ripple::lsfHighFreeze)) != 0u;
bool const lineDeepFreeze = (flags & (viewLowest ? ripple::lsfLowDeepFreeze : ripple::lsfHighDeepFreeze)) != 0u;
bool const lineDeepFreezePeer =
(flags & (not viewLowest ? ripple::lsfLowDeepFreeze : ripple::lsfHighDeepFreeze)) != 0u;
ripple::STAmount const& saBalance = balance;
ripple::STAmount const& saLimit = lineLimit;

View File

@@ -581,7 +581,7 @@ TEST_F(RPCHelpersTest, FetchAndCheckAnyFlagExists_BlobDoesNotExist)
});
}
TEST_F(RPCHelpersTest, FetchAndCheckAnyFlagExistsBlobExists_AccountWithCorrectFlag)
TEST_F(RPCHelpersTest, FetchAndCheckAnyFlagExists_AccountWithCorrectFlag)
{
auto const account = getAccountIdWithString(kACCOUNT);
auto const issuerKey = ripple::keylet::account(account);
@@ -600,12 +600,12 @@ TEST_F(RPCHelpersTest, FetchAndCheckAnyFlagExistsBlobExists_AccountWithCorrectFl
});
}
TEST_F(RPCHelpersTest, FetchAndCheckAnyFlagExistsBlobExists_AccountFlagDoesNotExist)
TEST_F(RPCHelpersTest, FetchAndCheckAnyFlagExists_TrustLineIsFrozenAndCheckFreezeFlag)
{
auto const account = getAccountIdWithString(kACCOUNT);
auto const issuerKey = ripple::keylet::account(account);
// create account with highDeepFreeze Flag
// create account with lowDeepFreeze Flag
auto const accountObject = createAccountRootObject(kACCOUNT, ripple::lsfLowDeepFreeze, 1, 10, 2, kTXN_ID, 3);
ON_CALL(*backend_, doFetchLedgerObject(issuerKey.key, kLEDGER_SEQ_OBJECT, _))

View File

@@ -19,6 +19,7 @@
#include "data/Types.hpp"
#include "rpc/Errors.hpp"
#include "rpc/RPCHelpers.hpp"
#include "rpc/common/AnyHandler.hpp"
#include "rpc/common/Types.hpp"
#include "rpc/handlers/AccountLines.hpp"
@@ -716,7 +717,7 @@ TEST_F(RPCAccountLinesHandlerTest, EmptyChannel)
});
}
TEST_F(RPCAccountLinesHandlerTest, OptionalResponseField)
TEST_F(RPCAccountLinesHandlerTest, OptionalResponseFieldWithDeepFreeze)
{
static constexpr auto kCORRECT_OUTPUT = R"({
"account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
@@ -806,6 +807,86 @@ TEST_F(RPCAccountLinesHandlerTest, OptionalResponseField)
});
}
TEST_F(RPCAccountLinesHandlerTest, FrozenTrustLineResponse)
{
static constexpr auto kCORRECT_OUTPUT = R"({
"account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"ledger_hash": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A652",
"ledger_index": 30,
"validated": true,
"limit": 200,
"lines": [
{
"account": "rLEsXccBGNR3UPuPu2hUXPjziKC3qKSBun",
"balance": "10",
"currency": "USD",
"limit": "100",
"limit_peer": "200",
"quality_in": 0,
"quality_out": 0,
"peer_authorized": true,
"freeze_peer": true
},
{
"account": "rLEsXccBGNR3UPuPu2hUXPjziKC3qKSBun",
"balance": "20",
"currency": "USD",
"limit": "200",
"limit_peer": "400",
"quality_in": 0,
"quality_out": 0,
"authorized": true,
"freeze": true
}
]
})";
auto ledgerHeader = createLedgerHeader(kLEDGER_HASH, 30);
EXPECT_CALL(*backend_, fetchLedgerBySequence).WillOnce(Return(ledgerHeader));
// fetch account object return something
auto account = getAccountIdWithString(kACCOUNT);
auto accountKk = ripple::keylet::account(account).key;
auto owneDirKk = ripple::keylet::ownerDir(account).key;
auto fake = Blob{'f', 'a', 'k', 'e'};
// return a non empty account
ON_CALL(*backend_, doFetchLedgerObject(accountKk, testing::_, testing::_)).WillByDefault(Return(fake));
// return owner index
ripple::STObject const ownerDir =
createOwnerDirLedgerObject({ripple::uint256{kINDEX1}, ripple::uint256{kINDEX2}}, kINDEX1);
ON_CALL(*backend_, doFetchLedgerObject(owneDirKk, testing::_, testing::_))
.WillByDefault(Return(ownerDir.getSerializer().peekData()));
// return few trust lines
std::vector<Blob> bbs;
auto line1 = createRippleStateLedgerObject("USD", kACCOUNT2, 10, kACCOUNT, 100, kACCOUNT2, 200, kTXN_ID, 0);
line1.setFlag(ripple::lsfHighAuth);
line1.setFlag(ripple::lsfHighFreeze);
bbs.push_back(line1.getSerializer().peekData());
auto line2 = createRippleStateLedgerObject("USD", kACCOUNT2, 20, kACCOUNT, 200, kACCOUNT2, 400, kTXN_ID, 0);
line2.setFlag(ripple::lsfLowAuth);
line2.setFlag(ripple::lsfLowFreeze);
bbs.push_back(line2.getSerializer().peekData());
EXPECT_CALL(*backend_, doFetchLedgerObjects).WillOnce(Return(bbs));
auto const input = json::parse(fmt::format(
R"({{
"account": "{}"
}})",
kACCOUNT
));
runSpawn([&, this](auto yield) {
auto handler = AnyHandler{AccountLinesHandler{this->backend_}};
auto const output = handler.process(input, Context{yield});
ASSERT_TRUE(output);
EXPECT_EQ(json::parse(kCORRECT_OUTPUT), *output.result);
});
}
// normal case : test marker output correct
TEST_F(RPCAccountLinesHandlerTest, MarkerOutput)
{