package link import ( "context" "encoding/json" "sync" "testing" "time" "github.com/nats-io/nats.go/jetstream" ) type recordedRunning struct { mu sync.Mutex bodies [][]byte } func (r *recordedRunning) Put(_ context.Context, _ string, value []byte) (uint64, error) { r.mu.Lock() defer r.mu.Unlock() r.bodies = append(r.bodies, value) return uint64(len(r.bodies)), nil } func (r *recordedRunning) Delete(context.Context, string, ...jetstream.KVDeleteOpt) error { return nil } func (r *recordedRunning) puts() [][]byte { r.mu.Lock() defer r.mu.Unlock() return append([][]byte(nil), r.bodies...) } // 1155/AC2: a check starting puts its key, and puts it again at each heartbeat, and every value carries the same Started, // the time the check started. func TestACheckRunningKeepsItsStartAcrossHeartbeats(t *testing.T) { // 1155/AC2 store := &recordedRunning{} started := time.Date(2026, 10, 18, 19, 0, 0, 0, time.UTC) stop := keepRunningIn(context.Background(), store, "novox.a.7", aPullCheck("b1", 7, "head-7-000000000", "trunk-1-000000", false), "builder-1", 5*time.Millisecond, started) deadline := time.Now().Add(5 * time.Second) for len(store.puts()) < 3 && time.Now().Before(deadline) { time.Sleep(5 * time.Millisecond) } stop() puts := store.puts() if len(puts) < 3 { t.Fatalf("the key was put %d times, want the first and two heartbeats", len(puts)) } for i, body := range puts { var got CheckRunning if err := json.Unmarshal(body, &got); err != nil { t.Fatal(err) } if !got.Started.Equal(started) { t.Fatalf("put %d carries Started %v, want %v", i, got.Started, started) } if got.Builder != "builder-1" || got.Build != "b1" { t.Fatalf("put %d lost the rest of the value: %+v", i, got) } } }