df7518cf54
Las fechas hardcoded (2026-02-24, 2026-03-01, 2026-03-06) quedaron fuera del periodo de retención de 7 días al avanzar el calendario. Ahora el test calcula las fechas relativas a time.Now() para que no caduque. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
115 lines
2.7 KiB
Go
115 lines
2.7 KiB
Go
package logger
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestCleanOldLogs(t *testing.T) {
|
|
dir := t.TempDir()
|
|
agentDir := filepath.Join(dir, "bot1")
|
|
os.MkdirAll(agentDir, 0o755)
|
|
|
|
now := time.Now().UTC()
|
|
oldDate := now.AddDate(0, 0, -10).Format("2006-01-02") // 10 days ago → should be removed
|
|
recentDate := now.AddDate(0, 0, -5).Format("2006-01-02") // 5 days ago → should remain
|
|
todayDate := now.Format("2006-01-02") // today → should remain
|
|
|
|
files := []string{
|
|
oldDate + ".jsonl",
|
|
oldDate + ".jsonl.gz",
|
|
recentDate + ".jsonl",
|
|
todayDate + ".jsonl",
|
|
}
|
|
for _, f := range files {
|
|
os.WriteFile(filepath.Join(agentDir, f), []byte("{}"), 0o644)
|
|
}
|
|
|
|
// Retain 7 days → should remove files older than 7 days.
|
|
cleanOldLogs(dir, "bot1", 7)
|
|
|
|
remaining, _ := os.ReadDir(agentDir)
|
|
names := make(map[string]bool)
|
|
for _, e := range remaining {
|
|
names[e.Name()] = true
|
|
}
|
|
|
|
if names[oldDate+".jsonl"] {
|
|
t.Errorf("%s.jsonl should have been removed", oldDate)
|
|
}
|
|
if names[oldDate+".jsonl.gz"] {
|
|
t.Errorf("%s.jsonl.gz should have been removed", oldDate)
|
|
}
|
|
if !names[recentDate+".jsonl"] {
|
|
t.Errorf("%s.jsonl should still exist", recentDate)
|
|
}
|
|
if !names[todayDate+".jsonl"] {
|
|
t.Errorf("%s.jsonl should still exist", todayDate)
|
|
}
|
|
}
|
|
|
|
func TestParseDateFromFilename(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
want string
|
|
}{
|
|
{"2026-03-06.jsonl", "2026-03-06"},
|
|
{"2026-03-06.1.jsonl", "2026-03-06"},
|
|
{"2026-03-06.jsonl.gz", "2026-03-06"},
|
|
{"2026-03-06.2.jsonl.gz", "2026-03-06"},
|
|
{"invalid.jsonl", ""},
|
|
}
|
|
for _, tt := range tests {
|
|
d := parseDateFromFilename(tt.name)
|
|
got := ""
|
|
if !d.IsZero() {
|
|
got = d.Format("2006-01-02")
|
|
}
|
|
if got != tt.want {
|
|
t.Errorf("parseDateFromFilename(%q) = %q, want %q", tt.name, got, tt.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestCleanOldLogs_EmptyDir(t *testing.T) {
|
|
dir := t.TempDir()
|
|
// Should not panic on non-existent agent dir.
|
|
cleanOldLogs(dir, "nonexistent", 7)
|
|
}
|
|
|
|
func TestIsLogFile(t *testing.T) {
|
|
if !isLogFile("2026-03-06.jsonl") {
|
|
t.Error("should match .jsonl")
|
|
}
|
|
if !isLogFile("2026-03-06.jsonl.gz") {
|
|
t.Error("should match .jsonl.gz")
|
|
}
|
|
if isLogFile("readme.txt") {
|
|
t.Error("should not match .txt")
|
|
}
|
|
}
|
|
|
|
func TestRunCleanup_Cancellation(t *testing.T) {
|
|
dir := t.TempDir()
|
|
os.MkdirAll(filepath.Join(dir, "bot1"), 0o755)
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
done := make(chan struct{})
|
|
go func() {
|
|
runCleanup(ctx, dir, "bot1", 7, 50*time.Millisecond)
|
|
close(done)
|
|
}()
|
|
|
|
time.Sleep(150 * time.Millisecond)
|
|
cancel()
|
|
|
|
select {
|
|
case <-done:
|
|
case <-time.After(2 * time.Second):
|
|
t.Error("cleanup goroutine did not exit after cancel")
|
|
}
|
|
}
|