diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-20 23:08:47 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-20 23:08:47 +0300 |
| commit | 54d3d3b4d4d2638d0e654fa4f3a39c50c341d971 (patch) | |
| tree | 880a2bdc7e203b31d33a2458c6a0c2d91fc864fa /tests | |
| parent | 43afaab582fd5e1428c51ecdbf6770d8e3917de6 (diff) | |
test: close pty masters before waiting
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/client_mode.rs | 22 | ||||
| -rw-r--r-- | tests/cross_area.rs | 16 | ||||
| -rw-r--r-- | tests/server_headless.rs | 12 |
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. |
