Skip to content

Commit 51dbd09

Browse files
fix: Empty signer list (#2746)
fixes #2730
1 parent 1ecc6a6 commit 51dbd09

File tree

3 files changed

+61
-27
lines changed

3 files changed

+61
-27
lines changed

src/rpc/handlers/AccountInfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ AccountInfoHandler::process(AccountInfoHandler::Input const& input, Context cons
113113
// This code will need to be revisited if in the future we
114114
// support multiple SignerLists on one account.
115115
auto const signers = sharedPtrBackend_->fetchLedgerObject(signersKey.key, lgrInfo.seq, ctx.yield);
116+
out.signerLists = std::vector<ripple::STLedgerEntry>();
116117

117118
if (signers) {
118119
ripple::STLedgerEntry const sleSigners{
@@ -122,7 +123,7 @@ AccountInfoHandler::process(AccountInfoHandler::Input const& input, Context cons
122123
if (!signersKey.check(sleSigners))
123124
return Error{Status{RippledError::rpcDB_DESERIALIZATION}};
124125

125-
out.signerLists = std::vector<ripple::STLedgerEntry>{sleSigners};
126+
out.signerLists->push_back(sleSigners);
126127
}
127128
}
128129

src/rpc/handlers/AccountInfo.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
#include <memory>
3838
#include <optional>
3939
#include <string>
40-
#include <utility>
4140
#include <vector>
4241

4342
namespace rpc {

tests/unit/rpc/handlers/AccountInfoTests.cpp

Lines changed: 59 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,8 @@ TEST_F(AccountInfoParameterTest, ApiV1SignerListIsNotBool)
183183

184184
TEST_F(RPCAccountInfoHandlerTest, LedgerNonExistViaIntSequence)
185185
{
186-
EXPECT_CALL(*backend_, fetchLedgerBySequence).Times(1);
187186
// return empty ledgerHeader
188-
ON_CALL(*backend_, fetchLedgerBySequence(30, _)).WillByDefault(Return(std::optional<ripple::LedgerHeader>{}));
187+
EXPECT_CALL(*backend_, fetchLedgerBySequence(30, _)).WillOnce(Return(std::optional<ripple::LedgerHeader>{}));
189188

190189
static auto const kINPUT = json::parse(
191190
fmt::format(
@@ -208,9 +207,8 @@ TEST_F(RPCAccountInfoHandlerTest, LedgerNonExistViaIntSequence)
208207

209208
TEST_F(RPCAccountInfoHandlerTest, LedgerNonExistViaStringSequence)
210209
{
211-
EXPECT_CALL(*backend_, fetchLedgerBySequence).Times(1);
212210
// return empty ledgerHeader
213-
ON_CALL(*backend_, fetchLedgerBySequence(30, _)).WillByDefault(Return(std::nullopt));
211+
EXPECT_CALL(*backend_, fetchLedgerBySequence(30, _)).WillOnce(Return(std::nullopt));
214212

215213
static auto const kINPUT = json::parse(
216214
fmt::format(
@@ -233,10 +231,9 @@ TEST_F(RPCAccountInfoHandlerTest, LedgerNonExistViaStringSequence)
233231

234232
TEST_F(RPCAccountInfoHandlerTest, LedgerNonExistViaHash)
235233
{
236-
EXPECT_CALL(*backend_, fetchLedgerByHash).Times(1);
237234
// return empty ledgerHeader
238-
ON_CALL(*backend_, fetchLedgerByHash(ripple::uint256{kLEDGER_HASH}, _))
239-
.WillByDefault(Return(std::optional<ripple::LedgerHeader>{}));
235+
EXPECT_CALL(*backend_, fetchLedgerByHash(ripple::uint256{kLEDGER_HASH}, _))
236+
.WillOnce(Return(std::optional<ripple::LedgerHeader>{}));
240237

241238
static auto const kINPUT = json::parse(
242239
fmt::format(
@@ -261,11 +258,10 @@ TEST_F(RPCAccountInfoHandlerTest, LedgerNonExistViaHash)
261258
TEST_F(RPCAccountInfoHandlerTest, AccountNotExist)
262259
{
263260
auto const ledgerHeader = createLedgerHeader(kLEDGER_HASH, 30);
264-
EXPECT_CALL(*backend_, fetchLedgerBySequence).Times(1);
261+
EXPECT_CALL(*backend_, fetchLedgerBySequence).WillOnce(Return(ledgerHeader));
265262

266-
ON_CALL(*backend_, fetchLedgerBySequence).WillByDefault(Return(ledgerHeader));
267263
ON_CALL(*backend_, doFetchLedgerObject).WillByDefault(Return(std::optional<Blob>{}));
268-
EXPECT_CALL(*backend_, doFetchLedgerObject).Times(1);
264+
EXPECT_CALL(*backend_, doFetchLedgerObject);
269265

270266
static auto const kINPUT = json::parse(
271267
fmt::format(
@@ -288,12 +284,11 @@ TEST_F(RPCAccountInfoHandlerTest, AccountNotExist)
288284
TEST_F(RPCAccountInfoHandlerTest, AccountInvalid)
289285
{
290286
auto const ledgerHeader = createLedgerHeader(kLEDGER_HASH, 30);
291-
EXPECT_CALL(*backend_, fetchLedgerBySequence).Times(1);
287+
EXPECT_CALL(*backend_, fetchLedgerBySequence).WillOnce(Return(ledgerHeader));
292288

293-
ON_CALL(*backend_, fetchLedgerBySequence).WillByDefault(Return(ledgerHeader));
294289
// return a valid ledger object but not account root
295290
ON_CALL(*backend_, doFetchLedgerObject).WillByDefault(Return(createLegacyFeeSettingBlob(1, 2, 3, 4, 0)));
296-
EXPECT_CALL(*backend_, doFetchLedgerObject).Times(1);
291+
EXPECT_CALL(*backend_, doFetchLedgerObject);
297292

298293
static auto const kINPUT = json::parse(
299294
fmt::format(
@@ -316,9 +311,8 @@ TEST_F(RPCAccountInfoHandlerTest, AccountInvalid)
316311
TEST_F(RPCAccountInfoHandlerTest, SignerListsInvalid)
317312
{
318313
auto const ledgerHeader = createLedgerHeader(kLEDGER_HASH, 30);
319-
EXPECT_CALL(*backend_, fetchLedgerBySequence).Times(1);
314+
EXPECT_CALL(*backend_, fetchLedgerBySequence).WillOnce(Return(ledgerHeader));
320315

321-
ON_CALL(*backend_, fetchLedgerBySequence).WillByDefault(Return(ledgerHeader));
322316
auto const account = getAccountIdWithString(kACCOUNT);
323317
auto const accountKk = ripple::keylet::account(account).key;
324318
auto const accountRoot = createAccountRootObject(kACCOUNT, 0, 2, 200, 2, kINDEX1, 2);
@@ -416,8 +410,7 @@ TEST_F(RPCAccountInfoHandlerTest, SignerListsTrueV2)
416410
);
417411

418412
auto const ledgerHeader = createLedgerHeader(kLEDGER_HASH, 30);
419-
EXPECT_CALL(*backend_, fetchLedgerBySequence).Times(1);
420-
ON_CALL(*backend_, fetchLedgerBySequence).WillByDefault(Return(ledgerHeader));
413+
EXPECT_CALL(*backend_, fetchLedgerBySequence).WillOnce(Return(ledgerHeader));
421414

422415
auto const account = getAccountIdWithString(kACCOUNT);
423416
auto const accountKk = ripple::keylet::account(account).key;
@@ -514,8 +507,7 @@ TEST_F(RPCAccountInfoHandlerTest, SignerListsTrueV1)
514507
);
515508

516509
auto const ledgerHeader = createLedgerHeader(kLEDGER_HASH, 30);
517-
EXPECT_CALL(*backend_, fetchLedgerBySequence).Times(1);
518-
ON_CALL(*backend_, fetchLedgerBySequence).WillByDefault(Return(ledgerHeader));
510+
EXPECT_CALL(*backend_, fetchLedgerBySequence).WillOnce(Return(ledgerHeader));
519511

520512
auto const account = getAccountIdWithString(kACCOUNT);
521513
auto const accountKk = ripple::keylet::account(account).key;
@@ -584,8 +576,7 @@ TEST_F(RPCAccountInfoHandlerTest, Flags)
584576
);
585577

586578
auto const ledgerHeader = createLedgerHeader(kLEDGER_HASH, 30);
587-
EXPECT_CALL(*backend_, fetchLedgerBySequence).Times(1);
588-
ON_CALL(*backend_, fetchLedgerBySequence).WillByDefault(Return(ledgerHeader));
579+
EXPECT_CALL(*backend_, fetchLedgerBySequence).WillOnce(Return(ledgerHeader));
589580

590581
auto const account = getAccountIdWithString(kACCOUNT);
591582
auto const accountKk = ripple::keylet::account(account).key;
@@ -626,8 +617,7 @@ TEST_F(RPCAccountInfoHandlerTest, Flags)
626617
TEST_F(RPCAccountInfoHandlerTest, IdentAndSignerListsFalse)
627618
{
628619
auto const ledgerHeader = createLedgerHeader(kLEDGER_HASH, 30);
629-
EXPECT_CALL(*backend_, fetchLedgerBySequence).Times(1);
630-
ON_CALL(*backend_, fetchLedgerBySequence).WillByDefault(Return(ledgerHeader));
620+
EXPECT_CALL(*backend_, fetchLedgerBySequence).WillOnce(Return(ledgerHeader));
631621

632622
auto const account = getAccountIdWithString(kACCOUNT);
633623
auto const accountKk = ripple::keylet::account(account).key;
@@ -655,6 +645,51 @@ TEST_F(RPCAccountInfoHandlerTest, IdentAndSignerListsFalse)
655645
});
656646
}
657647

648+
TEST_F(RPCAccountInfoHandlerTest, EmptySignerLists)
649+
{
650+
auto const ledgerHeader = createLedgerHeader(kLEDGER_HASH, 30);
651+
EXPECT_CALL(*backend_, fetchLedgerBySequence).WillOnce(Return(ledgerHeader));
652+
653+
auto const account = getAccountIdWithString(kACCOUNT);
654+
auto const accountKk = ripple::keylet::account(account).key;
655+
auto const accountRoot = createAccountRootObject(kACCOUNT, 0, 2, 200, 2, kINDEX1, 2);
656+
ON_CALL(*backend_, doFetchLedgerObject(accountKk, 30, _))
657+
.WillByDefault(Return(accountRoot.getSerializer().peekData()));
658+
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::DisallowIncoming, _)).WillOnce(Return(false));
659+
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::Clawback, _)).WillOnce(Return(false));
660+
EXPECT_CALL(*mockAmendmentCenterPtr_, isEnabled(_, Amendments::TokenEscrow, _)).WillOnce(Return(false));
661+
662+
auto signersKey = ripple::keylet::signers(account).key;
663+
ON_CALL(*backend_, doFetchLedgerObject(signersKey, 30, _)).WillByDefault(Return(std::optional<Blob>{}));
664+
665+
// Once for signer object, once for keylet
666+
EXPECT_CALL(*backend_, doFetchLedgerObject).Times(2);
667+
668+
static auto const kINPUT = json::parse(
669+
fmt::format(
670+
R"JSON({{
671+
"account": "{}",
672+
"signer_lists": true
673+
}})JSON",
674+
kACCOUNT
675+
)
676+
);
677+
678+
auto const handler = AnyHandler{AccountInfoHandler{backend_, mockAmendmentCenterPtr_}};
679+
680+
runSpawn([&](auto yield) {
681+
auto const output = handler.process(kINPUT, Context{.yield = yield, .apiVersion = 2});
682+
ASSERT_TRUE(output);
683+
684+
auto const& resultObj = output.result->as_object();
685+
ASSERT_TRUE(resultObj.contains("signer_lists"));
686+
687+
auto const& signerListsJson = resultObj.at("signer_lists");
688+
EXPECT_TRUE(signerListsJson.is_array());
689+
EXPECT_TRUE(signerListsJson.as_array().empty());
690+
});
691+
}
692+
658693
TEST_F(RPCAccountInfoHandlerTest, DisallowIncoming)
659694
{
660695
auto const expectedOutput = fmt::format(
@@ -696,8 +731,7 @@ TEST_F(RPCAccountInfoHandlerTest, DisallowIncoming)
696731
);
697732

698733
auto const ledgerHeader = createLedgerHeader(kLEDGER_HASH, 30);
699-
EXPECT_CALL(*backend_, fetchLedgerBySequence).Times(1);
700-
ON_CALL(*backend_, fetchLedgerBySequence).WillByDefault(Return(ledgerHeader));
734+
EXPECT_CALL(*backend_, fetchLedgerBySequence).WillOnce(Return(ledgerHeader));
701735

702736
auto const account = getAccountIdWithString(kACCOUNT);
703737
auto const accountKk = ripple::keylet::account(account).key;

0 commit comments

Comments
 (0)