Skip to content

Commit 55d3960

Browse files
committed
f - Add more test coverage
1 parent e88be8d commit 55d3960

File tree

1 file changed

+179
-16
lines changed

1 file changed

+179
-16
lines changed

lightning/src/routing/scoring.rs

Lines changed: 179 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1306,7 +1306,7 @@ mod tests {
13061306
network_graph.update_channel(&signed_update, &secp_ctx).unwrap();
13071307
}
13081308

1309-
fn payment_path(amount_msat: u64) -> Vec<RouteHop> {
1309+
fn payment_path_for_amount(amount_msat: u64) -> Vec<RouteHop> {
13101310
vec![
13111311
RouteHop {
13121312
pubkey: source_pubkey(),
@@ -1379,6 +1379,116 @@ mod tests {
13791379
assert_eq!(liquidity.as_directed(&recipient, &target, 1_000).max_liquidity_msat(), 1000);
13801380
}
13811381

1382+
#[test]
1383+
fn resets_liquidity_upper_bound_when_crossed_by_lower_bound() {
1384+
let network_graph = network_graph();
1385+
let params = ProbabilisticScoringParameters::default();
1386+
let mut scorer = ProbabilisticScorer::new(params, sender_pubkey(), &network_graph)
1387+
.with_channel(42,
1388+
ChannelLiquidity {
1389+
min_liquidity_offset_msat: 200, max_liquidity_offset_msat: 400
1390+
});
1391+
let source = source_node_id();
1392+
let target = target_node_id();
1393+
assert!(source > target);
1394+
1395+
// Check initial bounds.
1396+
let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1397+
.as_directed(&source, &target, 1_000);
1398+
assert_eq!(liquidity.min_liquidity_msat(), 400);
1399+
assert_eq!(liquidity.max_liquidity_msat(), 800);
1400+
1401+
let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1402+
.as_directed(&target, &source, 1_000);
1403+
assert_eq!(liquidity.min_liquidity_msat(), 200);
1404+
assert_eq!(liquidity.max_liquidity_msat(), 600);
1405+
1406+
// Reset from source to target.
1407+
scorer.channel_liquidities.get_mut(&42).unwrap()
1408+
.as_directed_mut(&source, &target, 1_000)
1409+
.set_min_liquidity_msat(900);
1410+
1411+
let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1412+
.as_directed(&source, &target, 1_000);
1413+
assert_eq!(liquidity.min_liquidity_msat(), 900);
1414+
assert_eq!(liquidity.max_liquidity_msat(), 1_000);
1415+
1416+
let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1417+
.as_directed(&target, &source, 1_000);
1418+
assert_eq!(liquidity.min_liquidity_msat(), 0);
1419+
assert_eq!(liquidity.max_liquidity_msat(), 100);
1420+
1421+
// Reset from target to source.
1422+
scorer.channel_liquidities.get_mut(&42).unwrap()
1423+
.as_directed_mut(&target, &source, 1_000)
1424+
.set_min_liquidity_msat(400);
1425+
1426+
let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1427+
.as_directed(&source, &target, 1_000);
1428+
assert_eq!(liquidity.min_liquidity_msat(), 0);
1429+
assert_eq!(liquidity.max_liquidity_msat(), 600);
1430+
1431+
let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1432+
.as_directed(&target, &source, 1_000);
1433+
assert_eq!(liquidity.min_liquidity_msat(), 400);
1434+
assert_eq!(liquidity.max_liquidity_msat(), 1_000);
1435+
}
1436+
1437+
#[test]
1438+
fn resets_liquidity_lower_bound_when_crossed_by_upper_bound() {
1439+
let network_graph = network_graph();
1440+
let params = ProbabilisticScoringParameters::default();
1441+
let mut scorer = ProbabilisticScorer::new(params, sender_pubkey(), &network_graph)
1442+
.with_channel(42,
1443+
ChannelLiquidity {
1444+
min_liquidity_offset_msat: 200, max_liquidity_offset_msat: 400
1445+
});
1446+
let source = source_node_id();
1447+
let target = target_node_id();
1448+
assert!(source > target);
1449+
1450+
// Check initial bounds.
1451+
let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1452+
.as_directed(&source, &target, 1_000);
1453+
assert_eq!(liquidity.min_liquidity_msat(), 400);
1454+
assert_eq!(liquidity.max_liquidity_msat(), 800);
1455+
1456+
let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1457+
.as_directed(&target, &source, 1_000);
1458+
assert_eq!(liquidity.min_liquidity_msat(), 200);
1459+
assert_eq!(liquidity.max_liquidity_msat(), 600);
1460+
1461+
// Reset from source to target.
1462+
scorer.channel_liquidities.get_mut(&42).unwrap()
1463+
.as_directed_mut(&source, &target, 1_000)
1464+
.set_max_liquidity_msat(300);
1465+
1466+
let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1467+
.as_directed(&source, &target, 1_000);
1468+
assert_eq!(liquidity.min_liquidity_msat(), 0);
1469+
assert_eq!(liquidity.max_liquidity_msat(), 300);
1470+
1471+
let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1472+
.as_directed(&target, &source, 1_000);
1473+
assert_eq!(liquidity.min_liquidity_msat(), 700);
1474+
assert_eq!(liquidity.max_liquidity_msat(), 1_000);
1475+
1476+
// Reset from target to source.
1477+
scorer.channel_liquidities.get_mut(&42).unwrap()
1478+
.as_directed_mut(&target, &source, 1_000)
1479+
.set_max_liquidity_msat(600);
1480+
1481+
let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1482+
.as_directed(&source, &target, 1_000);
1483+
assert_eq!(liquidity.min_liquidity_msat(), 400);
1484+
assert_eq!(liquidity.max_liquidity_msat(), 1_000);
1485+
1486+
let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1487+
.as_directed(&target, &source, 1_000);
1488+
assert_eq!(liquidity.min_liquidity_msat(), 0);
1489+
assert_eq!(liquidity.max_liquidity_msat(), 600);
1490+
}
1491+
13821492
#[test]
13831493
fn increased_penalty_nearing_liquidity_upper_bound() {
13841494
let network_graph = network_graph();
@@ -1418,30 +1528,83 @@ mod tests {
14181528
}
14191529

14201530
#[test]
1421-
fn reduces_liquidity_upper_bound_on_success() {
1531+
fn does_not_penalize_own_channel() {
14221532
let network_graph = network_graph();
14231533
let params = ProbabilisticScoringParameters::default();
1424-
let mut scorer = ProbabilisticScorer::new(params, sender_pubkey(), &network_graph)
1425-
.with_channel(42,
1426-
ChannelLiquidity { min_liquidity_offset_msat: 700, max_liquidity_offset_msat: 0 })
1427-
.with_channel(43,
1428-
ChannelLiquidity { min_liquidity_offset_msat: 0, max_liquidity_offset_msat: 400 });
1534+
let mut scorer = ProbabilisticScorer::new(params, sender_pubkey(), &network_graph);
1535+
let sender = sender_node_id();
1536+
let source = source_node_id();
1537+
let failed_path = payment_path_for_amount(500);
1538+
let successful_path = payment_path_for_amount(200);
1539+
1540+
assert_eq!(scorer.channel_penalty_msat(41, 500, 1_000, &sender, &source), 0);
1541+
1542+
scorer.payment_path_failed(&failed_path.iter().collect::<Vec<_>>(), 41);
1543+
assert_eq!(scorer.channel_penalty_msat(41, 500, 1_000, &sender, &source), 0);
1544+
1545+
scorer.payment_path_successful(&successful_path.iter().collect::<Vec<_>>());
1546+
assert_eq!(scorer.channel_penalty_msat(41, 500, 1_000, &sender, &source), 0);
1547+
}
1548+
1549+
#[test]
1550+
fn sets_liquidity_lower_bound_on_downstream_failure() {
1551+
let network_graph = network_graph();
1552+
let params = ProbabilisticScoringParameters::default();
1553+
let mut scorer = ProbabilisticScorer::new(params, sender_pubkey(), &network_graph);
1554+
let source = source_node_id();
1555+
let target = target_node_id();
1556+
let path = payment_path_for_amount(500);
1557+
1558+
assert_eq!(scorer.channel_penalty_msat(42, 250, 1_000, &source, &target), 124);
1559+
assert_eq!(scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 300);
1560+
assert_eq!(scorer.channel_penalty_msat(42, 750, 1_000, &source, &target), 600);
1561+
1562+
scorer.payment_path_failed(&path.iter().collect::<Vec<_>>(), 43);
1563+
1564+
assert_eq!(scorer.channel_penalty_msat(42, 250, 1_000, &source, &target), 0);
1565+
assert_eq!(scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 0);
1566+
assert_eq!(scorer.channel_penalty_msat(42, 750, 1_000, &source, &target), 300);
1567+
}
1568+
1569+
#[test]
1570+
fn sets_liquidity_upper_bound_on_failure() {
1571+
let network_graph = network_graph();
1572+
let params = ProbabilisticScoringParameters::default();
1573+
let mut scorer = ProbabilisticScorer::new(params, sender_pubkey(), &network_graph);
1574+
let source = source_node_id();
1575+
let target = target_node_id();
1576+
let path = payment_path_for_amount(500);
1577+
1578+
assert_eq!(scorer.channel_penalty_msat(42, 250, 1_000, &source, &target), 124);
1579+
assert_eq!(scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 300);
1580+
assert_eq!(scorer.channel_penalty_msat(42, 750, 1_000, &source, &target), 600);
1581+
1582+
scorer.payment_path_failed(&path.iter().collect::<Vec<_>>(), 42);
1583+
1584+
assert_eq!(scorer.channel_penalty_msat(42, 250, 1_000, &source, &target), 300);
1585+
assert_eq!(scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 2699);
1586+
assert_eq!(scorer.channel_penalty_msat(42, 750, 1_000, &source, &target), u64::max_value());
1587+
}
1588+
1589+
#[test]
1590+
fn reduces_liquidity_upper_bound_along_path_on_success() {
1591+
let network_graph = network_graph();
1592+
let params = ProbabilisticScoringParameters::default();
1593+
let mut scorer = ProbabilisticScorer::new(params, sender_pubkey(), &network_graph);
14291594
let sender = sender_node_id();
14301595
let source = source_node_id();
14311596
let target = target_node_id();
14321597
let recipient = recipient_node_id();
1433-
let path = payment_path(200);
1598+
let path = payment_path_for_amount(500);
14341599

1435-
assert_eq!(scorer.channel_penalty_msat(41, 200, 1_000, &sender, &source), 0);
1436-
assert_eq!(scorer.channel_penalty_msat(42, 200, 1_000, &source, &target), 474);
1437-
assert_eq!(scorer.channel_penalty_msat(43, 200, 1_000, &target, &recipient), 175);
1600+
assert_eq!(scorer.channel_penalty_msat(41, 250, 1_000, &sender, &source), 0);
1601+
assert_eq!(scorer.channel_penalty_msat(42, 250, 1_000, &source, &target), 124);
1602+
assert_eq!(scorer.channel_penalty_msat(43, 250, 1_000, &target, &recipient), 124);
14381603

14391604
scorer.payment_path_successful(&path.iter().collect::<Vec<_>>());
14401605

1441-
assert_eq!(scorer.channel_penalty_msat(41, 200, 1_000, &sender, &source), 0);
1442-
assert_eq!(scorer.channel_penalty_msat(42, 200, 1_000, &source, &target), u64::max_value());
1443-
assert_eq!(scorer.channel_penalty_msat(43, 200, 1_000, &target, &recipient), 299);
1606+
assert_eq!(scorer.channel_penalty_msat(41, 250, 1_000, &sender, &source), 0);
1607+
assert_eq!(scorer.channel_penalty_msat(42, 250, 1_000, &source, &target), 300);
1608+
assert_eq!(scorer.channel_penalty_msat(43, 250, 1_000, &target, &recipient), 300);
14441609
}
1445-
1446-
// TODO: Add more test coverage
14471610
}

0 commit comments

Comments
 (0)