package logger import ( "os" "path/filepath" "strings" "testing" "time" ) func TestRedactURLToken(t *testing.T) { raw := "http://ntunnel.example.com/?token=secret-token-value" got := RedactURL(raw) if strings.Contains(got, "secret-token-value") { t.Fatalf("token leaked: %s", got) } } func TestRedactTextPasswordAndToken(t *testing.T) { in := `login failed password=hunter2 token=abc123 url=https://x.example/?token=zzz` got := RedactText(in) for _, secret := range []string{"hunter2", "abc123", "zzz"} { if strings.Contains(got, secret) { t.Fatalf("secret %q leaked in %q", secret, got) } } } func TestParseLevel(t *testing.T) { if ParseLevel("DEBUG") != LevelDebug { t.Fatal("debug") } if ParseLevel("nope") != LevelInfo { t.Fatal("default") } } func TestDatedPath(t *testing.T) { day := time.Date(2026, 9, 21, 15, 0, 0, 0, time.Local) got := DatedPath(filepath.Join("logs", "tunnel.log"), day) want := filepath.Join("logs", "tunnel-2026-09-21.log") if got != want { t.Fatalf("got %s want %s", got, want) } } func TestDailyRotateAndPurge(t *testing.T) { dir := t.TempDir() base := filepath.Join(dir, "tunnel.log") now := time.Date(2026, 9, 21, 10, 0, 0, 0, time.Local) keepDay := now.AddDate(0, 0, -3) dropDay := now.AddDate(0, 0, -8) keepPath := DatedPath(base, keepDay) dropPath := DatedPath(base, dropDay) if err := os.WriteFile(keepPath, []byte("keep\n"), 0o640); err != nil { t.Fatal(err) } if err := os.WriteFile(dropPath, []byte("drop\n"), 0o640); err != nil { t.Fatal(err) } l, err := New(base, "info", false) if err != nil { t.Fatal(err) } defer l.Close() l.mu.Lock() if err := l.rotateLocked(now); err != nil { l.mu.Unlock() t.Fatal(err) } l.mu.Unlock() l.Info("hello") today := DatedPath(base, now) if _, err := os.Stat(today); err != nil { t.Fatalf("today log missing: %v", err) } if _, err := os.Stat(keepPath); err != nil { t.Fatalf("recent log should remain: %v", err) } if _, err := os.Stat(dropPath); !os.IsNotExist(err) { t.Fatalf("old log should be purged, err=%v", err) } }