swarm/: Report aborted connections (#2517)

Disconnect pending connections with `Swarm::disconnect` and eport aborted
connections via `SwarmEvent::OutgoingConnectionError`.

Co-authored-by: Jack Maloney <git@jmmaloney4.xyz>
Co-authored-by: Marco Munizaga <git@marcopolo.io>
This commit is contained in:
Max Inden
2022-02-15 10:19:55 +01:00
committed by GitHub
parent e66f04f41b
commit 146ed5f45e
5 changed files with 69 additions and 33 deletions

View File

@ -624,12 +624,14 @@ where
/// with [`ProtocolsHandler::connection_keep_alive`] or directly with
/// [`ProtocolsHandlerEvent::Close`].
pub fn disconnect_peer_id(&mut self, peer_id: PeerId) -> Result<(), ()> {
if self.pool.is_connected(peer_id) {
self.pool.disconnect(peer_id);
return Ok(());
}
let was_connected = self.pool.is_connected(peer_id);
self.pool.disconnect(peer_id);
Err(())
if was_connected {
Ok(())
} else {
Err(())
}
}
/// Checks whether there is an established connection to a peer.
@ -2422,4 +2424,39 @@ mod tests {
}))
.unwrap();
}
#[test]
fn aborting_pending_connection_surfaces_error() {
let _ = env_logger::try_init();
let mut dialer = new_test_swarm::<_, ()>(DummyProtocolsHandler::default()).build();
let mut listener = new_test_swarm::<_, ()>(DummyProtocolsHandler::default()).build();
let listener_peer_id = *listener.local_peer_id();
listener.listen_on(multiaddr![Memory(0u64)]).unwrap();
let listener_address = match block_on(listener.next()).unwrap() {
SwarmEvent::NewListenAddr { address, .. } => address,
e => panic!("Unexpected network event: {:?}", e),
};
dialer
.dial(
DialOpts::peer_id(listener_peer_id)
.addresses(vec![listener_address])
.build(),
)
.unwrap();
dialer
.disconnect_peer_id(listener_peer_id)
.expect_err("Expect peer to not yet be connected.");
match block_on(dialer.next()).unwrap() {
SwarmEvent::OutgoingConnectionError {
error: DialError::Aborted,
..
} => {}
e => panic!("Unexpected swarm event {:?}.", e),
}
}
}