1
0
mirror of https://github.com/guzzle/guzzle.git synced 2025-02-25 02:22:57 +01:00

Adding tests for Curl and CurlMulti, removing error event

- Adding a shared set of tests for curl and multi adapters
- Removing guard for failing to create a curl handle. This should not
  be allowed to fail.
This commit is contained in:
Michael Dowling 2014-02-19 23:26:33 -08:00
parent 769de2d766
commit 27c4a47f3c
4 changed files with 142 additions and 98 deletions

View File

@ -164,15 +164,11 @@ class MultiAdapter implements AdapterInterface, ParallelAdapterInterface
RequestEvents::emitBefore($transaction);
// Only transfer if the request was not intercepted
if (!$transaction->getResponse()) {
try {
$handle = $this->curlFactory->createHandle(
$transaction,
$this->messageFactory
);
$context->addTransaction($transaction, $handle);
} catch (RequestException $e) {
RequestEvents::emitError($transaction, $e);
}
}
} catch (RequestException $e) {
$this->throwException($e, $context);

View File

@ -0,0 +1,108 @@
<?php
namespace GuzzleHttp\Tests\Adapter\Curl;
require_once __DIR__ . '/../../Server.php';
use GuzzleHttp\Adapter\Transaction;
use GuzzleHttp\Client;
use GuzzleHttp\Event\CompleteEvent;
use GuzzleHttp\Event\ErrorEvent;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Message\Request;
use GuzzleHttp\Message\Response;
use GuzzleHttp\Tests\Server;
use GuzzleHttp\Url;
abstract class AbstractCurl extends \PHPUnit_Framework_TestCase
{
/** @var \GuzzleHttp\Tests\Server */
static $server;
public static function setUpBeforeClass()
{
self::$server = new Server();
self::$server->start();
}
public static function tearDownAfterClass()
{
self::$server->stop();
}
abstract protected function getAdapter($factory = null, $options = []);
public function testSendsRequest()
{
self::$server->flush();
self::$server->enqueue("HTTP/1.1 200 OK\r\nFoo: bar\r\nContent-Length: 0\r\n\r\n");
$t = new Transaction(new Client(), new Request('GET', self::$server->getUrl()));
$a = $this->getAdapter();
$response = $a->send($t);
$this->assertEquals(200, $response->getStatusCode());
$this->assertEquals('bar', $response->getHeader('Foo'));
}
/**
* @expectedException \GuzzleHttp\Exception\RequestException
*/
public function testCatchesErrorWhenPreparing()
{
$r = new Request('GET', self::$server->getUrl());
$f = $this->getMockBuilder('GuzzleHttp\Adapter\Curl\CurlFactory')
->setMethods(['createHandle'])
->getMock();
$f->expects($this->once())
->method('createHandle')
->will($this->throwException(new RequestException('foo', $r)));
$t = new Transaction(new Client(), $r);
$a = $this->getAdapter(null, ['handle_factory' => $f]);
$a->send($t);
}
public function testDispatchesAfterSendEvent()
{
self::$server->flush();
self::$server->enqueue("HTTP/1.1 201 OK\r\nContent-Length: 0\r\n\r\n");
$r = new Request('GET', self::$server->getUrl());
$t = new Transaction(new Client(), $r);
$a = $this->getAdapter();
$ev = null;
$r->getEmitter()->on('complete', function (CompleteEvent $e) use (&$ev) {
$ev = $e;
$e->intercept(new Response(200, ['Foo' => 'bar']));
});
$response = $a->send($t);
$this->assertEquals(200, $response->getStatusCode());
$this->assertEquals('bar', $response->getHeader('Foo'));
}
public function testDispatchesErrorEventAndRecovers()
{
self::$server->flush();
self::$server->enqueue("HTTP/1.1 201 OK\r\nContent-Length: 0\r\n\r\n");
$r = new Request('GET', self::$server->getUrl());
$t = new Transaction(new Client(), $r);
$a = $this->getAdapter();
$r->getEmitter()->once('complete', function (CompleteEvent $e) {
throw new RequestException('Foo', $e->getRequest());
});
$r->getEmitter()->on('error', function (ErrorEvent $e) {
$e->intercept(new Response(200, ['Foo' => 'bar']));
});
$response = $a->send($t);
$this->assertEquals(200, $response->getStatusCode());
$this->assertEquals('bar', $response->getHeader('Foo'));
}
public function testStripsFragmentFromHost()
{
self::$server->flush();
self::$server->enqueue("HTTP/1.1 200 OK\r\n\r\nContent-Length: 0\r\n\r\n");
// This will fail if the removal of the #fragment is not performed
$url = Url::fromString(self::$server->getUrl())->setPath(null)->setFragment('foo');
$client = new Client();
$client->get($url);
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace GuzzleHttp\Tests\Adapter\Curl;
require_once __DIR__ . '/AbstractCurl.php';
use GuzzleHttp\Adapter\Curl\CurlAdapter;
use GuzzleHttp\Message\MessageFactory;
/**
* @covers GuzzleHttp\Adapter\Curl\CurlAdapter
*/
class CurlAdapterTest extends AbstractCurl
{
protected function getAdapter($factory = null, $options = [])
{
return new CurlAdapter($factory ?: new MessageFactory(), $options);
}
public function canSetMaxHandles()
{
$a = new CurlAdapter(new MessageFactory(), ['max_handles' => 10]);
$this->assertEquals(10, $this->readAttribute($a, 'maxHandles'));
}
}

View File

@ -2,37 +2,23 @@
namespace GuzzleHttp\Tests\Adapter\Curl;
require_once __DIR__ . '/../../Server.php';
require_once __DIR__ . '/AbstractCurl.php';
use GuzzleHttp\Adapter\Curl\MultiAdapter;
use GuzzleHttp\Adapter\Transaction;
use GuzzleHttp\Client;
use GuzzleHttp\Event\CompleteEvent;
use GuzzleHttp\Event\ErrorEvent;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Message\MessageFactory;
use GuzzleHttp\Message\Request;
use GuzzleHttp\Message\Response;
use GuzzleHttp\Tests\Server;
use GuzzleHttp\Url;
/**
* @covers GuzzleHttp\Adapter\Curl\MultiAdapter
*/
class MultiAdapterTest extends \PHPUnit_Framework_TestCase
class MultiAdapterTest extends AbstractCurl
{
/** @var \GuzzleHttp\Tests\Server */
static $server;
public static function setUpBeforeClass()
protected function getAdapter($factory = null, $options = [])
{
self::$server = new Server();
self::$server->start();
}
public static function tearDownAfterClass()
{
self::$server->stop();
return new MultiAdapter($factory ?: new MessageFactory(), $options);
}
public function testSendsSingleRequest()
@ -67,67 +53,6 @@ class MultiAdapterTest extends \PHPUnit_Framework_TestCase
}
}
public function testCatchesErrorWhenPreparing()
{
$r = new Request('GET', self::$server->getUrl());
$f = $this->getMockBuilder('GuzzleHttp\Adapter\Curl\CurlFactory')
->setMethods(['createHandle'])
->getMock();
$f->expects($this->once())
->method('createHandle')
->will($this->throwException(new RequestException('foo', $r)));
$t = new Transaction(new Client(), $r);
$a = new MultiAdapter(new MessageFactory(), ['handle_factory' => $f]);
$ev = null;
$r->getEmitter()->on('error', function (ErrorEvent $e) use (&$ev) {
$ev = $e;
});
try {
$a->send($t);
$this->fail('Did not throw');
} catch (RequestException $e) {}
$this->assertInstanceOf('GuzzleHttp\Event\ErrorEvent', $ev);
$this->assertSame($r, $ev->getRequest());
$this->assertInstanceOf('GuzzleHttp\Exception\RequestException', $ev->getException());
}
public function testDispatchesAfterSendEvent()
{
self::$server->flush();
self::$server->enqueue("HTTP/1.1 201 OK\r\nContent-Length: 0\r\n\r\n");
$r = new Request('GET', self::$server->getUrl());
$t = new Transaction(new Client(), $r);
$a = new MultiAdapter(new MessageFactory());
$ev = null;
$r->getEmitter()->on('complete', function (CompleteEvent $e) use (&$ev) {
$ev = $e;
$e->intercept(new Response(200, ['Foo' => 'bar']));
});
$response = $a->send($t);
$this->assertEquals(200, $response->getStatusCode());
$this->assertEquals('bar', $response->getHeader('Foo'));
}
public function testDispatchesErrorEventAndRecovers()
{
self::$server->flush();
self::$server->enqueue("HTTP/1.1 201 OK\r\nContent-Length: 0\r\n\r\n");
$r = new Request('GET', self::$server->getUrl());
$t = new Transaction(new Client(), $r);
$a = new MultiAdapter(new MessageFactory());
$r->getEmitter()->once('complete', function (CompleteEvent $e) {
throw new RequestException('Foo', $e->getRequest());
});
$r->getEmitter()->on('error', function (ErrorEvent $e) {
$e->intercept(new Response(200, ['Foo' => 'bar']));
});
$response = $a->send($t);
$this->assertEquals(200, $response->getStatusCode());
$this->assertEquals('bar', $response->getHeader('Foo'));
}
/**
* @expectedException \GuzzleHttp\Exception\AdapterException
* @expectedExceptionMessage cURL error -2:
@ -166,14 +91,4 @@ class MultiAdapterTest extends \PHPUnit_Framework_TestCase
$this->assertContains($request->getUrl(), $e->getMessage());
}
}
public function testStripsFragmentFromHost()
{
self::$server->flush();
self::$server->enqueue("HTTP/1.1 200 OK\r\n\r\nContent-Length: 0\r\n\r\n");
// This will fail if the removal of the #fragment is not performed
$url = Url::fromString(self::$server->getUrl())->setPath(null)->setFragment('foo');
$client = new Client();
$client->get($url);
}
}