Skip to content

Commit 64b065a

Browse files
committed
Expose async monitor persistence for tests
Downstream tests need to exercise the same async monitor persistence path used by ChainMonitor::new_async_beta without reimplementing Persist. Add test-only constructors that let TestChainMonitor and AsyncPersister share the wake notifier so async completions drive the monitor update future. Co-Authored-By: HAL 9000
1 parent be0d771 commit 64b065a

3 files changed

Lines changed: 180 additions & 7 deletions

File tree

lightning/src/chain/chainmonitor.rs

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,31 @@ pub struct AsyncPersister<
278278
event_notifier: Arc<Notifier>,
279279
}
280280

281+
#[cfg(feature = "_test_utils")]
282+
impl<
283+
K: KVStore + MaybeSend + MaybeSync + 'static,
284+
S: FutureSpawner,
285+
L: Logger + MaybeSend + MaybeSync + 'static,
286+
ES: EntropySource + MaybeSend + MaybeSync + 'static,
287+
SP: SignerProvider + MaybeSend + MaybeSync + 'static,
288+
BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static,
289+
FE: FeeEstimator + MaybeSend + MaybeSync + 'static,
290+
> AsyncPersister<K, S, L, ES, SP, BI, FE>
291+
where
292+
SP::EcdsaSigner: MaybeSend + 'static,
293+
{
294+
/// Constructs a test-only [`AsyncPersister`] with the given event notifier.
295+
///
296+
/// The same notifier should be passed to the [`ChainMonitor`] which consumes this persister so
297+
/// that async persistence completions wake the monitor's update future.
298+
pub fn new_test(
299+
persister: MonitorUpdatingPersisterAsync<K, S, L, ES, SP, BI, FE>,
300+
event_notifier: Arc<Notifier>,
301+
) -> Self {
302+
Self { persister, event_notifier }
303+
}
304+
}
305+
281306
impl<
282307
K: KVStore + MaybeSend + MaybeSync + 'static,
283308
S: FutureSpawner,
@@ -648,6 +673,43 @@ where
648673
pub fn new(
649674
chain_source: Option<C>, broadcaster: T, logger: L, feeest: F, persister: P,
650675
_entropy_source: ES, _our_peerstorage_encryption_key: PeerStorageKey, deferred: bool,
676+
) -> Self {
677+
Self::with_event_notifier(
678+
chain_source,
679+
broadcaster,
680+
logger,
681+
feeest,
682+
persister,
683+
_entropy_source,
684+
_our_peerstorage_encryption_key,
685+
deferred,
686+
Arc::new(Notifier::new()),
687+
)
688+
}
689+
690+
#[cfg(feature = "_test_utils")]
691+
pub(crate) fn new_with_event_notifier(
692+
chain_source: Option<C>, broadcaster: T, logger: L, feeest: F, persister: P,
693+
_entropy_source: ES, _our_peerstorage_encryption_key: PeerStorageKey, deferred: bool,
694+
event_notifier: Arc<Notifier>,
695+
) -> Self {
696+
Self::with_event_notifier(
697+
chain_source,
698+
broadcaster,
699+
logger,
700+
feeest,
701+
persister,
702+
_entropy_source,
703+
_our_peerstorage_encryption_key,
704+
deferred,
705+
event_notifier,
706+
)
707+
}
708+
709+
fn with_event_notifier(
710+
chain_source: Option<C>, broadcaster: T, logger: L, feeest: F, persister: P,
711+
_entropy_source: ES, _our_peerstorage_encryption_key: PeerStorageKey, deferred: bool,
712+
event_notifier: Arc<Notifier>,
651713
) -> Self {
652714
Self {
653715
monitors: RwLock::new(new_hash_map()),
@@ -659,7 +721,7 @@ where
659721
_entropy_source,
660722
pending_monitor_events: Mutex::new(Vec::new()),
661723
highest_chain_height: AtomicUsize::new(0),
662-
event_notifier: Arc::new(Notifier::new()),
724+
event_notifier,
663725
pending_send_only_events: Mutex::new(Vec::new()),
664726
#[cfg(peer_storage)]
665727
our_peerstorage_encryption_key: _our_peerstorage_encryption_key,

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4924,6 +4924,50 @@ fn test_single_channel_multiple_mpp() {
49244924
check_added_monitors(&nodes[7], 1);
49254925
}
49264926

4927+
#[cfg(feature = "_test_utils")]
4928+
#[test]
4929+
fn async_persister_new_test_works_with_test_chain_monitor() {
4930+
let logger = Arc::new(test_utils::TestLogger::new());
4931+
let keys_manager = Arc::new(test_utils::TestKeysInterface::new(&[42; 32], Network::Testnet));
4932+
let tx_broadcaster = Arc::new(test_utils::TestBroadcaster::new(Network::Testnet));
4933+
let fee_estimator = Arc::new(test_utils::TestFeeEstimator::new(253));
4934+
let kv_store = Arc::new(test_utils::TestStore::new(false));
4935+
let persist_futures = Arc::new(FutureQueue::new());
4936+
let native_async_persister = MonitorUpdatingPersisterAsync::new(
4937+
Arc::clone(&kv_store),
4938+
Arc::clone(&persist_futures),
4939+
Arc::clone(&logger),
4940+
42,
4941+
Arc::clone(&keys_manager),
4942+
Arc::clone(&keys_manager),
4943+
Arc::clone(&tx_broadcaster),
4944+
Arc::clone(&fee_estimator),
4945+
);
4946+
let event_notifier = Arc::new(crate::util::wakers::Notifier::new());
4947+
let async_persister = crate::chain::chainmonitor::AsyncPersister::new_test(
4948+
native_async_persister,
4949+
Arc::clone(&event_notifier),
4950+
);
4951+
assert_eq!(Arc::strong_count(&event_notifier), 2);
4952+
4953+
let chain_source = test_utils::TestChainSource::new(Network::Testnet);
4954+
let test_chain_monitor = test_utils::TestChainMonitor::new_with_event_notifier(
4955+
Some(&chain_source),
4956+
tx_broadcaster.as_ref(),
4957+
logger.as_ref(),
4958+
fee_estimator.as_ref(),
4959+
&async_persister,
4960+
keys_manager.as_ref(),
4961+
Arc::clone(&event_notifier),
4962+
);
4963+
assert_eq!(Arc::strong_count(&event_notifier), 3);
4964+
4965+
let update_future = test_chain_monitor.chain_monitor.get_update_future();
4966+
assert!(!update_future.poll_is_complete());
4967+
event_notifier.notify();
4968+
assert!(update_future.poll_is_complete());
4969+
}
4970+
49274971
#[test]
49284972
fn native_async_persist() {
49294973
// Test ChainMonitor::new_async_beta and the backing MonitorUpdatingPersisterAsync.

lightning/src/util/test_utils.rs

Lines changed: 73 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,25 @@ impl<'a> TestChainMonitor<'a> {
555555
)
556556
}
557557

558+
#[cfg(feature = "_test_utils")]
559+
pub fn new_with_event_notifier(
560+
chain_source: Option<&'a TestChainSource>, broadcaster: &'a dyn SyncBroadcaster,
561+
logger: &'a TestLogger, fee_estimator: &'a TestFeeEstimator,
562+
persister: &'a dyn SyncPersist, keys_manager: &'a TestKeysInterface,
563+
event_notifier: Arc<Notifier>,
564+
) -> Self {
565+
Self::with_deferred_and_event_notifier(
566+
chain_source,
567+
broadcaster,
568+
logger,
569+
fee_estimator,
570+
persister,
571+
keys_manager,
572+
false,
573+
Some(event_notifier),
574+
)
575+
}
576+
558577
pub fn new_deferred(
559578
chain_source: Option<&'a TestChainSource>, broadcaster: &'a dyn SyncBroadcaster,
560579
logger: &'a TestLogger, fee_estimator: &'a TestFeeEstimator,
@@ -576,11 +595,27 @@ impl<'a> TestChainMonitor<'a> {
576595
logger: &'a TestLogger, fee_estimator: &'a TestFeeEstimator,
577596
persister: &'a dyn SyncPersist, keys_manager: &'a TestKeysInterface, deferred: bool,
578597
) -> Self {
579-
Self {
580-
added_monitors: Mutex::new(Vec::new()),
581-
monitor_updates: Mutex::new(new_hash_map()),
582-
latest_monitor_update_id: Mutex::new(new_hash_map()),
583-
chain_monitor: ChainMonitor::new(
598+
Self::with_deferred_and_event_notifier(
599+
chain_source,
600+
broadcaster,
601+
logger,
602+
fee_estimator,
603+
persister,
604+
keys_manager,
605+
deferred,
606+
None,
607+
)
608+
}
609+
610+
fn with_deferred_and_event_notifier(
611+
chain_source: Option<&'a TestChainSource>, broadcaster: &'a dyn SyncBroadcaster,
612+
logger: &'a TestLogger, fee_estimator: &'a TestFeeEstimator,
613+
persister: &'a dyn SyncPersist, keys_manager: &'a TestKeysInterface, deferred: bool,
614+
event_notifier: Option<Arc<Notifier>>,
615+
) -> Self {
616+
#[cfg(feature = "_test_utils")]
617+
let chain_monitor = if let Some(event_notifier) = event_notifier {
618+
ChainMonitor::new_with_event_notifier(
584619
chain_source,
585620
broadcaster,
586621
logger,
@@ -589,7 +624,39 @@ impl<'a> TestChainMonitor<'a> {
589624
keys_manager,
590625
keys_manager.get_peer_storage_key(),
591626
deferred,
592-
),
627+
event_notifier,
628+
)
629+
} else {
630+
ChainMonitor::new(
631+
chain_source,
632+
broadcaster,
633+
logger,
634+
fee_estimator,
635+
persister,
636+
keys_manager,
637+
keys_manager.get_peer_storage_key(),
638+
deferred,
639+
)
640+
};
641+
#[cfg(not(feature = "_test_utils"))]
642+
let chain_monitor = {
643+
let _ = event_notifier;
644+
ChainMonitor::new(
645+
chain_source,
646+
broadcaster,
647+
logger,
648+
fee_estimator,
649+
persister,
650+
keys_manager,
651+
keys_manager.get_peer_storage_key(),
652+
deferred,
653+
)
654+
};
655+
Self {
656+
added_monitors: Mutex::new(Vec::new()),
657+
monitor_updates: Mutex::new(new_hash_map()),
658+
latest_monitor_update_id: Mutex::new(new_hash_map()),
659+
chain_monitor,
593660
keys_manager,
594661
logger,
595662
expect_channel_force_closed: Mutex::new(None),

0 commit comments

Comments
 (0)