Merge branch 'master' into next

# Conflicts:
#	src/node/tests/bootstrap.rs
This commit is contained in:
Johnathan Corgan
2026-05-09 23:22:32 +00:00
13 changed files with 815 additions and 67 deletions
+89 -1
View File
@@ -2,10 +2,11 @@
use super::*;
use crate::EstablishedTraversal;
use crate::config::UdpConfig;
use crate::config::{TransportInstances, UdpConfig};
use crate::node::wire::{PHASE_MSG1, PHASE_MSG2, PHASE_MSG3};
use crate::transport::udp::UdpTransport;
use crate::utils::index::IndexAllocator;
use std::collections::HashMap;
use tokio::time::{Duration, timeout, timeout_at};
#[tokio::test]
@@ -284,3 +285,90 @@ async fn test_third_peer_can_handshake_via_adopted_transport_socket() {
transport.stop().await.ok();
}
}
#[tokio::test]
async fn test_adopted_udp_inherits_mtu_from_single_primary_config() {
let mut node = make_node();
node.config.transports.udp = TransportInstances::Single(UdpConfig {
mtu: Some(1500),
..Default::default()
});
let (packet_tx, packet_rx) = packet_channel(64);
node.packet_tx = Some(packet_tx);
node.packet_rx = Some(packet_rx);
node.state = NodeState::Running;
let peer = make_node();
let adopted_socket = std::net::UdpSocket::bind("127.0.0.1:0").unwrap();
let handoff = EstablishedTraversal::new(
"sess-inherit-single",
peer.npub(),
"127.0.0.1:9".parse().unwrap(),
adopted_socket,
);
let result = node.adopt_established_traversal(handoff).await.unwrap();
let adopted = node
.get_transport(&result.transport_id)
.expect("adopted transport present");
assert_eq!(
adopted.mtu(),
1500,
"adopted UDP transport should inherit MTU from the primary [transports.udp] config",
);
for (_, transport) in node.transports.iter_mut() {
transport.stop().await.ok();
}
}
#[tokio::test]
async fn test_adopted_udp_inherits_mtu_from_named_primary_config() {
let mut node = make_node();
let mut named = HashMap::new();
named.insert(
"primary".to_string(),
UdpConfig {
mtu: Some(1500),
..Default::default()
},
);
named.insert(
"secondary".to_string(),
UdpConfig {
mtu: Some(1280),
..Default::default()
},
);
node.config.transports.udp = TransportInstances::Named(named);
let (packet_tx, packet_rx) = packet_channel(64);
node.packet_tx = Some(packet_tx);
node.packet_rx = Some(packet_rx);
node.state = NodeState::Running;
let peer = make_node();
let adopted_socket = std::net::UdpSocket::bind("127.0.0.1:0").unwrap();
let handoff = EstablishedTraversal::new(
"sess-inherit-named",
peer.npub(),
"127.0.0.1:9".parse().unwrap(),
adopted_socket,
)
.with_transport_name("primary");
let result = node.adopt_established_traversal(handoff).await.unwrap();
let adopted = node
.get_transport(&result.transport_id)
.expect("adopted transport present");
assert_eq!(
adopted.mtu(),
1500,
"adopted UDP transport should inherit MTU from the named [transports.udp.<name>] config matching transport_name",
);
for (_, transport) in node.transports.iter_mut() {
transport.stop().await.ok();
}
}
+32
View File
@@ -955,6 +955,38 @@ fn test_promote_clears_retry_pending() {
);
}
/// Initial peer-init failure at startup must enqueue a retry. Otherwise a peer
/// whose addresses cannot be dialed at boot (no operational transport for the
/// configured transport types, all addresses unreachable, NAT rebind, etc.)
/// stays dead forever — pings arrive but cannot be answered until the daemon
/// is manually restarted.
#[tokio::test]
async fn test_initiate_peer_connections_schedules_retry_on_no_transport() {
let peer_identity = Identity::generate();
let peer_npub = peer_identity.npub();
let peer_node_addr = *PeerIdentity::from_npub(&peer_npub).unwrap().node_addr();
let mut config = Config::new();
// udp address but no UDP transport registered on the node — every dial
// attempt resolves to NodeError::NoTransportForType.
config.peers.push(crate::config::PeerConfig::new(
peer_npub,
"udp",
"10.0.0.2:2121",
));
let mut node = Node::new(config).unwrap();
assert!(node.retry_pending.is_empty());
node.initiate_peer_connections().await;
assert!(
node.retry_pending.contains_key(&peer_node_addr),
"startup peer-init failure must enqueue a retry so the peer can recover \
without a daemon restart"
);
}
// ============================================================================
// transport_mtu() — ISSUE-2026-0011 regression coverage
// ============================================================================