mod common;
use connexa::prelude::{ConnectionEvent, Multiaddr, PeerId};
use futures::StreamExt;
use libp2p::swarm::dial_opts::DialOpts;
use std::time::Duration;
use crate::common::spawn_connexa_with_default_key;
#[tokio::test]
async fn test_listen_on_address() {
let node = spawn_connexa_with_default_key().await;
let addr: Multiaddr = "/memory/0".parse().unwrap();
let listener_id = node.swarm().listen_on(addr).await.unwrap();
let addrs = node
.swarm()
.get_listening_addresses(listener_id)
.await
.unwrap();
assert!(
!addrs.is_empty(),
"Should have at least one listening address"
);
}
#[tokio::test]
async fn test_listening_addresses() {
let node = spawn_connexa_with_default_key().await;
let addr: Multiaddr = "/memory/0".parse().unwrap();
let listener_id = node.swarm().listen_on(addr).await.unwrap();
node.swarm()
.get_listening_addresses(listener_id)
.await
.unwrap();
}
#[tokio::test]
async fn test_remove_listener() {
let node = spawn_connexa_with_default_key().await;
let addr: Multiaddr = "/memory/0".parse().unwrap();
let listener_id = node.swarm().listen_on(addr).await.unwrap();
let addrs = node
.swarm()
.get_listening_addresses(listener_id)
.await
.unwrap();
assert!(!addrs.is_empty());
node.swarm().remove_listener(listener_id).await.unwrap();
let result = node.swarm().get_listening_addresses(listener_id).await;
assert!(result.is_err() || result.unwrap().is_empty());
}
#[tokio::test]
async fn test_external_addresses() {
let node = spawn_connexa_with_default_key().await;
let addr: Multiaddr = "/ip4/127.0.0.1/tcp/1234".parse().unwrap();
let addrs = node.swarm().external_addresses().await.unwrap();
assert_eq!(addrs.len(), 1);
node.swarm()
.add_external_address(addr.clone())
.await
.unwrap();
let addrs = node.swarm().external_addresses().await.unwrap();
assert_eq!(addrs.len(), 2);
assert!(addrs.contains(&addr));
}
#[tokio::test]
async fn test_remove_external_address() {
let node = spawn_connexa_with_default_key().await;
let addr: Multiaddr = "/ip4/127.0.0.1/tcp/1234".parse().unwrap();
node.swarm()
.add_external_address(addr.clone())
.await
.unwrap();
let addrs = node.swarm().external_addresses().await.unwrap();
assert_eq!(addrs.len(), 2);
node.swarm().remove_external_address(addr).await.unwrap();
let addrs = node.swarm().external_addresses().await.unwrap();
assert_eq!(addrs.len(), 1);
}
#[tokio::test]
async fn test_dial_and_connect() {
let [
(_node1, node1_peer_id, node1_addr),
(node2, _node2_peer_id, _node2_addr),
] = common::spawn_connexa_nodes_with_default_keys::<2>().await;
node2.swarm().dial(node1_addr).await.unwrap();
let is_connected = node2.swarm().is_connected(node1_peer_id).await.unwrap();
assert!(is_connected);
}
#[tokio::test]
async fn test_connected_peers() {
let [
(node1, _node1_peer_id, node1_addr),
(node2, node2_peer_id, _node2_addr),
(node3, node3_peer_id, _node3_addr),
] = common::spawn_connexa_nodes_with_default_keys::<3>().await;
let peers = node1.swarm().connected_peers().await.unwrap();
assert_eq!(peers.len(), 0);
node2.swarm().dial(node1_addr.clone()).await.unwrap();
node3.swarm().dial(node1_addr).await.unwrap();
let peers = node1.swarm().connected_peers().await.unwrap();
assert_eq!(peers.len(), 2);
let expected_peers = vec![node2_peer_id, node3_peer_id];
for peer in expected_peers {
assert!(peers.contains(&peer));
}
}
#[tokio::test]
async fn test_disconnect_by_peer_id() {
let [
(_node1, node1_peer_id, node1_addr),
(node2, _node2_peer_id, _node2_addr),
] = common::spawn_connexa_nodes_with_default_keys::<2>().await;
node2.swarm().dial(node1_addr).await.unwrap();
let is_connected = node2.swarm().is_connected(node1_peer_id).await.unwrap();
assert!(is_connected);
node2.swarm().disconnect(node1_peer_id).await.unwrap();
let is_connected = node2.swarm().is_connected(node1_peer_id).await.unwrap();
assert!(!is_connected);
}
#[tokio::test]
async fn test_disconnect_by_connection_id() {
let [
(_node1, node1_peer_id, node1_addr),
(node2, _node2_peer_id, _node2_addr),
] = common::spawn_connexa_nodes_with_default_keys::<2>().await;
let connection_id = node2.swarm().dial(node1_addr).await.unwrap();
let is_connected = node2.swarm().is_connected(node1_peer_id).await.unwrap();
assert!(is_connected);
node2.swarm().disconnect(connection_id).await.unwrap();
let is_connected = node2.swarm().is_connected(node1_peer_id).await.unwrap();
assert!(!is_connected);
}
#[tokio::test]
async fn test_dial_with_dial_opts() {
let [
(_node1, node1_peer_id, node1_addr),
(node2, _node2_peer_id, _node2_addr),
] = common::spawn_connexa_nodes_with_default_keys::<2>().await;
let dial_opts = DialOpts::peer_id(node1_peer_id)
.addresses(vec![node1_addr])
.build();
node2.swarm().dial(dial_opts).await.unwrap();
let is_connected = node2.swarm().is_connected(node1_peer_id).await.unwrap();
assert!(is_connected);
}
#[tokio::test]
async fn test_connection_listener() {
let [
(node1, _node1_peer_id, node1_addr),
(node2, _node2_peer_id, _node2_addr),
] = common::spawn_connexa_nodes_with_default_keys::<2>().await;
let mut listener = node1.swarm().listener().await.unwrap();
node2.swarm().dial(node1_addr).await.unwrap();
let event = tokio::time::timeout(Duration::from_secs(2), listener.next())
.await
.expect("Timeout waiting for connection event")
.expect("Stream ended unexpectedly");
assert!(matches!(
event,
ConnectionEvent::ConnectionEstablished { .. }
));
}
#[tokio::test]
async fn test_multiple_connections_same_peer() {
let [
(_node1, node1_peer_id, node1_addr),
(node2, _node2_peer_id, _node2_addr),
(node3, _node3_peer_id, _node3_addr),
] = common::spawn_connexa_nodes_with_default_keys::<3>().await;
node2.swarm().dial(node1_addr.clone()).await.unwrap();
node3.swarm().dial(node1_addr).await.unwrap();
let is_connected1 = node2.swarm().is_connected(node1_peer_id).await.unwrap();
assert!(is_connected1);
let is_connected2 = node3.swarm().is_connected(node1_peer_id).await.unwrap();
assert!(is_connected2)
}
#[tokio::test]
async fn test_is_connected_nonexistent_peer() {
let node = spawn_connexa_with_default_key().await;
let random_peer_id = PeerId::random();
let is_connected = node.swarm().is_connected(random_peer_id).await.unwrap();
assert!(!is_connected);
}
#[tokio::test]
async fn test_listening_on_invalid_address() {
let node = spawn_connexa_with_default_key().await;
let addr: Multiaddr = "/ip4/0.0.0.0/tcp/0".parse().unwrap();
let result = node.swarm().listen_on(addr).await;
assert!(result.is_err());
}
#[tokio::test]
async fn test_dial_self() {
let [(node, _node_peer_id, self_addr)] =
common::spawn_connexa_nodes_with_default_keys::<1>().await;
let result = node.swarm().dial(self_addr).await;
assert!(result.is_err());
}
#[tokio::test]
async fn test_external_addresses_add_remove() {
let node = spawn_connexa_with_default_key().await;
let addr: Multiaddr = "/ip4/1.2.3.4/tcp/1234".parse().unwrap();
node.swarm()
.add_external_address(addr.clone())
.await
.unwrap();
let addrs = node.swarm().external_addresses().await.unwrap();
assert_eq!(addrs.len(), 2);
assert!(addrs.contains(&addr));
node.swarm()
.remove_external_address(addr.clone())
.await
.unwrap();
let addrs = node.swarm().external_addresses().await.unwrap();
assert_eq!(addrs.len(), 1);
}