phar_extract.phpt 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. --TEST--
  2. Phar: Phar::extractTo()
  3. --EXTENSIONS--
  4. phar
  5. --CONFLICTS--
  6. tempmanifest1.phar.php
  7. --INI--
  8. phar.readonly=0
  9. --FILE--
  10. <?php
  11. $fname = __DIR__ . '/tempmanifest1.phar.php';
  12. $pname = 'phar://' . $fname;
  13. $a = new Phar($fname);
  14. $a['file1.txt'] = 'hi';
  15. $a['file2.txt'] = 'hi2';
  16. $a['subdir/ectory/file.txt'] = 'hi3';
  17. $a->mount($pname . '/mount', __FILE__);
  18. $a->addEmptyDir('one/level');
  19. $a->extractTo(__DIR__ . '/extract', 'mount');
  20. $a->extractTo(__DIR__ . '/extract');
  21. $out = array();
  22. foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator(__DIR__ . '/extract', 0x00003000), RecursiveIteratorIterator::CHILD_FIRST) as $p => $b) {
  23. $out[] = $p;
  24. }
  25. sort($out);
  26. foreach ($out as $b) {
  27. echo "$b\n";
  28. }
  29. $a->extractTo(__DIR__ . '/extract1', 'file1.txt');
  30. var_dump(file_get_contents(__DIR__ . '/extract1/file1.txt'));
  31. $a->extractTo(__DIR__ . '/extract1', 'subdir/ectory/file.txt');
  32. var_dump(file_get_contents(__DIR__ . '/extract1/subdir/ectory/file.txt'));
  33. $a->extractTo(__DIR__ . '/extract1-2', array('file2.txt', 'one/level'));
  34. var_dump(file_get_contents(__DIR__ . '/extract1-2/file2.txt'));
  35. var_dump(is_dir(__DIR__ . '/extract1-2/one/level'));
  36. try {
  37. $a->extractTo(__DIR__ . '/whatever', new stdClass());
  38. } catch (TypeError $e) {
  39. echo $e->getMessage(), "\n";
  40. }
  41. try {
  42. $a->extractTo(array());
  43. } catch (TypeError $e) {
  44. echo $e->getMessage(), "\n";
  45. }
  46. try {
  47. $a->extractTo('');
  48. } catch (Exception $e) {
  49. echo $e->getMessage(), "\n";
  50. }
  51. file_put_contents(__DIR__ . '/oops', 'I is file');
  52. try {
  53. $a->extractTo(__DIR__ . '/oops', 'file1.txt');
  54. } catch (Exception $e) {
  55. echo $e->getMessage(), "\n";
  56. }
  57. try {
  58. $a->extractTo(__DIR__ . '/oops1', array(array(), 'file1.txt'));
  59. } catch (Exception $e) {
  60. echo $e->getMessage(), "\n";
  61. }
  62. try {
  63. $a->extractTo(__DIR__ . '/extract', 'file1.txt');
  64. } catch (Exception $e) {
  65. echo $e->getMessage(), "\n";
  66. }
  67. file_put_contents(__DIR__ . '/extract/file1.txt', 'first');
  68. var_dump(file_get_contents(__DIR__ . '/extract/file1.txt'));
  69. $a->extractTo(__DIR__ . '/extract', 'file1.txt', true);
  70. var_dump(file_get_contents(__DIR__ . '/extract/file1.txt'));
  71. try {
  72. $a->extractTo(str_repeat('a', 20000), 'file1.txt');
  73. } catch (Exception $e) {
  74. echo $e->getMessage(), "\n";
  75. }
  76. $a[str_repeat('a', 20000)] = 'long';
  77. try {
  78. $a->extractTo(__DIR__ . '/extract', str_repeat('a', 20000));
  79. } catch (Exception $e) {
  80. echo $e->getMessage(), "\n";
  81. }
  82. ?>
  83. --CLEAN--
  84. <?php
  85. @rmdir(__DIR__ . '/whatever');
  86. @unlink(__DIR__ . '/oops');
  87. @rmdir(__DIR__ . '/oops1');
  88. @unlink(__DIR__ . '/tempmanifest1.phar.php');
  89. $e = __DIR__ . '/extract/';
  90. @unlink($e . 'file1.txt');
  91. @unlink($e . 'file2.txt');
  92. @unlink($e . 'subdir/ectory/file.txt');
  93. @rmdir($e . 'subdir/ectory');
  94. @rmdir($e . 'subdir');
  95. @rmdir($e . 'one/level');
  96. @rmdir($e . 'one');
  97. @rmdir($e);
  98. $e = __DIR__ . '/extract1/';
  99. @unlink($e . 'file1.txt');
  100. @unlink($e . 'subdir/ectory/file.txt');
  101. @rmdir($e . 'subdir/ectory');
  102. @rmdir($e . 'subdir');
  103. @rmdir($e);
  104. $e = __DIR__ . '/extract1-2/';
  105. @unlink($e . 'file2.txt');
  106. @rmdir($e . 'one/level');
  107. @rmdir($e . 'one');
  108. @rmdir($e);
  109. ?>
  110. --EXPECTF--
  111. %sextract%cfile1.txt
  112. %sextract%cfile2.txt
  113. %sextract%cone
  114. %sextract%csubdir
  115. %sextract%csubdir%cectory
  116. %sextract%csubdir%cectory%cfile.txt
  117. string(2) "hi"
  118. string(3) "hi3"
  119. string(3) "hi2"
  120. bool(false)
  121. Phar::extractTo(): Argument #2 ($files) must be of type array|string|null, stdClass given
  122. Phar::extractTo(): Argument #1 ($directory) must be of type string, array given
  123. Invalid argument, extraction path must be non-zero length
  124. Unable to use path "%soops" for extraction, it is a file, must be a directory
  125. Invalid argument, array of filenames to extract contains non-string value
  126. Extraction from phar "%stempmanifest1.phar.php" failed: Cannot extract "file1.txt" to "%sextract/file1.txt", path already exists
  127. string(5) "first"
  128. string(2) "hi"
  129. Cannot extract to "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...", destination directory is too long for filesystem
  130. Extraction from phar "%stempmanifest1.phar.php" failed: Cannot extract "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..." to "%s...", extracted filename is too long for filesystem