package validator import ( "crypto/sha256" "encoding/hex" "strings" "testing" "time" "browser.local/platform/domain" ) func TestValidateLogBatchIngestAcceptsVerbatimBlankAndLongLines(t *testing.T) { entries := []domain.LogEntry{ {Seq: 1, Timestamp: time.Date(2026, 9, 1, 0, 0, 0, 0, time.UTC), Line: ""}, {Seq: 2, Timestamp: time.Date(2026, 9, 1, 0, 0, 1, 0, time.UTC), Line: strings.Repeat("x", 32*1024)}, } checksum, err := LogEntriesChecksum(entries) if err != nil { t.Fatalf("checksum: %v", err) } batch := domain.LogBatchIngest{RunEndpointID: "run-1", SessionToken: "session-1", LogStreamID: "run.run-1.server-1.stdout", ServerInstanceID: "server-1", StreamKey: "stdout", Source: domain.LogStreamSourceProcess, FirstSeq: 1, LastSeq: 2, Compression: "none", Checksum: checksum, Entries: entries} if err := ValidateLogBatchIngest(batch); err != nil { t.Fatalf("verbatim log batch was rejected: %v", err) } } func TestValidateLogBatchIngestRejectsLineOnlyChecksumCompatibility(t *testing.T) { entry := domain.LogEntry{Seq: 1, Timestamp: time.Date(2026, 9, 1, 0, 0, 0, 0, time.UTC), Line: "password=opaque /Users/operator/game.log"} batch := domain.LogBatchIngest{RunEndpointID: "run-1", SessionToken: "session-1", LogStreamID: "run.run-1.server-1.stdout", ServerInstanceID: "server-1", StreamKey: "stdout", Source: domain.LogStreamSourceProcess, FirstSeq: 1, LastSeq: 1, Compression: "none", Checksum: lineOnlyChecksum(entry.Line), Entries: []domain.LogEntry{entry}} if err := ValidateLogBatchIngest(batch); err == nil || !strings.Contains(err.Error(), "checksum") { t.Fatalf("expected full-entry checksum rejection, got %v", err) } } func lineOnlyChecksum(value string) string { sum := sha256.Sum256([]byte(value)) return "sha256:" + hex.EncodeToString(sum[:]) }