843b319f35
gates / gates (push) Successful in 14s
MinAgent: 0.131.0 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
56 lines
2.3 KiB
Go
56 lines
2.3 KiB
Go
package stacks
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// R-514 — a worker OOM-killed inside a RUNNING container must be seen. BIGNIGHT: paperless-webserver
|
|
// `oomkilled=true restarts=0`, app „Fut", no event.
|
|
//
|
|
// RED-PROOF (run 2026-09-15, recorded in REPORT.md): with the `f[1] != "true"` filter inverted to
|
|
// skip every "true" line, the scan returned nothing and this failed at "OOM-killed worker not seen".
|
|
func TestScanOOMKilled_SeesKilledWorkerInRunningContainer(t *testing.T) {
|
|
var gotArgs []string
|
|
m := &Manager{
|
|
logger: log.New(io.Discard, "", 0),
|
|
stacks: map[string]*Stack{
|
|
"paperless-ngx": {Name: "paperless-ngx", Deployed: true, Containers: []ContainerInfo{
|
|
{Name: "paperless-webserver", State: StateRunning},
|
|
{Name: "paperless-redis", State: StateRunning},
|
|
}},
|
|
"bookstack": {Name: "bookstack", Deployed: true, Containers: []ContainerInfo{{Name: "bookstack", State: StateRunning}}},
|
|
"stopped": {Name: "stopped", Deployed: true, Containers: []ContainerInfo{{Name: "stopped-c", State: StateExited}}},
|
|
"undeployed": {Name: "undeployed", Deployed: false, Containers: []ContainerInfo{{Name: "u", State: StateRunning}}},
|
|
},
|
|
}
|
|
m.execFn = func(name string, args ...string) (string, error) {
|
|
gotArgs = args
|
|
return "/bookstack|false|2026-09-14T18:00:00Z\n/paperless-redis|false|2026-09-14T18:00:00Z\n/paperless-webserver|true|2026-09-14T18:00:01Z\n", nil
|
|
}
|
|
ooms, err := m.ScanOOMKilled()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(ooms) != 1 || ooms[0].Stack != "paperless-ngx" || ooms[0].Container != "paperless-webserver" || ooms[0].StartedAt == "" {
|
|
t.Fatalf("OOM-killed worker not seen: %+v", ooms)
|
|
}
|
|
joined := strings.Join(gotArgs, " ")
|
|
if strings.Contains(joined, "stopped-c") || strings.Contains(joined, " u") {
|
|
t.Fatalf("inspected a stopped or undeployed container: %v", gotArgs)
|
|
}
|
|
if got := m.OOMKilledStacks(); len(got["paperless-ngx"]) != 1 || len(got) != 1 {
|
|
t.Fatalf("dashboard cache wrong: %v", got)
|
|
}
|
|
// Next scan clean → cache cleared (a restarted container resets OOMKilled).
|
|
m.execFn = func(string, ...string) (string, error) {
|
|
return "/bookstack|false|x\n/paperless-redis|false|x\n/paperless-webserver|false|y\n", nil
|
|
}
|
|
_, _ = m.ScanOOMKilled()
|
|
if got := m.OOMKilledStacks(); len(got) != 0 {
|
|
t.Fatalf("cache not cleared after a clean scan: %v", got)
|
|
}
|
|
}
|