app-init
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user