github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/libpod/events/logfile_test.go (about)

     1  package events
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     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 := ioutil.TempFile("", "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  	contentAfter := `6
    81  7
    82  8
    83  9
    84  10
    85  `
    86  	// Create dummy file
    87  	tmp, err := ioutil.TempFile("", "log-rotation")
    88  	require.NoError(t, err)
    89  	defer os.Remove(tmp.Name())
    90  	defer tmp.Close()
    91  
    92  	// Write content before truncation to dummy file
    93  	_, err = tmp.WriteString(contentBefore)
    94  	require.NoError(t, err)
    95  
    96  	// Truncate the file
    97  	beforeTruncation, err := ioutil.ReadFile(tmp.Name())
    98  	require.NoError(t, err)
    99  	err = truncate(tmp.Name())
   100  	require.NoError(t, err)
   101  	afterTruncation, err := ioutil.ReadFile(tmp.Name())
   102  	require.NoError(t, err)
   103  
   104  	// Test if rotation was successful
   105  	require.NoError(t, err, "Log content has changed")
   106  	require.NotEqual(t, beforeTruncation, afterTruncation)
   107  	require.Equal(t, string(afterTruncation), contentAfter)
   108  }
   109  
   110  func TestRenameLog(t *testing.T) {
   111  	fileContent := `0
   112  1
   113  2
   114  3
   115  4
   116  5
   117  `
   118  	// Create two dummy files
   119  	source, err := ioutil.TempFile("", "removing")
   120  	require.NoError(t, err)
   121  	target, err := ioutil.TempFile("", "renaming")
   122  	require.NoError(t, err)
   123  
   124  	// Write to source dummy file
   125  	_, err = source.WriteString(fileContent)
   126  	require.NoError(t, err)
   127  
   128  	// Rename the files
   129  	beforeRename, err := ioutil.ReadFile(source.Name())
   130  	require.NoError(t, err)
   131  	err = renameLog(source.Name(), target.Name())
   132  	require.NoError(t, err)
   133  	afterRename, err := ioutil.ReadFile(target.Name())
   134  	require.NoError(t, err)
   135  
   136  	// Test if renaming was successful
   137  	require.Error(t, os.Remove(source.Name()))
   138  	require.NoError(t, os.Remove(target.Name()))
   139  	require.Equal(t, beforeRename, afterRename)
   140  }