]> granicus.if.org Git - php/commitdiff
OpenSSL: Improve non-blocking eof test
authorAbyr Valg <valga@abyrga.ru>
Sat, 9 Feb 2019 09:15:55 +0000 (12:15 +0300)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 20 Feb 2019 11:11:30 +0000 (12:11 +0100)
ext/openssl/tests/ServerClientTestCase.inc
ext/openssl/tests/bug77390.phpt

index 4bad3c2995aeff38126128dc5fcb0f70bd00f200..75767647773f1893adbb430223a57b21e8b97c4c 100644 (file)
@@ -9,9 +9,9 @@ function phpt_notify($worker = WORKER_DEFAULT_NAME)
     ServerClientTestCase::getInstance()->notify($worker);
 }
 
-function phpt_wait($worker = WORKER_DEFAULT_NAME)
+function phpt_wait($worker = WORKER_DEFAULT_NAME, $timeout = null)
 {
-    ServerClientTestCase::getInstance()->wait($worker);
+    ServerClientTestCase::getInstance()->wait($worker, $timeout);
 }
 
 /**
@@ -121,9 +121,24 @@ class ServerClientTestCase
         }
     }
 
-    public function wait($worker)
+    public function wait($worker, $timeout = null)
     {
-        fgets($this->isWorker ? STDIN : $this->workerStdOut[$worker]);
+        $handle = $this->isWorker ? STDIN : $this->workerStdOut[$worker];
+        if ($timeout === null) {
+            fgets($handle);
+            return true;
+        }
+
+        stream_set_blocking($handle, false);
+        $read = [$handle];
+        $result = stream_select($read, $write, $except, $timeout);
+        if (!$result) {
+            return false;
+        }
+
+        fgets($handle);
+        stream_set_blocking($handle, true);
+        return true;
     }
 
     public function notify($worker)
index 7f153296401f536b7a47646bbe816ee1d73f295f..a71275ef6f356626d8b5c9802f7d7768321c35bc 100644 (file)
@@ -23,16 +23,21 @@ $clientCode = <<<'CODE'
 
        $read = [$fp];
        $buf = '';
-       $printed = false;
+       $warmedUp = false;
        while (stream_select($read, $write, $except, 1000)) {
                $chunk = stream_get_contents($fp, 4096);
-               if ($chunk !== "") {
-                   var_dump($chunk);
-                   $buf .= $chunk;
-               } elseif (!$printed) {
-                   $printed = true;
-                   var_dump($chunk);
+               $buf .= $chunk;
+               phpt_notify('proxy');
+               if (!$warmedUp) {
+                       if ($buf !== 'warmup') {
+                               continue;
+                       }
+                       $warmedUp = true;
+                       $buf = '';
+                       phpt_notify('server');
+                       continue;
                }
+               var_dump($chunk);
                if ($buf === 'hello, world') {
                        break;
                }
@@ -51,6 +56,8 @@ $serverCode = <<<'CODE'
        phpt_notify();
        
        $conn = stream_socket_accept($fp);
+       fwrite($conn, 'warmup');
+       phpt_wait();
        fwrite($conn, 'hello, world');
        
        phpt_wait();
@@ -82,7 +89,7 @@ $proxyCode = <<<'CODE'
                                        $parts = str_split($data, (int) ceil(strlen($data) / 3));
                                        foreach ($parts as $part) {
                                                fwrite($conn, $part);
-                                               usleep(1000);
+                                               phpt_wait(null, 1);
                                        }
                                } else {
                                        fwrite($conn, $data);
@@ -116,4 +123,5 @@ ServerClientTestCase::getInstance()->run($clientCode, [
 ?>
 --EXPECT--
 string(0) ""
+string(0) ""
 string(12) "hello, world"