use super::*;
const LABEL: &str = "com.trusty.mpm";
#[test]
fn authoritative_fail_when_launchd_runs_a_different_pid() {
let check = verdict(
Some(LABEL),
Ownership::Running(111),
Some(222),
Some(true),
false,
"1.3.0",
);
assert_eq!(check.status, CheckStatus::Fail);
assert_eq!(check.name, CHECK_NAME);
assert!(
check.message.contains("111"),
"message was: {}",
check.message
);
assert!(
check.message.contains("222"),
"message was: {}",
check.message
);
}
#[test]
fn authoritative_fail_when_launchd_runs_nothing_but_a_daemon_answers() {
let check = verdict(
Some(LABEL),
Ownership::NotRunning,
Some(98606),
Some(false),
false,
"1.0.2",
);
assert_eq!(check.status, CheckStatus::Fail);
assert!(
check.message.contains("98606"),
"message was: {}",
check.message
);
}
#[test]
fn authoritative_ok_when_launchd_owns_the_responding_pid() {
let check = verdict(
Some(LABEL),
Ownership::Running(73599),
Some(73599),
Some(true),
false,
"1.3.0",
);
assert_eq!(check.status, CheckStatus::Ok);
}
#[test]
fn authoritative_verdict_ignores_a_lying_self_report() {
let lying_orphan = verdict(
Some(LABEL),
Ownership::Running(111),
Some(222),
Some(true),
false,
"1.3.0",
);
assert_eq!(lying_orphan.status, CheckStatus::Fail);
let pessimistic = verdict(
Some(LABEL),
Ownership::Running(333),
Some(333),
Some(false),
false,
"1.3.0",
);
assert_eq!(pessimistic.status, CheckStatus::Ok);
}
#[test]
fn ok_when_no_launchd_unit_is_registered() {
for supervised in [Some(false), Some(true), None] {
for pid in [None, Some(222)] {
assert_eq!(
verdict(
None,
Ownership::Unavailable,
pid,
supervised,
false,
"1.3.0"
)
.status,
CheckStatus::Ok,
"supervised={supervised:?} pid={pid:?}"
);
}
}
}
#[test]
fn fallback_fail_when_old_daemon_reports_unsupervised() {
let check = verdict(
Some(LABEL),
Ownership::NotRunning,
None,
Some(false),
false,
"1.0.2",
);
assert_eq!(check.status, CheckStatus::Fail);
}
#[test]
fn fallback_unknown_when_old_daemon_claims_supervised() {
let check = verdict(
Some(LABEL),
Ownership::NotRunning,
None,
Some(true),
false,
"1.0.2",
);
assert_eq!(check.status, CheckStatus::Unknown);
assert_ne!(check.status, CheckStatus::Ok);
assert!(
check.message.contains("getppid"),
"the message must explain why the self-report is not conclusive: {}",
check.message
);
}
#[test]
fn fallback_unknown_when_supervised_is_absent() {
let check = verdict(Some(LABEL), Ownership::NotRunning, None, None, false, "");
assert_eq!(check.status, CheckStatus::Unknown);
}
#[test]
fn warns_not_fails_when_the_operator_forced_it() {
for (ownership, serving_pid, supervised) in [
(Ownership::NotRunning, Some(222_u32), Some(false)),
(Ownership::Running(111), Some(222_u32), Some(true)),
(Ownership::NotRunning, None, Some(false)),
] {
let check = verdict(
Some(LABEL),
ownership,
serving_pid,
supervised,
true,
"1.3.0",
);
assert_eq!(
check.status,
CheckStatus::Warn,
"forced run must Warn, not Fail: {ownership:?}/{serving_pid:?}"
);
assert!(
check.message.contains("--force"),
"message was: {}",
check.message
);
}
}
#[test]
fn failure_names_the_pid_lookup_the_kill_and_the_launchctl_restart() {
let msg = verdict(
Some(LABEL),
Ownership::NotRunning,
Some(98606),
Some(false),
false,
"1.0.2",
)
.message;
assert!(msg.contains("lsof"), "message was: {msg}");
assert!(msg.contains("kill -TERM"), "message was: {msg}");
assert!(msg.contains("launchctl kickstart"), "message was: {msg}");
assert!(msg.contains("#4230"), "message was: {msg}");
}
#[test]
fn failure_names_the_force_opt_in() {
let msg = verdict(
Some(LABEL),
Ownership::NotRunning,
Some(98606),
Some(false),
false,
"1.0.2",
)
.message;
assert!(msg.contains("tm daemon --force"), "message was: {msg}");
}
#[test]
fn remediation_names_the_resolved_label() {
let drifted = "com.trusty.mpm.dogfood";
for check in [
verdict(
Some(drifted),
Ownership::NotRunning,
Some(222),
Some(false),
false,
"1.0.2",
),
verdict(
Some(drifted),
Ownership::NotRunning,
None,
Some(true),
false,
"1.0.2",
),
] {
assert!(
check.message.contains(drifted),
"message was: {}",
check.message
);
}
}
#[test]
fn failure_is_a_hard_fail_not_a_warn() {
let check = verdict(
Some(LABEL),
Ownership::NotRunning,
Some(98606),
Some(false),
false,
"1.0.2",
);
assert_eq!(check.status, CheckStatus::Fail);
assert_ne!(check.status, CheckStatus::Warn);
}
#[test]
fn failure_names_the_serving_version() {
let msg = verdict(
Some(LABEL),
Ownership::NotRunning,
Some(98606),
Some(false),
false,
"1.0.2",
)
.message;
assert!(msg.contains("1.0.2"), "message was: {msg}");
}
#[test]
fn unknown_version_is_labelled_not_blank() {
let msg = verdict(
Some(LABEL),
Ownership::NotRunning,
Some(98606),
Some(false),
false,
"",
)
.message;
assert!(msg.contains("version unknown"), "message was: {msg}");
}
#[test]
fn unknown_when_no_health_snapshot_is_available() {
let check = orphan_daemon_check(None);
assert_eq!(check.status, CheckStatus::Unknown);
assert_eq!(check.name, CHECK_NAME);
}
#[test]
fn unavailable_launchctl_is_unknown_not_a_fail() {
for supervised in [Some(true), Some(false), None] {
let check = verdict(
Some(LABEL),
Ownership::Unavailable,
Some(73599),
supervised,
false,
"1.3.1",
);
assert_eq!(
check.status,
CheckStatus::Unknown,
"supervised={supervised:?} must be Unknown, got {:?}: {}",
check.status,
check.message
);
assert_ne!(check.status, CheckStatus::Fail, "supervised={supervised:?}");
}
}
#[test]
fn unavailable_launchctl_never_prescribes_a_kill() {
let msg = verdict(
Some(LABEL),
Ownership::Unavailable,
Some(73599),
Some(true),
false,
"1.3.1",
)
.message;
assert!(!msg.contains("kill"), "must not prescribe a kill: {msg}");
assert!(!msg.contains("-TERM"), "must not prescribe a kill: {msg}");
assert!(!msg.contains("ORPHAN"), "must not assert an orphan: {msg}");
}
#[test]
fn unavailable_message_names_the_domain_cause() {
let msg = verdict(
Some(LABEL),
Ownership::Unavailable,
Some(73599),
None,
false,
"1.3.1",
)
.message;
assert!(msg.contains("domain"), "message was: {msg}");
assert!(msg.contains("PATH"), "message was: {msg}");
assert!(msg.contains(LABEL), "message was: {msg}");
assert!(msg.contains("#4230"), "message was: {msg}");
}
#[test]
fn not_running_but_supervised_is_unknown_not_a_kill_order() {
let check = verdict(
Some(LABEL),
Ownership::NotRunning,
Some(73599),
Some(true),
false,
"1.3.1",
);
assert_eq!(check.status, CheckStatus::Unknown);
assert_ne!(check.status, CheckStatus::Ok, "never a pass either");
assert!(
!check.message.contains("kill -TERM"),
"message was: {}",
check.message
);
}
#[test]
fn not_running_with_supervised_false_is_still_a_hard_fail() {
for supervised in [Some(false), None] {
let check = verdict(
Some(LABEL),
Ownership::NotRunning,
Some(98606),
supervised,
false,
"1.0.2",
);
assert_eq!(
check.status,
CheckStatus::Fail,
"supervised={supervised:?} is the #4230 population and must stay Fail: {}",
check.message
);
assert!(check.message.contains("kill -TERM"), "{}", check.message);
}
}
#[test]
fn unavailable_with_an_old_daemon_reporting_unsupervised_still_fails() {
let check = verdict(
Some(LABEL),
Ownership::Unavailable,
None,
Some(false),
false,
"1.0.2",
);
assert_eq!(check.status, CheckStatus::Fail);
}
#[test]
fn authoritative_tier_treats_unknown_and_false_identically() {
let with_none = verdict(
Some(LABEL),
Ownership::NotRunning,
Some(4242),
None,
false,
"1.3.1",
);
let with_false = verdict(
Some(LABEL),
Ownership::NotRunning,
Some(4242),
Some(false),
false,
"1.3.1",
);
let with_true = verdict(
Some(LABEL),
Ownership::NotRunning,
Some(4242),
Some(true),
false,
"1.3.1",
);
assert_eq!(
with_none.status, with_false.status,
"a collapsed unknown and a positive negative already decide the same way here, \
so downgrading one to the other would change no reachable verdict"
);
assert_eq!(with_none.status, CheckStatus::Fail);
assert_ne!(
with_true.status,
CheckStatus::Fail,
"a daemon claiming supervision against a down job is a contradiction, not a \
licence to prescribe `kill -TERM`: {}",
with_true.message
);
}