aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-20 23:08:47 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-20 23:08:47 +0300
commit54d3d3b4d4d2638d0e654fa4f3a39c50c341d971 (patch)
tree880a2bdc7e203b31d33a2458c6a0c2d91fc864fa /tests
parent43afaab582fd5e1428c51ecdbf6770d8e3917de6 (diff)
test: close pty masters before waiting
Diffstat (limited to 'tests')
-rw-r--r--tests/client_mode.rs22
-rw-r--r--tests/cross_area.rs16
-rw-r--r--tests/server_headless.rs12
3 files changed, 40 insertions, 10 deletions
diff --git a/tests/client_mode.rs b/tests/client_mode.rs
index 4fe5b11a..c6d8a3ec 100644
--- a/tests/client_mode.rs
+++ b/tests/client_mode.rs
@@ -31,14 +31,21 @@ fn unique_test_dir() -> PathBuf {
}
struct SpawnedHerdr {
- _master: Box<dyn MasterPty + Send>,
+ _master: Option<Box<dyn MasterPty + Send>>,
child: Box<dyn Child + Send + Sync>,
}
+impl SpawnedHerdr {
+ fn close_master(&mut self) {
+ drop(self._master.take());
+ }
+}
+
impl Drop for SpawnedHerdr {
fn drop(&mut self) {
let pid = self.child.process_id();
let _ = self.child.kill();
+ self.close_master();
if let Some(pid) = pid {
let deadline = Instant::now() + Duration::from_secs(2);
@@ -99,7 +106,7 @@ fn spawn_client_process(
drop(pair.slave);
SpawnedHerdr {
- _master: pair.master,
+ _master: Some(pair.master),
child,
}
}
@@ -142,7 +149,7 @@ fn spawn_server(
drop(pair.slave);
SpawnedHerdr {
- _master: pair.master,
+ _master: Some(pair.master),
child,
}
}
@@ -327,7 +334,7 @@ fn client_sees_headless_startup_config_diagnostic() {
drop(pair.slave);
let spawned = SpawnedHerdr {
- _master: pair.master,
+ _master: Some(pair.master),
child,
};
wait_for_socket(&api_socket, Duration::from_secs(10));
@@ -537,6 +544,7 @@ fn server_shutdown_sends_message_to_client() {
);
// Wait for the server to exit after shutdown signal.
+ spawned.close_master();
let _ = spawned.child.wait();
drop(spawned);
@@ -616,6 +624,8 @@ fn server_crash_after_attach_causes_lost_connection_error() {
// Prove attached before kill by waiting for at least one frame message.
let mut thin_reader = thin_client
._master
+ .as_ref()
+ .expect("thin client master")
.try_clone_reader()
.expect("clone client PTY reader");
let attached_before_kill = {
@@ -648,6 +658,7 @@ fn server_crash_after_attach_causes_lost_connection_error() {
libc::kill(pid as libc::pid_t, libc::SIGKILL);
}
}
+ spawned.close_master();
// Client should exit non-zero after connection loss.
let mut crash_output = String::new();
@@ -926,6 +937,7 @@ fn graceful_shutdown_sends_server_shutdown_to_client() {
}
// Wait for the server to exit.
+ spawned.close_master();
let _ = spawned.child.wait();
drop(spawned);
@@ -979,7 +991,7 @@ fn client_receives_notify_on_agent_state_change() {
drop(pair.slave);
let spawned = SpawnedHerdr {
- _master: pair.master,
+ _master: Some(pair.master),
child,
};
wait_for_socket(&api_socket, Duration::from_secs(10));
diff --git a/tests/cross_area.rs b/tests/cross_area.rs
index 87e85109..5b051277 100644
--- a/tests/cross_area.rs
+++ b/tests/cross_area.rs
@@ -30,14 +30,21 @@ fn unique_test_dir() -> PathBuf {
}
struct SpawnedHerdr {
- _master: Box<dyn MasterPty + Send>,
+ _master: Option<Box<dyn MasterPty + Send>>,
child: Box<dyn Child + Send + Sync>,
}
+impl SpawnedHerdr {
+ fn close_master(&mut self) {
+ drop(self._master.take());
+ }
+}
+
impl Drop for SpawnedHerdr {
fn drop(&mut self) {
let pid = self.child.process_id();
let _ = self.child.kill();
+ self.close_master();
if let Some(pid) = pid {
let deadline = Instant::now() + Duration::from_secs(2);
@@ -124,7 +131,7 @@ fn spawn_server_with_path(
drop(pair.slave);
SpawnedHerdr {
- _master: pair.master,
+ _master: Some(pair.master),
child,
}
}
@@ -159,7 +166,7 @@ fn spawn_client_process(
drop(pair.slave);
SpawnedHerdr {
- _master: pair.master,
+ _master: Some(pair.master),
child,
}
}
@@ -1003,6 +1010,8 @@ fn cross_area_server_kill_then_restart_and_reconnect() {
let mut thin_client = spawn_client_process(&config_home, &runtime_dir, &api_socket);
let mut thin_reader = thin_client
._master
+ .as_ref()
+ .expect("thin client master")
.try_clone_reader()
.expect("clone thin client reader");
@@ -1039,6 +1048,7 @@ fn cross_area_server_kill_then_restart_and_reconnect() {
unsafe {
libc::kill(server_pid as libc::pid_t, libc::SIGKILL);
}
+ server.close_master();
assert!(
wait_for_child_exit(&mut server.child, Duration::from_secs(5)),
"server should exit after SIGKILL"
diff --git a/tests/server_headless.rs b/tests/server_headless.rs
index 99f72404..8f0234f0 100644
--- a/tests/server_headless.rs
+++ b/tests/server_headless.rs
@@ -29,14 +29,21 @@ fn unique_test_dir() -> PathBuf {
}
struct SpawnedHerdr {
- _master: Box<dyn MasterPty + Send>,
+ _master: Option<Box<dyn MasterPty + Send>>,
child: Box<dyn Child + Send + Sync>,
}
+impl SpawnedHerdr {
+ fn close_master(&mut self) {
+ drop(self._master.take());
+ }
+}
+
impl Drop for SpawnedHerdr {
fn drop(&mut self) {
let pid = self.child.process_id();
let _ = self.child.kill();
+ self.close_master();
if let Some(pid) = pid {
let deadline = Instant::now() + Duration::from_secs(2);
@@ -127,7 +134,7 @@ fn spawn_server(
drop(pair.slave);
SpawnedHerdr {
- _master: pair.master,
+ _master: Some(pair.master),
child,
}
}
@@ -440,6 +447,7 @@ fn server_removes_client_socket_on_exit() {
// Kill the server.
let _ = spawned.child.kill();
+ spawned.close_master();
let _ = spawned.child.wait();
// Give it a moment to clean up.