From 3a6630a14df40e37acf92902c90a326d11d1d725 Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Thu, 26 Feb 2026 08:58:13 -0800 Subject: [PATCH] tests(cli): prevent request send test teardown hang (#408) --- .../yaak-cli/tests/common/http_server.rs | 46 +++++++++++++----- crates/yaak-templates/pkg/yaak_templates.d.ts | 4 +- .../yaak-templates/pkg/yaak_templates_bg.js | 8 +-- .../yaak-templates/pkg/yaak_templates_bg.wasm | Bin 66300 -> 66127 bytes 4 files changed, 40 insertions(+), 18 deletions(-) diff --git a/crates-cli/yaak-cli/tests/common/http_server.rs b/crates-cli/yaak-cli/tests/common/http_server.rs index 5a004d32..97dcd67f 100644 --- a/crates-cli/yaak-cli/tests/common/http_server.rs +++ b/crates-cli/yaak-cli/tests/common/http_server.rs @@ -1,9 +1,14 @@ use std::io::{Read, Write}; -use std::net::TcpListener; +use std::net::{SocketAddr, TcpListener, TcpStream}; +use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; use std::thread; +use std::time::Duration; pub struct TestHttpServer { pub url: String, + addr: SocketAddr, + shutdown: Arc, handle: Option>, } @@ -12,29 +17,46 @@ impl TestHttpServer { let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind test HTTP server"); let addr = listener.local_addr().expect("Failed to get local addr"); let url = format!("http://{addr}/test"); + listener.set_nonblocking(true).expect("Failed to set test server listener nonblocking"); + + let shutdown = Arc::new(AtomicBool::new(false)); + let shutdown_signal = Arc::clone(&shutdown); let body_bytes = body.as_bytes().to_vec(); let handle = thread::spawn(move || { - if let Ok((mut stream, _)) = listener.accept() { - let mut request_buf = [0u8; 4096]; - let _ = stream.read(&mut request_buf); + while !shutdown_signal.load(Ordering::Relaxed) { + match listener.accept() { + Ok((mut stream, _)) => { + let _ = stream.set_read_timeout(Some(Duration::from_secs(1))); + let mut request_buf = [0u8; 4096]; + let _ = stream.read(&mut request_buf); - let response = format!( - "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: {}\r\nConnection: close\r\n\r\n", - body_bytes.len() - ); - let _ = stream.write_all(response.as_bytes()); - let _ = stream.write_all(&body_bytes); - let _ = stream.flush(); + let response = format!( + "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: {}\r\nConnection: close\r\n\r\n", + body_bytes.len() + ); + let _ = stream.write_all(response.as_bytes()); + let _ = stream.write_all(&body_bytes); + let _ = stream.flush(); + break; + } + Err(err) if err.kind() == std::io::ErrorKind::WouldBlock => { + thread::sleep(Duration::from_millis(10)); + } + Err(_) => break, + } } }); - Self { url, handle: Some(handle) } + Self { url, addr, shutdown, handle: Some(handle) } } } impl Drop for TestHttpServer { fn drop(&mut self) { + self.shutdown.store(true, Ordering::Relaxed); + let _ = TcpStream::connect(self.addr); + if let Some(handle) = self.handle.take() { let _ = handle.join(); } diff --git a/crates/yaak-templates/pkg/yaak_templates.d.ts b/crates/yaak-templates/pkg/yaak_templates.d.ts index aed6c395..df962dbc 100644 --- a/crates/yaak-templates/pkg/yaak_templates.d.ts +++ b/crates/yaak-templates/pkg/yaak_templates.d.ts @@ -1,5 +1,5 @@ /* tslint:disable */ /* eslint-disable */ -export function unescape_template(template: string): any; -export function parse_template(template: string): any; export function escape_template(template: string): any; +export function parse_template(template: string): any; +export function unescape_template(template: string): any; diff --git a/crates/yaak-templates/pkg/yaak_templates_bg.js b/crates/yaak-templates/pkg/yaak_templates_bg.js index e7e87861..900d4685 100644 --- a/crates/yaak-templates/pkg/yaak_templates_bg.js +++ b/crates/yaak-templates/pkg/yaak_templates_bg.js @@ -165,10 +165,10 @@ function takeFromExternrefTable0(idx) { * @param {string} template * @returns {any} */ -export function unescape_template(template) { +export function escape_template(template) { const ptr0 = passStringToWasm0(template, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; - const ret = wasm.unescape_template(ptr0, len0); + const ret = wasm.escape_template(ptr0, len0); if (ret[2]) { throw takeFromExternrefTable0(ret[1]); } @@ -193,10 +193,10 @@ export function parse_template(template) { * @param {string} template * @returns {any} */ -export function escape_template(template) { +export function unescape_template(template) { const ptr0 = passStringToWasm0(template, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; - const ret = wasm.escape_template(ptr0, len0); + const ret = wasm.unescape_template(ptr0, len0); if (ret[2]) { throw takeFromExternrefTable0(ret[1]); } diff --git a/crates/yaak-templates/pkg/yaak_templates_bg.wasm b/crates/yaak-templates/pkg/yaak_templates_bg.wasm index 4d8b65b8975277eeec472315056977c536da362b..716adf950cac0f4673cc16fdcd372f273e730aa0 100644 GIT binary patch delta 3720 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 J|Ai2P{1@Y9HR=EW delta 3652 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