aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-04-23 00:48:22 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-04-23 00:48:22 +0300
commit40750418049c5125724b004c8f55ae66ca77edcf (patch)
treed72ecadb0506c3643ffaa5fe7cf40f22c90d967a /tests
parent3d6f3e78624f1308a360cbf02eeca3fec2434436 (diff)
feat(logging): add robust rotating support logs
Diffstat (limited to 'tests')
-rw-r--r--tests/auto_detect.rs90
1 files changed, 90 insertions, 0 deletions
diff --git a/tests/auto_detect.rs b/tests/auto_detect.rs
index 4c92d62c..94ab3f07 100644
--- a/tests/auto_detect.rs
+++ b/tests/auto_detect.rs
@@ -222,6 +222,25 @@ fn ping_socket(socket_path: &Path) -> String {
response.trim().to_string()
}
+fn wait_for_log_contains(path: &Path, needle: &str, timeout: Duration) {
+ let deadline = Instant::now() + timeout;
+ while Instant::now() < deadline {
+ if let Ok(content) = fs::read_to_string(path) {
+ if content.contains(needle) {
+ return;
+ }
+ }
+ thread::sleep(Duration::from_millis(25));
+ }
+ let content = fs::read_to_string(path).unwrap_or_default();
+ panic!(
+ "log {} did not contain {:?}. content:\n{}",
+ path.display(),
+ needle,
+ content
+ );
+}
+
fn run_cli(socket_path: &Path, args: &[&str]) -> std::process::Output {
let mut command = Command::new(env!("CARGO_BIN_EXE_herdr"));
command.args(args);
@@ -639,6 +658,77 @@ fn auto_detect_default_socket_path_from_config_dir() {
}
#[test]
+fn auto_detect_writes_client_and_server_logs_to_separate_files() {
+ let _lock = test_lock();
+ let base = unique_test_dir();
+ let config_home = base.join("config");
+ let runtime_dir = base.join("runtime");
+ let api_socket = runtime_dir.join("herdr.sock");
+ let client_socket = runtime_dir.join("herdr-client.sock");
+
+ let spawned = spawn_herdr_auto(&config_home, &runtime_dir, &api_socket, &client_socket);
+ wait_for_socket(&api_socket, Duration::from_secs(10));
+ wait_for_socket(&client_socket, Duration::from_secs(10));
+
+ let app_dir_name = if cfg!(debug_assertions) {
+ "herdr-dev"
+ } else {
+ "herdr"
+ };
+ let log_dir = config_home.join(app_dir_name);
+ let client_log = log_dir.join("herdr-client.log");
+ let server_log = log_dir.join("herdr-server.log");
+ let monolith_log = log_dir.join("herdr.log");
+
+ wait_for_log_contains(
+ &client_log,
+ "event=\"app.startup\" subsystem=\"client\"",
+ Duration::from_secs(10),
+ );
+ wait_for_log_contains(
+ &server_log,
+ "event=\"app.startup\" subsystem=\"server\"",
+ Duration::from_secs(10),
+ );
+
+ let monolith_content = fs::read_to_string(&monolith_log).unwrap_or_default();
+ assert!(
+ !monolith_content.contains("subsystem=\"client\""),
+ "persistent client logs should not land in herdr.log: {monolith_content}"
+ );
+
+ cleanup_spawned_herdr(spawned, base);
+}
+
+#[test]
+fn no_session_writes_startup_logs_to_monolith_file() {
+ let _lock = test_lock();
+ let base = unique_test_dir();
+ let config_home = base.join("config");
+ let runtime_dir = base.join("runtime");
+ let api_socket = runtime_dir.join("herdr.sock");
+
+ let spawned = spawn_herdr_no_session(&config_home, &runtime_dir, &api_socket);
+ wait_for_socket(&api_socket, Duration::from_secs(10));
+
+ let app_dir_name = if cfg!(debug_assertions) {
+ "herdr-dev"
+ } else {
+ "herdr"
+ };
+ let log_dir = config_home.join(app_dir_name);
+ let monolith_log = log_dir.join("herdr.log");
+
+ wait_for_log_contains(
+ &monolith_log,
+ "event=\"app.startup\" subsystem=\"app\"",
+ Duration::from_secs(10),
+ );
+
+ cleanup_spawned_herdr(spawned, base);
+}
+
+#[test]
fn auto_detect_respects_nested_guard_before_auto_attach() {
let _lock = test_lock();
let base = unique_test_dir();