github.com/influxdata/telegraf@v1.30.3/internal/rotate/file_writer_test.go (about) 1 package rotate 2 3 import ( 4 "os" 5 "path/filepath" 6 "testing" 7 "time" 8 9 "github.com/stretchr/testify/require" 10 ) 11 12 func TestFileWriter_NoRotation(t *testing.T) { 13 tempDir := t.TempDir() 14 writer, err := NewFileWriter(filepath.Join(tempDir, "test"), 0, 0, 0) 15 require.NoError(t, err) 16 t.Cleanup(func() { require.NoError(t, writer.Close()) }) 17 18 _, err = writer.Write([]byte("Hello World")) 19 require.NoError(t, err) 20 _, err = writer.Write([]byte("Hello World 2")) 21 require.NoError(t, err) 22 files, _ := os.ReadDir(tempDir) 23 require.Len(t, files, 1) 24 } 25 26 func TestFileWriter_TimeRotation(t *testing.T) { 27 tempDir := t.TempDir() 28 interval, _ := time.ParseDuration("10ms") 29 writer, err := NewFileWriter(filepath.Join(tempDir, "test"), interval, 0, -1) 30 require.NoError(t, err) 31 t.Cleanup(func() { require.NoError(t, writer.Close()) }) 32 33 _, err = writer.Write([]byte("Hello World")) 34 require.NoError(t, err) 35 time.Sleep(interval) 36 _, err = writer.Write([]byte("Hello World 2")) 37 require.NoError(t, err) 38 files, _ := os.ReadDir(tempDir) 39 require.Len(t, files, 2) 40 } 41 42 func TestFileWriter_ReopenTimeRotation(t *testing.T) { 43 tempDir := t.TempDir() 44 interval, _ := time.ParseDuration("10ms") 45 filePath := filepath.Join(tempDir, "test.log") 46 err := os.WriteFile(filePath, []byte("Hello World"), 0640) 47 time.Sleep(interval) 48 require.NoError(t, err) 49 writer, err := NewFileWriter(filepath.Join(tempDir, "test.log"), interval, 0, -1) 50 require.NoError(t, err) 51 t.Cleanup(func() { require.NoError(t, writer.Close()) }) 52 53 files, _ := os.ReadDir(tempDir) 54 require.Len(t, files, 2) 55 } 56 57 func TestFileWriter_SizeRotation(t *testing.T) { 58 tempDir := t.TempDir() 59 maxSize := int64(9) 60 writer, err := NewFileWriter(filepath.Join(tempDir, "test.log"), 0, maxSize, -1) 61 require.NoError(t, err) 62 t.Cleanup(func() { require.NoError(t, writer.Close()) }) 63 64 _, err = writer.Write([]byte("Hello World")) 65 require.NoError(t, err) 66 _, err = writer.Write([]byte("World 2")) 67 require.NoError(t, err) 68 files, _ := os.ReadDir(tempDir) 69 require.Len(t, files, 2) 70 } 71 72 func TestFileWriter_ReopenSizeRotation(t *testing.T) { 73 tempDir := t.TempDir() 74 maxSize := int64(12) 75 filePath := filepath.Join(tempDir, "test.log") 76 err := os.WriteFile(filePath, []byte("Hello World"), 0640) 77 require.NoError(t, err) 78 writer, err := NewFileWriter(filepath.Join(tempDir, "test.log"), 0, maxSize, -1) 79 require.NoError(t, err) 80 t.Cleanup(func() { require.NoError(t, writer.Close()) }) 81 82 _, err = writer.Write([]byte("Hello World Again")) 83 require.NoError(t, err) 84 files, _ := os.ReadDir(tempDir) 85 require.Len(t, files, 2) 86 } 87 88 func TestFileWriter_DeleteArchives(t *testing.T) { 89 if testing.Short() { 90 t.Skip("Skipping long test in short mode") 91 } 92 93 tempDir := t.TempDir() 94 maxSize := int64(5) 95 writer, err := NewFileWriter(filepath.Join(tempDir, "test.log"), 0, maxSize, 2) 96 require.NoError(t, err) 97 t.Cleanup(func() { require.NoError(t, writer.Close()) }) 98 99 _, err = writer.Write([]byte("First file")) 100 require.NoError(t, err) 101 // File names include the date with second precision 102 // So, to force rotation with different file names 103 // we need to wait 104 time.Sleep(1 * time.Second) 105 _, err = writer.Write([]byte("Second file")) 106 require.NoError(t, err) 107 time.Sleep(1 * time.Second) 108 _, err = writer.Write([]byte("Third file")) 109 require.NoError(t, err) 110 111 files, _ := os.ReadDir(tempDir) 112 require.Len(t, files, 3) 113 114 for _, tempFile := range files { 115 var bytes []byte 116 var err error 117 path := filepath.Join(tempDir, tempFile.Name()) 118 if bytes, err = os.ReadFile(path); err != nil { 119 t.Error(err.Error()) 120 return 121 } 122 contents := string(bytes) 123 124 if contents != "" && contents != "Second file" && contents != "Third file" { 125 t.Error("Should have deleted the eldest log file") 126 return 127 } 128 } 129 } 130 131 func TestFileWriter_CloseDoesNotRotate(t *testing.T) { 132 tempDir := t.TempDir() 133 maxSize := int64(9) 134 writer, err := NewFileWriter(filepath.Join(tempDir, "test.log"), 0, maxSize, -1) 135 require.NoError(t, err) 136 require.NoError(t, writer.Close()) 137 138 files, _ := os.ReadDir(tempDir) 139 require.Len(t, files, 1) 140 require.Regexp(t, "^test.log$", files[0].Name()) 141 }