@@ -1555,23 +1555,30 @@ macro_rules! commitment_signed_dance {
1555
1555
bs_revoke_and_ack
1556
1556
}
1557
1557
} ;
1558
- ( $node_a: expr, $node_b: expr, ( ) , $fail_backwards: expr, true /* skip last step */ , true /* return extra message */ ) => {
1559
- {
1560
- let ( extra_msg_option, bs_revoke_and_ack) = $crate:: ln:: functional_test_utils:: do_main_commitment_signed_dance( & $node_a, & $node_b, $fail_backwards) ;
1561
- $node_a. node. handle_revoke_and_ack( & $node_b. node. get_our_node_id( ) , & bs_revoke_and_ack) ;
1562
- $crate:: ln:: functional_test_utils:: check_added_monitors( & $node_a, 1 ) ;
1563
- extra_msg_option
1564
- }
1565
- } ;
1566
1558
( $node_a: expr, $node_b: expr, ( ) , $fail_backwards: expr, true /* skip last step */ , false /* no extra message */ ) => {
1567
- assert!( commitment_signed_dance! ( $node_a, $node_b, ( ) , $fail_backwards, true , true ) . is_none( ) ) ;
1559
+ assert!( $crate :: ln :: functional_test_utils :: commitment_signed_dance_through_cp_raa ( & $node_a, & $node_b, $fail_backwards) . is_none( ) ) ;
1568
1560
} ;
1569
1561
( $node_a: expr, $node_b: expr, $commitment_signed: expr, $fail_backwards: expr) => {
1570
1562
$crate:: ln:: functional_test_utils:: do_commitment_signed_dance( & $node_a, & $node_b, & $commitment_signed, $fail_backwards, false ) ;
1571
1563
}
1572
1564
}
1573
1565
1574
-
1566
+ /// Runs the commitment_signed dance after the initial commitment_signed is delivered through to
1567
+ /// the initiator's `revoke_and_ack` response. i.e. [`do_main_commitment_signed_dance`] plus the
1568
+ /// `revoke_and_ack` response to it.
1569
+ ///
1570
+ /// Returns any additional message `node_b` generated in addition to the `revoke_and_ack` response.
1571
+ pub fn commitment_signed_dance_through_cp_raa ( node_a : & Node < ' _ , ' _ , ' _ > , node_b : & Node < ' _ , ' _ , ' _ > , fail_backwards : bool ) -> Option < MessageSendEvent > {
1572
+ let ( extra_msg_option, bs_revoke_and_ack) = do_main_commitment_signed_dance ( node_a, node_b, fail_backwards) ;
1573
+ node_a. node . handle_revoke_and_ack ( & node_b. node . get_our_node_id ( ) , & bs_revoke_and_ack) ;
1574
+ check_added_monitors ( node_a, 1 ) ;
1575
+ extra_msg_option
1576
+ }
1577
+
1578
+ /// Does the main logic in the commitment_signed dance. After the first `commitment_signed` has
1579
+ /// been delivered, this method picks up and delivers the response `revoke_and_ack` and
1580
+ /// `commitment_signed`, returning the recipient's `revoke_and_ack` and any extra message it may
1581
+ /// have included.
1575
1582
pub fn do_main_commitment_signed_dance ( node_a : & Node < ' _ , ' _ , ' _ > , node_b : & Node < ' _ , ' _ , ' _ > , fail_backwards : bool ) -> ( Option < MessageSendEvent > , msgs:: RevokeAndACK ) {
1576
1583
let ( as_revoke_and_ack, as_commitment_signed) = get_revoke_commit_msgs ! ( node_a, node_b. node. get_our_node_id( ) ) ;
1577
1584
check_added_monitors ! ( node_b, 0 ) ;
@@ -1600,6 +1607,11 @@ pub fn do_main_commitment_signed_dance(node_a: &Node<'_, '_, '_>, node_b: &Node<
1600
1607
( extra_msg_option, bs_revoke_and_ack)
1601
1608
}
1602
1609
1610
+ /// Runs a full commitment_signed dance, delivering a commitment_signed, the responding
1611
+ /// `revoke_and_ack` and `commitment_signed`, and then the final `revoke_and_ack` response.
1612
+ ///
1613
+ /// If `skip_last_step` is unset, also checks for the payment failure update for the previous hop
1614
+ /// on failure or that no new messages are left over on success.
1603
1615
pub fn do_commitment_signed_dance ( node_a : & Node < ' _ , ' _ , ' _ > , node_b : & Node < ' _ , ' _ , ' _ > , commitment_signed : & msgs:: CommitmentSigned , fail_backwards : bool , skip_last_step : bool ) {
1604
1616
check_added_monitors ! ( node_a, 0 ) ;
1605
1617
assert ! ( node_a. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
@@ -1741,6 +1753,44 @@ macro_rules! expect_payment_claimed {
1741
1753
}
1742
1754
}
1743
1755
1756
+ pub fn expect_payment_sent < CM : AChannelManager , H : NodeHolder < CM =CM > > ( node : & H ,
1757
+ expected_payment_preimage : PaymentPreimage , expected_fee_msat_opt : Option < Option < u64 > > ,
1758
+ expect_per_path_claims : bool ,
1759
+ ) {
1760
+ let events = node. node ( ) . get_and_clear_pending_events ( ) ;
1761
+ let expected_payment_hash = PaymentHash (
1762
+ bitcoin:: hashes:: sha256:: Hash :: hash ( & expected_payment_preimage. 0 ) . into_inner ( ) ) ;
1763
+ if expect_per_path_claims {
1764
+ assert ! ( events. len( ) > 1 ) ;
1765
+ } else {
1766
+ assert_eq ! ( events. len( ) , 1 ) ;
1767
+ }
1768
+ let expected_payment_id = match events[ 0 ] {
1769
+ Event :: PaymentSent { ref payment_id, ref payment_preimage, ref payment_hash, ref fee_paid_msat } => {
1770
+ assert_eq ! ( expected_payment_preimage, * payment_preimage) ;
1771
+ assert_eq ! ( expected_payment_hash, * payment_hash) ;
1772
+ if let Some ( expected_fee_msat) = expected_fee_msat_opt {
1773
+ assert_eq ! ( * fee_paid_msat, expected_fee_msat) ;
1774
+ } else {
1775
+ assert ! ( fee_paid_msat. is_some( ) ) ;
1776
+ }
1777
+ payment_id. unwrap ( )
1778
+ } ,
1779
+ _ => panic ! ( "Unexpected event" ) ,
1780
+ } ;
1781
+ if expect_per_path_claims {
1782
+ for i in 1 ..events. len ( ) {
1783
+ match events[ i] {
1784
+ Event :: PaymentPathSuccessful { payment_id, payment_hash, .. } => {
1785
+ assert_eq ! ( payment_id, expected_payment_id) ;
1786
+ assert_eq ! ( payment_hash, Some ( expected_payment_hash) ) ;
1787
+ } ,
1788
+ _ => panic ! ( "Unexpected event" ) ,
1789
+ }
1790
+ }
1791
+ }
1792
+ }
1793
+
1744
1794
#[ cfg( test) ]
1745
1795
#[ macro_export]
1746
1796
macro_rules! expect_payment_sent_without_paths {
@@ -1760,40 +1810,10 @@ macro_rules! expect_payment_sent {
1760
1810
( $node: expr, $expected_payment_preimage: expr, $expected_fee_msat_opt: expr) => {
1761
1811
$crate:: expect_payment_sent!( $node, $expected_payment_preimage, $expected_fee_msat_opt, true ) ;
1762
1812
} ;
1763
- ( $node: expr, $expected_payment_preimage: expr, $expected_fee_msat_opt: expr, $expect_paths: expr) => { {
1764
- use bitcoin:: hashes:: Hash as _;
1765
- let events = $node. node. get_and_clear_pending_events( ) ;
1766
- let expected_payment_hash = $crate:: ln:: PaymentHash (
1767
- bitcoin:: hashes:: sha256:: Hash :: hash( & $expected_payment_preimage. 0 ) . into_inner( ) ) ;
1768
- if $expect_paths {
1769
- assert!( events. len( ) > 1 ) ;
1770
- } else {
1771
- assert_eq!( events. len( ) , 1 ) ;
1772
- }
1773
- let expected_payment_id = match events[ 0 ] {
1774
- $crate:: events:: Event :: PaymentSent { ref payment_id, ref payment_preimage, ref payment_hash, ref fee_paid_msat } => {
1775
- assert_eq!( $expected_payment_preimage, * payment_preimage) ;
1776
- assert_eq!( expected_payment_hash, * payment_hash) ;
1777
- assert!( fee_paid_msat. is_some( ) ) ;
1778
- if $expected_fee_msat_opt. is_some( ) {
1779
- assert_eq!( * fee_paid_msat, $expected_fee_msat_opt) ;
1780
- }
1781
- payment_id. unwrap( )
1782
- } ,
1783
- _ => panic!( "Unexpected event" ) ,
1784
- } ;
1785
- if $expect_paths {
1786
- for i in 1 ..events. len( ) {
1787
- match events[ i] {
1788
- $crate:: events:: Event :: PaymentPathSuccessful { payment_id, payment_hash, .. } => {
1789
- assert_eq!( payment_id, expected_payment_id) ;
1790
- assert_eq!( payment_hash, Some ( expected_payment_hash) ) ;
1791
- } ,
1792
- _ => panic!( "Unexpected event" ) ,
1793
- }
1794
- }
1795
- }
1796
- } }
1813
+ ( $node: expr, $expected_payment_preimage: expr, $expected_fee_msat_opt: expr, $expect_paths: expr) => {
1814
+ $crate:: ln:: functional_test_utils:: expect_payment_sent( & $node, $expected_payment_preimage,
1815
+ $expected_fee_msat_opt. map( |o| Some ( o) ) , $expect_paths) ;
1816
+ }
1797
1817
}
1798
1818
1799
1819
#[ cfg( test) ]
0 commit comments