From 38b11b085d650f8374c768754bf8a2bb494ff4fb Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 22 Mar 2026 12:41:22 +0000 Subject: [PATCH] Add direct upstream compatibility regression test Co-authored-by: Maxim Myalin --- src/transport/upstream.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/transport/upstream.rs b/src/transport/upstream.rs index 666ca7d..69d1246 100644 --- a/src/transport/upstream.rs +++ b/src/transport/upstream.rs @@ -1807,6 +1807,7 @@ impl UpstreamManager { mod tests { use super::*; use std::sync::Arc; + use tokio::net::TcpListener; use crate::stats::Stats; @@ -1961,4 +1962,40 @@ mod tests { ); assert_eq!(snapshot.upstreams[0].address, "127.0.0.1:8388"); } + + #[tokio::test] + async fn connect_with_details_keeps_direct_tcp_compatibility() { + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let target = listener.local_addr().unwrap(); + let accept_task = tokio::spawn(async move { + let (_stream, _peer) = listener.accept().await.unwrap(); + }); + let manager = UpstreamManager::new( + vec![UpstreamConfig { + upstream_type: UpstreamType::Direct { + interface: None, + bind_addresses: None, + }, + weight: 1, + enabled: true, + scopes: String::new(), + selected_scope: String::new(), + }], + 1, + 100, + 1000, + 1, + false, + Arc::new(Stats::new()), + ); + + let (stream, egress) = manager + .connect_with_details(target, None, None) + .await + .expect("direct upstream should return a raw TCP stream"); + + assert_eq!(stream.peer_addr().unwrap(), target); + assert_eq!(egress.route_kind, UpstreamRouteKind::Direct); + accept_task.await.unwrap(); + } }