Skip to content

Commit 7a29c39

Browse files
add test
1 parent 3a8f3b2 commit 7a29c39

File tree

1 file changed

+166
-1
lines changed

1 file changed

+166
-1
lines changed

lightning/src/ln/peer_handler.rs

+166-1
Original file line numberDiff line numberDiff line change
@@ -2699,11 +2699,12 @@ mod tests {
26992699
use crate::ln::types::ChannelId;
27002700
use crate::ln::features::{InitFeatures, NodeFeatures};
27012701
use crate::ln::peer_channel_encryptor::PeerChannelEncryptor;
2702-
use crate::ln::peer_handler::{CustomMessageHandler, PeerManager, MessageHandler, SocketDescriptor, IgnoringMessageHandler, filter_addresses, ErroringMessageHandler, MAX_BUFFER_DRAIN_TICK_INTERVALS_PER_PEER};
2702+
use crate::ln::peer_handler::{CustomMessageHandler, OnionMessageHandler, PeerManager, MessageHandler, SocketDescriptor, IgnoringMessageHandler, filter_addresses, ErroringMessageHandler, MAX_BUFFER_DRAIN_TICK_INTERVALS_PER_PEER};
27032703
use crate::ln::{msgs, wire};
27042704
use crate::ln::msgs::{Init, LightningError, SocketAddress};
27052705
use crate::util::test_utils;
27062706

2707+
27072708
use bitcoin::Network;
27082709
use bitcoin::blockdata::constants::ChainHash;
27092710
use bitcoin::secp256k1::{PublicKey, SecretKey};
@@ -2780,6 +2781,73 @@ mod tests {
27802781
}
27812782
}
27822783

2784+
struct TestPeerTrackingMessageHandler {
2785+
features: InitFeatures,
2786+
pub peer_connected_called: Mutex<bool>,
2787+
pub peer_disconnected_called: Mutex<bool>,
2788+
}
2789+
2790+
impl TestPeerTrackingMessageHandler {
2791+
pub fn new(features: InitFeatures) -> Self {
2792+
Self {
2793+
features,
2794+
peer_connected_called: Mutex::new(false),
2795+
peer_disconnected_called: Mutex::new(false),
2796+
}
2797+
}
2798+
}
2799+
2800+
impl wire::CustomMessageReader for TestPeerTrackingMessageHandler {
2801+
type CustomMessage = Infallible;
2802+
fn read<R: io::Read>(&self, _: u16, _: &mut R) -> Result<Option<Self::CustomMessage>, msgs::DecodeError> {
2803+
Ok(None)
2804+
}
2805+
}
2806+
2807+
impl CustomMessageHandler for TestPeerTrackingMessageHandler {
2808+
fn handle_custom_message(&self, _: Infallible, _: &PublicKey) -> Result<(), LightningError> {
2809+
unreachable!();
2810+
}
2811+
2812+
fn get_and_clear_pending_msg(&self) -> Vec<(PublicKey, Self::CustomMessage)> { Vec::new() }
2813+
2814+
fn peer_disconnected(&self, _their_node_id: &PublicKey) {
2815+
let mut disconnected = self.peer_disconnected_called.lock().unwrap();
2816+
*disconnected = true;
2817+
}
2818+
2819+
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &Init, _inbound: bool) -> Result<(), ()> {
2820+
let mut connected = self.peer_connected_called.lock().unwrap();
2821+
assert!(!*connected);
2822+
*connected = true;
2823+
Err(())
2824+
}
2825+
2826+
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }
2827+
2828+
fn provided_init_features(&self, _: &PublicKey) -> InitFeatures {
2829+
self.features.clone()
2830+
}
2831+
}
2832+
2833+
impl OnionMessageHandler for TestPeerTrackingMessageHandler {
2834+
fn handle_onion_message(&self, _peer_node_id: &PublicKey, _msg: &msgs::OnionMessage) {}
2835+
fn next_onion_message_for_peer(&self, _peer_node_id: PublicKey) -> Option<msgs::OnionMessage> { None }
2836+
fn peer_connected(&self, _their_node_id: &PublicKey, _init: &Init, _inbound: bool) -> Result<(), ()> {
2837+
let mut connected = self.peer_connected_called.lock().unwrap();
2838+
assert!(!*connected);
2839+
*connected = true;
2840+
Err(())
2841+
}
2842+
fn peer_disconnected(&self, _their_node_id: &PublicKey) {
2843+
let mut disconnected = self.peer_disconnected_called.lock().unwrap();
2844+
*disconnected = true;
2845+
}
2846+
fn timer_tick_occurred(&self) {}
2847+
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty()}
2848+
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures { self.features.clone() }
2849+
}
2850+
27832851
fn create_peermgr_cfgs(peer_count: usize) -> Vec<PeerManagerCfg> {
27842852
let mut cfgs = Vec::new();
27852853
for i in 0..peer_count {
@@ -3164,6 +3232,103 @@ mod tests {
31643232
assert_eq!(peers[0].peers.read().unwrap().len(), 0);
31653233
}
31663234

3235+
#[test]
3236+
fn test_peer_connected_error_disconnects() {
3237+
3238+
struct PeerTrackingPeerManagerConfig {
3239+
logger: test_utils::TestLogger,
3240+
node_signer: test_utils::TestNodeSigner,
3241+
chan_handler: test_utils::TestChannelMessageHandler,
3242+
route_handler: test_utils::TestRoutingMessageHandler,
3243+
onion_message_handler: TestPeerTrackingMessageHandler,
3244+
custom_message_handler: TestPeerTrackingMessageHandler,
3245+
}
3246+
3247+
fn create_cfgs(peers: u8) -> Vec<PeerTrackingPeerManagerConfig> {
3248+
let mut cfgs = vec![];
3249+
for i in 0..peers {
3250+
let features = {
3251+
let mut feature_bits = vec![0u8; 33];
3252+
feature_bits[32] = 0b00000001;
3253+
InitFeatures::from_le_bytes(feature_bits)
3254+
};
3255+
let node_secret = SecretKey::from_slice(&[42 + i as u8; 32]).unwrap();
3256+
cfgs.push(PeerTrackingPeerManagerConfig {
3257+
logger: test_utils::TestLogger::new(),
3258+
node_signer: test_utils::TestNodeSigner::new(node_secret),
3259+
chan_handler: test_utils::TestChannelMessageHandler::new(ChainHash::using_genesis_block(Network::Testnet)),
3260+
route_handler: test_utils::TestRoutingMessageHandler::new(),
3261+
onion_message_handler: TestPeerTrackingMessageHandler::new(features.clone()),
3262+
custom_message_handler: TestPeerTrackingMessageHandler::new(features.clone()),
3263+
});
3264+
}
3265+
cfgs
3266+
}
3267+
3268+
type PeerTrackingPeerManager<'a> = PeerManager<FileDescriptor, &'a test_utils::TestChannelMessageHandler, &'a test_utils::TestRoutingMessageHandler, &'a TestPeerTrackingMessageHandler, &'a test_utils::TestLogger, &'a TestPeerTrackingMessageHandler, &'a test_utils::TestNodeSigner>;
3269+
3270+
fn create_network<'a>(peer_count: usize, cfgs: &'a Vec<PeerTrackingPeerManagerConfig>) -> Vec<PeerTrackingPeerManager<'a>> {
3271+
let mut peers = Vec::new();
3272+
for i in 0..peer_count {
3273+
let ephemeral_bytes = [i as u8; 32];
3274+
let msg_handler = MessageHandler {
3275+
chan_handler: &cfgs[i].chan_handler, route_handler: &cfgs[i].route_handler,
3276+
onion_message_handler: &cfgs[i].onion_message_handler, custom_message_handler: &cfgs[i].custom_message_handler
3277+
};
3278+
let peer = PeerManager::new(msg_handler, 0, &ephemeral_bytes, &cfgs[i].logger, &cfgs[i].node_signer);
3279+
peers.push(peer);
3280+
}
3281+
3282+
peers
3283+
}
3284+
3285+
fn try_establish_connection<'a>(peer_a: &PeerTrackingPeerManager<'a>, peer_b: &PeerTrackingPeerManager<'a>) -> (FileDescriptor, FileDescriptor) {
3286+
let id_a = peer_a.node_signer.get_node_id(Recipient::Node).unwrap();
3287+
let mut fd_a = FileDescriptor {
3288+
fd: 1, outbound_data: Arc::new(Mutex::new(Vec::new())),
3289+
disconnect: Arc::new(AtomicBool::new(false)),
3290+
};
3291+
let addr_a = SocketAddress::TcpIpV4{addr: [127, 0, 0, 1], port: 1000};
3292+
let mut fd_b = FileDescriptor {
3293+
fd: 1, outbound_data: Arc::new(Mutex::new(Vec::new())),
3294+
disconnect: Arc::new(AtomicBool::new(false)),
3295+
};
3296+
let addr_b = SocketAddress::TcpIpV4{addr: [127, 0, 0, 1], port: 1001};
3297+
let initial_data = peer_b.new_outbound_connection(id_a, fd_b.clone(), Some(addr_a.clone())).unwrap();
3298+
peer_a.new_inbound_connection(fd_a.clone(), Some(addr_b.clone())).unwrap();
3299+
3300+
let _res = peer_a.read_event(&mut fd_a, &initial_data);
3301+
peer_a.process_events();
3302+
3303+
let a_data = fd_a.outbound_data.lock().unwrap().split_off(0);
3304+
3305+
let _res = peer_b.read_event(&mut fd_b, &a_data);
3306+
3307+
peer_b.process_events();
3308+
let b_data = fd_b.outbound_data.lock().unwrap().split_off(0);
3309+
let _res = peer_a.read_event(&mut fd_a, &b_data);
3310+
3311+
peer_a.process_events();
3312+
let a_data = fd_a.outbound_data.lock().unwrap().split_off(0);
3313+
3314+
let _res = peer_b.read_event(&mut fd_b, &a_data);
3315+
(fd_a.clone(), fd_b.clone())
3316+
}
3317+
3318+
let cfgs = create_cfgs(2);
3319+
let peers = create_network(2, &cfgs);
3320+
let (_sd1, _sd2) = try_establish_connection(&peers[0], &peers[1]);
3321+
3322+
let cmh_peer_connected_called = cfgs[0].custom_message_handler.peer_connected_called.lock().unwrap();
3323+
let cmh_peer_disconnected_called = cfgs[0].custom_message_handler.peer_disconnected_called.lock().unwrap();
3324+
let om_peer_connected_called = cfgs[0].onion_message_handler.peer_connected_called.lock().unwrap();
3325+
let om_peer_disconnected_called = cfgs[0].onion_message_handler.peer_disconnected_called.lock().unwrap();
3326+
assert!(*cmh_peer_connected_called);
3327+
assert!(*cmh_peer_disconnected_called);
3328+
assert!(*om_peer_connected_called);
3329+
assert!(*om_peer_disconnected_called);
3330+
}
3331+
31673332
#[test]
31683333
fn test_do_attempt_write_data() {
31693334
// Create 2 peers with custom TestRoutingMessageHandlers and connect them.

0 commit comments

Comments
 (0)