| <?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->expectException('\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->expectException('\JsonRPC\Exception\ConnectionFailureException'); |
|
|
| $httpClient = new HttpClient(); |
| $httpClient->handleExceptions(array( |
| 'HTTP/1.1 404 Not Found', |
| )); |
| } |
|
|
| public function testWithAccessForbidden() |
| { |
| $this->expectException('\JsonRPC\Exception\AccessDeniedException'); |
|
|
| $httpClient = new HttpClient(); |
| $httpClient->handleExceptions(array( |
| 'HTTP/1.1 403 Forbidden', |
| )); |
| } |
|
|
| public function testWithAccessNotAllowed() |
| { |
| $this->expectException('\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->expectException('\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->expectException('\JsonRPC\Exception\ConnectionFailureException'); |
| $httpClient->execute('test'); |
| } |
| } |
|
|