SymlinkTest.php 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. namespace PhpZip\Tests;
  3. use PhpZip\Constants\ZipOptions;
  4. use PhpZip\Util\FilesUtil;
  5. use PhpZip\ZipFile;
  6. use Symfony\Component\Finder\Finder;
  7. /**
  8. * @internal
  9. *
  10. * @small
  11. */
  12. final class SymlinkTest extends ZipTestCase
  13. {
  14. /**
  15. * @dataProvider provideAllowSymlink
  16. *
  17. * @param bool $allowSymlink
  18. *
  19. * @throws \Exception
  20. */
  21. public function testSymlink($allowSymlink)
  22. {
  23. if (self::skipTestForWindows()) {
  24. return;
  25. }
  26. if (!is_dir($this->outputDirname)) {
  27. self::assertTrue(mkdir($this->outputDirname, 0755, true));
  28. }
  29. $contentsFile = random_bytes(100);
  30. $filePath = $this->outputDirname . '/file.bin';
  31. $symlinkPath = $this->outputDirname . '/symlink.bin';
  32. $symlinkTarget = basename($filePath);
  33. self::assertNotFalse(file_put_contents($filePath, $contentsFile));
  34. self::assertTrue(symlink($symlinkTarget, $symlinkPath));
  35. $finder = (new Finder())->in($this->outputDirname);
  36. $zipFile = new ZipFile();
  37. $zipFile->addFromFinder($finder);
  38. $zipFile->saveAsFile($this->outputFilename);
  39. $zipFile->close();
  40. self::assertCorrectZipArchive($this->outputFilename);
  41. FilesUtil::removeDir($this->outputDirname);
  42. self::assertFalse(is_dir($this->outputDirname));
  43. self::assertTrue(mkdir($this->outputDirname, 0755, true));
  44. $zipFile->openFile($this->outputFilename);
  45. $zipFile->extractTo($this->outputDirname, null, [
  46. ZipOptions::EXTRACT_SYMLINKS => $allowSymlink,
  47. ]);
  48. $zipFile->close();
  49. $splFileInfo = new \SplFileInfo($symlinkPath);
  50. if ($allowSymlink) {
  51. self::assertTrue($splFileInfo->isLink());
  52. self::assertSame($splFileInfo->getLinkTarget(), $symlinkTarget);
  53. } else {
  54. self::assertFalse($splFileInfo->isLink());
  55. self::assertStringEqualsFile($symlinkPath, $symlinkTarget);
  56. }
  57. }
  58. /**
  59. * @return \Generator
  60. */
  61. public function provideAllowSymlink()
  62. {
  63. yield 'allow' => [true];
  64. yield 'deny' => [false];
  65. }
  66. }