package main import ( "testing" "time" ) // one fault, several alerts with the same name (per-pod label sets, group resend): one diagnosis inside the window func TestDedupeSameAlertName(t *testing.T) { r := NewAlertRouter(&App{cfg: Config{AlertDedupeS: 300}}) sid := "C-G2" if _, dup := r.dedupe("ApiMemoryPressure", &sid); dup { t.Fatal("first alert must be diagnosed") } if _, dup := r.dedupe("ApiMemoryPressure", &sid); !dup { t.Fatal("second alert inside the window must be skipped") } other := "V-G1" if _, dup := r.dedupe("ApiMemoryPressure", &other); dup { t.Fatal("another scenario is a new fault") } // all alerts of that name resolved -> the next firing starts a new diagnosis r.setFiring("fp1", "ApiMemoryPressure", true) r.clearDedupe("ApiMemoryPressure", &sid) // still firing: keep if _, dup := r.dedupe("ApiMemoryPressure", &sid); !dup { t.Fatal("still firing: keep the window") } r.setFiring("fp1", "ApiMemoryPressure", false) r.clearDedupe("ApiMemoryPressure", &sid) if _, dup := r.dedupe("ApiMemoryPressure", &sid); dup { t.Fatal("after resolve the next firing is a new fault") } // window expiry r.lastDiag["ApiMemoryPressure|"+sid] = time.Now().Add(-301 * time.Second) if _, dup := r.dedupe("ApiMemoryPressure", &sid); dup { t.Fatal("outside the window a new diagnosis is allowed") } // off r2 := NewAlertRouter(&App{cfg: Config{AlertDedupeS: 0}}) if _, dup := r2.dedupe("X", nil); dup { t.Fatal("dedupe off") } if _, dup := r2.dedupe("X", nil); dup { t.Fatal("dedupe off") } } // external-* models (reference runs served by a client outside the AI VM) get the long diagnose timeout; the model id // itself passes the run request bound. func TestDiagnoseTimeoutByModel(t *testing.T) { if d := diagnoseTimeout("claude-sonnet-5-5"); d != 3*time.Minute { t.Fatalf("api model timeout %v", d) } if d := diagnoseTimeout(""); d != 3*time.Minute { t.Fatalf("default model timeout %v", d) } if d := diagnoseTimeout("external-claude-mythos-5-1"); d != 26*time.Minute { t.Fatalf("external model timeout %v", d) } if !modelRe.MatchString("external-claude-mythos-5-1") { t.Fatal("external model id must pass modelRe") } }