2
0

SymlinkTest.php 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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 ZipFileTest
  13. {
  14. /**
  15. * This method is called before the first test of this test class is run.
  16. */
  17. public static function setUpBeforeClass()
  18. {
  19. parent::setUpBeforeClass();
  20. if (\DIRECTORY_SEPARATOR === '\\') {
  21. self::markTestSkipped('only linux test');
  22. return;
  23. }
  24. }
  25. /**
  26. * @dataProvider provideAllowSymlink
  27. *
  28. * @param bool $allowSymlink
  29. *
  30. * @throws \Exception
  31. */
  32. public function testSymlink($allowSymlink)
  33. {
  34. if (!is_dir($this->outputDirname)) {
  35. self::assertTrue(mkdir($this->outputDirname, 0755, true));
  36. }
  37. $contentsFile = random_bytes(100);
  38. $filePath = $this->outputDirname . '/file.bin';
  39. $symlinkPath = $this->outputDirname . '/symlink.bin';
  40. $symlinkTarget = basename($filePath);
  41. self::assertNotFalse(file_put_contents($filePath, $contentsFile));
  42. self::assertTrue(symlink($symlinkTarget, $symlinkPath));
  43. $finder = (new Finder())->in($this->outputDirname);
  44. $zipFile = new ZipFile();
  45. $zipFile->addFromFinder($finder);
  46. $zipFile->saveAsFile($this->outputFilename);
  47. $zipFile->close();
  48. self::assertCorrectZipArchive($this->outputFilename);
  49. FilesUtil::removeDir($this->outputDirname);
  50. self::assertFalse(is_dir($this->outputDirname));
  51. self::assertTrue(mkdir($this->outputDirname, 0755, true));
  52. $zipFile->openFile($this->outputFilename);
  53. $zipFile->extractTo($this->outputDirname, null, [
  54. ZipOptions::EXTRACT_SYMLINKS => $allowSymlink,
  55. ]);
  56. $zipFile->close();
  57. $splFileInfo = new \SplFileInfo($symlinkPath);
  58. if ($allowSymlink) {
  59. self::assertTrue($splFileInfo->isLink());
  60. self::assertSame($splFileInfo->getLinkTarget(), $symlinkTarget);
  61. } else {
  62. self::assertFalse($splFileInfo->isLink());
  63. self::assertStringEqualsFile($symlinkPath, $symlinkTarget);
  64. }
  65. }
  66. /**
  67. * @return \Generator
  68. */
  69. public function provideAllowSymlink()
  70. {
  71. yield 'allow' => [true];
  72. yield 'deny' => [false];
  73. }
  74. }