package warding import ( "errors" "testing" "time" "dcos.net/sorcery-go/pkg/eventbus" ) // stubTomb satisfies the TombReader interface for tests. type stubTomb struct{ shouldFail bool } func (s stubTomb) VerifyRoot(essenceID string) error { if s.shouldFail { return errors.New("simulated taint") } return nil } func (s stubTomb) VerifyBlobs(essenceID string) error { if s.shouldFail { return errors.New("simulated bit-rot") } return nil } func TestInspectPassesOnCleanEssence(t *testing.T) { bus := eventbus.New() w := New(stubTomb{shouldFail: false}, bus) if err := w.Inspect("essence-1"); err != nil { t.Fatalf("expected clean inspect, got %v", err) } if len(w.Alarms) != 0 { t.Fatalf("expected no alarms, got %d", len(w.Alarms)) } } func TestInspectRaisesAlarmOnTaint(t *testing.T) { bus := eventbus.New() w := New(stubTomb{shouldFail: true}, bus) if err := w.Inspect("essence-tainted"); err == nil { t.Fatalf("expected inspect to fail on taint") } if len(w.Alarms) != 1 || w.Alarms[0].Severity != "taint" { t.Fatalf("expected one taint alarm, got %+v", w.Alarms) } } func TestAlarmsSinceFiltersByTime(t *testing.T) { bus := eventbus.New() w := New(stubTomb{}, bus) w.Alarms = append(w.Alarms, Alarm{Time: time.Now().Add(-2 * time.Hour), Severity: "taint"}, Alarm{Time: time.Now().Add(-5 * time.Minute), Severity: "taint"}, ) recent := w.AlarmsSince(time.Now().Add(-1 * time.Hour)) if len(recent) != 1 { t.Fatalf("expected 1 recent alarm, got %d", len(recent)) } }