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 }