@@ -10,6 +10,7 @@ use hyper_util::rt::TokioIo;
1010use insta:: { assert_json_snapshot, assert_snapshot, with_settings} ;
1111use std:: str:: FromStr ;
1212use tokio:: net:: TcpListener ;
13+ use tokio:: task:: JoinHandle ;
1314use url:: Url ;
1415use uv_cache:: Cache ;
1516use uv_client:: RegistryClientBuilder ;
@@ -19,11 +20,13 @@ use uv_platform_tags::{Arch, Os, Platform};
1920use uv_redacted:: DisplaySafeUrl ;
2021use uv_version:: version;
2122
22- #[ tokio:: test]
23- async fn test_user_agent_has_version ( ) -> Result < ( ) > {
23+ /// Spawns a dummy HTTP server that echoes back the User-Agent header.
24+ /// Returns the server URL and the server task handle.
25+ async fn spawn_user_agent_echo_server ( ) -> Result < ( DisplaySafeUrl , JoinHandle < ( ) > ) > {
2426 // Set up the TCP listener on a random available port
2527 let listener = TcpListener :: bind ( "127.0.0.1:0" ) . await ?;
2628 let addr = listener. local_addr ( ) ?;
29+ let url = DisplaySafeUrl :: from_str ( & format ! ( "http://{addr}" ) ) ?;
2730
2831 // Spawn the server loop in a background task
2932 let server_task = tokio:: spawn ( async move {
@@ -50,12 +53,18 @@ async fn test_user_agent_has_version() -> Result<()> {
5053 } ) ;
5154 } ) ;
5255
56+ Ok ( ( url, server_task) )
57+ }
58+
59+ #[ tokio:: test]
60+ async fn test_user_agent_has_version ( ) -> Result < ( ) > {
61+ let ( url, server_task) = spawn_user_agent_echo_server ( ) . await ?;
62+
5363 // Initialize uv-client
5464 let cache = Cache :: temp ( ) ?. init ( ) ?;
5565 let client = RegistryClientBuilder :: new ( BaseClientBuilder :: default ( ) , cache) . build ( ) ;
5666
5767 // Send request to our dummy server
58- let url = DisplaySafeUrl :: from_str ( & format ! ( "http://{addr}" ) ) ?;
5968 let res = client
6069 . cached_client ( )
6170 . uncached ( )
@@ -81,34 +90,7 @@ async fn test_user_agent_has_version() -> Result<()> {
8190
8291#[ tokio:: test]
8392async fn test_user_agent_has_linehaul ( ) -> Result < ( ) > {
84- // Set up the TCP listener on a random available port
85- let listener = TcpListener :: bind ( "127.0.0.1:0" ) . await ?;
86- let addr = listener. local_addr ( ) ?;
87-
88- // Spawn the server loop in a background task
89- let server_task = tokio:: spawn ( async move {
90- let svc = service_fn ( move |req : Request < hyper:: body:: Incoming > | {
91- // Get User Agent Header and send it back in the response
92- let user_agent = req
93- . headers ( )
94- . get ( USER_AGENT )
95- . and_then ( |v| v. to_str ( ) . ok ( ) )
96- . map ( ToString :: to_string)
97- . unwrap_or_default ( ) ; // Empty Default
98- future:: ok :: < _ , hyper:: Error > ( Response :: new ( Full :: new ( Bytes :: from ( user_agent) ) ) )
99- } ) ;
100- // Start Server (not wrapped in loop {} since we want a single response server)
101- // If you want server to accept multiple connections, wrap it in loop {}
102- let ( socket, _) = listener. accept ( ) . await . unwrap ( ) ;
103- let socket = TokioIo :: new ( socket) ;
104- tokio:: task:: spawn ( async move {
105- http1:: Builder :: new ( )
106- . serve_connection ( socket, svc)
107- . with_upgrades ( )
108- . await
109- . expect ( "Server Started" ) ;
110- } ) ;
111- } ) ;
93+ let ( url, server_task) = spawn_user_agent_echo_server ( ) . await ?;
11294
11395 // Add some representative markers for an Ubuntu CI runner
11496 let markers = MarkerEnvironment :: try_from ( MarkerEnvironmentBuilder {
@@ -153,7 +135,6 @@ async fn test_user_agent_has_linehaul() -> Result<()> {
153135 let client = builder. build ( ) ;
154136
155137 // Send request to our dummy server
156- let url = DisplaySafeUrl :: from_str ( & format ! ( "http://{addr}" ) ) ?;
157138 let res = client
158139 . cached_client ( )
159140 . uncached ( )
@@ -262,34 +243,7 @@ async fn test_user_agent_has_linehaul() -> Result<()> {
262243
263244#[ tokio:: test]
264245async fn test_user_agent_installer_name_override ( ) -> Result < ( ) > {
265- // Set up the TCP listener on a random available port
266- let listener = TcpListener :: bind ( "127.0.0.1:0" ) . await ?;
267- let addr = listener. local_addr ( ) ?;
268-
269- // Spawn the server loop in a background task
270- let server_task = tokio:: spawn ( async move {
271- let svc = service_fn ( move |req : Request < hyper:: body:: Incoming > | {
272- // Get User Agent Header and send it back in the response
273- let user_agent = req
274- . headers ( )
275- . get ( USER_AGENT )
276- . and_then ( |v| v. to_str ( ) . ok ( ) )
277- . map ( ToString :: to_string)
278- . unwrap_or_default ( ) ; // Empty Default
279- future:: ok :: < _ , hyper:: Error > ( Response :: new ( Full :: new ( Bytes :: from ( user_agent) ) ) )
280- } ) ;
281- // Start Server (not wrapped in loop {} since we want a single response server)
282- // If you want server to accept multiple connections, wrap it in loop {}
283- let ( socket, _) = listener. accept ( ) . await . unwrap ( ) ;
284- let socket = TokioIo :: new ( socket) ;
285- tokio:: task:: spawn ( async move {
286- http1:: Builder :: new ( )
287- . serve_connection ( socket, svc)
288- . with_upgrades ( )
289- . await
290- . expect ( "Server Started" ) ;
291- } ) ;
292- } ) ;
246+ let ( url, server_task) = spawn_user_agent_echo_server ( ) . await ?;
293247
294248 // Add some representative markers for an Ubuntu CI runner
295249 let markers = MarkerEnvironment :: try_from ( MarkerEnvironmentBuilder {
@@ -315,7 +269,6 @@ async fn test_user_agent_installer_name_override() -> Result<()> {
315269 let client = RegistryClientBuilder :: new ( base_client, cache) . build ( ) ;
316270
317271 // Send request to our dummy server
318- let url = DisplaySafeUrl :: from_str ( & format ! ( "http://{addr}" ) ) ?;
319272 let res = client
320273 . cached_client ( )
321274 . uncached ( )
0 commit comments