@@ -1555,23 +1555,30 @@ macro_rules! commitment_signed_dance {
15551555 bs_revoke_and_ack
15561556 }
15571557 } ;
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- } ;
15661558 ( $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( ) ) ;
15681560 } ;
15691561 ( $node_a: expr, $node_b: expr, $commitment_signed: expr, $fail_backwards: expr) => {
15701562 $crate:: ln:: functional_test_utils:: do_commitment_signed_dance( & $node_a, & $node_b, & $commitment_signed, $fail_backwards, false ) ;
15711563 }
15721564}
15731565
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.
15751582pub fn do_main_commitment_signed_dance ( node_a : & Node < ' _ , ' _ , ' _ > , node_b : & Node < ' _ , ' _ , ' _ > , fail_backwards : bool ) -> ( Option < MessageSendEvent > , msgs:: RevokeAndACK ) {
15761583 let ( as_revoke_and_ack, as_commitment_signed) = get_revoke_commit_msgs ! ( node_a, node_b. node. get_our_node_id( ) ) ;
15771584 check_added_monitors ! ( node_b, 0 ) ;
@@ -1600,6 +1607,11 @@ pub fn do_main_commitment_signed_dance(node_a: &Node<'_, '_, '_>, node_b: &Node<
16001607 ( extra_msg_option, bs_revoke_and_ack)
16011608}
16021609
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.
16031615pub fn do_commitment_signed_dance ( node_a : & Node < ' _ , ' _ , ' _ > , node_b : & Node < ' _ , ' _ , ' _ > , commitment_signed : & msgs:: CommitmentSigned , fail_backwards : bool , skip_last_step : bool ) {
16041616 check_added_monitors ! ( node_a, 0 ) ;
16051617 assert ! ( node_a. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
@@ -1741,6 +1753,44 @@ macro_rules! expect_payment_claimed {
17411753 }
17421754}
17431755
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+
17441794#[ cfg( test) ]
17451795#[ macro_export]
17461796macro_rules! expect_payment_sent_without_paths {
@@ -1760,40 +1810,10 @@ macro_rules! expect_payment_sent {
17601810 ( $node: expr, $expected_payment_preimage: expr, $expected_fee_msat_opt: expr) => {
17611811 $crate:: expect_payment_sent!( $node, $expected_payment_preimage, $expected_fee_msat_opt, true ) ;
17621812 } ;
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+ }
17971817}
17981818
17991819#[ cfg( test) ]
0 commit comments