Files
felhom-controller/controller/internal/stacks/r1347_watcher_test.go
T

41 lines
1.4 KiB
Go

package stacks
import (
"fmt"
"io"
"log"
"testing"
"time"
)
// R-1347, the consequence: an app whose last update ended held is not watched for a crash loop; once its hold is lifted by
// a restore and the flag forgotten (backup.clearUpdateHoldAfterRestore → ForgetUpdateHeld) the same restarts trip the
// watcher again.
func TestR1347_TheWatcherWatchesAgainOnceTheFlagIsForgotten(t *testing.T) {
m := &Manager{logger: log.New(io.Discard, "", 0), stacks: map[string]*Stack{
"nextcloud": {Name: "nextcloud", Deployed: true, Containers: []ContainerInfo{{Name: "nextcloud-web-1"}}},
}}
m.markUpdateHeld("nextcloud")
count := int64(0)
m.execFn = func(string, ...string) (string, error) { return fmt.Sprintf("/nextcloud-web-1|%d\n", count), nil }
t0 := time.Date(2026, 11, 2, 4, 20, 0, 0, time.UTC)
sample := func(from int) []UnhealthyVerdict {
var got []UnhealthyVerdict
for i := from; i < from+12 && len(got) == 0; i++ {
count += 3
got = m.ObserveUnhealthy(t0.Add(time.Duration(i)*time.Minute), nil)
}
return got
}
if got := sample(0); len(got) != 0 {
t.Fatalf("control: an app whose update ended held must not be judged: %+v", got)
}
if !m.ForgetUpdateHeld("nextcloud") {
t.Fatal("the flag was set, so it must be forgotten")
}
got := sample(20)
if len(got) != 1 || got[0].Stack != "nextcloud" || got[0].Kind != UnhealthyCrashLoop {
t.Fatalf("after the restore lifted the hold the watcher must watch the app again; verdicts %+v", got)
}
}