fix(test): isolate health tests from minimal-response env var race (#4702)

Three health handler tests assert on payload fields (degradedReasons,
details) that are absent when RUSTFS_HEALTH_MINIMAL_RESPONSE_ENABLE is
true. The minimal-mode sibling test sets that env var via
temp_env::with_var, which leaks across parallel test threads.

Wrap the three affected tests with their own with_var guard pinning the
env var to false so they are deterministic regardless of thread order.
This commit is contained in:
Zhengchao An
2026-07-11 13:39:34 +08:00
committed by GitHub
parent 5650dcdc5d
commit a97f3a9c52
+19 -2
View File
@@ -88,6 +88,7 @@ impl Operation for HealthCheckHandler {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
use serial_test::serial;
use temp_env::with_var; use temp_env::with_var;
#[test] #[test]
@@ -285,6 +286,7 @@ mod tests {
} }
#[test] #[test]
#[serial]
fn test_build_health_payload_minimal_mode_returns_status_and_ready_only() { fn test_build_health_payload_minimal_mode_returns_status_and_ready_only() {
let health = health_check_state(true, false, true, true, HealthProbe::Readiness); let health = health_check_state(true, false, true, true, HealthProbe::Readiness);
with_var(rustfs_config::ENV_HEALTH_MINIMAL_RESPONSE_ENABLE, Some("true"), || { with_var(rustfs_config::ENV_HEALTH_MINIMAL_RESPONSE_ENABLE, Some("true"), || {
@@ -309,7 +311,9 @@ mod tests {
} }
#[test] #[test]
#[serial]
fn test_build_health_payload_includes_degraded_reasons() { fn test_build_health_payload_includes_degraded_reasons() {
with_var(rustfs_config::ENV_HEALTH_MINIMAL_RESPONSE_ENABLE, Some("false"), || {
let health = health_check_state(false, false, false, true, HealthProbe::Readiness); let health = health_check_state(false, false, false, true, HealthProbe::Readiness);
let payload = build_health_payload(HealthPayloadContext { let payload = build_health_payload(HealthPayloadContext {
health, health,
@@ -323,6 +327,7 @@ mod tests {
include_dependency_details: true, include_dependency_details: true,
}); });
assert_eq!(payload["degradedReasons"][0], "storage_and_iam_unavailable"); assert_eq!(payload["degradedReasons"][0], "storage_and_iam_unavailable");
});
} }
#[test] #[test]
@@ -343,7 +348,9 @@ mod tests {
} }
#[test] #[test]
#[serial]
fn test_build_health_response_parts_get_includes_payload() { fn test_build_health_response_parts_get_includes_payload() {
with_var(rustfs_config::ENV_HEALTH_MINIMAL_RESPONSE_ENABLE, Some("false"), || {
let report = crate::server::DependencyReadinessReport { let report = crate::server::DependencyReadinessReport {
readiness: crate::server::DependencyReadiness { readiness: crate::server::DependencyReadiness {
storage_ready: false, storage_ready: false,
@@ -360,10 +367,13 @@ mod tests {
assert_eq!(payload["status"], "degraded"); assert_eq!(payload["status"], "degraded");
assert_eq!(payload["ready"], false); assert_eq!(payload["ready"], false);
assert_eq!(payload["degradedReasons"][0], "storage_quorum_unavailable"); assert_eq!(payload["degradedReasons"][0], "storage_quorum_unavailable");
});
} }
#[test] #[test]
#[serial]
fn test_build_health_response_parts_readiness_marks_kms_not_ready() { fn test_build_health_response_parts_readiness_marks_kms_not_ready() {
with_var(rustfs_config::ENV_HEALTH_MINIMAL_RESPONSE_ENABLE, Some("false"), || {
let report = crate::server::DependencyReadinessReport { let report = crate::server::DependencyReadinessReport {
readiness: crate::server::DependencyReadiness { readiness: crate::server::DependencyReadiness {
storage_ready: true, storage_ready: true,
@@ -373,13 +383,20 @@ mod tests {
}, },
degraded_reasons: Vec::new(), degraded_reasons: Vec::new(),
}; };
let parts = let parts = build_health_response_parts(
build_health_response_parts(Method::GET, HealthProbe::Readiness, Some(&report), "rustfs-endpoint", None, Some(false)); Method::GET,
HealthProbe::Readiness,
Some(&report),
"rustfs-endpoint",
None,
Some(false),
);
assert_eq!(parts.status_code, StatusCode::SERVICE_UNAVAILABLE); assert_eq!(parts.status_code, StatusCode::SERVICE_UNAVAILABLE);
let payload = parts.payload.expect("GET should include payload"); let payload = parts.payload.expect("GET should include payload");
assert_eq!(payload["ready"], false); assert_eq!(payload["ready"], false);
assert_eq!(payload["details"]["lock"]["ready"], true); assert_eq!(payload["details"]["lock"]["ready"], true);
assert_eq!(payload["details"]["kms"]["ready"], false); assert_eq!(payload["details"]["kms"]["ready"], false);
assert_eq!(payload["degradedReasons"][0], "kms_not_ready"); assert_eq!(payload["degradedReasons"][0], "kms_not_ready");
});
} }
} }