| 100 | } |
| 101 | |
| 102 | func TestFileRotationPreserveMode(t *testing.T) { |
| 103 | m := syscall.Umask(0o000) |
| 104 | defer syscall.Umask(m) |
| 105 | |
| 106 | dir, err := os.MkdirTemp("", "caddytest") |
| 107 | if err != nil { |
| 108 | t.Fatalf("failed to create tempdir: %v", err) |
| 109 | } |
| 110 | defer os.RemoveAll(dir) |
| 111 | |
| 112 | fpath := path.Join(dir, "test.log") |
| 113 | |
| 114 | roll := true |
| 115 | mode := fileMode(0o640) |
| 116 | fw := FileWriter{ |
| 117 | Filename: fpath, |
| 118 | Mode: mode, |
| 119 | Roll: &roll, |
| 120 | RollSizeMB: 1, |
| 121 | } |
| 122 | |
| 123 | logger, err := fw.OpenWriter() |
| 124 | if err != nil { |
| 125 | t.Fatalf("failed to create file: %v", err) |
| 126 | } |
| 127 | defer logger.Close() |
| 128 | |
| 129 | b := make([]byte, 1024*1024-1000) |
| 130 | logger.Write(b) |
| 131 | logger.Write(b[0:2000]) |
| 132 | |
| 133 | files, err := os.ReadDir(dir) |
| 134 | if err != nil { |
| 135 | t.Fatalf("failed to read temporary log dir: %v", err) |
| 136 | } |
| 137 | |
| 138 | // We might get 2 or 3 files depending |
| 139 | // on the race between compressed log file generation, |
| 140 | // removal of the non compressed file and reading the directory. |
| 141 | // Ordering of the files are [ test-*.log test-*.log.gz test.log ] |
| 142 | if len(files) < 2 || len(files) > 3 { |
| 143 | t.Log("got files: ", files) |
| 144 | t.Fatalf("got %v files want 2", len(files)) |
| 145 | } |
| 146 | |
| 147 | wantPattern := "test-*-*-*-*-*.*.log" |
| 148 | test_date_log := files[0] |
| 149 | if m, _ := path.Match(wantPattern, test_date_log.Name()); m != true { |
| 150 | t.Fatalf("got %v filename want %v", test_date_log.Name(), wantPattern) |
| 151 | } |
| 152 | |
| 153 | st, err := os.Stat(path.Join(dir, test_date_log.Name())) |
| 154 | if err != nil { |
| 155 | t.Fatalf("failed to check file permissions: %v", err) |
| 156 | } |
| 157 | |
| 158 | if st.Mode() != os.FileMode(mode) { |
| 159 | t.Errorf("file mode is %v, want %v", st.Mode(), mode) |