Skip to content

Commit 0000294

Browse files
committed
Add a test scenario with holding cell output
1 parent 0ae339b commit 0000294

File tree

1 file changed

+66
-25
lines changed

1 file changed

+66
-25
lines changed

src/ln/channelmanager.rs

Lines changed: 66 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3892,9 +3892,8 @@ mod tests {
38923892
($node: expr) => {{
38933893
let mut events = $node.node.get_and_clear_pending_events();
38943894
assert_eq!(events.len(), 1);
3895-
let payment_event = SendEvent::from_event(events.remove(0));
3896-
assert_eq!(payment_event.msgs.len(), 1);
38973895
check_added_monitors!($node, 1);
3896+
let payment_event = SendEvent::from_event(events.remove(0));
38983897
payment_event
38993898
}}
39003899
}
@@ -3930,7 +3929,7 @@ mod tests {
39303929
}
39313930

39323931
let mut htlc_id = 0;
3933-
// channel reserve is bigger than max_htlc_msat so loop to deplete
3932+
// channel reserve is bigger than their_max_htlc_value_in_flight_msat so loop to deplete
39343933
// nodes[0]'s wealth
39353934
loop {
39363935
let amt_msat = recv_value_0 + total_fee_msat;
@@ -3970,15 +3969,15 @@ mod tests {
39703969
let amt_msat_1 = recv_value_1 + total_fee_msat;
39713970

39723971
let (route_1, our_payment_hash_1, our_payment_preimage_1) = get_route_and_payment_hash!(recv_value_1);
3973-
let payment_event = {
3972+
let payment_event_1 = {
39743973
nodes[0].node.send_payment(route_1, our_payment_hash_1).unwrap();
39753974
check_added_monitors!(nodes[0], 1);
39763975

39773976
let mut events = nodes[0].node.get_and_clear_pending_events();
39783977
assert_eq!(events.len(), 1);
39793978
SendEvent::from_event(events.remove(0))
39803979
};
3981-
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &payment_event.msgs[0]).unwrap();
3980+
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &payment_event_1.msgs[0]).unwrap();
39823981

39833982
let recv_value_2 = stat01.value_to_self_msat - amt_msat_1 - stat01.channel_reserve_msat - total_fee_msat;
39843983
{
@@ -4020,19 +4019,39 @@ mod tests {
40204019
}
40214020
}
40224021

4022+
let recv_value_21 = recv_value_2/2;
4023+
let recv_value_22 = recv_value_2 - recv_value_21 - total_fee_msat;
4024+
{
4025+
let stat = get_channel_value_stat!(nodes[0], chan_1.2);
4026+
assert_eq!(stat.value_to_self_msat - (stat.pending_outbound_htlcs_amount_msat + recv_value_21 + recv_value_22 + total_fee_msat + total_fee_msat), stat.channel_reserve_msat);
4027+
}
4028+
40234029
// now see if it goes through on both sides
4024-
let (route_2, our_payment_hash_2, our_payment_preimage_2) = get_route_and_payment_hash!(recv_value_2);
4025-
// but this will stuck the in the holding cell b/c nodes[0] is in
4026-
// AwaitingRemoteRevoke state
4027-
nodes[0].node.send_payment(route_2, our_payment_hash_2).unwrap();
4030+
let (route_21, our_payment_hash_21, our_payment_preimage_21) = get_route_and_payment_hash!(recv_value_21);
4031+
// but this will stuck in the holding cell
4032+
nodes[0].node.send_payment(route_21, our_payment_hash_21).unwrap();
40284033
check_added_monitors!(nodes[0], 0);
40294034
let events = nodes[0].node.get_and_clear_pending_events();
40304035
assert_eq!(events.len(), 0);
40314036

4032-
check_added_monitors!(nodes[1], 0);
4033-
let (as_revoke_and_ack, as_commitment_signed) = nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), &payment_event.commitment_msg).unwrap();
4034-
check_added_monitors!(nodes[1], 1);
4037+
{
4038+
let (route, our_payment_hash, _) = get_route_and_payment_hash!(recv_value_22+1);
4039+
match nodes[0].node.send_payment(route, our_payment_hash).err().unwrap() {
4040+
APIError::RouteError{err} => assert_eq!(err, "Cannot send value that would put us over our reserve value"),
4041+
_ => panic!("Unknown error variants"),
4042+
}
4043+
}
4044+
4045+
let (route_22, our_payment_hash_22, our_payment_preimage_22) = get_route_and_payment_hash!(recv_value_22);
4046+
// this will also stuck in the holding cell
4047+
nodes[0].node.send_payment(route_22, our_payment_hash_22).unwrap();
40354048
check_added_monitors!(nodes[0], 0);
4049+
let events = nodes[0].node.get_and_clear_pending_events();
4050+
assert_eq!(events.len(), 0);
4051+
4052+
let (as_revoke_and_ack, as_commitment_signed) = nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), &payment_event_1.commitment_msg).unwrap();
4053+
check_added_monitors!(nodes[1], 1);
4054+
40364055
let commitment_update_2 = nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &as_revoke_and_ack).unwrap().unwrap();
40374056
check_added_monitors!(nodes[0], 1);
40384057
let (bs_revoke_and_ack, bs_none) = nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &as_commitment_signed.unwrap()).unwrap();
@@ -4043,34 +4062,56 @@ mod tests {
40434062

40444063
expect_pending_htlcs_forwardable!(nodes[1]);
40454064

4046-
let payment_event_1 = expect_forward!(nodes[1]);
4047-
nodes[2].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &payment_event_1.msgs[0]).unwrap();
4048-
commitment_signed_dance!(nodes[2], nodes[1], &payment_event_1.commitment_msg, false);
4065+
let ref payment_event_11 = expect_forward!(nodes[1]);
4066+
nodes[2].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &payment_event_11.msgs[0]).unwrap();
4067+
commitment_signed_dance!(nodes[2], nodes[1], payment_event_11.commitment_msg, false);
40494068

40504069
expect_pending_htlcs_forwardable!(nodes[2]);
40514070
expect_payment_received!(nodes[2], our_payment_hash_1, recv_value_1);
40524071

40534072
// second payment
4054-
assert_eq!(commitment_update_2.update_add_htlcs.len(), 1);
4073+
assert_eq!(commitment_update_2.update_add_htlcs.len(), 2);
40554074
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &commitment_update_2.update_add_htlcs[0]).unwrap();
4075+
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &commitment_update_2.update_add_htlcs[1]).unwrap();
40564076
commitment_signed_dance!(nodes[1], nodes[0], &commitment_update_2.commitment_signed, false);
40574077
expect_pending_htlcs_forwardable!(nodes[1]);
40584078

4059-
let payment_event_2 = expect_forward!(nodes[1]);
4060-
nodes[2].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &payment_event_2.msgs[0]).unwrap();
4079+
let ref payment_event_3 = expect_forward!(nodes[1]);
4080+
assert_eq!(payment_event_3.msgs.len(), 2);
4081+
nodes[2].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &payment_event_3.msgs[0]).unwrap();
4082+
nodes[2].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &payment_event_3.msgs[1]).unwrap();
40614083

4062-
commitment_signed_dance!(nodes[2], nodes[1], &payment_event_2.commitment_msg, false);
4084+
commitment_signed_dance!(nodes[2], nodes[1], &payment_event_3.commitment_msg, false);
40634085
expect_pending_htlcs_forwardable!(nodes[2]);
40644086

4065-
expect_payment_received!(nodes[2], our_payment_hash_2, recv_value_2);
4087+
let events = nodes[2].node.get_and_clear_pending_events();
4088+
assert_eq!(events.len(), 2);
4089+
match events[0] {
4090+
Event::PaymentReceived { ref payment_hash, amt } => {
4091+
assert_eq!(our_payment_hash_21, *payment_hash);
4092+
assert_eq!(recv_value_21, amt);
4093+
},
4094+
_ => panic!("Unexpected event"),
4095+
}
4096+
match events[1] {
4097+
Event::PaymentReceived { ref payment_hash, amt } => {
4098+
assert_eq!(our_payment_hash_22, *payment_hash);
4099+
assert_eq!(recv_value_22, amt);
4100+
},
4101+
_ => panic!("Unexpected event"),
4102+
}
40664103

40674104
claim_payment(&nodes[0], &vec!(&nodes[1], &nodes[2]), our_payment_preimage_1);
4068-
claim_payment(&nodes[0], &vec!(&nodes[1], &nodes[2]), our_payment_preimage_2);
4105+
claim_payment(&nodes[0], &vec!(&nodes[1], &nodes[2]), our_payment_preimage_21);
4106+
claim_payment(&nodes[0], &vec!(&nodes[1], &nodes[2]), our_payment_preimage_22);
4107+
4108+
let expected_value_to_self = stat01.value_to_self_msat - (recv_value_1 + total_fee_msat) - (recv_value_21 + total_fee_msat) - (recv_value_22 + total_fee_msat);
4109+
let stat0 = get_channel_value_stat!(nodes[0], chan_1.2);
4110+
assert_eq!(stat0.value_to_self_msat, expected_value_to_self);
4111+
assert_eq!(stat0.value_to_self_msat, stat0.channel_reserve_msat);
40694112

4070-
let expected_value_to_self = stat01.value_to_self_msat - (recv_value_1 + total_fee_msat) - (recv_value_2 + total_fee_msat);
4071-
let stat = get_channel_value_stat!(nodes[0], chan_1.2);
4072-
assert_eq!(stat.value_to_self_msat, expected_value_to_self);
4073-
assert_eq!(stat.value_to_self_msat, stat.channel_reserve_msat);
4113+
let stat2 = get_channel_value_stat!(nodes[2], chan_2.2);
4114+
assert_eq!(stat2.value_to_self_msat, stat22.value_to_self_msat + recv_value_1 + recv_value_21 + recv_value_22);
40744115
}
40754116

40764117
#[test]

0 commit comments

Comments
 (0)