github.com/containers/podman/v4@v4.9.4/libpod/events/logfile_test.go (about)

     1  package events
     2  
     3  import (
     4  	"os"
     5  	"strings"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func TestRotateLog(t *testing.T) {
    12  	tests := []struct {
    13  		// If sizeInitial + sizeContent >= sizeLimit, then rotate
    14  		sizeInitial uint64
    15  		sizeContent uint64
    16  		sizeLimit   uint64
    17  		mustRotate  bool
    18  	}{
    19  		// No rotation
    20  		{0, 0, 1, false},
    21  		{1, 1, 0, false},
    22  		{10, 10, 30, false},
    23  		{1000, 500, 1600, false},
    24  		// Rotation
    25  		{10, 10, 20, true},
    26  		{30, 0, 29, true},
    27  		{200, 50, 150, true},
    28  		{1000, 600, 1500, true},
    29  	}
    30  
    31  	for _, test := range tests {
    32  		tmp, err := os.CreateTemp("", "log-rotation-")
    33  		require.NoError(t, err)
    34  		defer os.Remove(tmp.Name())
    35  		defer tmp.Close()
    36  
    37  		// Create dummy file and content.
    38  		initialContent := make([]byte, test.sizeInitial)
    39  		logContent := make([]byte, test.sizeContent)
    40  
    41  		// Write content to the file.
    42  		_, err = tmp.Write(initialContent)
    43  		require.NoError(t, err)
    44  
    45  		// Now rotate
    46  		fInfoBeforeRotate, err := tmp.Stat()
    47  		require.NoError(t, err)
    48  		isRotated, err := rotateLog(tmp.Name(), string(logContent), test.sizeLimit)
    49  		require.NoError(t, err)
    50  
    51  		fInfoAfterRotate, err := os.Stat(tmp.Name())
    52  		// Test if rotation was successful
    53  		if test.mustRotate {
    54  			// File has been renamed
    55  			require.True(t, isRotated)
    56  			require.NoError(t, err, "log file has been renamed")
    57  			require.NotEqual(t, fInfoBeforeRotate.Size(), fInfoAfterRotate.Size())
    58  		} else {
    59  			// File has not been renamed
    60  			require.False(t, isRotated)
    61  			require.NoError(t, err, "log file has not been renamed")
    62  			require.Equal(t, fInfoBeforeRotate.Size(), fInfoAfterRotate.Size())
    63  		}
    64  	}
    65  }
    66  
    67  func TestTruncationOutput(t *testing.T) {
    68  	contentBefore := `0
    69  1
    70  2
    71  3
    72  4
    73  5
    74  6
    75  7
    76  8
    77  9
    78  10
    79  `
    80  	// Create dummy file
    81  	tmp, err := os.CreateTemp("", "log-rotation")
    82  	require.NoError(t, err)
    83  	defer os.Remove(tmp.Name())
    84  	defer tmp.Close()
    85  
    86  	// Write content before truncation to dummy file
    87  	_, err = tmp.WriteString(contentBefore)
    88  	require.NoError(t, err)
    89  
    90  	// Truncate the file
    91  	beforeTruncation, err := os.ReadFile(tmp.Name())
    92  	require.NoError(t, err)
    93  	err = truncate(tmp.Name())
    94  	require.NoError(t, err)
    95  	afterTruncation, err := os.ReadFile(tmp.Name())
    96  	require.NoError(t, err)
    97  	// Content has changed
    98  	require.NotEqual(t, beforeTruncation, afterTruncation)
    99  	split := strings.Split(string(afterTruncation), "\n")
   100  	require.Len(t, split, 8) // 2 events + 5 rotated lines + last new line
   101  	require.Contains(t, split[0], "\"Attributes\":{\"io.podman.event.rotate\":\"begin\"}")
   102  	require.Equal(t, split[1:6], []string{"6", "7", "8", "9", "10"})
   103  	require.Contains(t, split[6], "\"Attributes\":{\"io.podman.event.rotate\":\"end\"}")
   104  	require.Contains(t, split[7], "")
   105  }
   106  
   107  func TestRenameLog(t *testing.T) {
   108  	fileContent := `0
   109  1
   110  2
   111  3
   112  4
   113  5
   114  `
   115  	// Create two dummy files
   116  	source, err := os.CreateTemp("", "removing")
   117  	require.NoError(t, err)
   118  	target, err := os.CreateTemp("", "renaming")
   119  	require.NoError(t, err)
   120  
   121  	// Write to source dummy file
   122  	_, err = source.WriteString(fileContent)
   123  	require.NoError(t, err)
   124  
   125  	// Rename the files
   126  	beforeRename, err := os.ReadFile(source.Name())
   127  	require.NoError(t, err)
   128  	err = renameLog(source.Name(), target.Name())
   129  	require.NoError(t, err)
   130  	afterRename, err := os.ReadFile(target.Name())
   131  	require.NoError(t, err)
   132  
   133  	// Test if renaming was successful
   134  	require.Error(t, os.Remove(source.Name()))
   135  	require.NoError(t, os.Remove(target.Name()))
   136  	require.Equal(t, beforeRename, afterRename)
   137  }