30 lines
1.4 KiB
Go
30 lines
1.4 KiB
Go
package felhomsshd
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// R-1194: on every fresh box the first host report — sent before the OOB loop's first pass — read „config invalid,
|
|
// port 0" (the config was not rendered yet) and the hub mailed oob_degraded. Reproduced 2026-10-21 on a fresh box
|
|
// (felhom.eu audits/night-2026-10-21/P5-checks/): the report at 20:34:00, the apply 0.4 s later, the daemon healthy.
|
|
// The loop now reports NO stanza (the hub does not evaluate a missing one) until a pass has run — a failed pass
|
|
// counts, so a real lasting failure is still reported from the next report on.
|
|
// RED-PROOF: with OOBStatus not gated on `passed`, the first assertion fails (a stanza with config_invalid).
|
|
func TestR1194_NoOOBStanzaBeforeTheFirstPass(t *testing.T) {
|
|
r := newScriptRunner()
|
|
m := NewManager(r, t.TempDir(), nil)
|
|
m.isActive = func(context.Context) bool { return false }
|
|
m.isFailed = func(context.Context) bool { return false }
|
|
m.now = func() time.Time { return time.Unix(1783270000, 0) }
|
|
l := NewLoop(m, nil, time.Minute, nil)
|
|
if st := l.OOBStatus(context.Background()); st != nil {
|
|
t.Fatalf("a stanza before the first pass reads a config that was never rendered: %+v", st)
|
|
}
|
|
l.reconcile(context.Background()) // fails or succeeds — either way a pass has run
|
|
if st := l.OOBStatus(context.Background()); st == nil {
|
|
t.Fatal("after the first pass the health must be reported (a real failure must reach the hub)")
|
|
}
|
|
}
|