--- /dev/null
+<?php
+
+function create_sleep_script()
+{
+ $fname = dirname(__FILE__) . DIRECTORY_SEPARATOR . "proc_open_pipes_sleep.php";
+
+ if (!file_exists($fname)) {
+ file_put_contents($fname, "<?php\nsleep(1);\n");
+ }
+
+ return $fname;
+}
+
+function unlink_sleep_script()
+{
+ $fname = dirname(__FILE__) . DIRECTORY_SEPARATOR . "proc_open_pipes_sleep.php";
+
+ if (file_exists($fname)) {
+ unlink($fname);
+ }
+}
+
--- /dev/null
+--TEST--
+proc_open() with > 16 pipes
+--FILE--
+<?php
+
+include dirname(__FILE__) . "/proc_open_pipes.inc";
+
+for ($i = 3; $i<= 30; $i++) {
+ $spec[$i] = array('pipe', 'w');
+}
+
+$php = getenv("TEST_PHP_EXECUTABLE");
+$callee = create_sleep_script();
+proc_open("$php $callee", $spec, $pipes);
+
+var_dump(count($spec));
+var_dump($pipes);
+
+?>
+--CLEAN--
+<?php
+include dirname(__FILE__) . "/proc_open_pipes.inc";
+
+unlink_sleep_script();
+
+?>
+--EXPECTF--
+int(28)
+array(28) {
+ [3]=>
+ resource(%d) of type (Unknown)
+ [4]=>
+ resource(%d) of type (Unknown)
+ [5]=>
+ resource(%d) of type (Unknown)
+ [6]=>
+ resource(%d) of type (Unknown)
+ [7]=>
+ resource(%d) of type (Unknown)
+ [8]=>
+ resource(%d) of type (Unknown)
+ [9]=>
+ resource(%d) of type (Unknown)
+ [10]=>
+ resource(%d) of type (Unknown)
+ [11]=>
+ resource(%d) of type (Unknown)
+ [12]=>
+ resource(%d) of type (Unknown)
+ [13]=>
+ resource(%d) of type (Unknown)
+ [14]=>
+ resource(%d) of type (Unknown)
+ [15]=>
+ resource(%d) of type (Unknown)
+ [16]=>
+ resource(%d) of type (Unknown)
+ [17]=>
+ resource(%d) of type (Unknown)
+ [18]=>
+ resource(%d) of type (Unknown)
+ [19]=>
+ resource(%d) of type (Unknown)
+ [20]=>
+ resource(%d) of type (Unknown)
+ [21]=>
+ resource(%d) of type (Unknown)
+ [22]=>
+ resource(%d) of type (Unknown)
+ [23]=>
+ resource(%d) of type (Unknown)
+ [24]=>
+ resource(%d) of type (Unknown)
+ [25]=>
+ resource(%d) of type (Unknown)
+ [26]=>
+ resource(%d) of type (Unknown)
+ [27]=>
+ resource(%d) of type (Unknown)
+ [28]=>
+ resource(%d) of type (Unknown)
+ [29]=>
+ resource(%d) of type (Unknown)
+ [30]=>
+ resource(%d) of type (Unknown)
+}
--- /dev/null
+--TEST--
+proc_open() with no pipes
+--FILE--
+<?php
+
+include dirname(__FILE__) . "/proc_open_pipes.inc";
+
+$spec = array();
+
+$php = getenv("TEST_PHP_EXECUTABLE");
+$callee = create_sleep_script();
+proc_open("$php $callee", $spec, $pipes);
+
+var_dump(count($spec));
+var_dump($pipes);
+
+?>
+--CLEAN--
+<?php
+include dirname(__FILE__) . "/proc_open_pipes.inc";
+
+unlink_sleep_script();
+
+?>
+--EXPECTF--
+int(0)
+array(0) {
+}
--- /dev/null
+--TEST--
+proc_open() with invalid pipes
+--FILE--
+<?php
+
+include dirname(__FILE__) . "/proc_open_pipes.inc";
+
+for ($i = 3; $i<= 5; $i++) {
+ $spec[$i] = array('pipe', 'w');
+}
+
+$php = getenv("TEST_PHP_EXECUTABLE");
+$callee = create_sleep_script();
+
+$spec[$i] = array('pi');
+proc_open("$php $callee", $spec, $pipes);
+
+$spec[$i] = 1;
+proc_open("$php $callee", $spec, $pipes);
+
+$spec[$i] = array('pipe', "test");
+proc_open("$php $callee", $spec, $pipes);
+var_dump($pipes);
+
+$spec[$i] = array('file', "test", "z");
+proc_open("$php $callee", $spec, $pipes);
+var_dump($pipes);
+
+echo "END\n";
+?>
+--CLEAN--
+<?php
+include dirname(__FILE__) . "/proc_open_pipes.inc";
+
+unlink_sleep_script();
+
+?>
+--EXPECTF--
+Warning: proc_open(): pi is not a valid descriptor spec/mode in %s on line %d
+
+Warning: proc_open(): Descriptor item must be either an array or a File-Handle in %s on line %d
+array(4) {
+ [3]=>
+ resource(%d) of type (Unknown)
+ [4]=>
+ resource(%d) of type (Unknown)
+ [5]=>
+ resource(%d) of type (Unknown)
+ [6]=>
+ resource(%d) of type (Unknown)
+}
+
+Warning: proc_open(test): failed to open stream: %s in %s on line %d
+array(4) {
+ [3]=>
+ resource(%d) of type (Unknown)
+ [4]=>
+ resource(%d) of type (Unknown)
+ [5]=>
+ resource(%d) of type (Unknown)
+ [6]=>
+ resource(%d) of type (Unknown)
+}
+END