SymlinkTest.php 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. self::skipTestForWindows();
  24. if (!is_dir($this->outputDirname)) {
  25. self::assertTrue(mkdir($this->outputDirname, 0755, true));
  26. }
  27. $contentsFile = random_bytes(100);
  28. $filePath = $this->outputDirname . '/file.bin';
  29. $symlinkPath = $this->outputDirname . '/symlink.bin';
  30. $symlinkTarget = basename($filePath);
  31. self::assertNotFalse(file_put_contents($filePath, $contentsFile));
  32. self::assertTrue(symlink($symlinkTarget, $symlinkPath));
  33. $finder = (new Finder())->in($this->outputDirname);
  34. $zipFile = new ZipFile();
  35. $zipFile->addFromFinder($finder);
  36. $zipFile->saveAsFile($this->outputFilename);
  37. $zipFile->close();
  38. self::assertCorrectZipArchive($this->outputFilename);
  39. FilesUtil::removeDir($this->outputDirname);
  40. self::assertDirectoryDoesNotExist($this->outputDirname);
  41. self::assertTrue(mkdir($this->outputDirname, 0755, true));
  42. $zipFile->openFile($this->outputFilename);
  43. $zipFile->extractTo($this->outputDirname, null, [
  44. ZipOptions::EXTRACT_SYMLINKS => $allowSymlink,
  45. ]);
  46. $zipFile->close();
  47. $splFileInfo = new \SplFileInfo($symlinkPath);
  48. if ($allowSymlink) {
  49. self::assertTrue($splFileInfo->isLink());
  50. self::assertSame($splFileInfo->getLinkTarget(), $symlinkTarget);
  51. } else {
  52. self::assertFalse($splFileInfo->isLink());
  53. self::assertStringEqualsFile($symlinkPath, $symlinkTarget);
  54. }
  55. }
  56. /**
  57. * @return \Generator
  58. */
  59. public function provideAllowSymlink()
  60. {
  61. yield 'allow' => [true];
  62. yield 'deny' => [false];
  63. }
  64. }