Spaces:
Sleeping
Sleeping
| import os | |
| from unittest.mock import patch | |
| def test_process_registry_register_pid_zero_noop(): | |
| """register_pid(0) is a no-op (early return).""" | |
| from cli import process_registry as pr | |
| before = len(pr._pids) | |
| pr.register_pid(0) | |
| assert len(pr._pids) == before | |
| def test_process_registry_unregister_pid_zero_noop(): | |
| """unregister_pid(0) is a no-op.""" | |
| from cli import process_registry as pr | |
| pr.register_pid(99999) | |
| pr.unregister_pid(0) | |
| assert 99999 in pr._pids | |
| pr.unregister_pid(99999) | |
| def test_process_registry_ensure_atexit_idempotent(): | |
| """Second call to ensure_atexit_registered is idempotent.""" | |
| from cli import process_registry as pr | |
| pr.ensure_atexit_registered() | |
| pr.ensure_atexit_registered() | |
| # Should not raise; atexit handler registered once | |
| def test_process_registry_kill_all_exception_logged_no_raise(monkeypatch): | |
| """Exception in os.kill/taskkill is logged but does not raise.""" | |
| from cli import process_registry as pr | |
| monkeypatch.setattr(pr, "_pids", {99999}) | |
| monkeypatch.setattr(os, "name", "posix", raising=False) | |
| def _kill_raises(pid, sig): | |
| raise ProcessLookupError("no such process") | |
| with patch("os.kill", _kill_raises): | |
| pr.kill_all_best_effort() | |
| # Should not raise | |
| def test_process_registry_register_unregister_does_not_crash(): | |
| from cli import process_registry as pr | |
| pr.register_pid(12345) | |
| pr.unregister_pid(12345) | |
| def test_process_registry_kill_all_best_effort_empty_is_noop(): | |
| from cli import process_registry as pr | |
| # Ensure no exception on empty set | |
| pr.kill_all_best_effort() | |
| def test_process_registry_kill_all_best_effort_windows_noop_when_taskkill_missing( | |
| monkeypatch, | |
| ): | |
| from cli import process_registry as pr | |
| # Simulate windows path in a stable way. | |
| monkeypatch.setattr(pr, "_pids", {12345}) | |
| monkeypatch.setattr(os, "name", "nt", raising=False) | |
| # If taskkill isn't callable, we still should not crash. | |
| import subprocess | |
| def _boom(*args, **kwargs): | |
| raise FileNotFoundError("taskkill missing") | |
| monkeypatch.setattr(subprocess, "run", _boom) | |
| pr.kill_all_best_effort() | |