Skip to content

Commit 9223986

Browse files
Add test utilities and integration tests for onion messages
1 parent fd118c4 commit 9223986

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

lightning/src/onion_message.rs

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

0 commit comments

Comments
 (0)