summaryrefslogtreecommitdiff
path: root/libs/jsonrpc/tests/HttpClientTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'libs/jsonrpc/tests/HttpClientTest.php')
-rw-r--r--libs/jsonrpc/tests/HttpClientTest.php220
1 files changed, 220 insertions, 0 deletions
diff --git a/libs/jsonrpc/tests/HttpClientTest.php b/libs/jsonrpc/tests/HttpClientTest.php
new file mode 100644
index 00000000..71e6c8d0
--- /dev/null
+++ b/libs/jsonrpc/tests/HttpClientTest.php
@@ -0,0 +1,220 @@
+<?php
+
+namespace JsonRPC;
+
+require_once __DIR__.'/../../../vendor/autoload.php';
+
+defined('CURLOPT_URL') or define('CURLOPT_URL', 10002);
+defined('CURLOPT_RETURNTRANSFER') or define('CURLOPT_RETURNTRANSFER', 19913);
+defined('CURLOPT_CONNECTTIMEOUT') or define('CURLOPT_CONNECTTIMEOUT', 78);
+defined('CURLOPT_MAXREDIRS') or define('CURLOPT_MAXREDIRS', 68);
+defined('CURLOPT_SSL_VERIFYPEER') or define('CURLOPT_SSL_VERIFYPEER', 64);
+defined('CURLOPT_POST') or define('CURLOPT_POST', 47);
+defined('CURLOPT_POSTFIELDS') or define('CURLOPT_POSTFIELDS', 10015);
+defined('CURLOPT_HTTPHEADER') or define('CURLOPT_HTTPHEADER', 10023);
+defined('CURLOPT_HEADERFUNCTION') or define('CURLOPT_HEADERFUNCTION', 20079);
+defined('CURLOPT_CAINFO') or define('CURLOPT_CAINFO', 10065);
+
+function extension_loaded($extension) {
+ return HttpClientTest::$functions->extension_loaded($extension);
+}
+
+function fopen($url, $mode, $use_include_path, $context)
+{
+ return HttpClientTest::$functions->fopen($url, $mode, $use_include_path, $context);
+}
+
+function stream_context_create(array $params)
+{
+ return HttpClientTest::$functions->stream_context_create($params);
+}
+
+function curl_init() {
+ return HttpClientTest::$functions->curl_init();
+}
+
+function curl_setopt_array($ch, array $params) {
+ HttpClientTest::$functions->curl_setopt_array($ch, $params);
+}
+
+function curl_setopt($ch, $option, $value) {
+ HttpClientTest::$functions->curl_setopt($ch, $option, $value);
+}
+
+function curl_exec($ch) {
+ return HttpClientTest::$functions->curl_exec($ch);
+}
+
+function curl_close($ch) {
+ HttpClientTest::$functions->curl_close($ch);
+}
+
+class HttpClientTest extends \PHPUnit_Framework_TestCase
+{
+ public static $functions;
+
+ public function setUp()
+ {
+ self::$functions = $this
+ ->getMockBuilder('stdClass')
+ ->setMethods(array('extension_loaded', 'fopen', 'stream_context_create',
+ 'curl_init', 'curl_setopt_array', 'curl_setopt', 'curl_exec', 'curl_close'))
+ ->getMock();
+ }
+
+ public function testWithServerError()
+ {
+ $this->setExpectedException('\JsonRPC\Exception\ServerErrorException');
+
+ $httpClient = new HttpClient();
+ $httpClient->handleExceptions(array(
+ 'HTTP/1.0 301 Moved Permanently',
+ 'Connection: close',
+ 'HTTP/1.1 500 Internal Server Error',
+ ));
+ }
+
+ public function testWithConnectionFailure()
+ {
+ $this->setExpectedException('\JsonRPC\Exception\ConnectionFailureException');
+
+ $httpClient = new HttpClient();
+ $httpClient->handleExceptions(array(
+ 'HTTP/1.1 404 Not Found',
+ ));
+ }
+
+ public function testWithAccessForbidden()
+ {
+ $this->setExpectedException('\JsonRPC\Exception\AccessDeniedException');
+
+ $httpClient = new HttpClient();
+ $httpClient->handleExceptions(array(
+ 'HTTP/1.1 403 Forbidden',
+ ));
+ }
+
+ public function testWithAccessNotAllowed()
+ {
+ $this->setExpectedException('\JsonRPC\Exception\AccessDeniedException');
+
+ $httpClient = new HttpClient();
+ $httpClient->handleExceptions(array(
+ 'HTTP/1.0 401 Unauthorized',
+ ));
+ }
+
+ public function testWithCallback()
+ {
+ self::$functions
+ ->expects($this->at(0))
+ ->method('extension_loaded')
+ ->with('curl')
+ ->will($this->returnValue(false));
+
+ self::$functions
+ ->expects($this->at(1))
+ ->method('stream_context_create')
+ ->with(array(
+ 'http' => array(
+ 'method' => 'POST',
+ 'protocol_version' => 1.1,
+ 'timeout' => 5,
+ 'max_redirects' => 2,
+ 'header' => implode("\r\n", array(
+ 'User-Agent: JSON-RPC PHP Client <https://github.com/fguillot/JsonRPC>',
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Connection: close',
+ 'Content-Length: 4',
+ )),
+ 'content' => 'test',
+ 'ignore_errors' => true,
+ ),
+ 'ssl' => array(
+ 'verify_peer' => true,
+ 'verify_peer_name' => true,
+ )
+ ))
+ ->will($this->returnValue('context'));
+
+ self::$functions
+ ->expects($this->at(2))
+ ->method('fopen')
+ ->with('url', 'r', false, 'context')
+ ->will($this->returnValue(false));
+
+ $httpClient = new HttpClient('url');
+ $httpClient->withBeforeRequestCallback(function(HttpClient $client, $payload) {
+ $client->withHeaders(array('Content-Length: '.strlen($payload)));
+ });
+
+ $this->setExpectedException('\JsonRPC\Exception\ConnectionFailureException');
+ $httpClient->execute('test');
+ }
+
+ public function testWithCurl()
+ {
+ self::$functions
+ ->expects($this->at(0))
+ ->method('extension_loaded')
+ ->with('curl')
+ ->will($this->returnValue(true));
+
+ self::$functions
+ ->expects($this->at(1))
+ ->method('curl_init')
+ ->will($this->returnValue('curl'));
+
+ self::$functions
+ ->expects($this->at(2))
+ ->method('curl_setopt_array')
+ ->with('curl', array(
+ CURLOPT_URL => 'url',
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_CONNECTTIMEOUT => 5,
+ CURLOPT_MAXREDIRS => 2,
+ CURLOPT_SSL_VERIFYPEER => true,
+ CURLOPT_POST => true,
+ CURLOPT_POSTFIELDS => 'test',
+ CURLOPT_HTTPHEADER => array(
+ 'User-Agent: JSON-RPC PHP Client <https://github.com/fguillot/JsonRPC>',
+ 'Content-Type: application/json',
+ 'Accept: application/json',
+ 'Connection: close',
+ 'Content-Length: 4',
+ ),
+ CURLOPT_HEADERFUNCTION => function ($curl, $header) use (&$headers) {
+ $headers[] = $header;
+ return strlen($header);
+ }
+ ));
+
+ self::$functions
+ ->expects($this->at(3))
+ ->method('curl_setopt')
+ ->with('curl', CURLOPT_CAINFO, 'test.crt');
+
+ self::$functions
+ ->expects($this->at(4))
+ ->method('curl_exec')
+ ->with('curl')
+ ->will($this->returnValue(false));
+
+ self::$functions
+ ->expects($this->at(5))
+ ->method('curl_close')
+ ->with('curl');
+
+ $httpClient = new HttpClient('url');
+ $httpClient
+ ->withSslLocalCert('test.crt')
+ ->withBeforeRequestCallback(function(HttpClient $client, $payload) {
+ $client->withHeaders(array('Content-Length: '.strlen($payload)));
+ });
+
+
+ $this->setExpectedException('\JsonRPC\Exception\ConnectionFailureException');
+ $httpClient->execute('test');
+ }
+}