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) } }