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  }