|
43 | 43 | import java.lang.reflect.Method;
|
44 | 44 | import java.lang.reflect.Parameter;
|
45 | 45 | import java.nio.file.FileSystem;
|
| 46 | +import java.nio.file.Files; |
46 | 47 | import java.nio.file.Path;
|
47 | 48 | import java.util.Optional;
|
48 | 49 | import java.util.logging.Level;
|
@@ -395,6 +396,65 @@ void onSuccessWithNoException(Class<?> elementType, @TrackLogRecords LogRecordLi
|
395 | 396 | .noneMatch(m -> m.startsWith("Skipping cleanup of temp dir"));
|
396 | 397 | }
|
397 | 398 |
|
| 399 | + @DisplayName("deletes symbolic links targeting directory inside temp dir") |
| 400 | + @ParameterizedTest |
| 401 | + @ElementTypeSource |
| 402 | + @DisabledOnOs(WINDOWS) |
| 403 | + void deletesSymbolicLinksTargetingDirInsideTempDir(Class<?> elementType, |
| 404 | + @TrackLogRecords LogRecordListener listener) throws IOException { |
| 405 | + |
| 406 | + reset(factory); |
| 407 | + |
| 408 | + closeablePath = TempDirectory.createTempDir(factory, ON_SUCCESS, elementType, elementContext, |
| 409 | + extensionContext); |
| 410 | + var rootDir = closeablePath.get(); |
| 411 | + assertThat(rootDir).isDirectory(); |
| 412 | + |
| 413 | + var subDir = createDirectory(rootDir.resolve("subDir")); |
| 414 | + Files.createFile(subDir.resolve("file")); |
| 415 | + Files.createSymbolicLink(rootDir.resolve("symbolicLink"), subDir); |
| 416 | + |
| 417 | + closeablePath.close(); |
| 418 | + |
| 419 | + verify(factory).close(); |
| 420 | + assertThat(rootDir).doesNotExist(); |
| 421 | + assertThat(listener.stream(Level.WARNING)).map(LogRecord::getMessage).isEmpty(); |
| 422 | + |
| 423 | + } |
| 424 | + |
| 425 | + @DisplayName("deletes symbolic links targeting directory outside temp dir") |
| 426 | + @ParameterizedTest |
| 427 | + @ElementTypeSource |
| 428 | + @DisabledOnOs(WINDOWS) |
| 429 | + void deletesSymbolicLinksTargetingDirOutsideTempDir(Class<?> elementType, |
| 430 | + @TrackLogRecords LogRecordListener listener) throws IOException { |
| 431 | + |
| 432 | + reset(factory); |
| 433 | + |
| 434 | + closeablePath = TempDirectory.createTempDir(factory, ON_SUCCESS, elementType, elementContext, |
| 435 | + extensionContext); |
| 436 | + var rootDir = closeablePath.get(); |
| 437 | + assertThat(rootDir).isDirectory(); |
| 438 | + |
| 439 | + var directoryOutsideTempDir = createTempDirectory("junit-"); |
| 440 | + try { |
| 441 | + var symbolicLink = createSymbolicLink(rootDir.resolve("symbolicLink"), directoryOutsideTempDir); |
| 442 | + |
| 443 | + closeablePath.close(); |
| 444 | + |
| 445 | + verify(factory).close(); |
| 446 | + assertThat(rootDir).doesNotExist(); |
| 447 | + assertThat(directoryOutsideTempDir).isDirectory(); |
| 448 | + assertThat(listener.stream(Level.WARNING)) // |
| 449 | + .map(LogRecord::getMessage) // |
| 450 | + .contains(("Deleting symbolic link from location inside of temp dir (%s) " |
| 451 | + + "to location outside of temp dir (%s) but not the target file/directory").formatted( |
| 452 | + symbolicLink, directoryOutsideTempDir.toRealPath())); |
| 453 | + } |
| 454 | + finally { |
| 455 | + Files.deleteIfExists(directoryOutsideTempDir); |
| 456 | + } |
| 457 | + } |
398 | 458 | }
|
399 | 459 |
|
400 | 460 | static class TestCase {
|
|
0 commit comments