]> granicus.if.org Git - php/commitdiff
Enable readlink_realpath_* tests on Windows
authorChristoph M. Becker <cmbecker69@gmx.de>
Thu, 2 Jul 2020 14:36:16 +0000 (16:36 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Thu, 2 Jul 2020 16:24:42 +0000 (18:24 +0200)
We modify _basic1.phpt so it runs on Windows as well.  The other test
cases hit the issue that `readlink()` fails normally for regular files,
but succeeds on Windows[1].  Therefore, we split these tests, but still
fix the skip reasons.

[1] <http://svn.php.net/viewvc?view=revision&revision=350097>

ext/standard/tests/file/readlink_realpath_basic1.phpt
ext/standard/tests/file/readlink_realpath_basic2-win32.phpt [new file with mode: 0644]
ext/standard/tests/file/readlink_realpath_basic2.phpt
ext/standard/tests/file/readlink_realpath_error-win32.phpt [new file with mode: 0644]
ext/standard/tests/file/readlink_realpath_error.phpt
ext/standard/tests/file/readlink_realpath_variation1-win32.phpt [new file with mode: 0644]
ext/standard/tests/file/readlink_realpath_variation1.phpt
ext/standard/tests/file/readlink_realpath_variation2-win32.phpt [new file with mode: 0644]
ext/standard/tests/file/readlink_realpath_variation2.phpt

index fa2056d076fdff7c01036b0f857cf83de65fb718..867aef1eb5200eaae70d6693bd3955491399fdfb 100644 (file)
@@ -2,8 +2,9 @@
 Test readlink() and realpath functions: basic functionality - diff. path notation for links(Bug #42038)
 --SKIPIF--
 <?php
-if (substr(PHP_OS, 0, 3) == 'WIN') {
-    die('skip no symlinks on Windows');
+if (PHP_OS_FAMILY === 'Windows') {
+    include __DIR__ . '/windows_links/common.inc';
+    skipIfSeCreateSymbolicLinkPrivilegeIsDisabled(__FILE__);
 }
 ?>
 --FILE--
@@ -74,32 +75,32 @@ rmdir("$name_prefix/");
 *** Testing readlink() and realpath(): with valid and invalid path ***
 
 -- Iteration 1 --
-string(%d) "%s/readlink_realpath_basic1/home/readlink_realpath_basic1.tmp"
-string(%d) "%s/readlink_realpath_basic1/home/readlink_realpath_basic1.tmp"
+string(%d) "%s%ereadlink_realpath_basic1%ehome%ereadlink_realpath_basic1.tmp"
+string(%d) "%s%ereadlink_realpath_basic1%ehome%ereadlink_realpath_basic1.tmp"
 
 -- Iteration 2 --
-string(%d) "%s/readlink_realpath_basic1/home/test/readlink_realpath_basic1.tmp"
-string(%d) "%s/readlink_realpath_basic1/home/test/readlink_realpath_basic1.tmp"
+string(%d) "%s%ereadlink_realpath_basic1%ehome%etest%ereadlink_realpath_basic1.tmp"
+string(%d) "%s%ereadlink_realpath_basic1%ehome%etest%ereadlink_realpath_basic1.tmp"
 
 -- Iteration 3 --
-string(%d) "%s/readlink_realpath_basic1/home/test/readlink_realpath_basic1.tmp"
-string(%d) "%s/readlink_realpath_basic1/home/test/readlink_realpath_basic1.tmp"
+string(%d) "%s%ereadlink_realpath_basic1%ehome%etest%ereadlink_realpath_basic1.tmp"
+string(%d) "%s%ereadlink_realpath_basic1%ehome%etest%ereadlink_realpath_basic1.tmp"
 
 -- Iteration 4 --
 
-Warning: readlink(): No such file or directory in %s on line %d
+Warning: readlink(): %s in %s on line %d
 bool(false)
 bool(false)
 
 -- Iteration 5 --
 
-Warning: readlink(): No such file or directory in %s on line %d
+Warning: readlink(): %s in %s on line %d
 bool(false)
 bool(false)
 
 -- Iteration 6 --
 
-Warning: readlink(): No such file or directory in %s on line %d
+Warning: readlink(): %s in %s on line %d
 bool(false)
 %s
 
diff --git a/ext/standard/tests/file/readlink_realpath_basic2-win32.phpt b/ext/standard/tests/file/readlink_realpath_basic2-win32.phpt
new file mode 100644 (file)
index 0000000..f0072ee
--- /dev/null
@@ -0,0 +1,86 @@
+--TEST--
+Test readlink() and realpath functions: basic functionality - diff. path notation for files
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) != 'WIN') {
+    die('skip only for Windows');
+}
+?>
+--FILE--
+<?php
+/* Prototype: string readlink ( string $path );
+   Description: Returns the target of a symbolic link
+
+   Prototype: string realpath ( string $path );
+   Description: Returns canonicalized absolute pathname
+*/
+
+/* creating directories, symbolic links and files */
+$file_path = __DIR__;
+mkdir("$file_path/readlink_realpath_basic2/home/test/", 0777, true);
+
+$file_handle1 = fopen("$file_path/readlink_realpath_basic2/home/test/readlink_realpath_basic2.tmp", "w");
+$file_handle2 = fopen("$file_path/readlink_realpath_basic2/home/readlink_realpath_basic2.tmp", "w");
+$file_handle3 = fopen("$file_path/readlink_realpath_basic2/readlink_realpath_basic2.tmp", "w");
+fclose($file_handle1);
+fclose($file_handle2);
+fclose($file_handle3);
+
+echo "\n*** Testing realpath() on filenames ***\n";
+$filenames = array (
+  /* filenames resulting in valid paths */
+  "$file_path/readlink_realpath_basic2/home/readlink_realpath_basic2.tmp",
+  "$file_path/readlink_realpath_basic2/readlink_realpath_basic2.tmp",
+  "$file_path/readlink_realpath_basic2//home/test//../test/./readlink_realpath_basic2.tmp",
+  "$file_path/readlink_realpath_basic2/home//../././readlink_realpath_basic2.tmp",
+
+  /* filenames with invalid path */
+  "$file_path///readlink_realpath_basic2/home//..//././test//readlink_realpath_basic2.tmp",
+  "$file_path/readlink_realpath_basic2/home/../home/../test/../readlink_realpath_basic2.tmp",
+  "$file_path/readlink_realpath_basic2/readlink_realpath_basic2.tmp/"
+);
+
+$counter = 1;
+/* loop through $files to read the filepath of $file in the above array */
+foreach($filenames as $file) {
+  echo "\n-- Iteration $counter --\n";
+  var_dump( realpath($file) );
+  $counter++;
+}
+
+echo "Done\n";
+?>
+--CLEAN--
+<?php
+$name_prefix = __DIR__."/readlink_realpath_basic2";
+unlink("$name_prefix/home/test/readlink_realpath_basic2.tmp");
+unlink("$name_prefix/home/readlink_realpath_basic2.tmp");
+unlink("$name_prefix/readlink_realpath_basic2.tmp");
+rmdir("$name_prefix/home/test/");
+rmdir("$name_prefix/home/");
+rmdir("$name_prefix/");
+?>
+--EXPECTF--
+*** Testing realpath() on filenames ***
+
+-- Iteration 1 --
+string(%d) "%s%ereadlink_realpath_basic2%ehome%ereadlink_realpath_basic2.tmp"
+
+-- Iteration 2 --
+string(%d) "%s%ereadlink_realpath_basic2%ereadlink_realpath_basic2.tmp"
+
+-- Iteration 3 --
+string(%d) "%s%ereadlink_realpath_basic2%ehome%etest%ereadlink_realpath_basic2.tmp"
+
+-- Iteration 4 --
+string(%d) "%s%ereadlink_realpath_basic2%ereadlink_realpath_basic2.tmp"
+
+-- Iteration 5 --
+bool(false)
+
+-- Iteration 6 --
+string(%d) "%s%eext%estandard%etests%efile%ereadlink_realpath_basic2%ereadlink_realpath_basic2.tmp"
+
+-- Iteration 7 --
+%s
+Done
index 104fba859d9abc9a71d8ef4aca039f999ccf0879..9971fd6f95051d5b67a52a456988bd19af737857 100644 (file)
@@ -3,7 +3,7 @@ Test readlink() and realpath functions: basic functionality - diff. path notatio
 --SKIPIF--
 <?php
 if (substr(PHP_OS, 0, 3) == 'WIN') {
-    die('skip no symlinks on Windows');
+    die('skip not for Windows');
 }
 ?>
 --FILE--
diff --git a/ext/standard/tests/file/readlink_realpath_error-win32.phpt b/ext/standard/tests/file/readlink_realpath_error-win32.phpt
new file mode 100644 (file)
index 0000000..679be44
--- /dev/null
@@ -0,0 +1,69 @@
+--TEST--
+Test readlink() and realpath() functions: error conditions
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) != 'WIN') {
+    die('skip only for Windows');
+}
+?>
+--FILE--
+<?php
+/* Prototype: string readlink ( string $path );
+   Description: Returns the target of a symbolic link
+
+   Prototype: string realpath ( string $path );
+   Description: Returns canonicalized absolute pathname
+*/
+
+echo "*** Testing readlink(): error conditions ***\n";
+var_dump( readlink() );  // args < expected
+var_dump( readlink(__FILE__, 2) );  // args > expected
+
+echo "\n*** Testing readlink() on a non-existent link ***\n";
+var_dump( readlink(__DIR__."/readlink_error.tmp") );
+
+echo "\n*** Testing readlink() on existing file ***\n";
+var_dump( readlink(__FILE__) );
+
+echo "\n*** Testing readlink() on existing directory ***\n";
+var_dump( readlink(__DIR__) );
+
+echo "*** Testing realpath(): error conditions ***\n";
+var_dump( realpath() );  // args < expected
+var_dump( realpath(1, 2) );  // args > expected
+
+echo "\n*** Testing realpath() on a non-existent file ***\n";
+var_dump( realpath(__DIR__."/realpath_error.tmp") );
+
+echo "Done\n";
+?>
+--EXPECTF--
+*** Testing readlink(): error conditions ***
+
+Warning: readlink() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+Warning: readlink() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+
+*** Testing readlink() on a non-existent link ***
+
+Warning: readlink(): readlink failed to read the symbolic link (%s, error %d) in %s on line %d
+bool(false)
+
+*** Testing readlink() on existing file ***
+string(%d) "%s%eext%estandard%etests%efile%ereadlink_realpath_error-win32.php"
+
+*** Testing readlink() on existing directory ***
+string(%d) "%s%eext%estandard%etests%efile"
+*** Testing realpath(): error conditions ***
+
+Warning: realpath() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+Warning: realpath() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+
+*** Testing realpath() on a non-existent file ***
+%s
+Done
index e2afb8bb364a93160c43cb08c2e29d7f7efac048..82743b73006a8a96625ea4b0d6614e8ef4a23917 100644 (file)
@@ -3,7 +3,7 @@ Test readlink() and realpath() functions: error conditions
 --SKIPIF--
 <?php
 if (substr(PHP_OS, 0, 3) == 'WIN') {
-    die('skip no symlinks on Windows');
+    die('skip not for Windows');
 }
 ?>
 --FILE--
diff --git a/ext/standard/tests/file/readlink_realpath_variation1-win32.phpt b/ext/standard/tests/file/readlink_realpath_variation1-win32.phpt
new file mode 100644 (file)
index 0000000..b46944b
--- /dev/null
@@ -0,0 +1,98 @@
+--TEST--
+Test readlink() and realpath() functions: usage variation - linkname/filename stored in object(Bug #42038)
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) != 'WIN') {
+    die('skip only for Windows');
+} else {
+    include __DIR__ . '/windows_links/common.inc';
+    skipIfSeCreateSymbolicLinkPrivilegeIsDisabled(__FILE__);
+}
+?>
+--FILE--
+<?php
+/* Prototype: string readlink ( string $path );
+   Description: Returns the target of a symbolic link
+
+   Prototype: string realpath ( string $path );
+   Description: Returns canonicalized absolute pathname
+*/
+
+echo "*** Testing readlink() and realpath() : usage variations ***\n";
+$name_prefix = __DIR__;
+$filename = "$name_prefix/readlink_realpath_variation1/home/tests/link/readlink_realpath_variation1.tmp";
+mkdir("$name_prefix/readlink_realpath_variation1/home/tests/link/", 0777, true);
+
+echo "\n*** Testing readlink() and realpath() with linkname stored inside a object ***\n";
+// create a temp file
+$file_handle = fopen($filename, "w");
+fclose($file_handle);
+
+// creating object with members as linkname
+class object_temp {
+  public $linkname;
+  function __construct($link) {
+    $this->linkname = $link;
+  }
+}
+$obj1 = new object_temp("$name_prefix/readlink_realpath_variation1/../././readlink_realpath_variation1/home/readlink_realpath_variation1_link.tmp");
+$obj2 = new object_temp("$name_prefix/readlink_realpath_variation1/home/../..///readlink_realpath_variation1_link.tmp");
+
+echo "\n-- Testing readlink() and realpath() with softlink, linkname stored inside an object --\n";
+// creating the links
+var_dump( symlink($filename, $obj1->linkname) );
+var_dump( readlink($obj1->linkname) );
+var_dump( realpath($obj1->linkname) );
+var_dump( symlink($filename, $obj2->linkname) );
+var_dump( readlink($obj2->linkname) );
+var_dump( realpath($obj2->linkname) );
+
+// deleting the link
+unlink($obj1->linkname);
+unlink($obj2->linkname);
+
+echo "\n-- Testing readlink() and realpath() with hardlink, linkname stored inside an object --\n";
+// creating hard links
+var_dump( link($filename, $obj1->linkname) );
+var_dump( readlink($obj1->linkname) );   // invalid because readlink doesn't work with hardlink
+var_dump( realpath($obj1->linkname) );
+var_dump( link($filename, $obj2->linkname) );
+var_dump( readlink($obj2->linkname) );   // invalid because readlink doesn't work with hardlink
+var_dump( realpath($obj2->linkname) );
+
+// delete the links
+unlink($obj1->linkname);
+unlink($obj2->linkname);
+
+echo "Done\n";
+?>
+--CLEAN--
+<?php
+$name_prefix = __DIR__."/readlink_realpath_variation1";
+unlink("$name_prefix/home/tests/link/readlink_realpath_variation1.tmp");
+rmdir("$name_prefix/home/tests/link/");
+rmdir("$name_prefix/home/tests/");
+rmdir("$name_prefix/home/");
+rmdir("$name_prefix/");
+?>
+--EXPECTF--
+*** Testing readlink() and realpath() : usage variations ***
+
+*** Testing readlink() and realpath() with linkname stored inside a object ***
+
+-- Testing readlink() and realpath() with softlink, linkname stored inside an object --
+bool(true)
+string(%d) "%s%ereadlink_realpath_variation1%ehome%etests%elink%ereadlink_realpath_variation1.tmp"
+string(%d) "%s%ereadlink_realpath_variation1%ehome%etests%elink%ereadlink_realpath_variation1.tmp"
+bool(true)
+string(%d) "%s%ereadlink_realpath_variation1%ehome%etests%elink%ereadlink_realpath_variation1.tmp"
+string(%d) "%s%ereadlink_realpath_variation1%ehome%etests%elink%ereadlink_realpath_variation1.tmp"
+
+-- Testing readlink() and realpath() with hardlink, linkname stored inside an object --
+bool(true)
+string(%d) "%s%ereadlink_realpath_variation1%ehome%ereadlink_realpath_variation1_link.tmp"
+string(%d) "%s%ereadlink_realpath_variation1%ehome%ereadlink_realpath_variation1_link.tmp"
+bool(true)
+string(%d) "%s%ereadlink_realpath_variation1_link.tmp"
+string(%d) "%s%ereadlink_realpath_variation1_link.tmp"
+Done
index 797badd9147ac0387855973643e38db0c16ec9c7..1530029daadfd2ea78f5b9bbcc5a2b73df8bfa81 100644 (file)
@@ -3,7 +3,7 @@ Test readlink() and realpath() functions: usage variation - linkname/filename st
 --SKIPIF--
 <?php
 if (substr(PHP_OS, 0, 3) == 'WIN') {
-    die('skip no symlinks on Windows');
+    die('skip not for Windows');
 }
 ?>
 --FILE--
diff --git a/ext/standard/tests/file/readlink_realpath_variation2-win32.phpt b/ext/standard/tests/file/readlink_realpath_variation2-win32.phpt
new file mode 100644 (file)
index 0000000..7c75f09
--- /dev/null
@@ -0,0 +1,105 @@
+--TEST--
+Test readlink() and realpath() functions: usage variation - linkname/filename stored in array(Bug #42038)
+--SKIPIF--
+<?php
+if (substr(PHP_OS, 0, 3) != 'WIN') {
+    die('skip only for Windows');
+} else {
+    include __DIR__ . '/windows_links/common.inc';
+    skipIfSeCreateSymbolicLinkPrivilegeIsDisabled(__FILE__);
+}
+?>
+--FILE--
+<?php
+/* Prototype: string readlink ( string $path );
+   Description: Returns the target of a symbolic link
+
+   Prototype: string realpath ( string $path );
+   Description: Returns canonicalized absolute pathname
+*/
+
+echo "*** Testing readlink() and realpath() : usage variations ***\n";
+$name_prefix = __DIR__;
+// create temp dir
+mkdir("$name_prefix/readlink_realpath_variation2/home/tests/link/", 0777, true);
+// create the file
+$filename = "$name_prefix/readlink_realpath_variation2/home/tests/link/readlink_realpath_variation2.tmp";
+$fp = fopen($filename, "w");
+fclose($fp);
+
+echo "\n*** Testing readlink() and realpath() with linkname stored in an array ***\n";
+$link_arr = array (
+  "$name_prefix////readlink_realpath_variation2/home/tests/link/readlink_realpath_variation2_link.tmp",
+  "$name_prefix/./readlink_realpath_variation2/home/../home//tests//..//..//..//home//readlink_realpath_variation2_link.tmp/"
+);
+
+echo "\n-- Testing readlink() and realpath() with softlink, linkname stored inside an array --\n";
+// creating the links
+var_dump( symlink($filename, $link_arr[0]) );
+var_dump( readlink($link_arr[0]) );
+var_dump( realpath($link_arr[0]) );
+var_dump( symlink($filename, $link_arr[1]) );
+var_dump( readlink($link_arr[1]) );
+var_dump( realpath($link_arr[1]) );
+
+// deleting the link
+unlink($link_arr[0]);
+unlink($link_arr[1]);
+
+echo "\n-- Testing readlink() and realpath() with hardlink, linkname stored inside an array --\n";
+// creating hard links
+var_dump( link($filename, $link_arr[0]) );
+var_dump( readlink($link_arr[0]) );   // invalid because readlink doesn't work with hardlink
+var_dump( realpath($link_arr[0]) );
+var_dump( link($filename, $link_arr[1]) );
+var_dump( readlink($link_arr[1]) );   // invalid because readlink doesn't work with hardlink
+var_dump( realpath($link_arr[1]) );
+
+// delete the links
+unlink($link_arr[0]);
+unlink($link_arr[1]);
+
+echo "Done\n";
+?>
+--CLEAN--
+<?php
+$name_prefix = __DIR__."/readlink_realpath_variation2";
+unlink("$name_prefix/home/tests/link/readlink_realpath_variation2.tmp");
+rmdir("$name_prefix/home/tests/link/");
+rmdir("$name_prefix/home/tests/");
+rmdir("$name_prefix/home/");
+rmdir("$name_prefix/");
+?>
+--EXPECTF--
+*** Testing readlink() and realpath() : usage variations ***
+
+*** Testing readlink() and realpath() with linkname stored in an array ***
+
+-- Testing readlink() and realpath() with softlink, linkname stored inside an array --
+bool(true)
+string(%d) "%s%ereadlink_realpath_variation2%ehome%etests%elink%ereadlink_realpath_variation2.tmp"
+string(%d) "%s%ereadlink_realpath_variation2%ehome%etests%elink%ereadlink_realpath_variation2.tmp"
+
+Warning: symlink(): No such file or directory in %s on line %d
+bool(false)
+
+Warning: readlink(): readlink failed to read the symbolic link (%s) in %s on line %d
+bool(false)
+bool(false)
+
+Warning: unlink(%s/./readlink_realpath_variation2/home/../home//tests//..//..//..//home//readlink_realpath_variation2_link.tmp/): No such file or directory in %s on line %d
+
+-- Testing readlink() and realpath() with hardlink, linkname stored inside an array --
+bool(true)
+string(%d) "%s%ereadlink_realpath_variation2%ehome%etests%elink%ereadlink_realpath_variation2_link.tmp"
+string(%d) "%s%ereadlink_realpath_variation2%ehome%etests%elink%ereadlink_realpath_variation2_link.tmp"
+
+Warning: link(): No such file or directory in %s on line %d
+bool(false)
+
+Warning: readlink(): readlink failed to read the symbolic link (%s) in %s on line %d
+bool(false)
+bool(false)
+
+Warning: unlink(%s/./readlink_realpath_variation2/home/../home//tests//..//..//..//home//readlink_realpath_variation2_link.tmp/): No such file or directory in %s on line %d
+Done
index 82deabecb6b2eb8cca1678a1e09faac16f9678f0..fe0d1305c680d7c2f313a100a973efbf9bfd8bdc 100644 (file)
@@ -3,7 +3,7 @@ Test readlink() and realpath() functions: usage variation - linkname/filename st
 --SKIPIF--
 <?php
 if (substr(PHP_OS, 0, 3) == 'WIN') {
-    die('skip no symlinks on Windows');
+    die('skip not for Windows');
 }
 ?>
 --FILE--