2121#include " data/Types.hpp"
2222#include " etl/SystemState.hpp"
2323#include " etl/impl/LedgerPublisher.hpp"
24- #include " util/AsioContextTestFixture.hpp"
2524#include " util/MockBackendTestFixture.hpp"
2625#include " util/MockPrometheus.hpp"
2726#include " util/MockSubscriptionManager.hpp"
2827#include " util/TestObject.hpp"
28+ #include " util/async/context/BasicExecutionContext.hpp"
2929#include " util/config/ConfigDefinition.hpp"
3030
3131#include < fmt/format.h>
@@ -64,17 +64,18 @@ MATCHER_P(ledgerHeaderMatcher, expectedHeader, "Headers match")
6464
6565} // namespace
6666
67- struct ETLLedgerPublisherTest : util::prometheus::WithPrometheus, MockBackendTestStrict, SyncAsioContextTest {
67+ struct ETLLedgerPublisherTest : util::prometheus::WithPrometheus, MockBackendTestStrict {
6868 util::config::ClioConfigDefinition cfg{{}};
6969 StrictMockSubscriptionManagerSharedPtr mockSubscriptionManagerPtr;
70+ util::async::CoroExecutionContext ctx;
7071};
7172
7273TEST_F (ETLLedgerPublisherTest, PublishLedgerHeaderSkipDueToAge)
7374{
7475 // Use kAGE (800) which is > MAX_LEDGER_AGE_SECONDS (600) to test skipping
7576 auto const dummyLedgerHeader = createLedgerHeader (kLEDGER_HASH , kSEQ , kAGE );
7677 auto dummyState = etl::SystemState{};
77- auto publisher = impl::LedgerPublisher (ctx_ , backend_, mockSubscriptionManagerPtr, dummyState);
78+ auto publisher = impl::LedgerPublisher (ctx , backend_, mockSubscriptionManagerPtr, dummyState);
7879
7980 backend_->setRange (kSEQ - 1 , kSEQ );
8081 publisher.publish (dummyLedgerHeader);
@@ -90,22 +91,15 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderSkipDueToAge)
9091 EXPECT_CALL (*mockSubscriptionManagerPtr, pubBookChanges).Times (0 );
9192 EXPECT_CALL (*mockSubscriptionManagerPtr, pubTransaction).Times (0 );
9293
93- ctx_. run ();
94+ ctx. join ();
9495}
9596
9697TEST_F (ETLLedgerPublisherTest, PublishLedgerHeaderWithinAgeLimit)
9798{
9899 // Use age 0 which is < MAX_LEDGER_AGE_SECONDS to ensure publishing happens
99100 auto const dummyLedgerHeader = createLedgerHeader (kLEDGER_HASH , kSEQ , 0 );
100101 auto dummyState = etl::SystemState{};
101- auto publisher = impl::LedgerPublisher (ctx_, backend_, mockSubscriptionManagerPtr, dummyState);
102-
103- backend_->setRange (kSEQ - 1 , kSEQ );
104- publisher.publish (dummyLedgerHeader);
105-
106- // Verify last published sequence is set immediately
107- EXPECT_TRUE (publisher.getLastPublishedSequence ());
108- EXPECT_EQ (publisher.getLastPublishedSequence ().value (), kSEQ );
102+ auto publisher = impl::LedgerPublisher (ctx, backend_, mockSubscriptionManagerPtr, dummyState);
109103
110104 EXPECT_CALL (*backend_, doFetchLedgerObject (ripple::keylet::fees ().key , kSEQ , _))
111105 .WillOnce (Return (createLegacyFeeSettingBlob (1 , 2 , 3 , 4 , 0 )));
@@ -115,7 +109,14 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderWithinAgeLimit)
115109 EXPECT_CALL (*mockSubscriptionManagerPtr, pubLedger (_, _, fmt::format (" {}-{}" , kSEQ - 1 , kSEQ ), 0 ));
116110 EXPECT_CALL (*mockSubscriptionManagerPtr, pubBookChanges);
117111
118- ctx_.run ();
112+ backend_->setRange (kSEQ - 1 , kSEQ );
113+ publisher.publish (dummyLedgerHeader);
114+
115+ // Verify last published sequence is set immediately
116+ EXPECT_TRUE (publisher.getLastPublishedSequence ());
117+ EXPECT_EQ (publisher.getLastPublishedSequence ().value (), kSEQ );
118+
119+ ctx.join ();
119120 EXPECT_TRUE (publisher.lastPublishAgeSeconds () <= 1 );
120121}
121122
@@ -124,13 +125,14 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderIsWritingTrue)
124125 auto dummyState = etl::SystemState{};
125126 dummyState.isWriting = true ;
126127 auto const dummyLedgerHeader = createLedgerHeader (kLEDGER_HASH , kSEQ , kAGE );
127- auto publisher = impl::LedgerPublisher (ctx_, backend_, mockSubscriptionManagerPtr, dummyState);
128- publisher.publish (dummyLedgerHeader);
128+ auto publisher = impl::LedgerPublisher (ctx, backend_, mockSubscriptionManagerPtr, dummyState);
129129
130+ publisher.publish (dummyLedgerHeader);
130131 EXPECT_TRUE (publisher.getLastPublishedSequence ());
131132 EXPECT_EQ (publisher.getLastPublishedSequence ().value (), kSEQ );
132133
133- ctx_.run ();
134+ ctx.join ();
135+
134136 EXPECT_FALSE (backend_->fetchLedgerRange ());
135137}
136138
@@ -140,11 +142,9 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderInRange)
140142 dummyState.isWriting = true ;
141143
142144 auto const dummyLedgerHeader = createLedgerHeader (kLEDGER_HASH , kSEQ , 0 ); // age is 0
143- auto publisher = impl::LedgerPublisher (ctx_ , backend_, mockSubscriptionManagerPtr, dummyState);
145+ auto publisher = impl::LedgerPublisher (ctx , backend_, mockSubscriptionManagerPtr, dummyState);
144146 backend_->setRange (kSEQ - 1 , kSEQ );
145147
146- publisher.publish (dummyLedgerHeader);
147-
148148 EXPECT_CALL (*backend_, doFetchLedgerObject (ripple::keylet::fees ().key , kSEQ , _))
149149 .WillOnce (Return (createLegacyFeeSettingBlob (1 , 2 , 3 , 4 , 0 )));
150150
@@ -158,15 +158,17 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderInRange)
158158
159159 EXPECT_CALL (*backend_, fetchAllTransactionsInLedger).WillOnce (Return (std::vector<TransactionAndMetadata>{t1}));
160160
161- EXPECT_TRUE (publisher.getLastPublishedSequence ());
162- EXPECT_EQ (publisher.getLastPublishedSequence ().value (), kSEQ );
163-
164161 EXPECT_CALL (*mockSubscriptionManagerPtr, pubLedger (_, _, fmt::format (" {}-{}" , kSEQ - 1 , kSEQ ), 1 ));
165162 EXPECT_CALL (*mockSubscriptionManagerPtr, pubBookChanges);
166163 // mock 1 transaction
167164 EXPECT_CALL (*mockSubscriptionManagerPtr, pubTransaction);
168165
169- ctx_.run ();
166+ publisher.publish (dummyLedgerHeader);
167+ EXPECT_TRUE (publisher.getLastPublishedSequence ());
168+ EXPECT_EQ (publisher.getLastPublishedSequence ().value (), kSEQ );
169+
170+ ctx.join ();
171+
170172 EXPECT_TRUE (publisher.lastPublishAgeSeconds () <= 1 );
171173}
172174
@@ -182,8 +184,7 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderCloseTimeGreaterThanNow)
182184
183185 backend_->setRange (kSEQ - 1 , kSEQ );
184186
185- auto publisher = impl::LedgerPublisher (ctx_, backend_, mockSubscriptionManagerPtr, dummyState);
186- publisher.publish (dummyLedgerHeader);
187+ auto publisher = impl::LedgerPublisher (ctx, backend_, mockSubscriptionManagerPtr, dummyState);
187188
188189 EXPECT_CALL (*backend_, doFetchLedgerObject (ripple::keylet::fees ().key , kSEQ , _))
189190 .WillOnce (Return (createLegacyFeeSettingBlob (1 , 2 , 3 , 4 , 0 )));
@@ -199,30 +200,32 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerHeaderCloseTimeGreaterThanNow)
199200 EXPECT_CALL (*backend_, fetchAllTransactionsInLedger (kSEQ , _))
200201 .WillOnce (Return (std::vector<TransactionAndMetadata>{t1}));
201202
202- EXPECT_TRUE (publisher.getLastPublishedSequence ());
203- EXPECT_EQ (publisher.getLastPublishedSequence ().value (), kSEQ );
204-
205203 EXPECT_CALL (*mockSubscriptionManagerPtr, pubLedger (_, _, fmt::format (" {}-{}" , kSEQ - 1 , kSEQ ), 1 ));
206204 EXPECT_CALL (*mockSubscriptionManagerPtr, pubBookChanges);
207205 EXPECT_CALL (*mockSubscriptionManagerPtr, pubTransaction);
208206
209- ctx_.run ();
207+ publisher.publish (dummyLedgerHeader);
208+ EXPECT_TRUE (publisher.getLastPublishedSequence ());
209+ EXPECT_EQ (publisher.getLastPublishedSequence ().value (), kSEQ );
210+
211+ ctx.join ();
212+
210213 EXPECT_TRUE (publisher.lastPublishAgeSeconds () <= 1 );
211214}
212215
213216TEST_F (ETLLedgerPublisherTest, PublishLedgerSeqStopIsTrue)
214217{
215218 auto dummyState = etl::SystemState{};
216219 dummyState.isStopping = true ;
217- auto publisher = impl::LedgerPublisher (ctx_ , backend_, mockSubscriptionManagerPtr, dummyState);
220+ auto publisher = impl::LedgerPublisher (ctx , backend_, mockSubscriptionManagerPtr, dummyState);
218221 EXPECT_FALSE (publisher.publish (kSEQ , {}));
219222}
220223
221224TEST_F (ETLLedgerPublisherTest, PublishLedgerSeqMaxAttempt)
222225{
223226 auto dummyState = etl::SystemState{};
224227 dummyState.isStopping = false ;
225- auto publisher = impl::LedgerPublisher (ctx_ , backend_, mockSubscriptionManagerPtr, dummyState);
228+ auto publisher = impl::LedgerPublisher (ctx , backend_, mockSubscriptionManagerPtr, dummyState);
226229
227230 static constexpr auto kMAX_ATTEMPT = 2 ;
228231
@@ -236,7 +239,7 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerSeqStopIsFalse)
236239{
237240 auto dummyState = etl::SystemState{};
238241 dummyState.isStopping = false ;
239- auto publisher = impl::LedgerPublisher (ctx_ , backend_, mockSubscriptionManagerPtr, dummyState);
242+ auto publisher = impl::LedgerPublisher (ctx , backend_, mockSubscriptionManagerPtr, dummyState);
240243
241244 LedgerRange const range{.minSequence = kSEQ , .maxSequence = kSEQ };
242245 EXPECT_CALL (*backend_, hardFetchLedgerRange).WillOnce (Return (range));
@@ -245,7 +248,7 @@ TEST_F(ETLLedgerPublisherTest, PublishLedgerSeqStopIsFalse)
245248 EXPECT_CALL (*backend_, fetchLedgerBySequence (kSEQ , _)).WillOnce (Return (dummyLedgerHeader));
246249
247250 EXPECT_TRUE (publisher.publish (kSEQ , {}));
248- ctx_. run ();
251+ ctx. join ();
249252}
250253
251254TEST_F (ETLLedgerPublisherTest, PublishMultipleTxInOrder)
@@ -254,11 +257,9 @@ TEST_F(ETLLedgerPublisherTest, PublishMultipleTxInOrder)
254257 dummyState.isWriting = true ;
255258
256259 auto const dummyLedgerHeader = createLedgerHeader (kLEDGER_HASH , kSEQ , 0 ); // age is 0
257- auto publisher = impl::LedgerPublisher (ctx_ , backend_, mockSubscriptionManagerPtr, dummyState);
260+ auto publisher = impl::LedgerPublisher (ctx , backend_, mockSubscriptionManagerPtr, dummyState);
258261 backend_->setRange (kSEQ - 1 , kSEQ );
259262
260- publisher.publish (dummyLedgerHeader);
261-
262263 EXPECT_CALL (*backend_, doFetchLedgerObject (ripple::keylet::fees ().key , kSEQ , _))
263264 .WillOnce (Return (createLegacyFeeSettingBlob (1 , 2 , 3 , 4 , 0 )));
264265
@@ -283,17 +284,19 @@ TEST_F(ETLLedgerPublisherTest, PublishMultipleTxInOrder)
283284 EXPECT_CALL (*backend_, fetchAllTransactionsInLedger (kSEQ , _))
284285 .WillOnce (Return (std::vector<TransactionAndMetadata>{t1, t2}));
285286
286- EXPECT_TRUE (publisher.getLastPublishedSequence ());
287- EXPECT_EQ (publisher.getLastPublishedSequence ().value (), kSEQ );
288-
289287 EXPECT_CALL (*mockSubscriptionManagerPtr, pubLedger (_, _, fmt::format (" {}-{}" , kSEQ - 1 , kSEQ ), 2 ));
290288 EXPECT_CALL (*mockSubscriptionManagerPtr, pubBookChanges);
291289
292290 Sequence const s;
293291 EXPECT_CALL (*mockSubscriptionManagerPtr, pubTransaction (t2, _)).InSequence (s);
294292 EXPECT_CALL (*mockSubscriptionManagerPtr, pubTransaction (t1, _)).InSequence (s);
295293
296- ctx_.run ();
294+ publisher.publish (dummyLedgerHeader);
295+ EXPECT_TRUE (publisher.getLastPublishedSequence ());
296+ EXPECT_EQ (publisher.getLastPublishedSequence ().value (), kSEQ );
297+
298+ ctx.join ();
299+
297300 EXPECT_TRUE (publisher.lastPublishAgeSeconds () <= 1 );
298301}
299302
@@ -304,19 +307,18 @@ TEST_F(ETLLedgerPublisherTest, PublishVeryOldLedgerShouldSkip)
304307
305308 // Create a ledger header with age (800) greater than MAX_LEDGER_AGE_SECONDS (600)
306309 auto const dummyLedgerHeader = createLedgerHeader (kLEDGER_HASH , kSEQ , 800 );
307- auto publisher = impl::LedgerPublisher (ctx_ , backend_, mockSubscriptionManagerPtr, dummyState);
310+ auto publisher = impl::LedgerPublisher (ctx , backend_, mockSubscriptionManagerPtr, dummyState);
308311 backend_->setRange (kSEQ - 1 , kSEQ );
309312
310- publisher.publish (dummyLedgerHeader);
311-
312313 EXPECT_CALL (*mockSubscriptionManagerPtr, pubLedger).Times (0 );
313314 EXPECT_CALL (*mockSubscriptionManagerPtr, pubBookChanges).Times (0 );
314315 EXPECT_CALL (*mockSubscriptionManagerPtr, pubTransaction).Times (0 );
315316
317+ publisher.publish (dummyLedgerHeader);
316318 EXPECT_TRUE (publisher.getLastPublishedSequence ());
317319 EXPECT_EQ (publisher.getLastPublishedSequence ().value (), kSEQ );
318320
319- ctx_. run ();
321+ ctx. join ();
320322}
321323
322324TEST_F (ETLLedgerPublisherTest, PublishMultipleLedgersInQuickSuccession)
@@ -326,13 +328,9 @@ TEST_F(ETLLedgerPublisherTest, PublishMultipleLedgersInQuickSuccession)
326328
327329 auto const dummyLedgerHeader1 = createLedgerHeader (kLEDGER_HASH , kSEQ , 0 );
328330 auto const dummyLedgerHeader2 = createLedgerHeader (kLEDGER_HASH , kSEQ + 1 , 0 );
329- auto publisher = impl::LedgerPublisher (ctx_ , backend_, mockSubscriptionManagerPtr, dummyState);
331+ auto publisher = impl::LedgerPublisher (ctx , backend_, mockSubscriptionManagerPtr, dummyState);
330332 backend_->setRange (kSEQ - 1 , kSEQ + 1 );
331333
332- // Publish two ledgers in quick succession
333- publisher.publish (dummyLedgerHeader1);
334- publisher.publish (dummyLedgerHeader2);
335-
336334 EXPECT_CALL (*backend_, doFetchLedgerObject (ripple::keylet::fees ().key , kSEQ , _))
337335 .WillOnce (Return (createLegacyFeeSettingBlob (1 , 2 , 3 , 4 , 0 )));
338336 EXPECT_CALL (*backend_, doFetchLedgerObject (ripple::keylet::fees ().key , kSEQ + 1 , _))
@@ -349,8 +347,12 @@ TEST_F(ETLLedgerPublisherTest, PublishMultipleLedgersInQuickSuccession)
349347 EXPECT_CALL (*mockSubscriptionManagerPtr, pubLedger (ledgerHeaderMatcher (dummyLedgerHeader2), _, _, _)).InSequence (s);
350348 EXPECT_CALL (*mockSubscriptionManagerPtr, pubBookChanges (ledgerHeaderMatcher (dummyLedgerHeader2), _)).InSequence (s);
351349
350+ // Publish two ledgers in quick succession
351+ publisher.publish (dummyLedgerHeader1);
352+ publisher.publish (dummyLedgerHeader2);
353+
352354 EXPECT_TRUE (publisher.getLastPublishedSequence ());
353355 EXPECT_EQ (publisher.getLastPublishedSequence ().value (), kSEQ + 1 );
354356
355- ctx_. run ();
357+ ctx. join ();
356358}
0 commit comments