@@ -710,3 +710,108 @@ pub type SimpleArcOnionMessenger<L> = OnionMessenger<InMemorySigner, Arc<KeysMan
710
710
///[`SimpleRefChannelManager`]: crate::ln::channelmanager::SimpleRefChannelManager
711
711
///[`SimpleRefPeerManager`]: crate::ln::peer_handler::SimpleRefPeerManager
712
712
pub type SimpleRefOnionMessenger < ' a , ' b , L > = OnionMessenger < InMemorySigner , & ' a KeysManager , & ' b L > ;
713
+
714
+ #[ cfg( test) ]
715
+ mod tests {
716
+ use chain:: keysinterface:: { KeysInterface , Recipient } ;
717
+ use ln:: msgs:: OnionMessageHandler ;
718
+ use onion_message:: { BlindedRoute , Destination , OnionMessenger } ;
719
+ use util:: enforcing_trait_impls:: EnforcingSigner ;
720
+ use util:: events:: { MessageSendEvent , MessageSendEventsProvider } ;
721
+ use util:: test_utils;
722
+
723
+ use bitcoin:: network:: constants:: Network ;
724
+ use bitcoin:: secp256k1:: { PublicKey , Secp256k1 } ;
725
+
726
+ use sync:: Arc ;
727
+
728
+ struct MessengerNode {
729
+ keys_manager : Arc < test_utils:: TestKeysInterface > ,
730
+ messenger : OnionMessenger < EnforcingSigner , Arc < test_utils:: TestKeysInterface > , Arc < test_utils:: TestLogger > > ,
731
+ logger : Arc < test_utils:: TestLogger > ,
732
+ }
733
+
734
+ impl MessengerNode {
735
+ fn get_node_pk ( & self ) -> PublicKey {
736
+ let secp_ctx = Secp256k1 :: new ( ) ;
737
+ PublicKey :: from_secret_key ( & secp_ctx, & self . keys_manager . get_node_secret ( Recipient :: Node ) . unwrap ( ) )
738
+ }
739
+ }
740
+
741
+ fn create_nodes ( num_messengers : u8 ) -> Vec < MessengerNode > {
742
+ let mut res = Vec :: new ( ) ;
743
+ for i in 0 ..num_messengers {
744
+ let logger = Arc :: new ( test_utils:: TestLogger :: with_id ( format ! ( "node {}" , i) ) ) ;
745
+ let seed = [ i as u8 ; 32 ] ;
746
+ let keys_manager = Arc :: new ( test_utils:: TestKeysInterface :: new ( & seed, Network :: Testnet ) ) ;
747
+ res. push ( MessengerNode {
748
+ keys_manager : keys_manager. clone ( ) ,
749
+ messenger : OnionMessenger :: new ( keys_manager, logger. clone ( ) ) ,
750
+ logger,
751
+ } ) ;
752
+ }
753
+ res
754
+ }
755
+
756
+ fn pass_along_path ( path : Vec < & MessengerNode > , expected_path_id : Option < [ u8 ; 32 ] > ) {
757
+ let mut prev_node = path[ 0 ] ;
758
+ for ( idx, node) in path. iter ( ) . enumerate ( ) . skip ( 1 ) {
759
+ let events = prev_node. messenger . get_and_clear_pending_msg_events ( ) ;
760
+ assert_eq ! ( events. len( ) , 1 ) ;
761
+ let onion_msg = match & events[ 0 ] {
762
+ MessageSendEvent :: SendOnionMessage { msg, .. } => msg. clone ( ) ,
763
+ _ => panic ! ( "Unexpected event" ) ,
764
+ } ;
765
+ node. messenger . handle_onion_message ( & prev_node. get_node_pk ( ) , & onion_msg) ;
766
+ if idx == path. len ( ) - 1 {
767
+ node. logger . assert_log_contains (
768
+ "lightning::onion_message" . to_string ( ) ,
769
+ format ! ( "Received an onion message with path_id: {:02x?}" , expected_path_id) . to_string ( ) , 1 ) ;
770
+ break
771
+ }
772
+ prev_node = node;
773
+ }
774
+ }
775
+
776
+ #[ test]
777
+ fn one_hop ( ) {
778
+ let mut nodes = create_nodes ( 2 ) ;
779
+ let ( node1, node2) = ( nodes. remove ( 0 ) , nodes. remove ( 0 ) ) ;
780
+
781
+ node1. messenger . send_onion_message ( vec ! [ ] , Destination :: Node ( node2. get_node_pk ( ) ) ) . unwrap ( ) ;
782
+ pass_along_path ( vec ! [ & node1, & node2] , None ) ;
783
+ }
784
+
785
+ #[ test]
786
+ fn two_unblinded_hops ( ) {
787
+ let mut nodes = create_nodes ( 3 ) ;
788
+ let ( node1, node2, node3) = ( nodes. remove ( 0 ) , nodes. remove ( 0 ) , nodes. remove ( 0 ) ) ;
789
+
790
+ node1. messenger . send_onion_message ( vec ! [ node2. get_node_pk( ) ] , Destination :: Node ( node3. get_node_pk ( ) ) ) . unwrap ( ) ;
791
+ pass_along_path ( vec ! [ & node1, & node2, & node3] , None ) ;
792
+ }
793
+
794
+ #[ test]
795
+ fn two_unblinded_two_blinded ( ) {
796
+ let mut nodes = create_nodes ( 5 ) ;
797
+ let ( node1, node2, node3, node4, node5) = ( nodes. remove ( 0 ) , nodes. remove ( 0 ) , nodes. remove ( 0 ) , nodes. remove ( 0 ) , nodes. remove ( 0 ) ) ;
798
+
799
+ let secp_ctx = Secp256k1 :: new ( ) ;
800
+ let blinded_route = BlindedRoute :: new ( vec ! [ node4. get_node_pk( ) , node5. get_node_pk( ) ] , & node5. keys_manager , & secp_ctx) . unwrap ( ) ;
801
+
802
+ node1. messenger . send_onion_message ( vec ! [ node2. get_node_pk( ) , node3. get_node_pk( ) ] , Destination :: BlindedRoute ( blinded_route) ) . unwrap ( ) ;
803
+ pass_along_path ( vec ! [ & node1, & node2, & node3, & node4, & node5] , None ) ;
804
+ }
805
+
806
+ #[ test]
807
+ fn three_blinded_hops ( ) {
808
+ let mut nodes = create_nodes ( 4 ) ;
809
+ let ( node1, node2, node3, node4) = ( nodes. remove ( 0 ) , nodes. remove ( 0 ) , nodes. remove ( 0 ) , nodes. remove ( 0 ) ) ;
810
+
811
+ let secp_ctx = Secp256k1 :: new ( ) ;
812
+ let blinded_route = BlindedRoute :: new ( vec ! [ node2. get_node_pk( ) , node3. get_node_pk( ) , node4. get_node_pk( ) ] , & node4. keys_manager , & secp_ctx) . unwrap ( ) ;
813
+
814
+ node1. messenger . send_onion_message ( vec ! [ ] , Destination :: BlindedRoute ( blinded_route) ) . unwrap ( ) ;
815
+ pass_along_path ( vec ! [ & node1, & node2, & node3, & node4] , None ) ;
816
+ }
817
+ }
0 commit comments