package main import ( "os" "path/filepath" "strings" "testing" "time" ) func TestDailyWriterRotatesBySize(t *testing.T) { dir := t.TempDir() w, err := newDailyWriter(dir, "service-test", 30, 64, 1024) if err != nil { t.Fatal(err) } defer w.Close() if _, err = w.Write([]byte(strings.Repeat("a", 48))); err != nil { t.Fatal(err) } if _, err = w.Write([]byte(strings.Repeat("b", 48))); err != nil { t.Fatal(err) } files, err := filepath.Glob(filepath.Join(dir, "service-test-*.log")) if err != nil { t.Fatal(err) } if len(files) != 2 { t.Fatalf("expected 2 log parts, got %d: %v", len(files), files) } } func TestDailyWriterEnforcesTotalSize(t *testing.T) { dir := t.TempDir() oldPath := filepath.Join(dir, "service-old-2020-01-01.log") if err := os.WriteFile(oldPath, []byte(strings.Repeat("x", 90)), 0o644); err != nil { t.Fatal(err) } oldTime := time.Now().AddDate(0, 0, -2) if err := os.Chtimes(oldPath, oldTime, oldTime); err != nil { t.Fatal(err) } w, err := newDailyWriter(dir, "service-test", 30, 64, 100) if err != nil { t.Fatal(err) } defer w.Close() if _, err = w.Write([]byte(strings.Repeat("a", 64))); err != nil { t.Fatal(err) } if _, err = w.Write([]byte(strings.Repeat("b", 64))); err != nil { t.Fatal(err) } if _, err = os.Stat(oldPath); !os.IsNotExist(err) { t.Fatalf("oldest log should be removed, stat error: %v", err) } entries, err := os.ReadDir(dir) if err != nil { t.Fatal(err) } var total int64 for _, entry := range entries { info, infoErr := entry.Info() if infoErr != nil { t.Fatal(infoErr) } total += info.Size() } if total > 128 { // 当前打开分卷允许最多超出一个 64 字节分卷。 t.Fatalf("log directory grew unexpectedly: %d bytes", total) } }