|
|
|
@@ -21,11 +21,11 @@
|
|
|
|
#include "data/Types.hpp"
|
|
|
|
#include "data/Types.hpp"
|
|
|
|
#include "etl/SystemState.hpp"
|
|
|
|
#include "etl/SystemState.hpp"
|
|
|
|
#include "etl/impl/LedgerPublisher.hpp"
|
|
|
|
#include "etl/impl/LedgerPublisher.hpp"
|
|
|
|
#include "util/AsioContextTestFixture.hpp"
|
|
|
|
|
|
|
|
#include "util/MockBackendTestFixture.hpp"
|
|
|
|
#include "util/MockBackendTestFixture.hpp"
|
|
|
|
#include "util/MockPrometheus.hpp"
|
|
|
|
#include "util/MockPrometheus.hpp"
|
|
|
|
#include "util/MockSubscriptionManager.hpp"
|
|
|
|
#include "util/MockSubscriptionManager.hpp"
|
|
|
|
#include "util/TestObject.hpp"
|
|
|
|
#include "util/TestObject.hpp"
|
|
|
|
|
|
|
|
#include "util/async/context/BasicExecutionContext.hpp"
|
|
|
|
#include "util/config/ConfigDefinition.hpp"
|
|
|
|
#include "util/config/ConfigDefinition.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
#include <fmt/format.h>
|
|
|
|
#include <fmt/format.h>
|
|
|
|
@@ -64,9 +64,10 @@ MATCHER_P(ledgerHeaderMatcher, expectedHeader, "Headers match")
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
|
|
struct ETLLedgerPublisherTest : util::prometheus::WithPrometheus, MockBackendTestStrict, SyncAsioContextTest {
|
|
|
|
struct ETLLedgerPublisherTest : util::prometheus::WithPrometheus, MockBackendTestStrict {
|
|
|
|
util::config::ClioConfigDefinition cfg{{}};
|
|
|
|
util::config::ClioConfigDefinition cfg{{}};
|
|
|
|
StrictMockSubscriptionManagerSharedPtr mockSubscriptionManagerPtr;
|
|
|
|
StrictMockSubscriptionManagerSharedPtr mockSubscriptionManagerPtr;
|
|
|
|
|
|
|
|
util::async::CoroExecutionContext ctx;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderSkipDueToAge)
|
|
|
|
TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderSkipDueToAge)
|
|
|
|
@@ -74,7 +75,7 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderSkipDueToAge)
|
|
|
|
// Use kAGE (800) which is > MAX_LEDGER_AGE_SECONDS (600) to test skipping
|
|
|
|
// Use kAGE (800) which is > MAX_LEDGER_AGE_SECONDS (600) to test skipping
|
|
|
|
auto const dummyLedgerHeader = createLedgerHeader(kLEDGER_HASH, kSEQ, kAGE);
|
|
|
|
auto const dummyLedgerHeader = createLedgerHeader(kLEDGER_HASH, kSEQ, kAGE);
|
|
|
|
auto dummyState = etl::SystemState{};
|
|
|
|
auto dummyState = etl::SystemState{};
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx_, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
|
|
|
|
|
|
|
|
backend_->setRange(kSEQ - 1, kSEQ);
|
|
|
|
backend_->setRange(kSEQ - 1, kSEQ);
|
|
|
|
publisher.publish(dummyLedgerHeader);
|
|
|
|
publisher.publish(dummyLedgerHeader);
|
|
|
|
@@ -90,7 +91,7 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderSkipDueToAge)
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubBookChanges).Times(0);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubBookChanges).Times(0);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubTransaction).Times(0);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubTransaction).Times(0);
|
|
|
|
|
|
|
|
|
|
|
|
ctx_.run();
|
|
|
|
ctx.join();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderWithinAgeLimit)
|
|
|
|
TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderWithinAgeLimit)
|
|
|
|
@@ -98,14 +99,7 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderWithinAgeLimit)
|
|
|
|
// Use age 0 which is < MAX_LEDGER_AGE_SECONDS to ensure publishing happens
|
|
|
|
// Use age 0 which is < MAX_LEDGER_AGE_SECONDS to ensure publishing happens
|
|
|
|
auto const dummyLedgerHeader = createLedgerHeader(kLEDGER_HASH, kSEQ, 0);
|
|
|
|
auto const dummyLedgerHeader = createLedgerHeader(kLEDGER_HASH, kSEQ, 0);
|
|
|
|
auto dummyState = etl::SystemState{};
|
|
|
|
auto dummyState = etl::SystemState{};
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx_, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
|
|
|
|
|
|
|
|
backend_->setRange(kSEQ - 1, kSEQ);
|
|
|
|
|
|
|
|
publisher.publish(dummyLedgerHeader);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Verify last published sequence is set immediately
|
|
|
|
|
|
|
|
EXPECT_TRUE(publisher.getLastPublishedSequence());
|
|
|
|
|
|
|
|
EXPECT_EQ(publisher.getLastPublishedSequence().value(), kSEQ);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_CALL(*backend_, doFetchLedgerObject(ripple::keylet::fees().key, kSEQ, _))
|
|
|
|
EXPECT_CALL(*backend_, doFetchLedgerObject(ripple::keylet::fees().key, kSEQ, _))
|
|
|
|
.WillOnce(Return(createLegacyFeeSettingBlob(1, 2, 3, 4, 0)));
|
|
|
|
.WillOnce(Return(createLegacyFeeSettingBlob(1, 2, 3, 4, 0)));
|
|
|
|
@@ -115,7 +109,14 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderWithinAgeLimit)
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubLedger(_, _, fmt::format("{}-{}", kSEQ - 1, kSEQ), 0));
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubLedger(_, _, fmt::format("{}-{}", kSEQ - 1, kSEQ), 0));
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubBookChanges);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubBookChanges);
|
|
|
|
|
|
|
|
|
|
|
|
ctx_.run();
|
|
|
|
backend_->setRange(kSEQ - 1, kSEQ);
|
|
|
|
|
|
|
|
publisher.publish(dummyLedgerHeader);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Verify last published sequence is set immediately
|
|
|
|
|
|
|
|
EXPECT_TRUE(publisher.getLastPublishedSequence());
|
|
|
|
|
|
|
|
EXPECT_EQ(publisher.getLastPublishedSequence().value(), kSEQ);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ctx.join();
|
|
|
|
EXPECT_TRUE(publisher.lastPublishAgeSeconds() <= 1);
|
|
|
|
EXPECT_TRUE(publisher.lastPublishAgeSeconds() <= 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -124,13 +125,14 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderIsWritingTrue)
|
|
|
|
auto dummyState = etl::SystemState{};
|
|
|
|
auto dummyState = etl::SystemState{};
|
|
|
|
dummyState.isWriting = true;
|
|
|
|
dummyState.isWriting = true;
|
|
|
|
auto const dummyLedgerHeader = createLedgerHeader(kLEDGER_HASH, kSEQ, kAGE);
|
|
|
|
auto const dummyLedgerHeader = createLedgerHeader(kLEDGER_HASH, kSEQ, kAGE);
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx_, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
publisher.publish(dummyLedgerHeader);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
publisher.publish(dummyLedgerHeader);
|
|
|
|
EXPECT_TRUE(publisher.getLastPublishedSequence());
|
|
|
|
EXPECT_TRUE(publisher.getLastPublishedSequence());
|
|
|
|
EXPECT_EQ(publisher.getLastPublishedSequence().value(), kSEQ);
|
|
|
|
EXPECT_EQ(publisher.getLastPublishedSequence().value(), kSEQ);
|
|
|
|
|
|
|
|
|
|
|
|
ctx_.run();
|
|
|
|
ctx.join();
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_FALSE(backend_->fetchLedgerRange());
|
|
|
|
EXPECT_FALSE(backend_->fetchLedgerRange());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -140,11 +142,9 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderInRange)
|
|
|
|
dummyState.isWriting = true;
|
|
|
|
dummyState.isWriting = true;
|
|
|
|
|
|
|
|
|
|
|
|
auto const dummyLedgerHeader = createLedgerHeader(kLEDGER_HASH, kSEQ, 0); // age is 0
|
|
|
|
auto const dummyLedgerHeader = createLedgerHeader(kLEDGER_HASH, kSEQ, 0); // age is 0
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx_, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
backend_->setRange(kSEQ - 1, kSEQ);
|
|
|
|
backend_->setRange(kSEQ - 1, kSEQ);
|
|
|
|
|
|
|
|
|
|
|
|
publisher.publish(dummyLedgerHeader);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_CALL(*backend_, doFetchLedgerObject(ripple::keylet::fees().key, kSEQ, _))
|
|
|
|
EXPECT_CALL(*backend_, doFetchLedgerObject(ripple::keylet::fees().key, kSEQ, _))
|
|
|
|
.WillOnce(Return(createLegacyFeeSettingBlob(1, 2, 3, 4, 0)));
|
|
|
|
.WillOnce(Return(createLegacyFeeSettingBlob(1, 2, 3, 4, 0)));
|
|
|
|
|
|
|
|
|
|
|
|
@@ -158,15 +158,17 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderInRange)
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_CALL(*backend_, fetchAllTransactionsInLedger).WillOnce(Return(std::vector<TransactionAndMetadata>{t1}));
|
|
|
|
EXPECT_CALL(*backend_, fetchAllTransactionsInLedger).WillOnce(Return(std::vector<TransactionAndMetadata>{t1}));
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(publisher.getLastPublishedSequence());
|
|
|
|
|
|
|
|
EXPECT_EQ(publisher.getLastPublishedSequence().value(), kSEQ);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubLedger(_, _, fmt::format("{}-{}", kSEQ - 1, kSEQ), 1));
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubLedger(_, _, fmt::format("{}-{}", kSEQ - 1, kSEQ), 1));
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubBookChanges);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubBookChanges);
|
|
|
|
// mock 1 transaction
|
|
|
|
// mock 1 transaction
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubTransaction);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubTransaction);
|
|
|
|
|
|
|
|
|
|
|
|
ctx_.run();
|
|
|
|
publisher.publish(dummyLedgerHeader);
|
|
|
|
|
|
|
|
EXPECT_TRUE(publisher.getLastPublishedSequence());
|
|
|
|
|
|
|
|
EXPECT_EQ(publisher.getLastPublishedSequence().value(), kSEQ);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ctx.join();
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(publisher.lastPublishAgeSeconds() <= 1);
|
|
|
|
EXPECT_TRUE(publisher.lastPublishAgeSeconds() <= 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -182,8 +184,7 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderCloseTimeGreaterThanNow)
|
|
|
|
|
|
|
|
|
|
|
|
backend_->setRange(kSEQ - 1, kSEQ);
|
|
|
|
backend_->setRange(kSEQ - 1, kSEQ);
|
|
|
|
|
|
|
|
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx_, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
publisher.publish(dummyLedgerHeader);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_CALL(*backend_, doFetchLedgerObject(ripple::keylet::fees().key, kSEQ, _))
|
|
|
|
EXPECT_CALL(*backend_, doFetchLedgerObject(ripple::keylet::fees().key, kSEQ, _))
|
|
|
|
.WillOnce(Return(createLegacyFeeSettingBlob(1, 2, 3, 4, 0)));
|
|
|
|
.WillOnce(Return(createLegacyFeeSettingBlob(1, 2, 3, 4, 0)));
|
|
|
|
@@ -199,14 +200,16 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderCloseTimeGreaterThanNow)
|
|
|
|
EXPECT_CALL(*backend_, fetchAllTransactionsInLedger(kSEQ, _))
|
|
|
|
EXPECT_CALL(*backend_, fetchAllTransactionsInLedger(kSEQ, _))
|
|
|
|
.WillOnce(Return(std::vector<TransactionAndMetadata>{t1}));
|
|
|
|
.WillOnce(Return(std::vector<TransactionAndMetadata>{t1}));
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(publisher.getLastPublishedSequence());
|
|
|
|
|
|
|
|
EXPECT_EQ(publisher.getLastPublishedSequence().value(), kSEQ);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubLedger(_, _, fmt::format("{}-{}", kSEQ - 1, kSEQ), 1));
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubLedger(_, _, fmt::format("{}-{}", kSEQ - 1, kSEQ), 1));
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubBookChanges);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubBookChanges);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubTransaction);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubTransaction);
|
|
|
|
|
|
|
|
|
|
|
|
ctx_.run();
|
|
|
|
publisher.publish(dummyLedgerHeader);
|
|
|
|
|
|
|
|
EXPECT_TRUE(publisher.getLastPublishedSequence());
|
|
|
|
|
|
|
|
EXPECT_EQ(publisher.getLastPublishedSequence().value(), kSEQ);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ctx.join();
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(publisher.lastPublishAgeSeconds() <= 1);
|
|
|
|
EXPECT_TRUE(publisher.lastPublishAgeSeconds() <= 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -214,7 +217,7 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerSeqStopIsTrue)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
auto dummyState = etl::SystemState{};
|
|
|
|
auto dummyState = etl::SystemState{};
|
|
|
|
dummyState.isStopping = true;
|
|
|
|
dummyState.isStopping = true;
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx_, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
EXPECT_FALSE(publisher.publish(kSEQ, {}));
|
|
|
|
EXPECT_FALSE(publisher.publish(kSEQ, {}));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -222,7 +225,7 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerSeqMaxAttempt)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
auto dummyState = etl::SystemState{};
|
|
|
|
auto dummyState = etl::SystemState{};
|
|
|
|
dummyState.isStopping = false;
|
|
|
|
dummyState.isStopping = false;
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx_, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
|
|
|
|
|
|
|
|
static constexpr auto kMAX_ATTEMPT = 2;
|
|
|
|
static constexpr auto kMAX_ATTEMPT = 2;
|
|
|
|
|
|
|
|
|
|
|
|
@@ -236,7 +239,7 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerSeqStopIsFalse)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
auto dummyState = etl::SystemState{};
|
|
|
|
auto dummyState = etl::SystemState{};
|
|
|
|
dummyState.isStopping = false;
|
|
|
|
dummyState.isStopping = false;
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx_, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
|
|
|
|
|
|
|
|
LedgerRange const range{.minSequence = kSEQ, .maxSequence = kSEQ};
|
|
|
|
LedgerRange const range{.minSequence = kSEQ, .maxSequence = kSEQ};
|
|
|
|
EXPECT_CALL(*backend_, hardFetchLedgerRange).WillOnce(Return(range));
|
|
|
|
EXPECT_CALL(*backend_, hardFetchLedgerRange).WillOnce(Return(range));
|
|
|
|
@@ -245,7 +248,7 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerSeqStopIsFalse)
|
|
|
|
EXPECT_CALL(*backend_, fetchLedgerBySequence(kSEQ, _)).WillOnce(Return(dummyLedgerHeader));
|
|
|
|
EXPECT_CALL(*backend_, fetchLedgerBySequence(kSEQ, _)).WillOnce(Return(dummyLedgerHeader));
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(publisher.publish(kSEQ, {}));
|
|
|
|
EXPECT_TRUE(publisher.publish(kSEQ, {}));
|
|
|
|
ctx_.run();
|
|
|
|
ctx.join();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(ETLLedgerPublisherTest, PublishMultipleTxInOrder)
|
|
|
|
TEST_F(ETLLedgerPublisherTest, PublishMultipleTxInOrder)
|
|
|
|
@@ -254,11 +257,9 @@ TEST_F(ETLLedgerPublisherTest, PublishMultipleTxInOrder)
|
|
|
|
dummyState.isWriting = true;
|
|
|
|
dummyState.isWriting = true;
|
|
|
|
|
|
|
|
|
|
|
|
auto const dummyLedgerHeader = createLedgerHeader(kLEDGER_HASH, kSEQ, 0); // age is 0
|
|
|
|
auto const dummyLedgerHeader = createLedgerHeader(kLEDGER_HASH, kSEQ, 0); // age is 0
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx_, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
backend_->setRange(kSEQ - 1, kSEQ);
|
|
|
|
backend_->setRange(kSEQ - 1, kSEQ);
|
|
|
|
|
|
|
|
|
|
|
|
publisher.publish(dummyLedgerHeader);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_CALL(*backend_, doFetchLedgerObject(ripple::keylet::fees().key, kSEQ, _))
|
|
|
|
EXPECT_CALL(*backend_, doFetchLedgerObject(ripple::keylet::fees().key, kSEQ, _))
|
|
|
|
.WillOnce(Return(createLegacyFeeSettingBlob(1, 2, 3, 4, 0)));
|
|
|
|
.WillOnce(Return(createLegacyFeeSettingBlob(1, 2, 3, 4, 0)));
|
|
|
|
|
|
|
|
|
|
|
|
@@ -283,9 +284,6 @@ TEST_F(ETLLedgerPublisherTest, PublishMultipleTxInOrder)
|
|
|
|
EXPECT_CALL(*backend_, fetchAllTransactionsInLedger(kSEQ, _))
|
|
|
|
EXPECT_CALL(*backend_, fetchAllTransactionsInLedger(kSEQ, _))
|
|
|
|
.WillOnce(Return(std::vector<TransactionAndMetadata>{t1, t2}));
|
|
|
|
.WillOnce(Return(std::vector<TransactionAndMetadata>{t1, t2}));
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(publisher.getLastPublishedSequence());
|
|
|
|
|
|
|
|
EXPECT_EQ(publisher.getLastPublishedSequence().value(), kSEQ);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubLedger(_, _, fmt::format("{}-{}", kSEQ - 1, kSEQ), 2));
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubLedger(_, _, fmt::format("{}-{}", kSEQ - 1, kSEQ), 2));
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubBookChanges);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubBookChanges);
|
|
|
|
|
|
|
|
|
|
|
|
@@ -293,7 +291,12 @@ TEST_F(ETLLedgerPublisherTest, PublishMultipleTxInOrder)
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubTransaction(t2, _)).InSequence(s);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubTransaction(t2, _)).InSequence(s);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubTransaction(t1, _)).InSequence(s);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubTransaction(t1, _)).InSequence(s);
|
|
|
|
|
|
|
|
|
|
|
|
ctx_.run();
|
|
|
|
publisher.publish(dummyLedgerHeader);
|
|
|
|
|
|
|
|
EXPECT_TRUE(publisher.getLastPublishedSequence());
|
|
|
|
|
|
|
|
EXPECT_EQ(publisher.getLastPublishedSequence().value(), kSEQ);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ctx.join();
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(publisher.lastPublishAgeSeconds() <= 1);
|
|
|
|
EXPECT_TRUE(publisher.lastPublishAgeSeconds() <= 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -304,19 +307,18 @@ TEST_F(ETLLedgerPublisherTest, PublishVeryOldLedgerShouldSkip)
|
|
|
|
|
|
|
|
|
|
|
|
// Create a ledger header with age (800) greater than MAX_LEDGER_AGE_SECONDS (600)
|
|
|
|
// Create a ledger header with age (800) greater than MAX_LEDGER_AGE_SECONDS (600)
|
|
|
|
auto const dummyLedgerHeader = createLedgerHeader(kLEDGER_HASH, kSEQ, 800);
|
|
|
|
auto const dummyLedgerHeader = createLedgerHeader(kLEDGER_HASH, kSEQ, 800);
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx_, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
backend_->setRange(kSEQ - 1, kSEQ);
|
|
|
|
backend_->setRange(kSEQ - 1, kSEQ);
|
|
|
|
|
|
|
|
|
|
|
|
publisher.publish(dummyLedgerHeader);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubLedger).Times(0);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubLedger).Times(0);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubBookChanges).Times(0);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubBookChanges).Times(0);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubTransaction).Times(0);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubTransaction).Times(0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
publisher.publish(dummyLedgerHeader);
|
|
|
|
EXPECT_TRUE(publisher.getLastPublishedSequence());
|
|
|
|
EXPECT_TRUE(publisher.getLastPublishedSequence());
|
|
|
|
EXPECT_EQ(publisher.getLastPublishedSequence().value(), kSEQ);
|
|
|
|
EXPECT_EQ(publisher.getLastPublishedSequence().value(), kSEQ);
|
|
|
|
|
|
|
|
|
|
|
|
ctx_.run();
|
|
|
|
ctx.join();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(ETLLedgerPublisherTest, PublishMultipleLedgersInQuickSuccession)
|
|
|
|
TEST_F(ETLLedgerPublisherTest, PublishMultipleLedgersInQuickSuccession)
|
|
|
|
@@ -326,13 +328,9 @@ TEST_F(ETLLedgerPublisherTest, PublishMultipleLedgersInQuickSuccession)
|
|
|
|
|
|
|
|
|
|
|
|
auto const dummyLedgerHeader1 = createLedgerHeader(kLEDGER_HASH, kSEQ, 0);
|
|
|
|
auto const dummyLedgerHeader1 = createLedgerHeader(kLEDGER_HASH, kSEQ, 0);
|
|
|
|
auto const dummyLedgerHeader2 = createLedgerHeader(kLEDGER_HASH, kSEQ + 1, 0);
|
|
|
|
auto const dummyLedgerHeader2 = createLedgerHeader(kLEDGER_HASH, kSEQ + 1, 0);
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx_, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
auto publisher = impl::LedgerPublisher(ctx, backend_, mockSubscriptionManagerPtr, dummyState);
|
|
|
|
backend_->setRange(kSEQ - 1, kSEQ + 1);
|
|
|
|
backend_->setRange(kSEQ - 1, kSEQ + 1);
|
|
|
|
|
|
|
|
|
|
|
|
// Publish two ledgers in quick succession
|
|
|
|
|
|
|
|
publisher.publish(dummyLedgerHeader1);
|
|
|
|
|
|
|
|
publisher.publish(dummyLedgerHeader2);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_CALL(*backend_, doFetchLedgerObject(ripple::keylet::fees().key, kSEQ, _))
|
|
|
|
EXPECT_CALL(*backend_, doFetchLedgerObject(ripple::keylet::fees().key, kSEQ, _))
|
|
|
|
.WillOnce(Return(createLegacyFeeSettingBlob(1, 2, 3, 4, 0)));
|
|
|
|
.WillOnce(Return(createLegacyFeeSettingBlob(1, 2, 3, 4, 0)));
|
|
|
|
EXPECT_CALL(*backend_, doFetchLedgerObject(ripple::keylet::fees().key, kSEQ + 1, _))
|
|
|
|
EXPECT_CALL(*backend_, doFetchLedgerObject(ripple::keylet::fees().key, kSEQ + 1, _))
|
|
|
|
@@ -349,8 +347,12 @@ TEST_F(ETLLedgerPublisherTest, PublishMultipleLedgersInQuickSuccession)
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubLedger(ledgerHeaderMatcher(dummyLedgerHeader2), _, _, _)).InSequence(s);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubLedger(ledgerHeaderMatcher(dummyLedgerHeader2), _, _, _)).InSequence(s);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubBookChanges(ledgerHeaderMatcher(dummyLedgerHeader2), _)).InSequence(s);
|
|
|
|
EXPECT_CALL(*mockSubscriptionManagerPtr, pubBookChanges(ledgerHeaderMatcher(dummyLedgerHeader2), _)).InSequence(s);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Publish two ledgers in quick succession
|
|
|
|
|
|
|
|
publisher.publish(dummyLedgerHeader1);
|
|
|
|
|
|
|
|
publisher.publish(dummyLedgerHeader2);
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(publisher.getLastPublishedSequence());
|
|
|
|
EXPECT_TRUE(publisher.getLastPublishedSequence());
|
|
|
|
EXPECT_EQ(publisher.getLastPublishedSequence().value(), kSEQ + 1);
|
|
|
|
EXPECT_EQ(publisher.getLastPublishedSequence().value(), kSEQ + 1);
|
|
|
|
|
|
|
|
|
|
|
|
ctx_.run();
|
|
|
|
ctx.join();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|