@@ -776,51 +776,55 @@ 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 < [ u8 ; 32 ] > ) {
780
- let mut payment_event = {
781
- origin_node. node . send_payment ( route, our_payment_hash, our_payment_secret. as_ref ( ) ) . 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 < [ u8 ; 32 ] > ) {
780
+ origin_node. node . send_payment ( route, our_payment_hash, our_payment_secret. as_ref ( ) ) . 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
+ if path_idx == expected_paths. len ( ) - 1 {
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" ) ,
809
+ }
810
+ } else {
811
+ assert ! ( events_2. is_empty( ) ) ;
812
+ }
813
+ } else {
814
+ let mut events_2 = node. node . get_and_clear_pending_msg_events ( ) ;
815
+ assert_eq ! ( events_2. len( ) , 1 ) ;
816
+ check_added_monitors ! ( node, 1 ) ;
817
+ payment_event = SendEvent :: from_event ( events_2. remove ( 0 ) ) ;
818
+ assert_eq ! ( payment_event. msgs. len( ) , 1 ) ;
809
819
}
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
820
818
- prev_node = node;
821
+ prev_node = node;
822
+ }
819
823
}
820
824
}
821
825
822
826
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 ) ;
827
+ send_along_route_with_secret ( origin_node, route, & [ expected_route] , recv_value, our_payment_hash, None ) ;
824
828
}
825
829
826
830
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 +833,96 @@ pub fn send_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, route: Route
829
833
( our_payment_preimage, our_payment_hash)
830
834
}
831
835
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 < [ u8 ; 32 ] > , 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 ) ;
836
+ 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 < [ u8 ; 32 ] > , expected_amount : u64 ) {
837
+ for path in expected_paths. iter ( ) {
838
+ assert_eq ! ( path. last( ) . unwrap( ) . node. get_our_node_id( ) , expected_paths[ 0 ] . last( ) . unwrap( ) . node. get_our_node_id( ) ) ;
839
+ }
840
+ assert ! ( expected_paths[ 0 ] . last( ) . unwrap( ) . node. claim_funds( our_payment_preimage, & our_payment_secret, expected_amount) ) ;
841
+ check_added_monitors ! ( expected_paths[ 0 ] . last( ) . unwrap( ) , expected_paths. len( ) ) ;
835
842
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
- }
843
+ macro_rules! msgs_from_ev {
844
+ ( $ev: expr) => {
845
+ match $ev {
846
+ & 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 } } => {
847
+ assert!( update_add_htlcs. is_empty( ) ) ;
848
+ assert_eq!( update_fulfill_htlcs. len( ) , 1 ) ;
849
+ assert!( update_fail_htlcs. is_empty( ) ) ;
850
+ assert!( update_fail_malformed_htlcs. is_empty( ) ) ;
851
+ assert!( update_fee. is_none( ) ) ;
852
+ ( ( update_fulfill_htlcs[ 0 ] . clone( ) , commitment_signed. clone( ) ) , node_id. clone( ) )
853
+ } ,
854
+ _ => panic!( "Unexpected event" ) ,
855
855
}
856
856
}
857
857
}
858
+ let mut per_path_msgs: Vec < ( ( msgs:: UpdateFulfillHTLC , msgs:: CommitmentSigned ) , PublicKey ) > = Vec :: with_capacity ( expected_paths. len ( ) ) ;
859
+ let events = expected_paths[ 0 ] . last ( ) . unwrap ( ) . node . get_and_clear_pending_msg_events ( ) ;
860
+ assert_eq ! ( events. len( ) , expected_paths. len( ) ) ;
861
+ for ev in events. iter ( ) {
862
+ per_path_msgs. push ( msgs_from_ev ! ( ev) ) ;
863
+ }
858
864
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 ) ;
865
+ for ( expected_route, ( path_msgs, next_hop) ) in expected_paths. iter ( ) . zip ( per_path_msgs. drain ( ..) ) {
866
+ let mut next_msgs = Some ( path_msgs) ;
867
+ let mut expected_next_node = next_hop;
868
+
869
+ macro_rules! last_update_fulfill_dance {
870
+ ( $node: expr, $prev_node: 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, 0 ) ;
874
+ assert!( $node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
875
+ commitment_signed_dance!( $node, $prev_node, next_msgs. as_ref( ) . unwrap( ) . 1 , false ) ;
876
+ }
866
877
}
867
878
}
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;
879
+ macro_rules! mid_update_fulfill_dance {
880
+ ( $node: expr, $prev_node: expr, $new_msgs: expr) => {
881
+ {
882
+ $node. node. handle_update_fulfill_htlc( & $prev_node. node. get_our_node_id( ) , & next_msgs. as_ref( ) . unwrap( ) . 0 ) ;
883
+ check_added_monitors!( $node, 1 ) ;
884
+ let new_next_msgs = if $new_msgs {
885
+ let events = $node. node. get_and_clear_pending_msg_events( ) ;
886
+ assert_eq!( events. len( ) , 1 ) ;
887
+ let ( res, nexthop) = msgs_from_ev!( & events[ 0 ] ) ;
888
+ expected_next_node = nexthop;
889
+ Some ( res)
890
+ } else {
891
+ assert!( $node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
892
+ None
893
+ } ;
894
+ commitment_signed_dance!( $node, $prev_node, next_msgs. as_ref( ) . unwrap( ) . 1 , false ) ;
895
+ next_msgs = new_next_msgs;
896
+ }
882
897
}
883
898
}
884
- }
885
899
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
- }
900
+ let mut prev_node = expected_route. last ( ) . unwrap ( ) ;
901
+ for ( idx, node) in expected_route. iter ( ) . rev ( ) . enumerate ( ) . skip ( 1 ) {
902
+ assert_eq ! ( expected_next_node, node. node. get_our_node_id( ) ) ;
903
+ let update_next_msgs = !skip_last || idx != expected_route. len ( ) - 1 ;
904
+ if next_msgs. is_some ( ) {
905
+ mid_update_fulfill_dance ! ( node, prev_node, update_next_msgs) ;
906
+ } else {
907
+ assert ! ( !update_next_msgs) ;
908
+ assert ! ( node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
909
+ }
910
+ if !skip_last && idx == expected_route. len ( ) - 1 {
911
+ assert_eq ! ( expected_next_node, origin_node. node. get_our_node_id( ) ) ;
912
+ }
900
913
901
- prev_node = node;
902
- }
914
+ prev_node = node;
915
+ }
903
916
904
- if !skip_last {
905
- last_update_fulfill_dance ! ( origin_node, expected_route. first( ) . unwrap( ) ) ;
906
- expect_payment_sent ! ( origin_node, our_payment_preimage) ;
917
+ if !skip_last {
918
+ last_update_fulfill_dance ! ( origin_node, expected_route. first( ) . unwrap( ) ) ;
919
+ expect_payment_sent ! ( origin_node, our_payment_preimage) ;
920
+ }
907
921
}
908
922
}
909
923
910
924
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) ;
925
+ claim_payment_along_route_with_secret ( origin_node, & [ expected_route] , skip_last, our_payment_preimage, None , expected_amount) ;
912
926
}
913
927
914
928
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