travis
[plcapi.git] / tests / 4LocalhostMultiTest.php
index 5ef6a3c..0516c30 100644 (file)
@@ -7,96 +7,159 @@ include_once __DIR__ . '/parse_args.php';
 
 include_once __DIR__ . '/3LocalhostTest.php';
 
+/**
+ * Tests which stress http features of the library.
+ * Each of these tests iterates over (almost) all of the 'localhost' tests
+ */
 class LocalhostMultiTest extends LocalhostTest
 {
     /**
+     * Returns all test methods from the base class, except the ones which failed already
+     *
      * @todo reintroduce skipping of tests which failed when executed individually if test runs happen as separate processes
      * @todo reintroduce skipping of tests within the loop
      */
-    function _runtests()
+    public function getSingleHttpTestMethods()
     {
-        $unsafeMethods = array('testHttps', 'testCatchExceptions', 'testUtf8Method');
+        $unsafeMethods = array(
+            'testCatchExceptions', 'testUtf8Method', 'testServerComments',
+            'testExoticCharsetsRequests', 'testExoticCharsetsRequests2', 'testExoticCharsetsRequests3',
+        );
+
+        $methods = array();
         foreach(get_class_methods('LocalhostTest') as $method)
         {
             if(strpos($method, 'test') === 0 && !in_array($method, $unsafeMethods))
             {
-                if (!isset(self::$failed_tests[$method]))
-                    $this->$method();
+                if (!isset(self::$failed_tests[$method])) {
+                    $methods[$method] = array($method);
+                }
             }
-            /*if ($this->_failed)
-            {
-                break;
-            }*/
         }
+
+        return $methods;
     }
 
-    function testDeflate()
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testDeflate($method)
     {
         if(!function_exists('gzdeflate'))
         {
-            $this->fail('Zlib missing: cannot test deflate functionality');
+            $this->markTestSkipped('Zlib missing: cannot test deflate functionality');
             return;
         }
+
         $this->client->accepted_compression = array('deflate');
         $this->client->request_compression = 'deflate';
-        $this->_runtests();
+
+        $this->$method();
     }
 
-    function testGzip()
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testGzip($method)
     {
         if(!function_exists('gzdeflate'))
         {
-            $this->fail('Zlib missing: cannot test gzip functionality');
+            $this->markTestSkipped('Zlib missing: cannot test gzip functionality');
             return;
         }
+
         $this->client->accepted_compression = array('gzip');
         $this->client->request_compression = 'gzip';
-        $this->_runtests();
+
+        $this->$method();
     }
 
-    function testKeepAlives()
+    public function testKeepAlives()
     {
         if(!function_exists('curl_init'))
         {
-            $this->fail('CURL missing: cannot test http 1.1');
+            $this->markTestSkipped('CURL missing: cannot test http 1.1');
             return;
         }
+
         $this->method = 'http11';
+        $this->client->method = 'http11';
         $this->client->keepalive = true;
-        $this->_runtests();
+
+        // to successfully test keepalive, we have to reuse the same client for all tests, we can not recreate one on setup/teardown...
+        foreach ($this->getSingleHttpTestMethods() as $methods) {
+            $method = $methods[0];
+            $this->$method();
+        }
     }
 
-    function testProxy()
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testProxy($method)
     {
-        if ($this->args['PROXYSERVER'])
+        if ($this->args['PROXYSERVER'] == '')
         {
-            $this->client->setProxy($this->args['PROXYSERVER'], $this->args['PROXYPORT']);
-            $this->_runtests();
+            $this->markTestSkipped('PROXY definition missing: cannot test proxy');
+            return;
         }
-        else
-            $this->fail('PROXY definition missing: cannot test proxy');
+
+        $this->client->setProxy($this->args['PROXYSERVER'], $this->args['PROXYPORT']);
+
+        $this->$method();
     }
 
-    function testHttp11()
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testHttp11($method)
     {
         if(!function_exists('curl_init'))
         {
-            $this->fail('CURL missing: cannot test http 1.1');
+            $this->markTestSkipped('CURL missing: cannot test http 1.1');
             return;
         }
+
         $this->method = 'http11'; // not an error the double assignment!
         $this->client->method = 'http11';
-        //$this->client->verifyhost = 0;
-        //$this->client->verifypeer = 0;
         $this->client->keepalive = false;
-        $this->_runtests();
+
+        $this->$method();
+    }
+
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testHttp10Curl($method)
+    {
+        if(!function_exists('curl_init'))
+        {
+            $this->markTestSkipped('CURL missing: cannot test http 1.1');
+            return;
+        }
+
+        $this->method = 'http10'; // not an error the double assignment!
+        $this->client->method = 'http10';
+        $this->client->keepalive = false;
+        $this->client->setUseCurl(\PhpXmlRpc\Client::USE_CURL_ALWAYS);
+
+        $this->$method();
     }
 
-    function testHttp11Gzip()
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testHttp11Gzip($method)
     {
         if(!function_exists('curl_init'))
         {
-            $this->fail('CURL missing: cannot test http 1.1');
+            $this->markTestSkipped('CURL missing: cannot test http 1.1');
             return;
         }
         $this->method = 'http11'; // not an error the double assignment!
@@ -104,14 +167,19 @@ class LocalhostMultiTest extends LocalhostTest
         $this->client->keepalive = false;
         $this->client->accepted_compression = array('gzip');
         $this->client->request_compression = 'gzip';
-        $this->_runtests();
+
+        $this->$method();
     }
 
-    function testHttp11Deflate()
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testHttp11Deflate($method)
     {
         if(!function_exists('curl_init'))
         {
-            $this->fail('CURL missing: cannot test http 1.1');
+            $this->markTestSkipped('CURL missing: cannot test http 1.1');
             return;
         }
         $this->method = 'http11'; // not an error the double assignment!
@@ -119,37 +187,75 @@ class LocalhostMultiTest extends LocalhostTest
         $this->client->keepalive = false;
         $this->client->accepted_compression = array('deflate');
         $this->client->request_compression = 'deflate';
-        $this->_runtests();
+
+        $this->$method();
     }
 
-    function testHttp11Proxy()
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testHttp11Proxy($method)
     {
         if(!function_exists('curl_init'))
         {
-            $this->fail('CURL missing: cannot test http 1.1 w. proxy');
+            $this->markTestSkipped('CURL missing: cannot test http 1.1 w. proxy');
             return;
         }
         else if ($this->args['PROXYSERVER'] == '')
         {
-            $this->fail('PROXY definition missing: cannot test proxy w. http 1.1');
+            $this->markTestSkipped('PROXY definition missing: cannot test proxy w. http 1.1');
             return;
         }
+
         $this->method = 'http11'; // not an error the double assignment!
         $this->client->method = 'http11';
         $this->client->setProxy($this->args['PROXYSERVER'], $this->args['PROXYPORT']);
-        //$this->client->verifyhost = 0;
-        //$this->client->verifypeer = 0;
         $this->client->keepalive = false;
-        $this->_runtests();
+
+        $this->$method();
     }
 
-    function testHttps()
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testHttps($method)
     {
         if(!function_exists('curl_init'))
         {
-            $this->fail('CURL missing: cannot test https functionality');
+            $this->markTestSkipped('CURL missing: cannot test https functionality');
+            return;
+        }
+        else if ($this->args['HTTPSSERVER'] == '')
+        {
+            $this->markTestSkipped('HTTPS SERVER definition missing: cannot test https');
+            return;
+        }
+
+        $this->client->server = $this->args['HTTPSSERVER'];
+        $this->method = 'https';
+        $this->client->method = 'https';
+        $this->client->path = $this->args['HTTPSURI'];
+        $this->client->setSSLVerifyPeer(!$this->args['HTTPSIGNOREPEER']);
+        $this->client->setSSLVerifyHost($this->args['HTTPSVERIFYHOST']);
+        $this->client->setSSLVersion($this->args['SSLVERSION']);
+
+        $this->$method();
+    }
+
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testHttpsSocket($method)
+    {
+        if ($this->args['HTTPSSERVER'] == '')
+        {
+            $this->markTestSkipped('HTTPS SERVER definition missing: cannot test https');
             return;
         }
+
         $this->client->server = $this->args['HTTPSSERVER'];
         $this->method = 'https';
         $this->client->method = 'https';
@@ -157,21 +263,33 @@ class LocalhostMultiTest extends LocalhostTest
         $this->client->setSSLVerifyPeer(!$this->args['HTTPSIGNOREPEER']);
         $this->client->setSSLVerifyHost($this->args['HTTPSVERIFYHOST']);
         $this->client->setSSLVersion($this->args['SSLVERSION']);
-        $this->_runtests();
+        $this->client->setUseCurl(\PhpXmlRpc\Client::USE_CURL_NEVER);
+
+        $this->$method();
     }
 
-    function testHttpsProxy()
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testHttpsProxy($method)
     {
         if(!function_exists('curl_init'))
         {
-            $this->fail('CURL missing: cannot test https functionality');
+            $this->markTestSkipped('CURL missing: cannot test https w. proxy');
             return;
         }
         else if ($this->args['PROXYSERVER'] == '')
         {
-            $this->fail('PROXY definition missing: cannot test proxy w. http 1.1');
+            $this->markTestSkipped('PROXY definition missing: cannot test proxy w. https');
             return;
         }
+        else if ($this->args['HTTPSSERVER'] == '')
+        {
+            $this->markTestSkipped('HTTPS SERVER definition missing: cannot test https w. proxy');
+            return;
+        }
+
         $this->client->server = $this->args['HTTPSSERVER'];
         $this->method = 'https';
         $this->client->method = 'https';
@@ -180,32 +298,83 @@ class LocalhostMultiTest extends LocalhostTest
         $this->client->setSSLVerifyPeer(!$this->args['HTTPSIGNOREPEER']);
         $this->client->setSSLVerifyHost($this->args['HTTPSVERIFYHOST']);
         $this->client->setSSLVersion($this->args['SSLVERSION']);
-        $this->_runtests();
+
+        $this->$method();
     }
 
-    function testUTF8Responses()
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testUTF8Responses($method)
     {
-        //$this->client->path = strpos($URI, '?') === null ? $URI.'?RESPONSE_ENCODING=UTF-8' : $URI.'&RESPONSE_ENCODING=UTF-8';
-        $this->client->path = $this->args['URI'].'?RESPONSE_ENCODING=UTF-8';
-        $this->_runtests();
+        $this->addQueryParams(array('RESPONSE_ENCODING' => 'UTF-8'));
+
+        $this->$method();
     }
 
-    function testUTF8Requests()
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testUTF8Requests($method)
     {
         $this->client->request_charset_encoding = 'UTF-8';
-        $this->_runtests();
+
+        $this->$method();
     }
 
-    function testISOResponses()
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testISOResponses($method)
     {
-        //$this->client->path = strpos($URI, '?') === null ? $URI.'?RESPONSE_ENCODING=UTF-8' : $URI.'&RESPONSE_ENCODING=UTF-8';
-        $this->client->path = $this->args['URI'].'?RESPONSE_ENCODING=ISO-8859-1';
-        $this->_runtests();
+        $this->addQueryParams(array('RESPONSE_ENCODING' => 'ISO-8859-1'));
+
+        $this->$method();
     }
 
-    function testISORequests()
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testISORequests($method)
     {
         $this->client->request_charset_encoding = 'ISO-8859-1';
-        $this->_runtests();
+
+        $this->$method();
+    }
+
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testBasicAuth($method)
+    {
+        $this->client->setCredentials('test', 'test');
+        $this->addQueryParams(array('FORCE_AUTH' => 'Basic'));
+
+        $this->$method();
+    }
+
+    /**
+     * @dataProvider getSingleHttpTestMethods
+     * @param string $method
+     */
+    public function testDigestAuth($method)
+    {
+        if (!function_exists('curl_init'))
+        {
+            $this->markTestSkipped('CURL missing: cannot test digest auth functionality');
+            return;
+        }
+
+        $this->client->setCredentials('test', 'test', CURLAUTH_DIGEST);
+        $this->addQueryParams(array('FORCE_AUTH' => 'Digest'));
+        $this->method = 'http11';
+        $this->client->method = 'http11';
+
+        $this->$method();
     }
 }