]> granicus.if.org Git - php/commitdiff
new tests
authorAntony Dovgal <tony2001@php.net>
Tue, 15 Aug 2006 08:54:15 +0000 (08:54 +0000)
committerAntony Dovgal <tony2001@php.net>
Tue, 15 Aug 2006 08:54:15 +0000 (08:54 +0000)
ext/standard/tests/file/bug38450.phpt [new file with mode: 0644]
ext/standard/tests/file/bug38450_1.phpt [new file with mode: 0644]
ext/standard/tests/file/bug38450_2.phpt [new file with mode: 0644]
ext/standard/tests/file/bug38450_3.phpt [new file with mode: 0644]

diff --git a/ext/standard/tests/file/bug38450.phpt b/ext/standard/tests/file/bug38450.phpt
new file mode 100644 (file)
index 0000000..6fcdab8
--- /dev/null
@@ -0,0 +1,114 @@
+--TEST--
+Bug #38450 (constructor is not called for classes used in userspace stream wrappers)
+--FILE--
+<?php
+
+class VariableStream {
+       var $position;
+       var $varname;
+
+       function VariableStream($var) {
+               var_dump("constructor!");
+       }
+
+       function stream_open($path, $mode, $options, &$opened_path)
+       {
+               $url = parse_url($path);
+               $this->varname = $url["host"];
+               $this->position = 0;
+
+               return true;
+       }
+
+       function stream_read($count)
+       {
+               $ret = substr($GLOBALS[$this->varname], $this->position, $count);
+               $this->position += strlen($ret);
+               return $ret;
+       }
+
+       function stream_write($data)
+       {
+               $left = substr($GLOBALS[$this->varname], 0, $this->position);
+               $right = substr($GLOBALS[$this->varname], $this->position + strlen($data));
+               $GLOBALS[$this->varname] = $left . $data . $right;
+               $this->position += strlen($data);
+               return strlen($data);
+       }
+
+       function stream_tell()
+       {
+               return $this->position;
+       }
+
+       function stream_eof()
+       {
+               return $this->position >= strlen($GLOBALS[$this->varname]);
+       }
+       function stream_seek($offset, $whence)
+       {
+               switch ($whence) {
+               case SEEK_SET:
+                       if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) {
+                               $this->position = $offset;
+                               return true;
+                       } else {
+                               return false;
+                       }
+                       break;
+
+               case SEEK_CUR:
+                       if ($offset >= 0) {
+                               $this->position += $offset;
+                               return true;
+                       } else {
+                               return false;
+                       }
+                       break;
+
+               case SEEK_END:
+                       if (strlen($GLOBALS[$this->varname]) + $offset >= 0) {
+                               $this->position = strlen($GLOBALS[$this->varname]) + $offset;
+                               return true;
+                       } else {
+                               return false;
+                       }
+                       break;
+
+               default:
+                       return false;
+               }
+       }
+}
+
+stream_wrapper_register("var", "VariableStream")
+       or die("Failed to register protocol");
+
+$myvar = "";
+
+$fp = fopen("var://myvar", "r+");
+
+fwrite($fp, "line1\n");
+fwrite($fp, "line2\n");
+fwrite($fp, "line3\n");
+
+rewind($fp);
+while (!feof($fp)) {
+       echo fgets($fp);
+}
+fclose($fp);
+var_dump($myvar);
+
+echo "Done\n";
+?>
+--EXPECTF--    
+Warning: Missing argument 1 for VariableStream::VariableStream() in %s on line %d
+string(12) "constructor!"
+line1
+line2
+line3
+string(18) "line1
+line2
+line3
+"
+Done
diff --git a/ext/standard/tests/file/bug38450_1.phpt b/ext/standard/tests/file/bug38450_1.phpt
new file mode 100644 (file)
index 0000000..094755e
--- /dev/null
@@ -0,0 +1,114 @@
+--TEST--
+Bug #38450 (constructor is not called for classes used in userspace stream wrappers)
+--FILE--
+<?php
+
+class VariableStream {
+       var $position;
+       var $varname;
+
+       function __construct($var) {
+               var_dump("constructor!");
+       }
+
+       function stream_open($path, $mode, $options, &$opened_path)
+       {
+               $url = parse_url($path);
+               $this->varname = $url["host"];
+               $this->position = 0;
+
+               return true;
+       }
+
+       function stream_read($count)
+       {
+               $ret = substr($GLOBALS[$this->varname], $this->position, $count);
+               $this->position += strlen($ret);
+               return $ret;
+       }
+
+       function stream_write($data)
+       {
+               $left = substr($GLOBALS[$this->varname], 0, $this->position);
+               $right = substr($GLOBALS[$this->varname], $this->position + strlen($data));
+               $GLOBALS[$this->varname] = $left . $data . $right;
+               $this->position += strlen($data);
+               return strlen($data);
+       }
+
+       function stream_tell()
+       {
+               return $this->position;
+       }
+
+       function stream_eof()
+       {
+               return $this->position >= strlen($GLOBALS[$this->varname]);
+       }
+       function stream_seek($offset, $whence)
+       {
+               switch ($whence) {
+               case SEEK_SET:
+                       if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) {
+                               $this->position = $offset;
+                               return true;
+                       } else {
+                               return false;
+                       }
+                       break;
+
+               case SEEK_CUR:
+                       if ($offset >= 0) {
+                               $this->position += $offset;
+                               return true;
+                       } else {
+                               return false;
+                       }
+                       break;
+
+               case SEEK_END:
+                       if (strlen($GLOBALS[$this->varname]) + $offset >= 0) {
+                               $this->position = strlen($GLOBALS[$this->varname]) + $offset;
+                               return true;
+                       } else {
+                               return false;
+                       }
+                       break;
+
+               default:
+                       return false;
+               }
+       }
+}
+
+stream_wrapper_register("var", "VariableStream")
+       or die("Failed to register protocol");
+
+$myvar = "";
+
+$fp = fopen("var://myvar", "r+");
+
+fwrite($fp, "line1\n");
+fwrite($fp, "line2\n");
+fwrite($fp, "line3\n");
+
+rewind($fp);
+while (!feof($fp)) {
+       echo fgets($fp);
+}
+fclose($fp);
+var_dump($myvar);
+
+echo "Done\n";
+?>
+--EXPECTF--    
+Warning: Missing argument 1 for VariableStream::__construct() in %s on line %d
+string(12) "constructor!"
+line1
+line2
+line3
+string(18) "line1
+line2
+line3
+"
+Done
diff --git a/ext/standard/tests/file/bug38450_2.phpt b/ext/standard/tests/file/bug38450_2.phpt
new file mode 100644 (file)
index 0000000..625fd7c
--- /dev/null
@@ -0,0 +1,114 @@
+--TEST--
+Bug #38450 (constructor is not called for classes used in userspace stream wrappers)
+--FILE--
+<?php
+
+class VariableStream {
+       var $position;
+       var $varname;
+
+       function __construct($var) {
+               throw new Exception("constructor");
+       }
+
+       function stream_open($path, $mode, $options, &$opened_path)
+       {
+               $url = parse_url($path);
+               $this->varname = $url["host"];
+               $this->position = 0;
+
+               return true;
+       }
+
+       function stream_read($count)
+       {
+               $ret = substr($GLOBALS[$this->varname], $this->position, $count);
+               $this->position += strlen($ret);
+               return $ret;
+       }
+
+       function stream_write($data)
+       {
+               $left = substr($GLOBALS[$this->varname], 0, $this->position);
+               $right = substr($GLOBALS[$this->varname], $this->position + strlen($data));
+               $GLOBALS[$this->varname] = $left . $data . $right;
+               $this->position += strlen($data);
+               return strlen($data);
+       }
+
+       function stream_tell()
+       {
+               return $this->position;
+       }
+
+       function stream_eof()
+       {
+               return $this->position >= strlen($GLOBALS[$this->varname]);
+       }
+       function stream_seek($offset, $whence)
+       {
+               switch ($whence) {
+               case SEEK_SET:
+                       if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) {
+                               $this->position = $offset;
+                               return true;
+                       } else {
+                               return false;
+                       }
+                       break;
+
+               case SEEK_CUR:
+                       if ($offset >= 0) {
+                               $this->position += $offset;
+                               return true;
+                       } else {
+                               return false;
+                       }
+                       break;
+
+               case SEEK_END:
+                       if (strlen($GLOBALS[$this->varname]) + $offset >= 0) {
+                               $this->position = strlen($GLOBALS[$this->varname]) + $offset;
+                               return true;
+                       } else {
+                               return false;
+                       }
+                       break;
+
+               default:
+                       return false;
+               }
+       }
+}
+
+stream_wrapper_register("var", "VariableStream")
+       or die("Failed to register protocol");
+
+$myvar = "";
+
+$fp = fopen("var://myvar", "r+");
+
+fwrite($fp, "line1\n");
+fwrite($fp, "line2\n");
+fwrite($fp, "line3\n");
+
+rewind($fp);
+while (!feof($fp)) {
+       echo fgets($fp);
+}
+fclose($fp);
+var_dump($myvar);
+
+echo "Done\n";
+?>
+--EXPECTF--    
+Warning: Missing argument 1 for VariableStream::__construct() in %s on line %d
+
+Warning: fopen(var://myvar): failed to open stream: "VariableStream::stream_open" call failed in %s on line %d
+
+Fatal error: Uncaught exception 'Exception' with message 'constructor' in %s:%d
+Stack trace:
+#0 [internal function]: VariableStream->__construct()
+#1 %s(%d): fopen('var://myvar', 'r+')
+#2 {main}
+  thrown in %s on line %d
diff --git a/ext/standard/tests/file/bug38450_3.phpt b/ext/standard/tests/file/bug38450_3.phpt
new file mode 100644 (file)
index 0000000..d11ebd9
--- /dev/null
@@ -0,0 +1,105 @@
+--TEST--
+Bug #38450 (constructor is not called for classes used in userspace stream wrappers)
+--FILE--
+<?php
+
+class VariableStream {
+       var $position;
+       var $varname;
+
+       function __construct(array $var) {
+               var_dump("constructor!");
+       }
+
+       function stream_open($path, $mode, $options, &$opened_path)
+       {
+               $url = parse_url($path);
+               $this->varname = $url["host"];
+               $this->position = 0;
+
+               return true;
+       }
+
+       function stream_read($count)
+       {
+               $ret = substr($GLOBALS[$this->varname], $this->position, $count);
+               $this->position += strlen($ret);
+               return $ret;
+       }
+
+       function stream_write($data)
+       {
+               $left = substr($GLOBALS[$this->varname], 0, $this->position);
+               $right = substr($GLOBALS[$this->varname], $this->position + strlen($data));
+               $GLOBALS[$this->varname] = $left . $data . $right;
+               $this->position += strlen($data);
+               return strlen($data);
+       }
+
+       function stream_tell()
+       {
+               return $this->position;
+       }
+
+       function stream_eof()
+       {
+               return $this->position >= strlen($GLOBALS[$this->varname]);
+       }
+       function stream_seek($offset, $whence)
+       {
+               switch ($whence) {
+               case SEEK_SET:
+                       if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) {
+                               $this->position = $offset;
+                               return true;
+                       } else {
+                               return false;
+                       }
+                       break;
+
+               case SEEK_CUR:
+                       if ($offset >= 0) {
+                               $this->position += $offset;
+                               return true;
+                       } else {
+                               return false;
+                       }
+                       break;
+
+               case SEEK_END:
+                       if (strlen($GLOBALS[$this->varname]) + $offset >= 0) {
+                               $this->position = strlen($GLOBALS[$this->varname]) + $offset;
+                               return true;
+                       } else {
+                               return false;
+                       }
+                       break;
+
+               default:
+                       return false;
+               }
+       }
+}
+
+stream_wrapper_register("var", "VariableStream")
+       or die("Failed to register protocol");
+
+$myvar = "";
+
+$fp = fopen("var://myvar", "r+");
+
+fwrite($fp, "line1\n");
+fwrite($fp, "line2\n");
+fwrite($fp, "line3\n");
+
+rewind($fp);
+while (!feof($fp)) {
+       echo fgets($fp);
+}
+fclose($fp);
+var_dump($myvar);
+
+echo "Done\n";
+?>
+--EXPECTF--    
+Catchable fatal error: Argument 1 passed to VariableStream::__construct() must be an array, none given in %s on line %d