//go:build windows package main import ( "os" "path/filepath" "strings" "testing" "unicode/utf8" ) func TestLogRotationBoundedUTF8AndRestart(t *testing.T) { path := filepath.Join(t.TempDir(), "test.log") w, e := openRotatingLog(path, 256) if e != nil { t.Fatal(e) } for i := 0; i < 8; i++ { if e = w.Write(strings.Repeat("АБ", 40) + "\n"); e != nil { t.Fatal(e) } } if e = w.Write(strings.Repeat("Ж", 600)); e != nil { t.Fatal(e) } if e = w.Close(); e != nil { t.Fatal(e) } for _, p := range []string{path, path + ".1"} { data, e := os.ReadFile(p) if e != nil { t.Fatal(e) } if len(data) > 256 { t.Fatalf("unbounded log: %d bytes", len(data)) } if !utf8.Valid(data) { t.Fatal("split a UTF-8 character") } } w, e = openRotatingLog(path, 256) if e != nil { t.Fatal(e) } if e = w.Write("LAST\n"); e != nil { t.Fatal(e) } w.Close() data, e := os.ReadFile(path) if e != nil || !strings.HasSuffix(string(data), "LAST\n") { t.Fatal("restart failed") } entries, _ := os.ReadDir(filepath.Dir(path)) if len(entries) != 1 { t.Fatalf("unexpected files: %d", len(entries)) } } func TestLogRejectsDirectoryAndClosedWriter(t *testing.T) { dir := t.TempDir() if w, e := openRotatingLog(dir, 256); e == nil { w.Close() t.Fatal("accepted a directory") } w, e := openRotatingLog(filepath.Join(dir, "x.log"), 256) if e != nil { t.Fatal(e) } w.Close() if e = w.Write("x"); e == nil { t.Fatal("silenced write after close") } }