Skip to content

Commit e5f8d1b

Browse files
committed
Add a random real-world-network-graph test for the router
This is the same code as was recently failing in our benchmarks, adapted to use a random starting seed instead of a fixed one and a smaller iteration to reduce runtime.
1 parent 1f06b6a commit e5f8d1b

File tree

1 file changed

+73
-2
lines changed

1 file changed

+73
-2
lines changed

lightning/src/routing/router.rs

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3793,6 +3793,77 @@ mod tests {
37933793
assert_eq!(route.paths[0][1].channel_features.le_flags(), &id_to_feature_flags(13));
37943794
}
37953795
}
3796+
3797+
/// Tries to open a network graph file, or panics with a URL to fetch it.
3798+
pub(super) fn get_route_file() -> std::fs::File {
3799+
File::open("net_graph-2021-02-12.bin") // By default we're run in RL/lightning
3800+
.or_else(|_| File::open("lightning/net_graph-2021-02-12.bin")) // We may be run manually in RL/
3801+
.or_else(|_| { // Fall back to guessing based on the binary location
3802+
// path is likely something like .../rust-lightning/target/debug/deps/lightning-...
3803+
let mut path = std::env::current_exe().unwrap();
3804+
path.pop(); // lightning-...
3805+
path.pop(); // deps
3806+
path.pop(); // debug
3807+
path.pop(); // target
3808+
path.push("lightning");
3809+
path.push("net_graph-2021-02-12.bin");
3810+
eprintln!("{}", path.to_str().unwrap());
3811+
File::open(path)
3812+
})
3813+
.expect("Please fetch https://bitcoin.ninja/ldk-net_graph-879e309c128-2020-02-12.bin and place it at lightning/net_graph-2021-02-12.bin")
3814+
}
3815+
3816+
pub(super) fn random_init_seed() -> u64 {
3817+
// Because the default HashMap in std pulls OS randomness, we can use it as a (bad) RNG.
3818+
use std::hash::{BuildHasher, Hasher};
3819+
let seed = std::collections::hash_map::RandomState::new().build_hasher().finish();
3820+
println!("Using seed of {}", seed);
3821+
seed
3822+
}
3823+
3824+
use std::fs::File;
3825+
use util::ser::Readable;
3826+
#[test]
3827+
fn generate_routes() {
3828+
let mut d = get_route_file();
3829+
let graph = NetworkGraph::read(&mut d).unwrap();
3830+
3831+
// First, get 100 (source, destination) pairs for which route-getting actually succeeds...
3832+
let mut seed = random_init_seed() as usize;
3833+
'load_endpoints: for _ in 0..10 {
3834+
loop {
3835+
seed = seed.overflowing_mul(0xdeadbeef).0;
3836+
let src = graph.get_nodes().keys().skip(seed % graph.get_nodes().len()).next().unwrap();
3837+
seed = seed.overflowing_mul(0xdeadbeef).0;
3838+
let dst = graph.get_nodes().keys().skip(seed % graph.get_nodes().len()).next().unwrap();
3839+
let amt = seed as u64 % 200_000_000;
3840+
if get_route(src, &graph, dst, None, None, &[], amt, 42, &test_utils::TestLogger::new()).is_ok() {
3841+
continue 'load_endpoints;
3842+
}
3843+
}
3844+
}
3845+
}
3846+
3847+
#[test]
3848+
fn generate_routes_mpp() {
3849+
let mut d = get_route_file();
3850+
let graph = NetworkGraph::read(&mut d).unwrap();
3851+
3852+
// First, get 100 (source, destination) pairs for which route-getting actually succeeds...
3853+
let mut seed = random_init_seed() as usize;
3854+
'load_endpoints: for _ in 0..10 {
3855+
loop {
3856+
seed = seed.overflowing_mul(0xdeadbeef).0;
3857+
let src = graph.get_nodes().keys().skip(seed % graph.get_nodes().len()).next().unwrap();
3858+
seed = seed.overflowing_mul(0xdeadbeef).0;
3859+
let dst = graph.get_nodes().keys().skip(seed % graph.get_nodes().len()).next().unwrap();
3860+
let amt = seed as u64 % 200_000_000;
3861+
if get_route(src, &graph, dst, Some(InvoiceFeatures::known()), None, &[], amt, 42, &test_utils::TestLogger::new()).is_ok() {
3862+
continue 'load_endpoints;
3863+
}
3864+
}
3865+
}
3866+
}
37963867
}
37973868

37983869
#[cfg(all(test, feature = "unstable"))]
@@ -3810,7 +3881,7 @@ mod benches {
38103881

38113882
#[bench]
38123883
fn generate_routes(bench: &mut Bencher) {
3813-
let mut d = File::open("net_graph-2021-02-12.bin").expect("Please fetch https://bitcoin.ninja/ldk-net_graph-879e309c128-2020-02-12.bin and place it at lightning/net_graph-2021-02-12.bin");
3884+
let mut d = tests::get_route_file();
38143885
let graph = NetworkGraph::read(&mut d).unwrap();
38153886

38163887
// First, get 100 (source, destination) pairs for which route-getting actually succeeds...
@@ -3841,7 +3912,7 @@ mod benches {
38413912

38423913
#[bench]
38433914
fn generate_mpp_routes(bench: &mut Bencher) {
3844-
let mut d = File::open("net_graph-2021-02-12.bin").expect("Please fetch https://bitcoin.ninja/ldk-net_graph-879e309c128-2020-02-12.bin and place it at lightning/net_graph-2021-02-12.bin");
3915+
let mut d = tests::get_route_file();
38453916
let graph = NetworkGraph::read(&mut d).unwrap();
38463917

38473918
// First, get 100 (source, destination) pairs for which route-getting actually succeeds...

0 commit comments

Comments
 (0)