aboutsummaryrefslogtreecommitdiff
path: root/tests/support
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-25 15:36:50 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-25 15:36:50 +0300
commitd4a5e02e8433db156b9dabe2b81ddd1d2aca9ea6 (patch)
treef94ebdfc2bf1e54b3d110052269c67b6ba5f6fb8 /tests/support
parenta1543f3e248f8f5266322014ccd853e478b1dcd6 (diff)
feat: hand off ptys during updates
Diffstat (limited to 'tests/support')
-rw-r--r--tests/support/mod.rs30
1 files changed, 22 insertions, 8 deletions
diff --git a/tests/support/mod.rs b/tests/support/mod.rs
index e810b843..cae140c9 100644
--- a/tests/support/mod.rs
+++ b/tests/support/mod.rs
@@ -328,16 +328,30 @@ pub fn wait_for_message_variant(
}
pub fn wait_for_disconnect(stream: &mut UnixStream, timeout: Duration) -> Result<bool, String> {
- stream
- .set_read_timeout(Some(Duration::from_millis(200)))
- .map_err(|e| e.to_string())?;
+ stream.set_nonblocking(true).map_err(|e| e.to_string())?;
let deadline = Instant::now() + timeout;
- while Instant::now() < deadline {
- if read_server_message(stream).is_err() {
- return Ok(true);
+ let mut idle_since = None;
+ let result = loop {
+ match read_server_message(stream) {
+ Ok(_) => idle_since = None,
+ Err(err)
+ if err.to_ascii_lowercase().contains("would block")
+ || err.contains("Resource temporarily unavailable") =>
+ {
+ let idle_started = *idle_since.get_or_insert_with(Instant::now);
+ if idle_started.elapsed() >= Duration::from_millis(200) {
+ break Ok(true);
+ }
+ }
+ Err(_) => break Ok(true),
}
- }
- Ok(false)
+ if Instant::now() >= deadline {
+ break Ok(false);
+ }
+ thread::sleep(Duration::from_millis(25));
+ };
+ let _ = stream.set_nonblocking(false);
+ result
}
pub fn cleanup_registered_herdr_pids() {