fix(R-1298): held-app reports only for installed apps (a restore hold always)
Red-proved. Commit only.
This commit is contained in:
1 parent
dfd0f8ec53
commit
b156e4526a
4 files changed
+75
-3
No files matched your search
@@ -155,7 +155,7 @@ func TestD53_TheReporterIsWiredInMain(t *testing.T) {
|
||||
}
|
||||
}
|
||||
src := strings.Join(live, "\n")
|
||||
for _, want := range []string{"holdreport.New(sett, notifier.PushEvent, logger)", `sched.Every("hold-report"`, "holdReporter.Tick("} {
|
||||
for _, want := range []string{"holdreport.New(sett, notifier.PushEvent, logger)", `sched.Every("hold-report"`, "holdReporter.Tick(", "holdReporter.SetInstalled("} {
|
||||
if !strings.Contains(src, want) {
|
||||
t.Errorf("main.go lacks %q — the hold report is not wired", want)
|
||||
}
|
||||
@@ -180,3 +180,32 @@ func TestD53_TheReportedRecordSurvivesAReload(t *testing.T) {
|
||||
t.Fatalf("after a reload the record reads %q", got)
|
||||
}
|
||||
}
|
||||
|
||||
// R-1298: an install's hold (crash-loop stop, failed update, waiting put-back) of an app that is NOT installed any more is
|
||||
// not reported — on 9202 four such holds from a hand removal would have mailed the operator weekly about apps that do not
|
||||
// exist. A restore hold stays reported whatever the app's state (R-379: a person clears it). A hold reported earlier and
|
||||
// now skipped is reported cleared. COMPANION RED-PROOF: without the installed check all three holds are reported.
|
||||
func TestR1298_OnlyHoldsOfInstalledAppsAreReported(t *testing.T) {
|
||||
st := &fakeStore{holds: map[string]settings.RestoreHold{
|
||||
"gone": {Stack: "gone", At: "2026-09-24T12:16:24Z", Reason: settings.HoldReasonUnhealthyStop},
|
||||
"gonedb": {Stack: "gonedb", At: "2026-09-24T12:16:24Z", Reason: settings.HoldReasonRestoreFailed},
|
||||
"present": {Stack: "present", At: "2026-10-26T17:37:52Z", Reason: settings.HoldReasonUpdateFailed},
|
||||
}, reported: map[string]string{"gone": "unhealthy_stop|2026-09-24T12:16:24Z"}}
|
||||
var out []sent
|
||||
r := New(st, rec(&out), nil)
|
||||
r.SetInstalled(func(stack string) bool { return stack == "present" })
|
||||
r.Tick(t0)
|
||||
got := map[string]string{}
|
||||
for _, s := range out {
|
||||
got[s.d.StackName] = s.typ
|
||||
}
|
||||
if got["gone"] != EventCleared {
|
||||
t.Errorf("the hold of an app that is not installed must be reported cleared, got %q", got["gone"])
|
||||
}
|
||||
if got["gonedb"] != EventHeld {
|
||||
t.Errorf("a restore hold must stay reported even when the app is gone, got %q", got["gonedb"])
|
||||
}
|
||||
if got["present"] != EventHeld {
|
||||
t.Errorf("an installed app's hold must be reported, got %q", got["present"])
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user