@@ -776,51 +776,57 @@ macro_rules! expect_payment_failed {
776
776
}
777
777
}
778
778
779
- pub fn send_along_route_with_secret < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , route : Route , expected_route : & [ & Node < ' a , ' b , ' c > ] , recv_value : u64 , our_payment_hash : PaymentHash , our_payment_secret : Option < PaymentSecret > ) {
780
- let mut payment_event = {
781
- origin_node. node . send_payment ( route, our_payment_hash, & our_payment_secret) . unwrap ( ) ;
782
- check_added_monitors ! ( origin_node, 1 ) ;
783
-
784
- let mut events = origin_node. node . get_and_clear_pending_msg_events ( ) ;
785
- assert_eq ! ( events. len( ) , 1 ) ;
786
- SendEvent :: from_event ( events. remove ( 0 ) )
787
- } ;
788
- let mut prev_node = origin_node;
789
-
790
- for ( idx, & node) in expected_route. iter ( ) . enumerate ( ) {
791
- assert_eq ! ( node. node. get_our_node_id( ) , payment_event. node_id) ;
792
-
793
- node. node . handle_update_add_htlc ( & prev_node. node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
794
- check_added_monitors ! ( node, 0 ) ;
795
- commitment_signed_dance ! ( node, prev_node, payment_event. commitment_msg, false ) ;
796
-
797
- expect_pending_htlcs_forwardable ! ( node) ;
798
-
799
- if idx == expected_route. len ( ) - 1 {
800
- let events_2 = node. node . get_and_clear_pending_events ( ) ;
801
- assert_eq ! ( events_2. len( ) , 1 ) ;
802
- match events_2[ 0 ] {
803
- Event :: PaymentReceived { ref payment_hash, ref payment_secret, amt } => {
804
- assert_eq ! ( our_payment_hash, * payment_hash) ;
805
- assert_eq ! ( our_payment_secret, * payment_secret) ;
806
- assert_eq ! ( amt, recv_value) ;
807
- } ,
808
- _ => panic ! ( "Unexpected event" ) ,
779
+ pub fn send_along_route_with_secret < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , route : Route , expected_paths : & [ & [ & Node < ' a , ' b , ' c > ] ] , recv_value : u64 , our_payment_hash : PaymentHash , our_payment_secret : Option < PaymentSecret > ) {
780
+ origin_node. node . send_payment ( route, our_payment_hash, & our_payment_secret) . unwrap ( ) ;
781
+ check_added_monitors ! ( origin_node, expected_paths. len( ) ) ;
782
+
783
+ let mut events = origin_node. node . get_and_clear_pending_msg_events ( ) ;
784
+ assert_eq ! ( events. len( ) , expected_paths. len( ) ) ;
785
+ for ( path_idx, ( ev, expected_route) ) in events. drain ( ..) . zip ( expected_paths. iter ( ) ) . enumerate ( ) {
786
+ let mut payment_event = SendEvent :: from_event ( ev) ;
787
+ let mut prev_node = origin_node;
788
+
789
+ for ( idx, & node) in expected_route. iter ( ) . enumerate ( ) {
790
+ assert_eq ! ( node. node. get_our_node_id( ) , payment_event. node_id) ;
791
+
792
+ node. node . handle_update_add_htlc ( & prev_node. node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
793
+ check_added_monitors ! ( node, 0 ) ;
794
+ commitment_signed_dance ! ( node, prev_node, payment_event. commitment_msg, false ) ;
795
+
796
+ expect_pending_htlcs_forwardable ! ( node) ;
797
+
798
+ if idx == expected_route. len ( ) - 1 {
799
+ let events_2 = node. node . get_and_clear_pending_events ( ) ;
800
+ // Once we've gotten through all the HTLCs, the last one should result in a
801
+ // PaymentReceived (but each previous one should not!).
802
+ if path_idx == expected_paths. len ( ) - 1 {
803
+ assert_eq ! ( events_2. len( ) , 1 ) ;
804
+ match events_2[ 0 ] {
805
+ Event :: PaymentReceived { ref payment_hash, ref payment_secret, amt } => {
806
+ assert_eq ! ( our_payment_hash, * payment_hash) ;
807
+ assert_eq ! ( our_payment_secret, * payment_secret) ;
808
+ assert_eq ! ( amt, recv_value) ;
809
+ } ,
810
+ _ => panic ! ( "Unexpected event" ) ,
811
+ }
812
+ } else {
813
+ assert ! ( events_2. is_empty( ) ) ;
814
+ }
815
+ } else {
816
+ let mut events_2 = node. node . get_and_clear_pending_msg_events ( ) ;
817
+ assert_eq ! ( events_2. len( ) , 1 ) ;
818
+ check_added_monitors ! ( node, 1 ) ;
819
+ payment_event = SendEvent :: from_event ( events_2. remove ( 0 ) ) ;
820
+ assert_eq ! ( payment_event. msgs. len( ) , 1 ) ;
809
821
}
810
- } else {
811
- let mut events_2 = node. node . get_and_clear_pending_msg_events ( ) ;
812
- assert_eq ! ( events_2. len( ) , 1 ) ;
813
- check_added_monitors ! ( node, 1 ) ;
814
- payment_event = SendEvent :: from_event ( events_2. remove ( 0 ) ) ;
815
- assert_eq ! ( payment_event. msgs. len( ) , 1 ) ;
816
- }
817
822
818
- prev_node = node;
823
+ prev_node = node;
824
+ }
819
825
}
820
826
}
821
827
822
828
pub fn send_along_route_with_hash < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , route : Route , expected_route : & [ & Node < ' a , ' b , ' c > ] , recv_value : u64 , our_payment_hash : PaymentHash ) {
823
- send_along_route_with_secret ( origin_node, route, expected_route, recv_value, our_payment_hash, None ) ;
829
+ send_along_route_with_secret ( origin_node, route, & [ expected_route] , recv_value, our_payment_hash, None ) ;
824
830
}
825
831
826
832
pub fn send_along_route < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , route : Route , expected_route : & [ & Node < ' a , ' b , ' c > ] , recv_value : u64 ) -> ( PaymentPreimage , PaymentHash ) {
@@ -829,86 +835,96 @@ pub fn send_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, route: Route
829
835
( our_payment_preimage, our_payment_hash)
830
836
}
831
837
832
- pub fn claim_payment_along_route_with_secret < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_route : & [ & Node < ' a , ' b , ' c > ] , skip_last : bool , our_payment_preimage : PaymentPreimage , our_payment_secret : Option < PaymentSecret > , expected_amount : u64 ) {
833
- assert ! ( expected_route. last( ) . unwrap( ) . node. claim_funds( our_payment_preimage, & our_payment_secret, expected_amount) ) ;
834
- check_added_monitors ! ( expected_route. last( ) . unwrap( ) , 1 ) ;
838
+ pub fn claim_payment_along_route_with_secret < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_paths : & [ & [ & Node < ' a , ' b , ' c > ] ] , skip_last : bool , our_payment_preimage : PaymentPreimage , our_payment_secret : Option < PaymentSecret > , expected_amount : u64 ) {
839
+ for path in expected_paths. iter ( ) {
840
+ assert_eq ! ( path. last( ) . unwrap( ) . node. get_our_node_id( ) , expected_paths[ 0 ] . last( ) . unwrap( ) . node. get_our_node_id( ) ) ;
841
+ }
842
+ assert ! ( expected_paths[ 0 ] . last( ) . unwrap( ) . node. claim_funds( our_payment_preimage, & our_payment_secret, expected_amount) ) ;
843
+ check_added_monitors ! ( expected_paths[ 0 ] . last( ) . unwrap( ) , expected_paths. len( ) ) ;
835
844
836
- let mut next_msgs: Option < ( msgs:: UpdateFulfillHTLC , msgs:: CommitmentSigned ) > = None ;
837
- let mut expected_next_node = expected_route. last ( ) . unwrap ( ) . node . get_our_node_id ( ) ;
838
- macro_rules! get_next_msgs {
839
- ( $node: expr) => {
840
- {
841
- let events = $node. node. get_and_clear_pending_msg_events( ) ;
842
- assert_eq!( events. len( ) , 1 ) ;
843
- match events[ 0 ] {
844
- MessageSendEvent :: UpdateHTLCs { ref node_id, updates: msgs:: CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {
845
- assert!( update_add_htlcs. is_empty( ) ) ;
846
- assert_eq!( update_fulfill_htlcs. len( ) , 1 ) ;
847
- assert!( update_fail_htlcs. is_empty( ) ) ;
848
- assert!( update_fail_malformed_htlcs. is_empty( ) ) ;
849
- assert!( update_fee. is_none( ) ) ;
850
- expected_next_node = node_id. clone( ) ;
851
- Some ( ( update_fulfill_htlcs[ 0 ] . clone( ) , commitment_signed. clone( ) ) )
852
- } ,
853
- _ => panic!( "Unexpected event" ) ,
854
- }
845
+ macro_rules! msgs_from_ev {
846
+ ( $ev: expr) => {
847
+ match $ev {
848
+ & MessageSendEvent :: UpdateHTLCs { ref node_id, updates: msgs:: CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {
849
+ assert!( update_add_htlcs. is_empty( ) ) ;
850
+ assert_eq!( update_fulfill_htlcs. len( ) , 1 ) ;
851
+ assert!( update_fail_htlcs. is_empty( ) ) ;
852
+ assert!( update_fail_malformed_htlcs. is_empty( ) ) ;
853
+ assert!( update_fee. is_none( ) ) ;
854
+ ( ( update_fulfill_htlcs[ 0 ] . clone( ) , commitment_signed. clone( ) ) , node_id. clone( ) )
855
+ } ,
856
+ _ => panic!( "Unexpected event" ) ,
855
857
}
856
858
}
857
859
}
860
+ let mut per_path_msgs: Vec < ( ( msgs:: UpdateFulfillHTLC , msgs:: CommitmentSigned ) , PublicKey ) > = Vec :: with_capacity ( expected_paths. len ( ) ) ;
861
+ let events = expected_paths[ 0 ] . last ( ) . unwrap ( ) . node . get_and_clear_pending_msg_events ( ) ;
862
+ assert_eq ! ( events. len( ) , expected_paths. len( ) ) ;
863
+ for ev in events. iter ( ) {
864
+ per_path_msgs. push ( msgs_from_ev ! ( ev) ) ;
865
+ }
858
866
859
- macro_rules! last_update_fulfill_dance {
860
- ( $node: expr, $prev_node: expr) => {
861
- {
862
- $node. node. handle_update_fulfill_htlc( & $prev_node. node. get_our_node_id( ) , & next_msgs. as_ref( ) . unwrap( ) . 0 ) ;
863
- check_added_monitors!( $node, 0 ) ;
864
- assert!( $node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
865
- commitment_signed_dance!( $node, $prev_node, next_msgs. as_ref( ) . unwrap( ) . 1 , false ) ;
867
+ for ( expected_route, ( path_msgs, next_hop) ) in expected_paths. iter ( ) . zip ( per_path_msgs. drain ( ..) ) {
868
+ let mut next_msgs = Some ( path_msgs) ;
869
+ let mut expected_next_node = next_hop;
870
+
871
+ macro_rules! last_update_fulfill_dance {
872
+ ( $node: expr, $prev_node: expr) => {
873
+ {
874
+ $node. node. handle_update_fulfill_htlc( & $prev_node. node. get_our_node_id( ) , & next_msgs. as_ref( ) . unwrap( ) . 0 ) ;
875
+ check_added_monitors!( $node, 0 ) ;
876
+ assert!( $node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
877
+ commitment_signed_dance!( $node, $prev_node, next_msgs. as_ref( ) . unwrap( ) . 1 , false ) ;
878
+ }
866
879
}
867
880
}
868
- }
869
- macro_rules! mid_update_fulfill_dance {
870
- ( $node: expr, $prev_node: expr, $new_msgs: expr) => {
871
- {
872
- $node. node. handle_update_fulfill_htlc( & $prev_node. node. get_our_node_id( ) , & next_msgs. as_ref( ) . unwrap( ) . 0 ) ;
873
- check_added_monitors!( $node, 1 ) ;
874
- let new_next_msgs = if $new_msgs {
875
- get_next_msgs!( $node)
876
- } else {
877
- assert!( $node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
878
- None
879
- } ;
880
- commitment_signed_dance!( $node, $prev_node, next_msgs. as_ref( ) . unwrap( ) . 1 , false ) ;
881
- next_msgs = new_next_msgs;
881
+ macro_rules! mid_update_fulfill_dance {
882
+ ( $node: expr, $prev_node: expr, $new_msgs: expr) => {
883
+ {
884
+ $node. node. handle_update_fulfill_htlc( & $prev_node. node. get_our_node_id( ) , & next_msgs. as_ref( ) . unwrap( ) . 0 ) ;
885
+ check_added_monitors!( $node, 1 ) ;
886
+ let new_next_msgs = if $new_msgs {
887
+ let events = $node. node. get_and_clear_pending_msg_events( ) ;
888
+ assert_eq!( events. len( ) , 1 ) ;
889
+ let ( res, nexthop) = msgs_from_ev!( & events[ 0 ] ) ;
890
+ expected_next_node = nexthop;
891
+ Some ( res)
892
+ } else {
893
+ assert!( $node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
894
+ None
895
+ } ;
896
+ commitment_signed_dance!( $node, $prev_node, next_msgs. as_ref( ) . unwrap( ) . 1 , false ) ;
897
+ next_msgs = new_next_msgs;
898
+ }
882
899
}
883
900
}
884
- }
885
901
886
- let mut prev_node = expected_route. last ( ) . unwrap ( ) ;
887
- for ( idx, node) in expected_route. iter ( ) . rev ( ) . enumerate ( ) {
888
- assert_eq ! ( expected_next_node, node. node. get_our_node_id( ) ) ;
889
- let update_next_msgs = !skip_last || idx != expected_route. len ( ) - 1 ;
890
- if next_msgs. is_some ( ) {
891
- mid_update_fulfill_dance ! ( node, prev_node, update_next_msgs) ;
892
- } else if update_next_msgs {
893
- next_msgs = get_next_msgs ! ( node) ;
894
- } else {
895
- assert ! ( node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
896
- }
897
- if !skip_last && idx == expected_route. len ( ) - 1 {
898
- assert_eq ! ( expected_next_node, origin_node. node. get_our_node_id( ) ) ;
899
- }
902
+ let mut prev_node = expected_route. last ( ) . unwrap ( ) ;
903
+ for ( idx, node) in expected_route. iter ( ) . rev ( ) . enumerate ( ) . skip ( 1 ) {
904
+ assert_eq ! ( expected_next_node, node. node. get_our_node_id( ) ) ;
905
+ let update_next_msgs = !skip_last || idx != expected_route. len ( ) - 1 ;
906
+ if next_msgs. is_some ( ) {
907
+ mid_update_fulfill_dance ! ( node, prev_node, update_next_msgs) ;
908
+ } else {
909
+ assert ! ( !update_next_msgs) ;
910
+ assert ! ( node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
911
+ }
912
+ if !skip_last && idx == expected_route. len ( ) - 1 {
913
+ assert_eq ! ( expected_next_node, origin_node. node. get_our_node_id( ) ) ;
914
+ }
900
915
901
- prev_node = node;
902
- }
916
+ prev_node = node;
917
+ }
903
918
904
- if !skip_last {
905
- last_update_fulfill_dance ! ( origin_node, expected_route. first( ) . unwrap( ) ) ;
906
- expect_payment_sent ! ( origin_node, our_payment_preimage) ;
919
+ if !skip_last {
920
+ last_update_fulfill_dance ! ( origin_node, expected_route. first( ) . unwrap( ) ) ;
921
+ expect_payment_sent ! ( origin_node, our_payment_preimage) ;
922
+ }
907
923
}
908
924
}
909
925
910
926
pub fn claim_payment_along_route < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_route : & [ & Node < ' a , ' b , ' c > ] , skip_last : bool , our_payment_preimage : PaymentPreimage , expected_amount : u64 ) {
911
- claim_payment_along_route_with_secret ( origin_node, expected_route, skip_last, our_payment_preimage, None , expected_amount) ;
927
+ claim_payment_along_route_with_secret ( origin_node, & [ expected_route] , skip_last, our_payment_preimage, None , expected_amount) ;
912
928
}
913
929
914
930
pub fn claim_payment < ' a , ' b , ' c > ( origin_node : & Node < ' a , ' b , ' c > , expected_route : & [ & Node < ' a , ' b , ' c > ] , our_payment_preimage : PaymentPreimage , expected_amount : u64 ) {
0 commit comments