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