85 lines
2.2 KiB
Go
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)
|
||
|
|
}
|
||
|
|
}
|