| | <?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'); |
| | } |
| | } |
| |
|