Skip to content

Commit 76486bb

Browse files
committed
Support OnionMessenger in functional_test_utils
OnionMessenger is needed to write functional tests for ChannelManager's OffersMessageHandler implementation. Also adds a TestMessageRouter, which simply wraps DefaultMessageRouter for now.
1 parent 2440fe1 commit 76486bb

File tree

3 files changed

+61
-9
lines changed

3 files changed

+61
-9
lines changed

lightning/src/ln/functional_test_utils.rs

+41-8
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ use crate::ln::{ChannelId, PaymentPreimage, PaymentHash, PaymentSecret};
1919
use crate::ln::channelmanager::{AChannelManager, ChainParameters, ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure, RecipientOnionFields, PaymentId, MIN_CLTV_EXPIRY_DELTA};
2020
use crate::ln::features::InitFeatures;
2121
use crate::ln::msgs;
22-
use crate::ln::msgs::{ChannelMessageHandler,RoutingMessageHandler};
22+
use crate::ln::msgs::{ChannelMessageHandler, OnionMessageHandler, RoutingMessageHandler};
23+
use crate::ln::peer_handler::IgnoringMessageHandler;
24+
use crate::onion_message::OnionMessenger;
2325
use crate::routing::gossip::{P2PGossipSync, NetworkGraph, NetworkUpdate};
2426
use crate::routing::router::{self, PaymentParameters, Route, RouteParameters};
2527
use crate::sign::EntropySource;
@@ -378,6 +380,7 @@ pub struct NodeCfg<'a> {
378380
pub tx_broadcaster: &'a test_utils::TestBroadcaster,
379381
pub fee_estimator: &'a test_utils::TestFeeEstimator,
380382
pub router: test_utils::TestRouter<'a>,
383+
pub message_router: test_utils::TestMessageRouter,
381384
pub chain_monitor: test_utils::TestChainMonitor<'a>,
382385
pub keys_manager: &'a test_utils::TestKeysInterface,
383386
pub logger: &'a test_utils::TestLogger,
@@ -397,6 +400,15 @@ type TestChannelManager<'node_cfg, 'chan_mon_cfg> = ChannelManager<
397400
&'chan_mon_cfg test_utils::TestLogger,
398401
>;
399402

403+
type TestOnionMessenger<'chan_man, 'node_cfg, 'chan_mon_cfg> = OnionMessenger<
404+
&'node_cfg test_utils::TestKeysInterface,
405+
&'node_cfg test_utils::TestKeysInterface,
406+
&'chan_mon_cfg test_utils::TestLogger,
407+
&'node_cfg test_utils::TestMessageRouter,
408+
&'chan_man TestChannelManager<'node_cfg, 'chan_mon_cfg>,
409+
IgnoringMessageHandler,
410+
>;
411+
400412
pub struct Node<'chan_man, 'node_cfg: 'chan_man, 'chan_mon_cfg: 'node_cfg> {
401413
pub chain_source: &'chan_mon_cfg test_utils::TestChainSource,
402414
pub tx_broadcaster: &'chan_mon_cfg test_utils::TestBroadcaster,
@@ -405,6 +417,7 @@ pub struct Node<'chan_man, 'node_cfg: 'chan_man, 'chan_mon_cfg: 'node_cfg> {
405417
pub chain_monitor: &'node_cfg test_utils::TestChainMonitor<'chan_mon_cfg>,
406418
pub keys_manager: &'chan_mon_cfg test_utils::TestKeysInterface,
407419
pub node: &'chan_man TestChannelManager<'node_cfg, 'chan_mon_cfg>,
420+
pub onion_messenger: TestOnionMessenger<'chan_man, 'node_cfg, 'chan_mon_cfg>,
408421
pub network_graph: &'node_cfg NetworkGraph<&'chan_mon_cfg test_utils::TestLogger>,
409422
pub gossip_sync: P2PGossipSync<&'node_cfg NetworkGraph<&'chan_mon_cfg test_utils::TestLogger>, &'chan_mon_cfg test_utils::TestChainSource, &'chan_mon_cfg test_utils::TestLogger>,
410423
pub node_seed: [u8; 32],
@@ -2714,6 +2727,7 @@ pub fn create_node_cfgs_with_persisters<'a>(node_count: usize, chanmon_cfgs: &'a
27142727
tx_broadcaster: &chanmon_cfgs[i].tx_broadcaster,
27152728
fee_estimator: &chanmon_cfgs[i].fee_estimator,
27162729
router: test_utils::TestRouter::new(network_graph.clone(), &chanmon_cfgs[i].scorer),
2730+
message_router: test_utils::TestMessageRouter::new(),
27172731
chain_monitor,
27182732
keys_manager: &chanmon_cfgs[i].keys_manager,
27192733
node_seed: seed,
@@ -2767,14 +2781,18 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
27672781
let connect_style = Rc::new(RefCell::new(ConnectStyle::random_style()));
27682782

27692783
for i in 0..node_count {
2784+
let onion_messenger = OnionMessenger::new(
2785+
cfgs[i].keys_manager, cfgs[i].keys_manager, cfgs[i].logger, &cfgs[i].message_router,
2786+
&chan_mgrs[i], IgnoringMessageHandler {},
2787+
);
27702788
let gossip_sync = P2PGossipSync::new(cfgs[i].network_graph.as_ref(), None, cfgs[i].logger);
27712789
let wallet_source = Arc::new(test_utils::TestWalletSource::new(SecretKey::from_slice(&[i as u8 + 1; 32]).unwrap()));
27722790
nodes.push(Node{
27732791
chain_source: cfgs[i].chain_source, tx_broadcaster: cfgs[i].tx_broadcaster,
27742792
fee_estimator: cfgs[i].fee_estimator, router: &cfgs[i].router,
27752793
chain_monitor: &cfgs[i].chain_monitor, keys_manager: &cfgs[i].keys_manager,
27762794
node: &chan_mgrs[i], network_graph: cfgs[i].network_graph.as_ref(), gossip_sync,
2777-
node_seed: cfgs[i].node_seed, network_chan_count: chan_count.clone(),
2795+
node_seed: cfgs[i].node_seed, onion_messenger, network_chan_count: chan_count.clone(),
27782796
network_payment_count: payment_count.clone(), logger: cfgs[i].logger,
27792797
blocks: Arc::clone(&cfgs[i].tx_broadcaster.blocks),
27802798
connect_style: Rc::clone(&connect_style),
@@ -2789,16 +2807,31 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
27892807

27902808
for i in 0..node_count {
27912809
for j in (i+1)..node_count {
2792-
nodes[i].node.peer_connected(&nodes[j].node.get_our_node_id(), &msgs::Init {
2793-
features: nodes[j].override_init_features.borrow().clone().unwrap_or_else(|| nodes[j].node.init_features()),
2810+
let node_id_i = nodes[i].node.get_our_node_id();
2811+
let node_id_j = nodes[j].node.get_our_node_id();
2812+
2813+
let features_i = nodes[i]
2814+
.override_init_features.borrow().clone()
2815+
.unwrap_or_else(|| nodes[i].node.init_features() | nodes[i].onion_messenger.provided_init_features(&node_id_j));
2816+
let features_j = nodes[j]
2817+
.override_init_features.borrow().clone()
2818+
.unwrap_or_else(|| nodes[j].node.init_features() | nodes[j].onion_messenger.provided_init_features(&node_id_i));
2819+
2820+
let init_i = msgs::Init {
2821+
features: features_i,
27942822
networks: None,
27952823
remote_network_address: None,
2796-
}, true).unwrap();
2797-
nodes[j].node.peer_connected(&nodes[i].node.get_our_node_id(), &msgs::Init {
2798-
features: nodes[i].override_init_features.borrow().clone().unwrap_or_else(|| nodes[i].node.init_features()),
2824+
};
2825+
let init_j = msgs::Init {
2826+
features: features_j,
27992827
networks: None,
28002828
remote_network_address: None,
2801-
}, false).unwrap();
2829+
};
2830+
2831+
nodes[i].node.peer_connected(&node_id_j, &init_j, true).unwrap();
2832+
nodes[j].node.peer_connected(&node_id_i, &init_i, false).unwrap();
2833+
nodes[i].onion_messenger.peer_connected(&node_id_j, &init_j, true).unwrap();
2834+
nodes[j].onion_messenger.peer_connected(&node_id_i, &init_i, false).unwrap();
28022835
}
28032836
}
28042837

lightning/src/ln/functional_tests.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -5526,7 +5526,8 @@ fn test_key_derivation_params() {
55265526
let network_graph = Arc::new(NetworkGraph::new(Network::Testnet, &chanmon_cfgs[0].logger));
55275527
let scorer = RwLock::new(test_utils::TestScorer::new());
55285528
let router = test_utils::TestRouter::new(network_graph.clone(), &scorer);
5529-
let node = NodeCfg { chain_source: &chanmon_cfgs[0].chain_source, logger: &chanmon_cfgs[0].logger, tx_broadcaster: &chanmon_cfgs[0].tx_broadcaster, fee_estimator: &chanmon_cfgs[0].fee_estimator, router, chain_monitor, keys_manager: &keys_manager, network_graph, node_seed: seed, override_init_features: alloc::rc::Rc::new(core::cell::RefCell::new(None)) };
5529+
let message_router = test_utils::TestMessageRouter::new();
5530+
let node = NodeCfg { chain_source: &chanmon_cfgs[0].chain_source, logger: &chanmon_cfgs[0].logger, tx_broadcaster: &chanmon_cfgs[0].tx_broadcaster, fee_estimator: &chanmon_cfgs[0].fee_estimator, router, message_router, chain_monitor, keys_manager: &keys_manager, network_graph, node_seed: seed, override_init_features: alloc::rc::Rc::new(core::cell::RefCell::new(None)) };
55305531
let mut node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
55315532
node_cfgs.remove(0);
55325533
node_cfgs.insert(0, node);

lightning/src/util/test_utils.rs

+18
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ use crate::ln::msgs::LightningError;
2929
use crate::ln::script::ShutdownScript;
3030
use crate::offers::invoice::UnsignedBolt12Invoice;
3131
use crate::offers::invoice_request::UnsignedInvoiceRequest;
32+
use crate::onion_message::{DefaultMessageRouter, Destination, MessageRouter, OnionMessagePath};
3233
use crate::routing::gossip::{EffectiveCapacity, NetworkGraph, NodeId};
3334
use crate::routing::utxo::{UtxoLookup, UtxoLookupError, UtxoResult};
3435
use crate::routing::router::{find_route, InFlightHtlcs, Path, Route, RouteParameters, Router, ScorerAccountingForInFlightHtlcs};
@@ -175,6 +176,23 @@ impl<'a> Drop for TestRouter<'a> {
175176
}
176177
}
177178

179+
pub struct TestMessageRouter(DefaultMessageRouter);
180+
181+
impl TestMessageRouter {
182+
pub fn new() -> Self {
183+
TestMessageRouter(DefaultMessageRouter {})
184+
}
185+
}
186+
187+
impl MessageRouter for TestMessageRouter {
188+
fn find_path(
189+
&self, sender: PublicKey, peers: Vec<PublicKey>, destination: Destination
190+
) -> Result<OnionMessagePath, ()> {
191+
self.0.find_path(sender, peers, destination)
192+
}
193+
}
194+
195+
178196
pub struct OnlyReadsKeysInterface {}
179197

180198
impl EntropySource for OnlyReadsKeysInterface {

0 commit comments

Comments
 (0)