Files
loggerx/loggerx_heal_test.go
2026-09-13 21:53:37 +08:00

85 lines
2.2 KiB
Go

package loggerx
import (
"os"
"path/filepath"
"testing"
)
// 自愈:能删掉「.gz + .log 成对」里冗余的 .log
func TestHealRemovesRedundantLog(t *testing.T) {
dir := t.TempDir()
src := filepath.Join(dir, "2026-09-13_info_1.log")
if err := os.WriteFile(src, []byte("hello log\n"), 0644); err != nil {
t.Fatal(err)
}
if err := gzipFile(src, 1); err != nil {
t.Fatal(err)
}
// 人为造出「压缩成功但源文件还在」的现场
if err := os.WriteFile(src, []byte("hello log\n"), 0644); err != nil {
t.Fatal(err)
}
l := &Logger{option: defaultOptions()}
l.option.dir = dir
l.option.compress = true
if err := l.healCompressedLeftovers(); err != nil {
t.Fatalf("自愈出错: %v", err)
}
if _, err := os.Stat(src); !os.IsNotExist(err) {
t.Errorf("冗余的 .log 没被清掉: %v", err)
}
if _, err := os.Stat(src + ".gz"); err != nil {
t.Errorf(".gz 被误删了: %v", err)
}
}
// 安全性:.gz 损坏时必须保留 .log(那是唯一可读副本)
func TestHealKeepsLogWhenGzCorrupt(t *testing.T) {
dir := t.TempDir()
src := filepath.Join(dir, "2026-09-13_info_2.log")
if err := os.WriteFile(src, []byte("important data\n"), 0644); err != nil {
t.Fatal(err)
}
// 造一个损坏的 .gz(截断的非 gzip 内容)
if err := os.WriteFile(src+".gz", []byte("not a gzip stream"), 0644); err != nil {
t.Fatal(err)
}
l := &Logger{option: defaultOptions()}
l.option.dir = dir
l.option.compress = true
if err := l.healCompressedLeftovers(); err != nil {
t.Fatalf("自愈出错: %v", err)
}
if _, err := os.Stat(src); err != nil {
t.Errorf("损坏压缩包时不该删掉 .log: %v", err)
}
}
// 关闭压缩时不做自愈(用户有意保留未压缩归档)
func TestHealSkippedWhenCompressOff(t *testing.T) {
dir := t.TempDir()
src := filepath.Join(dir, "2026-09-13_info_3.log")
if err := os.WriteFile(src, []byte("data\n"), 0644); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(src+".gz", []byte("x"), 0644); err != nil {
t.Fatal(err)
}
l := &Logger{option: defaultOptions()}
l.option.dir = dir
l.option.compress = false
if err := l.healCompressedLeftovers(); err != nil {
t.Fatal(err)
}
if _, err := os.Stat(src); err != nil {
t.Errorf("关闭压缩时不该清理 .log: %v", err)
}
}