Skip to content

Commit d556236

Browse files
committed
Introduce traits to make test utils generic across the CM Holder
In our test utilities, we generally refer to a `Node` struct which holds a `ChannelManager` and a number of other structs. However, we use the same utilities in benchmarking, where we have a different `Node`-like struct. This made moving from macros to functions entirely impossible, as we end up needing multiple types in a given context. Thus, here, we take the pain and introduce some wrapper traits which encapsulte what we need from `Node`, swapping some of our macros to functions.
1 parent fb86fc2 commit d556236

File tree

2 files changed

+146
-54
lines changed

2 files changed

+146
-54
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 82 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,61 @@ pub type SimpleArcChannelManager<M, T, F, L> = ChannelManager<
618618
/// This is not exported to bindings users as Arcs don't make sense in bindings
619619
pub type SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, M, T, F, L> = ChannelManager<&'a M, &'b T, &'c KeysManager, &'c KeysManager, &'c KeysManager, &'d F, &'e DefaultRouter<&'f NetworkGraph<&'g L>, &'g L, &'h Mutex<ProbabilisticScorer<&'f NetworkGraph<&'g L>, &'g L>>>, &'g L>;
620620

621+
/// A trivial trait which describes any [`ChannelManager`] used in testing.
622+
#[cfg(any(test, feature = "_test_utils"))]
623+
pub trait AChannelManager {
624+
type Watch: chain::Watch<Self::Signer>;
625+
type M: Deref<Target = Self::Watch>;
626+
type Broadcaster: BroadcasterInterface;
627+
type T: Deref<Target = Self::Broadcaster>;
628+
type EntropySource: EntropySource;
629+
type ES: Deref<Target = Self::EntropySource>;
630+
type NodeSigner: NodeSigner;
631+
type NS: Deref<Target = Self::NodeSigner>;
632+
type Signer: WriteableEcdsaChannelSigner;
633+
type SignerProvider: SignerProvider<Signer = Self::Signer>;
634+
type SP: Deref<Target = Self::SignerProvider>;
635+
type FeeEstimator: FeeEstimator;
636+
type F: Deref<Target = Self::FeeEstimator>;
637+
type Router: Router;
638+
type R: Deref<Target = Self::Router>;
639+
type Logger: Logger;
640+
type L: Deref<Target = Self::Logger>;
641+
fn get_cm(&self) -> &ChannelManager<Self::M, Self::T, Self::ES, Self::NS, Self::SP, Self::F, Self::R, Self::L>;
642+
}
643+
#[cfg(any(test, feature = "_test_utils"))]
644+
impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, L: Deref> AChannelManager
645+
for ChannelManager<M, T, ES, NS, SP, F, R, L>
646+
where
647+
M::Target: chain::Watch<<SP::Target as SignerProvider>::Signer> + Sized,
648+
T::Target: BroadcasterInterface + Sized,
649+
ES::Target: EntropySource + Sized,
650+
NS::Target: NodeSigner + Sized,
651+
SP::Target: SignerProvider + Sized,
652+
F::Target: FeeEstimator + Sized,
653+
R::Target: Router + Sized,
654+
L::Target: Logger + Sized,
655+
{
656+
type Watch = M::Target;
657+
type M = M;
658+
type Broadcaster = T::Target;
659+
type T = T;
660+
type EntropySource = ES::Target;
661+
type ES = ES;
662+
type NodeSigner = NS::Target;
663+
type NS = NS;
664+
type Signer = <SP::Target as SignerProvider>::Signer;
665+
type SignerProvider = SP::Target;
666+
type SP = SP;
667+
type FeeEstimator = F::Target;
668+
type F = F;
669+
type Router = R::Target;
670+
type R = R;
671+
type Logger = L::Target;
672+
type L = L;
673+
fn get_cm(&self) -> &ChannelManager<M, T, ES, NS, SP, F, R, L> { self }
674+
}
675+
621676
/// Manager which keeps track of a number of channels and sends messages to the appropriate
622677
/// channel, also tracking HTLC preimages and forwarding onion packets appropriately.
623678
///
@@ -8839,14 +8894,23 @@ pub mod bench {
88398894

88408895
use test::Bencher;
88418896

8842-
struct NodeHolder<'a, P: Persist<InMemorySigner>> {
8843-
node: &'a ChannelManager<
8844-
&'a ChainMonitor<InMemorySigner, &'a test_utils::TestChainSource,
8845-
&'a test_utils::TestBroadcaster, &'a test_utils::TestFeeEstimator,
8846-
&'a test_utils::TestLogger, &'a P>,
8847-
&'a test_utils::TestBroadcaster, &'a KeysManager, &'a KeysManager, &'a KeysManager,
8848-
&'a test_utils::TestFeeEstimator, &'a test_utils::TestRouter<'a>,
8849-
&'a test_utils::TestLogger>,
8897+
type Manager<'a, P> = ChannelManager<
8898+
&'a ChainMonitor<InMemorySigner, &'a test_utils::TestChainSource,
8899+
&'a test_utils::TestBroadcaster, &'a test_utils::TestFeeEstimator,
8900+
&'a test_utils::TestLogger, &'a P>,
8901+
&'a test_utils::TestBroadcaster, &'a KeysManager, &'a KeysManager, &'a KeysManager,
8902+
&'a test_utils::TestFeeEstimator, &'a test_utils::TestRouter<'a>,
8903+
&'a test_utils::TestLogger>;
8904+
8905+
struct ANodeHolder<'a, P: Persist<InMemorySigner>> {
8906+
node: &'a Manager<'a, P>,
8907+
}
8908+
impl<'a, P: Persist<InMemorySigner>> NodeHolder for ANodeHolder<'a, P> {
8909+
type CM = Manager<'a, P>;
8910+
#[inline]
8911+
fn node(&self) -> &Manager<'a, P> { self.node }
8912+
#[inline]
8913+
fn chain_monitor(&self) -> Option<&test_utils::TestChainMonitor> { None }
88508914
}
88518915

88528916
#[cfg(test)]
@@ -8877,7 +8941,7 @@ pub mod bench {
88778941
network,
88788942
best_block: BestBlock::from_network(network),
88798943
});
8880-
let node_a_holder = NodeHolder { node: &node_a };
8944+
let node_a_holder = ANodeHolder { node: &node_a };
88818945

88828946
let logger_b = test_utils::TestLogger::with_id("node a".to_owned());
88838947
let chain_monitor_b = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_b);
@@ -8887,7 +8951,7 @@ pub mod bench {
88878951
network,
88888952
best_block: BestBlock::from_network(network),
88898953
});
8890-
let node_b_holder = NodeHolder { node: &node_b };
8954+
let node_b_holder = ANodeHolder { node: &node_b };
88918955

88928956
node_a.peer_connected(&node_b.get_our_node_id(), &Init { features: node_b.init_features(), remote_network_address: None }, true).unwrap();
88938957
node_b.peer_connected(&node_a.get_our_node_id(), &Init { features: node_a.init_features(), remote_network_address: None }, false).unwrap();
@@ -8983,15 +9047,15 @@ pub mod bench {
89839047
let payment_event = SendEvent::from_event($node_a.get_and_clear_pending_msg_events().pop().unwrap());
89849048
$node_b.handle_update_add_htlc(&$node_a.get_our_node_id(), &payment_event.msgs[0]);
89859049
$node_b.handle_commitment_signed(&$node_a.get_our_node_id(), &payment_event.commitment_msg);
8986-
let (raa, cs) = do_get_revoke_commit_msgs!(NodeHolder { node: &$node_b }, &$node_a.get_our_node_id());
9050+
let (raa, cs) = get_revoke_commit_msgs(&ANodeHolder { node: &$node_b }, &$node_a.get_our_node_id());
89879051
$node_a.handle_revoke_and_ack(&$node_b.get_our_node_id(), &raa);
89889052
$node_a.handle_commitment_signed(&$node_b.get_our_node_id(), &cs);
8989-
$node_b.handle_revoke_and_ack(&$node_a.get_our_node_id(), &get_event_msg!(NodeHolder { node: &$node_a }, MessageSendEvent::SendRevokeAndACK, $node_b.get_our_node_id()));
9053+
$node_b.handle_revoke_and_ack(&$node_a.get_our_node_id(), &get_event_msg!(ANodeHolder { node: &$node_a }, MessageSendEvent::SendRevokeAndACK, $node_b.get_our_node_id()));
89909054

8991-
expect_pending_htlcs_forwardable!(NodeHolder { node: &$node_b });
8992-
expect_payment_claimable!(NodeHolder { node: &$node_b }, payment_hash, payment_secret, 10_000);
9055+
expect_pending_htlcs_forwardable!(ANodeHolder { node: &$node_b });
9056+
expect_payment_claimable!(ANodeHolder { node: &$node_b }, payment_hash, payment_secret, 10_000);
89939057
$node_b.claim_funds(payment_preimage);
8994-
expect_payment_claimed!(NodeHolder { node: &$node_b }, payment_hash, 10_000);
9058+
expect_payment_claimed!(ANodeHolder { node: &$node_b }, payment_hash, 10_000);
89959059

89969060
match $node_b.get_and_clear_pending_msg_events().pop().unwrap() {
89979061
MessageSendEvent::UpdateHTLCs { node_id, updates } => {
@@ -9002,12 +9066,12 @@ pub mod bench {
90029066
_ => panic!("Failed to generate claim event"),
90039067
}
90049068

9005-
let (raa, cs) = do_get_revoke_commit_msgs!(NodeHolder { node: &$node_a }, &$node_b.get_our_node_id());
9069+
let (raa, cs) = get_revoke_commit_msgs(&ANodeHolder { node: &$node_a }, &$node_b.get_our_node_id());
90069070
$node_b.handle_revoke_and_ack(&$node_a.get_our_node_id(), &raa);
90079071
$node_b.handle_commitment_signed(&$node_a.get_our_node_id(), &cs);
9008-
$node_a.handle_revoke_and_ack(&$node_b.get_our_node_id(), &get_event_msg!(NodeHolder { node: &$node_b }, MessageSendEvent::SendRevokeAndACK, $node_a.get_our_node_id()));
9072+
$node_a.handle_revoke_and_ack(&$node_b.get_our_node_id(), &get_event_msg!(ANodeHolder { node: &$node_b }, MessageSendEvent::SendRevokeAndACK, $node_a.get_our_node_id()));
90099073

9010-
expect_payment_sent!(NodeHolder { node: &$node_a }, payment_preimage);
9074+
expect_payment_sent!(ANodeHolder { node: &$node_a }, payment_preimage);
90119075
}
90129076
}
90139077

lightning/src/ln/functional_test_utils.rs

Lines changed: 64 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::chain::channelmonitor::ChannelMonitor;
1515
use crate::chain::transaction::OutPoint;
1616
use crate::events::{ClosureReason, Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider, PathFailure, PaymentPurpose, PaymentFailureReason};
1717
use crate::ln::{PaymentPreimage, PaymentHash, PaymentSecret};
18-
use crate::ln::channelmanager::{ChainParameters, ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure, RecipientOnionFields, PaymentId, MIN_CLTV_EXPIRY_DELTA};
18+
use crate::ln::channelmanager::{AChannelManager, ChainParameters, ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure, RecipientOnionFields, PaymentId, MIN_CLTV_EXPIRY_DELTA};
1919
use crate::routing::gossip::{P2PGossipSync, NetworkGraph, NetworkUpdate};
2020
use crate::routing::router::{self, PaymentParameters, Route};
2121
use crate::ln::features::InitFeatures;
@@ -324,14 +324,16 @@ pub struct NodeCfg<'a> {
324324
pub override_init_features: Rc<RefCell<Option<InitFeatures>>>,
325325
}
326326

327+
type TestChannelManager<'a, 'b, 'c> = ChannelManager<&'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'b test_utils::TestKeysInterface, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'b test_utils::TestRouter<'c>, &'c test_utils::TestLogger>;
328+
327329
pub struct Node<'a, 'b: 'a, 'c: 'b> {
328330
pub chain_source: &'c test_utils::TestChainSource,
329331
pub tx_broadcaster: &'c test_utils::TestBroadcaster,
330332
pub fee_estimator: &'c test_utils::TestFeeEstimator,
331333
pub router: &'b test_utils::TestRouter<'c>,
332334
pub chain_monitor: &'b test_utils::TestChainMonitor<'c>,
333335
pub keys_manager: &'b test_utils::TestKeysInterface,
334-
pub node: &'a ChannelManager<&'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'b test_utils::TestKeysInterface, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'b test_utils::TestRouter<'c>, &'c test_utils::TestLogger>,
336+
pub node: &'a TestChannelManager<'a, 'b, 'c>,
335337
pub network_graph: &'a NetworkGraph<&'c test_utils::TestLogger>,
336338
pub gossip_sync: P2PGossipSync<&'b NetworkGraph<&'c test_utils::TestLogger>, &'c test_utils::TestChainSource, &'c test_utils::TestLogger>,
337339
pub node_seed: [u8; 32],
@@ -367,6 +369,39 @@ impl NodePtr {
367369
unsafe impl Send for NodePtr {}
368370
unsafe impl Sync for NodePtr {}
369371

372+
373+
pub trait NodeHolder {
374+
type CM: AChannelManager;
375+
fn node(&self) -> &ChannelManager<
376+
<Self::CM as AChannelManager>::M,
377+
<Self::CM as AChannelManager>::T,
378+
<Self::CM as AChannelManager>::ES,
379+
<Self::CM as AChannelManager>::NS,
380+
<Self::CM as AChannelManager>::SP,
381+
<Self::CM as AChannelManager>::F,
382+
<Self::CM as AChannelManager>::R,
383+
<Self::CM as AChannelManager>::L>;
384+
fn chain_monitor(&self) -> Option<&test_utils::TestChainMonitor>;
385+
}
386+
impl<H: NodeHolder> NodeHolder for &H {
387+
type CM = H::CM;
388+
fn node(&self) -> &ChannelManager<
389+
<Self::CM as AChannelManager>::M,
390+
<Self::CM as AChannelManager>::T,
391+
<Self::CM as AChannelManager>::ES,
392+
<Self::CM as AChannelManager>::NS,
393+
<Self::CM as AChannelManager>::SP,
394+
<Self::CM as AChannelManager>::F,
395+
<Self::CM as AChannelManager>::R,
396+
<Self::CM as AChannelManager>::L> { (*self).node() }
397+
fn chain_monitor(&self) -> Option<&test_utils::TestChainMonitor> { (*self).chain_monitor() }
398+
}
399+
impl<'a, 'b: 'a, 'c: 'b> NodeHolder for Node<'a, 'b, 'c> {
400+
type CM = TestChannelManager<'a, 'b, 'c>;
401+
fn node(&self) -> &TestChannelManager<'a, 'b, 'c> { &self.node }
402+
fn chain_monitor(&self) -> Option<&test_utils::TestChainMonitor> { Some(self.chain_monitor) }
403+
}
404+
370405
impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
371406
fn drop(&mut self) {
372407
if !panicking() {
@@ -486,36 +521,27 @@ pub fn create_chan_between_nodes_with_value<'a, 'b, 'c, 'd>(node_a: &'a Node<'b,
486521
}
487522

488523
/// Gets an RAA and CS which were sent in response to a commitment update
489-
///
490-
/// Should only be used directly when the `$node` is not actually a [`Node`].
491-
macro_rules! do_get_revoke_commit_msgs {
492-
($node: expr, $recipient: expr) => { {
493-
let events = $node.node.get_and_clear_pending_msg_events();
494-
assert_eq!(events.len(), 2);
495-
(match events[0] {
496-
MessageSendEvent::SendRevokeAndACK { ref node_id, ref msg } => {
497-
assert_eq!(node_id, $recipient);
498-
(*msg).clone()
499-
},
500-
_ => panic!("Unexpected event"),
501-
}, match events[1] {
502-
MessageSendEvent::UpdateHTLCs { ref node_id, ref updates } => {
503-
assert_eq!(node_id, $recipient);
504-
assert!(updates.update_add_htlcs.is_empty());
505-
assert!(updates.update_fulfill_htlcs.is_empty());
506-
assert!(updates.update_fail_htlcs.is_empty());
507-
assert!(updates.update_fail_malformed_htlcs.is_empty());
508-
assert!(updates.update_fee.is_none());
509-
updates.commitment_signed.clone()
510-
},
511-
_ => panic!("Unexpected event"),
512-
})
513-
} }
514-
}
515-
516-
/// Gets an RAA and CS which were sent in response to a commitment update
517-
pub fn get_revoke_commit_msgs(node: &Node, recipient: &PublicKey) -> (msgs::RevokeAndACK, msgs::CommitmentSigned) {
518-
do_get_revoke_commit_msgs!(node, recipient)
524+
pub fn get_revoke_commit_msgs<CM: AChannelManager, H: NodeHolder<CM=CM>>(node: &H, recipient: &PublicKey) -> (msgs::RevokeAndACK, msgs::CommitmentSigned) {
525+
let events = node.node().get_and_clear_pending_msg_events();
526+
assert_eq!(events.len(), 2);
527+
(match events[0] {
528+
MessageSendEvent::SendRevokeAndACK { ref node_id, ref msg } => {
529+
assert_eq!(node_id, recipient);
530+
(*msg).clone()
531+
},
532+
_ => panic!("Unexpected event"),
533+
}, match events[1] {
534+
MessageSendEvent::UpdateHTLCs { ref node_id, ref updates } => {
535+
assert_eq!(node_id, recipient);
536+
assert!(updates.update_add_htlcs.is_empty());
537+
assert!(updates.update_fulfill_htlcs.is_empty());
538+
assert!(updates.update_fail_htlcs.is_empty());
539+
assert!(updates.update_fail_malformed_htlcs.is_empty());
540+
assert!(updates.update_fee.is_none());
541+
updates.commitment_signed.clone()
542+
},
543+
_ => panic!("Unexpected event"),
544+
})
519545
}
520546

521547
#[macro_export]
@@ -774,10 +800,12 @@ macro_rules! unwrap_send_err {
774800
}
775801

776802
/// Check whether N channel monitor(s) have been added.
777-
pub fn check_added_monitors(node: &Node, count: usize) {
778-
let mut added_monitors = node.chain_monitor.added_monitors.lock().unwrap();
779-
assert_eq!(added_monitors.len(), count);
780-
added_monitors.clear();
803+
pub fn check_added_monitors<CM: AChannelManager, H: NodeHolder<CM=CM>>(node: &H, count: usize) {
804+
if let Some(chain_monitor) = node.chain_monitor() {
805+
let mut added_monitors = chain_monitor.added_monitors.lock().unwrap();
806+
assert_eq!(added_monitors.len(), count);
807+
added_monitors.clear();
808+
}
781809
}
782810

783811
/// Check whether N channel monitor(s) have been added.

0 commit comments

Comments
 (0)