Skip to content

Commit 48f718f

Browse files
Implement routing against the netgraph in tests
1 parent b634ef1 commit 48f718f

File tree

5 files changed

+49
-42
lines changed

5 files changed

+49
-42
lines changed

lightning-background-processor/src/lib.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,7 @@ mod tests {
620620
type RGS = Arc<RapidGossipSync<Arc<NetworkGraph<Arc<test_utils::TestLogger>>>, Arc<test_utils::TestLogger>>>;
621621

622622
struct Node {
623-
node: Arc<SimpleArcChannelManager<ChainMonitor, test_utils::TestBroadcaster, test_utils::TestFeeEstimator, test_utils::TestRouter, test_utils::TestLogger>>,
623+
node: Arc<SimpleArcChannelManager<ChainMonitor, test_utils::TestBroadcaster, test_utils::TestFeeEstimator, DefaultRouter<Arc<NetworkGraph<Arc<test_utils::TestLogger>>>, Arc<test_utils::TestLogger>, Arc<Mutex<FixedPenaltyScorer>>>, test_utils::TestLogger>>,
624624
p2p_gossip_sync: PGS,
625625
rapid_gossip_sync: RGS,
626626
peer_manager: Arc<PeerManager<TestDescriptor, Arc<test_utils::TestChannelMessageHandler>, Arc<test_utils::TestRoutingMessageHandler>, IgnoringMessageHandler, Arc<test_utils::TestLogger>, IgnoringMessageHandler>>,
@@ -727,25 +727,25 @@ mod tests {
727727
for i in 0..num_nodes {
728728
let tx_broadcaster = Arc::new(test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new()), blocks: Arc::new(Mutex::new(Vec::new()))});
729729
let fee_estimator = Arc::new(test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) });
730-
let router = Arc::new(test_utils::TestRouter { });
731-
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Testnet));
732730
let logger = Arc::new(test_utils::TestLogger::with_id(format!("node {}", i)));
733-
let persister = Arc::new(FilesystemPersister::new(format!("{}_persister_{}", persist_dir, i)));
734-
let seed = [i as u8; 32];
735731
let network = Network::Testnet;
736732
let genesis_block = genesis_block(network);
733+
let network_graph = Arc::new(NetworkGraph::new(genesis_block.header.block_hash(), logger.clone()));
734+
let scorer = Arc::new(Mutex::new(test_utils::TestScorer::with_penalty(0)));
735+
let seed = [i as u8; 32];
736+
let router = Arc::new(DefaultRouter::new(network_graph.clone(), logger.clone(), seed, scorer.clone()));
737+
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Testnet));
738+
let persister = Arc::new(FilesystemPersister::new(format!("{}_persister_{}", persist_dir, i)));
737739
let now = Duration::from_secs(genesis_block.header.time as u64);
738740
let keys_manager = Arc::new(KeysManager::new(&seed, now.as_secs(), now.subsec_nanos()));
739741
let chain_monitor = Arc::new(chainmonitor::ChainMonitor::new(Some(chain_source.clone()), tx_broadcaster.clone(), logger.clone(), fee_estimator.clone(), persister.clone()));
740742
let best_block = BestBlock::from_genesis(network);
741743
let params = ChainParameters { network, best_block };
742744
let manager = Arc::new(ChannelManager::new(fee_estimator.clone(), chain_monitor.clone(), tx_broadcaster.clone(), router.clone(), logger.clone(), keys_manager.clone(), UserConfig::default(), params));
743-
let network_graph = Arc::new(NetworkGraph::new(genesis_block.header.block_hash(), logger.clone()));
744745
let p2p_gossip_sync = Arc::new(P2PGossipSync::new(network_graph.clone(), Some(chain_source.clone()), logger.clone()));
745746
let rapid_gossip_sync = Arc::new(RapidGossipSync::new(network_graph.clone()));
746747
let msg_handler = MessageHandler { chan_handler: Arc::new(test_utils::TestChannelMessageHandler::new()), route_handler: Arc::new(test_utils::TestRoutingMessageHandler::new()), onion_message_handler: IgnoringMessageHandler{}};
747748
let peer_manager = Arc::new(PeerManager::new(msg_handler, keys_manager.get_node_secret(Recipient::Node).unwrap(), 0, &seed, logger.clone(), IgnoringMessageHandler{}));
748-
let scorer = Arc::new(Mutex::new(test_utils::TestScorer::with_penalty(0)));
749749
let node = Node { node: manager, p2p_gossip_sync, rapid_gossip_sync, peer_manager, chain_monitor, persister, tx_broadcaster, network_graph, logger, best_block, scorer };
750750
nodes.push(node);
751751
}

lightning/src/ln/channelmanager.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -8147,7 +8147,7 @@ mod tests {
81478147
final_value_msat: 10_000,
81488148
final_cltv_expiry_delta: 40,
81498149
};
8150-
let network_graph = nodes[0].network_graph;
8150+
let network_graph = nodes[0].network_graph.clone();
81518151
let first_hops = nodes[0].node.list_usable_channels();
81528152
let scorer = test_utils::TestScorer::with_penalty(0);
81538153
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
@@ -8192,7 +8192,7 @@ mod tests {
81928192
final_value_msat: 10_000,
81938193
final_cltv_expiry_delta: 40,
81948194
};
8195-
let network_graph = nodes[0].network_graph;
8195+
let network_graph = nodes[0].network_graph.clone();
81968196
let first_hops = nodes[0].node.list_usable_channels();
81978197
let scorer = test_utils::TestScorer::with_penalty(0);
81988198
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
@@ -8420,7 +8420,7 @@ pub mod bench {
84208420
&'a test_utils::TestBroadcaster, &'a test_utils::TestFeeEstimator,
84218421
&'a test_utils::TestLogger, &'a P>,
84228422
&'a test_utils::TestBroadcaster, &'a KeysManager,
8423-
&'a test_utils::TestFeeEstimator, &'a test_utils::TestRouter,
8423+
&'a test_utils::TestFeeEstimator, &'a test_utils::TestRouter<'a>,
84248424
&'a test_utils::TestLogger>,
84258425
}
84268426

@@ -8439,12 +8439,12 @@ pub mod bench {
84398439

84408440
let tx_broadcaster = test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new()), blocks: Arc::new(Mutex::new(Vec::new()))};
84418441
let fee_estimator = test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) };
8442-
let router = test_utils::TestRouter {};
8442+
let logger_a = test_utils::TestLogger::with_id("node a".to_owned());
8443+
let router = test_utils::TestRouter { network_graph: Arc::new(NetworkGraph::new(genesis_hash, &logger_a)) };
84438444

84448445
let mut config: UserConfig = Default::default();
84458446
config.channel_handshake_config.minimum_depth = 1;
84468447

8447-
let logger_a = test_utils::TestLogger::with_id("node a".to_owned());
84488448
let chain_monitor_a = ChainMonitor::new(None, &tx_broadcaster, &logger_a, &fee_estimator, &persister_a);
84498449
let seed_a = [1u8; 32];
84508450
let keys_manager_a = KeysManager::new(&seed_a, 42, 42);

lightning/src/ln/functional_test_utils.rs

+18-16
Original file line numberDiff line numberDiff line change
@@ -301,11 +301,11 @@ pub struct NodeCfg<'a> {
301301
pub chain_source: &'a test_utils::TestChainSource,
302302
pub tx_broadcaster: &'a test_utils::TestBroadcaster,
303303
pub fee_estimator: &'a test_utils::TestFeeEstimator,
304-
pub router: test_utils::TestRouter,
304+
pub router: test_utils::TestRouter<'a>,
305305
pub chain_monitor: test_utils::TestChainMonitor<'a>,
306306
pub keys_manager: &'a test_utils::TestKeysInterface,
307307
pub logger: &'a test_utils::TestLogger,
308-
pub network_graph: NetworkGraph<&'a test_utils::TestLogger>,
308+
pub network_graph: Arc<NetworkGraph<&'a test_utils::TestLogger>>,
309309
pub node_seed: [u8; 32],
310310
pub features: InitFeatures,
311311
}
@@ -314,12 +314,12 @@ pub struct Node<'a, 'b: 'a, 'c: 'b> {
314314
pub chain_source: &'c test_utils::TestChainSource,
315315
pub tx_broadcaster: &'c test_utils::TestBroadcaster,
316316
pub fee_estimator: &'c test_utils::TestFeeEstimator,
317-
pub router: &'b test_utils::TestRouter,
317+
pub router: &'b test_utils::TestRouter<'c>,
318318
pub chain_monitor: &'b test_utils::TestChainMonitor<'c>,
319319
pub keys_manager: &'b test_utils::TestKeysInterface,
320-
pub node: &'a ChannelManager<&'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'c test_utils::TestRouter, &'c test_utils::TestLogger>,
321-
pub network_graph: &'b NetworkGraph<&'c test_utils::TestLogger>,
322-
pub gossip_sync: P2PGossipSync<&'b NetworkGraph<&'c test_utils::TestLogger>, &'c test_utils::TestChainSource, &'c test_utils::TestLogger>,
320+
pub node: &'a ChannelManager<&'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'b test_utils::TestRouter<'c>, &'c test_utils::TestLogger>,
321+
pub network_graph: Arc<NetworkGraph<&'c test_utils::TestLogger>>,
322+
pub gossip_sync: P2PGossipSync<Arc<NetworkGraph<&'c test_utils::TestLogger>>, &'c test_utils::TestChainSource, &'c test_utils::TestLogger>,
323323
pub node_seed: [u8; 32],
324324
pub network_payment_count: Rc<RefCell<u8>>,
325325
pub network_chan_count: Rc<RefCell<u32>>,
@@ -357,7 +357,7 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
357357
}
358358

359359
// Check that if we serialize the Router, we can deserialize it again.
360-
{
360+
let network_graph = {
361361
let mut w = test_utils::TestVecWriter(Vec::new());
362362
self.network_graph.write(&mut w).unwrap();
363363
let network_graph_deser = <NetworkGraph<_>>::read(&mut io::Cursor::new(&w.0), self.logger).unwrap();
@@ -385,7 +385,8 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
385385
None => break,
386386
};
387387
}
388-
}
388+
network_graph_deser
389+
};
389390

390391
// Check that if we serialize and then deserialize all our channel monitors we get the
391392
// same set of outputs to watch for on chain as we have now. Note that if we write
@@ -421,7 +422,7 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
421422
default_config: *self.node.get_current_default_configuration(),
422423
keys_manager: self.keys_manager,
423424
fee_estimator: &test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) },
424-
router: &test_utils::TestRouter {},
425+
router: &test_utils::TestRouter { network_graph: Arc::new(network_graph) },
425426
chain_monitor: self.chain_monitor,
426427
tx_broadcaster: &broadcaster,
427428
logger: &self.logger,
@@ -658,7 +659,7 @@ macro_rules! check_added_monitors {
658659
}
659660
}
660661

661-
pub fn _reload_node<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, default_config: UserConfig, chanman_encoded: &[u8], monitors_encoded: &[&[u8]]) -> ChannelManager<&'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'c test_utils::TestRouter, &'c test_utils::TestLogger> {
662+
pub fn _reload_node<'a, 'b, 'c, 'd>(node: &'a Node<'b, 'c, 'd>, default_config: UserConfig, chanman_encoded: &[u8], monitors_encoded: &[&[u8]]) -> ChannelManager<&'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'b test_utils::TestRouter<'c>, &'c test_utils::TestLogger> {
662663
let mut monitors_read = Vec::with_capacity(monitors_encoded.len());
663664
for encoded in monitors_encoded {
664665
let mut monitor_read = &encoded[..];
@@ -2156,7 +2157,7 @@ pub fn create_chanmon_cfgs(node_count: usize) -> Vec<TestChanMonCfg> {
21562157
let seed = [i as u8; 32];
21572158
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
21582159

2159-
chan_mon_cfgs.push(TestChanMonCfg{ tx_broadcaster, fee_estimator, chain_source, logger, persister, keys_manager });
2160+
chan_mon_cfgs.push(TestChanMonCfg { tx_broadcaster, fee_estimator, chain_source, logger, persister, keys_manager });
21602161
}
21612162

21622163
chan_mon_cfgs
@@ -2167,18 +2168,19 @@ pub fn create_node_cfgs<'a>(node_count: usize, chanmon_cfgs: &'a Vec<TestChanMon
21672168

21682169
for i in 0..node_count {
21692170
let chain_monitor = test_utils::TestChainMonitor::new(Some(&chanmon_cfgs[i].chain_source), &chanmon_cfgs[i].tx_broadcaster, &chanmon_cfgs[i].logger, &chanmon_cfgs[i].fee_estimator, &chanmon_cfgs[i].persister, &chanmon_cfgs[i].keys_manager);
2171+
let network_graph = Arc::new(NetworkGraph::new(chanmon_cfgs[i].chain_source.genesis_hash, &chanmon_cfgs[i].logger));
21702172
let seed = [i as u8; 32];
21712173
nodes.push(NodeCfg {
21722174
chain_source: &chanmon_cfgs[i].chain_source,
21732175
logger: &chanmon_cfgs[i].logger,
21742176
tx_broadcaster: &chanmon_cfgs[i].tx_broadcaster,
21752177
fee_estimator: &chanmon_cfgs[i].fee_estimator,
2176-
router: test_utils::TestRouter {},
2178+
router: test_utils::TestRouter { network_graph: network_graph.clone() },
21772179
chain_monitor,
21782180
keys_manager: &chanmon_cfgs[i].keys_manager,
21792181
node_seed: seed,
21802182
features: channelmanager::provided_init_features(),
2181-
network_graph: NetworkGraph::new(chanmon_cfgs[i].chain_source.genesis_hash, &chanmon_cfgs[i].logger),
2183+
network_graph: network_graph,
21822184
});
21832185
}
21842186

@@ -2201,7 +2203,7 @@ pub fn test_default_channel_config() -> UserConfig {
22012203
default_config
22022204
}
22032205

2204-
pub fn create_node_chanmgrs<'a, 'b>(node_count: usize, cfgs: &'a Vec<NodeCfg<'b>>, node_config: &[Option<UserConfig>]) -> Vec<ChannelManager<&'a TestChainMonitor<'b>, &'b test_utils::TestBroadcaster, &'a test_utils::TestKeysInterface, &'b test_utils::TestFeeEstimator, &'a test_utils::TestRouter, &'b test_utils::TestLogger>> {
2206+
pub fn create_node_chanmgrs<'a, 'b>(node_count: usize, cfgs: &'a Vec<NodeCfg<'b>>, node_config: &[Option<UserConfig>]) -> Vec<ChannelManager<&'a TestChainMonitor<'b>, &'b test_utils::TestBroadcaster, &'a test_utils::TestKeysInterface, &'b test_utils::TestFeeEstimator, &'a test_utils::TestRouter<'b>, &'b test_utils::TestLogger>> {
22052207
let mut chanmgrs = Vec::new();
22062208
for i in 0..node_count {
22072209
let network = Network::Testnet;
@@ -2224,12 +2226,12 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
22242226
let connect_style = Rc::new(RefCell::new(ConnectStyle::random_style()));
22252227

22262228
for i in 0..node_count {
2227-
let gossip_sync = P2PGossipSync::new(&cfgs[i].network_graph, None, cfgs[i].logger);
2229+
let gossip_sync = P2PGossipSync::new(cfgs[i].network_graph.clone(), None, cfgs[i].logger);
22282230
nodes.push(Node{
22292231
chain_source: cfgs[i].chain_source, tx_broadcaster: cfgs[i].tx_broadcaster,
22302232
fee_estimator: cfgs[i].fee_estimator, router: &cfgs[i].router,
22312233
chain_monitor: &cfgs[i].chain_monitor, keys_manager: &cfgs[i].keys_manager,
2232-
node: &chan_mgrs[i], network_graph: &cfgs[i].network_graph, gossip_sync,
2234+
node: &chan_mgrs[i], network_graph: cfgs[i].network_graph.clone(), gossip_sync,
22332235
node_seed: cfgs[i].node_seed, network_chan_count: chan_count.clone(),
22342236
network_payment_count: payment_count.clone(), logger: cfgs[i].logger,
22352237
blocks: Arc::clone(&cfgs[i].tx_broadcaster.blocks),

lightning/src/ln/functional_tests.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ use alloc::collections::BTreeSet;
5656
use core::default::Default;
5757
use core::iter::repeat;
5858
use bitcoin::hashes::Hash;
59-
use crate::sync::Mutex;
59+
use crate::sync::{Arc, Mutex};
6060

6161
use crate::ln::functional_test_utils::*;
6262
use crate::ln::chan_utils::CommitmentTransaction;
@@ -5268,8 +5268,8 @@ fn test_key_derivation_params() {
52685268
let seed = [42; 32];
52695269
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
52705270
let chain_monitor = test_utils::TestChainMonitor::new(Some(&chanmon_cfgs[0].chain_source), &chanmon_cfgs[0].tx_broadcaster, &chanmon_cfgs[0].logger, &chanmon_cfgs[0].fee_estimator, &chanmon_cfgs[0].persister, &keys_manager);
5271-
let router = test_utils::TestRouter {};
5272-
let network_graph = NetworkGraph::new(chanmon_cfgs[0].chain_source.genesis_hash, &chanmon_cfgs[0].logger);
5271+
let network_graph = Arc::new(NetworkGraph::new(chanmon_cfgs[0].chain_source.genesis_hash, &chanmon_cfgs[0].logger));
5272+
let router = test_utils::TestRouter { network_graph: network_graph.clone() };
52735273
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, features: channelmanager::provided_init_features() };
52745274
let mut node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
52755275
node_cfgs.remove(0);
@@ -9146,7 +9146,7 @@ fn test_keysend_payments_to_public_node() {
91469146
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
91479147

91489148
let _chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
9149-
let network_graph = nodes[0].network_graph;
9149+
let network_graph = nodes[0].network_graph.clone();
91509150
let payer_pubkey = nodes[0].node.get_our_node_id();
91519151
let payee_pubkey = nodes[1].node.get_our_node_id();
91529152
let route_params = RouteParameters {
@@ -9187,7 +9187,7 @@ fn test_keysend_payments_to_private_node() {
91879187
final_value_msat: 10000,
91889188
final_cltv_expiry_delta: 40,
91899189
};
9190-
let network_graph = nodes[0].network_graph;
9190+
let network_graph = nodes[0].network_graph.clone();
91919191
let first_hops = nodes[0].node.list_usable_channels();
91929192
let scorer = test_utils::TestScorer::with_penalty(0);
91939193
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();

lightning/src/util/test_utils.rs

+14-9
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ use crate::ln::channelmanager;
2121
use crate::ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
2222
use crate::ln::{msgs, wire};
2323
use crate::ln::script::ShutdownScript;
24-
use crate::routing::router::{InFlightHtlcs, Route, RouteHop, RouteParameters, Router};
24+
use crate::routing::gossip::NetworkGraph;
25+
use crate::routing::router::{find_route, InFlightHtlcs, Route, RouteHop, RouteParameters, Router, ScorerAccountingForInFlightHtlcs};
2526
use crate::routing::scoring::FixedPenaltyScorer;
2627
use crate::util::enforcing_trait_impls::{EnforcingSigner, EnforcementState};
2728
use crate::util::events;
@@ -72,17 +73,21 @@ impl chaininterface::FeeEstimator for TestFeeEstimator {
7273
}
7374
}
7475

75-
pub struct TestRouter {}
76+
pub struct TestRouter<'a> {
77+
pub network_graph: Arc<NetworkGraph<&'a TestLogger>>,
78+
}
7679

77-
impl Router for TestRouter {
80+
impl<'a> Router for TestRouter<'a> {
7881
fn find_route(
79-
&self, _payer: &PublicKey, _params: &RouteParameters, _first_hops: Option<&[&channelmanager::ChannelDetails]>,
80-
_inflight_htlcs: InFlightHtlcs
82+
&self, payer: &PublicKey, params: &RouteParameters, first_hops: Option<&[&channelmanager::ChannelDetails]>,
83+
inflight_htlcs: InFlightHtlcs
8184
) -> Result<Route, msgs::LightningError> {
82-
Err(msgs::LightningError {
83-
err: String::from("Not implemented"),
84-
action: msgs::ErrorAction::IgnoreError
85-
})
85+
let logger = TestLogger::new();
86+
find_route(
87+
payer, params, &self.network_graph, first_hops, &logger,
88+
&ScorerAccountingForInFlightHtlcs::new(&mut TestScorer::with_penalty(0), inflight_htlcs),
89+
&[42; 32]
90+
)
8691
}
8792
fn notify_payment_path_failed(&self, _path: &[&RouteHop], _short_channel_id: u64) {}
8893
fn notify_payment_path_successful(&self, _path: &[&RouteHop]) {}

0 commit comments

Comments
 (0)