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 }