|
41 | 41 | import java.util.Set; |
42 | 42 | import java.util.concurrent.locks.LockSupport; |
43 | 43 | import org.apache.logging.log4j.core.config.DefaultConfiguration; |
| 44 | +import org.apache.logging.log4j.core.layout.PatternLayout; |
44 | 45 | import org.apache.logging.log4j.core.util.Closer; |
45 | 46 | import org.apache.logging.log4j.core.util.FileUtils; |
46 | 47 | import org.apache.logging.log4j.core.util.NullOutputStream; |
47 | 48 | import org.apache.logging.log4j.util.Strings; |
48 | 49 | import org.junit.jupiter.api.Test; |
| 50 | +import org.junit.jupiter.params.ParameterizedTest; |
| 51 | +import org.junit.jupiter.params.provider.CsvSource; |
49 | 52 |
|
50 | 53 | /** |
51 | 54 | * Tests the RollingRandomAccessFileManager class. |
@@ -333,4 +336,64 @@ void testRolloverRetainsFileAttributes() throws Exception { |
333 | 336 | .permissions(); |
334 | 337 | assertEquals(filePermissions, actualFilePermissions); |
335 | 338 | } |
| 339 | + |
| 340 | + @ParameterizedTest |
| 341 | + @CsvSource({ |
| 342 | + "true,true", |
| 343 | + "true,false", |
| 344 | + "false,true", |
| 345 | + "false,false", |
| 346 | + }) |
| 347 | + void testWriteHeaderWhetherAppendOrExists(final boolean append, final boolean fileExists) throws Exception { |
| 348 | + final File file = File.createTempFile("log4j2", "test"); |
| 349 | + if (!fileExists) { |
| 350 | + file.delete(); // Ensure file doesn't exist |
| 351 | + } else { |
| 352 | + // If file exists, write some content to it so it's not empty |
| 353 | + try (FileOutputStream fos = new FileOutputStream(file)) { |
| 354 | + fos.write("EXISTING_CONTENT".getBytes()); |
| 355 | + } |
| 356 | + } |
| 357 | + file.deleteOnExit(); |
| 358 | + |
| 359 | + final String header = "HEADER"; |
| 360 | + final PatternLayout layout = |
| 361 | + PatternLayout.newBuilder().setHeader(header).build(); |
| 362 | + |
| 363 | + final RollingRandomAccessFileManager manager = RollingRandomAccessFileManager.getRollingRandomAccessFileManager( |
| 364 | + file.getAbsolutePath(), |
| 365 | + Strings.EMPTY, |
| 366 | + append, |
| 367 | + true, |
| 368 | + RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE, |
| 369 | + new SizeBasedTriggeringPolicy(Long.MAX_VALUE), |
| 370 | + null, |
| 371 | + null, |
| 372 | + layout, |
| 373 | + null, |
| 374 | + null, |
| 375 | + null, |
| 376 | + null); |
| 377 | + assertNotNull(manager); |
| 378 | + manager.close(); |
| 379 | + |
| 380 | + // Verify header was written based on logic: writeHeader = !append || !fileExistedBefore |
| 381 | + // Note: writeHeader() also checks file.length() == 0, so header is only written if file is empty |
| 382 | + assertTrue(file.exists(), "File should exist"); |
| 383 | + final byte[] fileContent = Files.readAllBytes(file.toPath()); |
| 384 | + final String content = new String(fileContent); |
| 385 | + final boolean expectedHeaderWritten = !append || !fileExists; |
| 386 | + if (expectedHeaderWritten) { |
| 387 | + assertTrue( |
| 388 | + content.startsWith(header), |
| 389 | + "File should start with header when append=" + append + ", fileExists=" + fileExists + ", content: " |
| 390 | + + content); |
| 391 | + } else { |
| 392 | + // When append=true and fileExists=true, file has existing content, so header should not be written |
| 393 | + assertTrue( |
| 394 | + !content.startsWith(header), |
| 395 | + "File should not start with header when append=" + append + ", fileExists=" + fileExists |
| 396 | + + ", content: " + content); |
| 397 | + } |
| 398 | + } |
336 | 399 | } |
0 commit comments