diff --git a/src/rpc/handlers/AccountLines.cpp b/src/rpc/handlers/AccountLines.cpp index 5644e7daf..6459e27d6 100644 --- a/src/rpc/handlers/AccountLines.cpp +++ b/src/rpc/handlers/AccountLines.cpp @@ -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; diff --git a/tests/unit/rpc/RPCHelpersTests.cpp b/tests/unit/rpc/RPCHelpersTests.cpp index cfc0c7e03..0dd500d34 100644 --- a/tests/unit/rpc/RPCHelpersTests.cpp +++ b/tests/unit/rpc/RPCHelpersTests.cpp @@ -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, _)) diff --git a/tests/unit/rpc/handlers/AccountLinesTests.cpp b/tests/unit/rpc/handlers/AccountLinesTests.cpp index 2d0b72aa8..1b774fd49 100644 --- a/tests/unit/rpc/handlers/AccountLinesTests.cpp +++ b/tests/unit/rpc/handlers/AccountLinesTests.cpp @@ -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 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) {