package spool import ( "testing" "time" "browser.local/run/protocol" ) func TestLogSpoolRetainsPendingAndRemovesAcknowledgedBatch(t *testing.T) { spool, err := NewLogSpool(t.TempDir()) if err != nil { t.Fatalf("new log spool: %v", err) } first := validSpoolLogBatch(1, 2) second := validSpoolLogBatch(3, 3) if err := spool.Enqueue(first); err != nil { t.Fatalf("enqueue first: %v", err) } if err := spool.Enqueue(second); err != nil { t.Fatalf("enqueue second: %v", err) } pending, err := spool.Pending() if err != nil { t.Fatalf("pending before ack: %v", err) } if len(pending) != 2 { t.Fatalf("expected two pending batches, got %+v", pending) } if err := spool.Ack(protocol.LogBatchIngestResponse{LogStreamID: "log-1", AcceptedFrom: 1, AcceptedTo: 2}); err != nil { t.Fatalf("ack first: %v", err) } pending, err = spool.Pending() if err != nil { t.Fatalf("pending after ack: %v", err) } if len(pending) != 1 || pending[0].FirstSeq != 3 { t.Fatalf("expected second batch pending, got %+v", pending) } } func TestLogSpoolRetainsBatchWhenAckDoesNotCoverRange(t *testing.T) { spool, err := NewLogSpool(t.TempDir()) if err != nil { t.Fatalf("new log spool: %v", err) } if err := spool.Enqueue(validSpoolLogBatch(1, 2)); err != nil { t.Fatalf("enqueue: %v", err) } if err := spool.Ack(protocol.LogBatchIngestResponse{LogStreamID: "log-1", AcceptedFrom: 1, AcceptedTo: 1}); err != nil { t.Fatalf("partial ack: %v", err) } pending, err := spool.Pending() if err != nil { t.Fatalf("pending: %v", err) } if len(pending) != 1 { t.Fatalf("expected batch to remain pending, got %+v", pending) } } func validSpoolLogBatch(firstSeq uint64, lastSeq uint64) protocol.LogBatchIngestRequest { entries := make([]protocol.LogEntry, 0, lastSeq-firstSeq+1) for seq := firstSeq; seq <= lastSeq; seq++ { entries = append(entries, protocol.LogEntry{Seq: seq, Timestamp: time.Date(2026, 7, 3, 12, 0, int(seq), 0, time.UTC), Level: "info", Line: "line"}) } return protocol.LogBatchIngestRequest{ RunEndpointID: "run-local", SessionToken: "session-token", LogStreamID: "log-1", ServerInstanceID: "server-1", StreamKey: "stdout", Source: "process", FirstSeq: firstSeq, LastSeq: lastSeq, Compression: "none", Checksum: "sha256:test", Entries: entries, } }