@@ -758,51 +758,55 @@ macro_rules! expect_payment_failed {
758
758
}
759
759
}
760
760
761
- 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 ] > ) {
762
- let mut payment_event = {
763
- origin_node. node . send_payment ( route, our_payment_hash, our_payment_secret. as_ref ( ) ) . unwrap ( ) ;
764
- check_added_monitors ! ( origin_node, 1 ) ;
765
-
766
- let mut events = origin_node. node . get_and_clear_pending_msg_events ( ) ;
767
- assert_eq ! ( events. len( ) , 1 ) ;
768
- SendEvent :: from_event ( events. remove ( 0 ) )
769
- } ;
770
- let mut prev_node = origin_node;
771
-
772
- for ( idx, & node) in expected_route. iter ( ) . enumerate ( ) {
773
- assert_eq ! ( node. node. get_our_node_id( ) , payment_event. node_id) ;
774
-
775
- node. node . handle_update_add_htlc ( & prev_node. node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
776
- check_added_monitors ! ( node, 0 ) ;
777
- commitment_signed_dance ! ( node, prev_node, payment_event. commitment_msg, false ) ;
778
-
779
- expect_pending_htlcs_forwardable ! ( node) ;
780
-
781
- if idx == expected_route. len ( ) - 1 {
782
- let events_2 = node. node . get_and_clear_pending_events ( ) ;
783
- assert_eq ! ( events_2. len( ) , 1 ) ;
784
- match events_2[ 0 ] {
785
- Event :: PaymentReceived { ref payment_hash, ref payment_secret, amt } => {
786
- assert_eq ! ( our_payment_hash, * payment_hash) ;
787
- assert_eq ! ( our_payment_secret, * payment_secret) ;
788
- assert_eq ! ( amt, recv_value) ;
789
- } ,
790
- _ => panic ! ( "Unexpected event" ) ,
761
+ 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 ] > ) {
762
+ origin_node. node . send_payment ( route, our_payment_hash, our_payment_secret. as_ref ( ) ) . unwrap ( ) ;
763
+ check_added_monitors ! ( origin_node, expected_paths. len( ) ) ;
764
+
765
+ let mut events = origin_node. node . get_and_clear_pending_msg_events ( ) ;
766
+ assert_eq ! ( events. len( ) , expected_paths. len( ) ) ;
767
+ for ( path_idx, ( ev, expected_route) ) in events. drain ( ..) . zip ( expected_paths. iter ( ) ) . enumerate ( ) {
768
+ let mut payment_event = SendEvent :: from_event ( ev) ;
769
+ let mut prev_node = origin_node;
770
+
771
+ for ( idx, & node) in expected_route. iter ( ) . enumerate ( ) {
772
+ assert_eq ! ( node. node. get_our_node_id( ) , payment_event. node_id) ;
773
+
774
+ node. node . handle_update_add_htlc ( & prev_node. node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) ;
775
+ check_added_monitors ! ( node, 0 ) ;
776
+ commitment_signed_dance ! ( node, prev_node, payment_event. commitment_msg, false ) ;
777
+
778
+ expect_pending_htlcs_forwardable ! ( node) ;
779
+
780
+ if idx == expected_route. len ( ) - 1 {
781
+ let events_2 = node. node . get_and_clear_pending_events ( ) ;
782
+ if path_idx == expected_paths. len ( ) - 1 {
783
+ assert_eq ! ( events_2. len( ) , 1 ) ;
784
+ match events_2[ 0 ] {
785
+ Event :: PaymentReceived { ref payment_hash, ref payment_secret, amt } => {
786
+ assert_eq ! ( our_payment_hash, * payment_hash) ;
787
+ assert_eq ! ( our_payment_secret, * payment_secret) ;
788
+ assert_eq ! ( amt, recv_value) ;
789
+ } ,
790
+ _ => panic ! ( "Unexpected event" ) ,
791
+ }
792
+ } else {
793
+ assert ! ( events_2. is_empty( ) ) ;
794
+ }
795
+ } else {
796
+ let mut events_2 = node. node . get_and_clear_pending_msg_events ( ) ;
797
+ assert_eq ! ( events_2. len( ) , 1 ) ;
798
+ check_added_monitors ! ( node, 1 ) ;
799
+ payment_event = SendEvent :: from_event ( events_2. remove ( 0 ) ) ;
800
+ assert_eq ! ( payment_event. msgs. len( ) , 1 ) ;
791
801
}
792
- } else {
793
- let mut events_2 = node. node . get_and_clear_pending_msg_events ( ) ;
794
- assert_eq ! ( events_2. len( ) , 1 ) ;
795
- check_added_monitors ! ( node, 1 ) ;
796
- payment_event = SendEvent :: from_event ( events_2. remove ( 0 ) ) ;
797
- assert_eq ! ( payment_event. msgs. len( ) , 1 ) ;
798
- }
799
802
800
- prev_node = node;
803
+ prev_node = node;
804
+ }
801
805
}
802
806
}
803
807
804
808
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 ) {
805
- send_along_route_with_secret ( origin_node, route, expected_route, recv_value, our_payment_hash, None ) ;
809
+ send_along_route_with_secret ( origin_node, route, & [ expected_route] , recv_value, our_payment_hash, None ) ;
806
810
}
807
811
808
812
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 ) {
@@ -811,86 +815,96 @@ pub fn send_along_route<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, route: Route
811
815
( our_payment_preimage, our_payment_hash)
812
816
}
813
817
814
- 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 ) {
815
- assert ! ( expected_route. last( ) . unwrap( ) . node. claim_funds( our_payment_preimage, & our_payment_secret, expected_amount) ) ;
816
- check_added_monitors ! ( expected_route. last( ) . unwrap( ) , 1 ) ;
818
+ 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 ) {
819
+ for path in expected_paths. iter ( ) {
820
+ assert_eq ! ( path. last( ) . unwrap( ) . node. get_our_node_id( ) , expected_paths[ 0 ] . last( ) . unwrap( ) . node. get_our_node_id( ) ) ;
821
+ }
822
+ assert ! ( expected_paths[ 0 ] . last( ) . unwrap( ) . node. claim_funds( our_payment_preimage, & our_payment_secret, expected_amount) ) ;
823
+ check_added_monitors ! ( expected_paths[ 0 ] . last( ) . unwrap( ) , expected_paths. len( ) ) ;
817
824
818
- let mut next_msgs: Option < ( msgs:: UpdateFulfillHTLC , msgs:: CommitmentSigned ) > = None ;
819
- let mut expected_next_node = expected_route. last ( ) . unwrap ( ) . node . get_our_node_id ( ) ;
820
- macro_rules! get_next_msgs {
821
- ( $node: expr) => {
822
- {
823
- let events = $node. node. get_and_clear_pending_msg_events( ) ;
824
- assert_eq!( events. len( ) , 1 ) ;
825
- match events[ 0 ] {
826
- 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 } } => {
827
- assert!( update_add_htlcs. is_empty( ) ) ;
828
- assert_eq!( update_fulfill_htlcs. len( ) , 1 ) ;
829
- assert!( update_fail_htlcs. is_empty( ) ) ;
830
- assert!( update_fail_malformed_htlcs. is_empty( ) ) ;
831
- assert!( update_fee. is_none( ) ) ;
832
- expected_next_node = node_id. clone( ) ;
833
- Some ( ( update_fulfill_htlcs[ 0 ] . clone( ) , commitment_signed. clone( ) ) )
834
- } ,
835
- _ => panic!( "Unexpected event" ) ,
836
- }
825
+ macro_rules! msgs_from_ev {
826
+ ( $ev: expr) => {
827
+ match $ev {
828
+ & 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 } } => {
829
+ assert!( update_add_htlcs. is_empty( ) ) ;
830
+ assert_eq!( update_fulfill_htlcs. len( ) , 1 ) ;
831
+ assert!( update_fail_htlcs. is_empty( ) ) ;
832
+ assert!( update_fail_malformed_htlcs. is_empty( ) ) ;
833
+ assert!( update_fee. is_none( ) ) ;
834
+ ( ( update_fulfill_htlcs[ 0 ] . clone( ) , commitment_signed. clone( ) ) , node_id. clone( ) )
835
+ } ,
836
+ _ => panic!( "Unexpected event" ) ,
837
837
}
838
838
}
839
839
}
840
+ let mut per_path_msgs: Vec < ( ( msgs:: UpdateFulfillHTLC , msgs:: CommitmentSigned ) , PublicKey ) > = Vec :: with_capacity ( expected_paths. len ( ) ) ;
841
+ let events = expected_paths[ 0 ] . last ( ) . unwrap ( ) . node . get_and_clear_pending_msg_events ( ) ;
842
+ assert_eq ! ( events. len( ) , expected_paths. len( ) ) ;
843
+ for ev in events. iter ( ) {
844
+ per_path_msgs. push ( msgs_from_ev ! ( ev) ) ;
845
+ }
840
846
841
- macro_rules! last_update_fulfill_dance {
842
- ( $node: expr, $prev_node: expr) => {
843
- {
844
- $node. node. handle_update_fulfill_htlc( & $prev_node. node. get_our_node_id( ) , & next_msgs. as_ref( ) . unwrap( ) . 0 ) ;
845
- check_added_monitors!( $node, 0 ) ;
846
- assert!( $node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
847
- commitment_signed_dance!( $node, $prev_node, next_msgs. as_ref( ) . unwrap( ) . 1 , false ) ;
847
+ for ( expected_route, ( path_msgs, next_hop) ) in expected_paths. iter ( ) . zip ( per_path_msgs. drain ( ..) ) {
848
+ let mut next_msgs = Some ( path_msgs) ;
849
+ let mut expected_next_node = next_hop;
850
+
851
+ macro_rules! last_update_fulfill_dance {
852
+ ( $node: expr, $prev_node: expr) => {
853
+ {
854
+ $node. node. handle_update_fulfill_htlc( & $prev_node. node. get_our_node_id( ) , & next_msgs. as_ref( ) . unwrap( ) . 0 ) ;
855
+ check_added_monitors!( $node, 0 ) ;
856
+ assert!( $node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
857
+ commitment_signed_dance!( $node, $prev_node, next_msgs. as_ref( ) . unwrap( ) . 1 , false ) ;
858
+ }
848
859
}
849
860
}
850
- }
851
- macro_rules! mid_update_fulfill_dance {
852
- ( $node: expr, $prev_node: expr, $new_msgs: expr) => {
853
- {
854
- $node. node. handle_update_fulfill_htlc( & $prev_node. node. get_our_node_id( ) , & next_msgs. as_ref( ) . unwrap( ) . 0 ) ;
855
- check_added_monitors!( $node, 1 ) ;
856
- let new_next_msgs = if $new_msgs {
857
- get_next_msgs!( $node)
858
- } else {
859
- assert!( $node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
860
- None
861
- } ;
862
- commitment_signed_dance!( $node, $prev_node, next_msgs. as_ref( ) . unwrap( ) . 1 , false ) ;
863
- next_msgs = new_next_msgs;
861
+ macro_rules! mid_update_fulfill_dance {
862
+ ( $node: expr, $prev_node: expr, $new_msgs: expr) => {
863
+ {
864
+ $node. node. handle_update_fulfill_htlc( & $prev_node. node. get_our_node_id( ) , & next_msgs. as_ref( ) . unwrap( ) . 0 ) ;
865
+ check_added_monitors!( $node, 1 ) ;
866
+ let new_next_msgs = if $new_msgs {
867
+ let events = $node. node. get_and_clear_pending_msg_events( ) ;
868
+ assert_eq!( events. len( ) , 1 ) ;
869
+ let ( res, nexthop) = msgs_from_ev!( & events[ 0 ] ) ;
870
+ expected_next_node = nexthop;
871
+ Some ( res)
872
+ } else {
873
+ assert!( $node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
874
+ None
875
+ } ;
876
+ commitment_signed_dance!( $node, $prev_node, next_msgs. as_ref( ) . unwrap( ) . 1 , false ) ;
877
+ next_msgs = new_next_msgs;
878
+ }
864
879
}
865
880
}
866
- }
867
881
868
- let mut prev_node = expected_route. last ( ) . unwrap ( ) ;
869
- for ( idx, node) in expected_route. iter ( ) . rev ( ) . enumerate ( ) {
870
- assert_eq ! ( expected_next_node, node. node. get_our_node_id( ) ) ;
871
- let update_next_msgs = !skip_last || idx != expected_route. len ( ) - 1 ;
872
- if next_msgs. is_some ( ) {
873
- mid_update_fulfill_dance ! ( node, prev_node, update_next_msgs) ;
874
- } else if update_next_msgs {
875
- next_msgs = get_next_msgs ! ( node) ;
876
- } else {
877
- assert ! ( node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
878
- }
879
- if !skip_last && idx == expected_route. len ( ) - 1 {
880
- assert_eq ! ( expected_next_node, origin_node. node. get_our_node_id( ) ) ;
881
- }
882
+ let mut prev_node = expected_route. last ( ) . unwrap ( ) ;
883
+ for ( idx, node) in expected_route. iter ( ) . rev ( ) . enumerate ( ) . skip ( 1 ) {
884
+ assert_eq ! ( expected_next_node, node. node. get_our_node_id( ) ) ;
885
+ let update_next_msgs = !skip_last || idx != expected_route. len ( ) - 1 ;
886
+ if next_msgs. is_some ( ) {
887
+ mid_update_fulfill_dance ! ( node, prev_node, update_next_msgs) ;
888
+ } else {
889
+ assert ! ( !update_next_msgs) ;
890
+ assert ! ( node. node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
891
+ }
892
+ if !skip_last && idx == expected_route. len ( ) - 1 {
893
+ assert_eq ! ( expected_next_node, origin_node. node. get_our_node_id( ) ) ;
894
+ }
882
895
883
- prev_node = node;
884
- }
896
+ prev_node = node;
897
+ }
885
898
886
- if !skip_last {
887
- last_update_fulfill_dance ! ( origin_node, expected_route. first( ) . unwrap( ) ) ;
888
- expect_payment_sent ! ( origin_node, our_payment_preimage) ;
899
+ if !skip_last {
900
+ last_update_fulfill_dance ! ( origin_node, expected_route. first( ) . unwrap( ) ) ;
901
+ expect_payment_sent ! ( origin_node, our_payment_preimage) ;
902
+ }
889
903
}
890
904
}
891
905
892
906
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 ) {
893
- claim_payment_along_route_with_secret ( origin_node, expected_route, skip_last, our_payment_preimage, None , expected_amount) ;
907
+ claim_payment_along_route_with_secret ( origin_node, & [ expected_route] , skip_last, our_payment_preimage, None , expected_amount) ;
894
908
}
895
909
896
910
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