|
1 | 1 | package com.devonfw.tools.ide.io;
|
2 | 2 |
|
| 3 | +import static com.devonfw.tools.ide.io.FileAccessImpl.generatePermissionString; |
3 | 4 | import static org.junit.jupiter.api.Assertions.assertThrows;
|
4 | 5 |
|
5 | 6 | import java.io.IOException;
|
6 | 7 | import java.nio.file.Files;
|
7 | 8 | import java.nio.file.LinkOption;
|
8 | 9 | import java.nio.file.NoSuchFileException;
|
9 | 10 | import java.nio.file.Path;
|
| 11 | +import java.nio.file.attribute.PosixFilePermission; |
| 12 | +import java.nio.file.attribute.PosixFilePermissions; |
| 13 | +import java.util.Set; |
10 | 14 |
|
11 | 15 | import org.junit.jupiter.api.Test;
|
12 | 16 | import org.junit.jupiter.api.io.TempDir;
|
@@ -325,7 +329,7 @@ private void createSymlinks(FileAccess fa, Path dir, boolean relative) {
|
325 | 329 |
|
326 | 330 | /**
|
327 | 331 | * Checks if the symlinks exist. This is used by the tests of {@link FileAccessImpl#symlink(Path, Path, boolean)}.
|
328 |
| - * |
| 332 | + * |
329 | 333 | * @param dir the {@link Path} to the directory where the symlinks are expected.
|
330 | 334 | */
|
331 | 335 | private void assertSymlinksExist(Path dir) {
|
@@ -469,4 +473,99 @@ private void assertSymlinkRead(Path link, Path trueTarget) {
|
469 | 473 | + " and readPath " + readPath, e);
|
470 | 474 | }
|
471 | 475 | }
|
| 476 | + |
| 477 | + /** |
| 478 | + * Test of {@link FileAccessImpl#untar(Path, Path, TarCompression)} with {@link TarCompression#NONE} and checks if |
| 479 | + * file permissions are preserved on Unix. |
| 480 | + */ |
| 481 | + @Test |
| 482 | + public void testUntarWithNoneCompressionWithFilePermissions(@TempDir Path tempDir) { |
| 483 | + |
| 484 | + // arrange |
| 485 | + IdeContext context = IdeTestContextMock.get(); |
| 486 | + if (context.getSystemInfo().isWindows()) { |
| 487 | + return; |
| 488 | + } |
| 489 | + |
| 490 | + // act |
| 491 | + context.getFileAccess().untar( |
| 492 | + Path.of("src/test/resources/com/devonfw/tools/ide/io").resolve("executable_and_non_executable.tar"), tempDir, |
| 493 | + TarCompression.NONE); |
| 494 | + |
| 495 | + // assert |
| 496 | + assertPosixFilePermissions(tempDir.resolve("executableFile.txt"), "rwxrwxr-x"); |
| 497 | + assertPosixFilePermissions(tempDir.resolve("nonExecutableFile.txt"), "rw-rw-r--"); |
| 498 | + } |
| 499 | + |
| 500 | + /** |
| 501 | + * Test of {@link FileAccessImpl#untar(Path, Path, TarCompression)} with {@link TarCompression#GZ} and checks if file |
| 502 | + * permissions are preserved on Unix. |
| 503 | + */ |
| 504 | + @Test |
| 505 | + public void testUntarWithGzCompressionWithFilePermissions(@TempDir Path tempDir) { |
| 506 | + |
| 507 | + // arrange |
| 508 | + IdeContext context = IdeTestContextMock.get(); |
| 509 | + if (context.getSystemInfo().isWindows()) { |
| 510 | + return; |
| 511 | + } |
| 512 | + |
| 513 | + // act |
| 514 | + context.getFileAccess().untar( |
| 515 | + Path.of("src/test/resources/com/devonfw/tools/ide/io").resolve("executable_and_non_executable.tar.gz"), tempDir, |
| 516 | + TarCompression.GZ); |
| 517 | + |
| 518 | + // assert |
| 519 | + assertPosixFilePermissions(tempDir.resolve("executableFile.txt"), "rwxrwxr-x"); |
| 520 | + assertPosixFilePermissions(tempDir.resolve("nonExecutableFile.txt"), "rw-rw-r--"); |
| 521 | + } |
| 522 | + |
| 523 | + /** |
| 524 | + * Test of {@link FileAccessImpl#untar(Path, Path, TarCompression)} with {@link TarCompression#BZIP2} and checks if |
| 525 | + * file permissions are preserved on Unix. |
| 526 | + */ |
| 527 | + @Test |
| 528 | + public void testUntarWithBzip2CompressionWithFilePermissions(@TempDir Path tempDir) { |
| 529 | + |
| 530 | + // arrange |
| 531 | + IdeContext context = IdeTestContextMock.get(); |
| 532 | + if (context.getSystemInfo().isWindows()) { |
| 533 | + return; |
| 534 | + } |
| 535 | + |
| 536 | + // act |
| 537 | + context.getFileAccess().untar( |
| 538 | + Path.of("src/test/resources/com/devonfw/tools/ide/io").resolve("executable_and_non_executable.tar.bz2"), |
| 539 | + tempDir, TarCompression.BZIP2); |
| 540 | + |
| 541 | + // assert |
| 542 | + assertPosixFilePermissions(tempDir.resolve("executableFile.txt"), "rwxrwxr-x"); |
| 543 | + assertPosixFilePermissions(tempDir.resolve("nonExecutableFile.txt"), "rw-rw-r--"); |
| 544 | + } |
| 545 | + |
| 546 | + private void assertPosixFilePermissions(Path file, String permissions) { |
| 547 | + |
| 548 | + try { |
| 549 | + Set<PosixFilePermission> posixPermissions = Files.getPosixFilePermissions(file); |
| 550 | + String permissionStr = PosixFilePermissions.toString(posixPermissions); |
| 551 | + assertThat(permissions).isEqualTo(permissionStr); |
| 552 | + } catch (IOException e) { |
| 553 | + throw new RuntimeException(e); |
| 554 | + } |
| 555 | + } |
| 556 | + |
| 557 | + /** |
| 558 | + * Test of {@link FileAccessImpl#generatePermissionString(int)}. |
| 559 | + */ |
| 560 | + @Test |
| 561 | + public void testGeneratePermissionString() { |
| 562 | + |
| 563 | + assertThat(generatePermissionString(0)).isEqualTo("---------"); |
| 564 | + assertThat(generatePermissionString(436)).isEqualTo("rw-rw-r--"); |
| 565 | + assertThat(generatePermissionString(948)).isEqualTo("rw-rw-r--"); |
| 566 | + assertThat(generatePermissionString(509)).isEqualTo("rwxrwxr-x"); |
| 567 | + assertThat(generatePermissionString(511)).isEqualTo("rwxrwxrwx"); |
| 568 | + |
| 569 | + } |
| 570 | + |
472 | 571 | }
|
0 commit comments