You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.8 KiB
109 lines
2.8 KiB
<?php
|
|
namespace GuzzleHttp\Tests\Ring\Future;
|
|
|
|
use GuzzleHttp\Ring\Exception\CancelledFutureAccessException;
|
|
use GuzzleHttp\Ring\Future\FutureValue;
|
|
use React\Promise\Deferred;
|
|
|
|
class FutureValueTest extends \PHPUnit_Framework_TestCase
|
|
{
|
|
public function testDerefReturnsValue()
|
|
{
|
|
$called = 0;
|
|
$deferred = new Deferred();
|
|
|
|
$f = new FutureValue(
|
|
$deferred->promise(),
|
|
function () use ($deferred, &$called) {
|
|
$called++;
|
|
$deferred->resolve('foo');
|
|
}
|
|
);
|
|
|
|
$this->assertEquals('foo', $f->wait());
|
|
$this->assertEquals(1, $called);
|
|
$this->assertEquals('foo', $f->wait());
|
|
$this->assertEquals(1, $called);
|
|
$f->cancel();
|
|
$this->assertTrue($this->readAttribute($f, 'isRealized'));
|
|
}
|
|
|
|
/**
|
|
* @expectedException \GuzzleHttp\Ring\Exception\CancelledFutureAccessException
|
|
*/
|
|
public function testThrowsWhenAccessingCancelled()
|
|
{
|
|
$f = new FutureValue(
|
|
(new Deferred())->promise(),
|
|
function () {},
|
|
function () { return true; }
|
|
);
|
|
$f->cancel();
|
|
$f->wait();
|
|
}
|
|
|
|
/**
|
|
* @expectedException \OutOfBoundsException
|
|
*/
|
|
public function testThrowsWhenDerefFailure()
|
|
{
|
|
$called = false;
|
|
$deferred = new Deferred();
|
|
$f = new FutureValue(
|
|
$deferred->promise(),
|
|
function () use(&$called) {
|
|
$called = true;
|
|
}
|
|
);
|
|
$deferred->reject(new \OutOfBoundsException());
|
|
$f->wait();
|
|
$this->assertFalse($called);
|
|
}
|
|
|
|
/**
|
|
* @expectedException \GuzzleHttp\Ring\Exception\RingException
|
|
* @expectedExceptionMessage Waiting did not resolve future
|
|
*/
|
|
public function testThrowsWhenDerefDoesNotResolve()
|
|
{
|
|
$deferred = new Deferred();
|
|
$f = new FutureValue(
|
|
$deferred->promise(),
|
|
function () use(&$called) {
|
|
$called = true;
|
|
}
|
|
);
|
|
$f->wait();
|
|
}
|
|
|
|
public function testThrowingCancelledFutureAccessExceptionCancels()
|
|
{
|
|
$deferred = new Deferred();
|
|
$f = new FutureValue(
|
|
$deferred->promise(),
|
|
function () use ($deferred) {
|
|
throw new CancelledFutureAccessException();
|
|
}
|
|
);
|
|
try {
|
|
$f->wait();
|
|
$this->fail('did not throw');
|
|
} catch (CancelledFutureAccessException $e) {}
|
|
}
|
|
|
|
/**
|
|
* @expectedException \Exception
|
|
* @expectedExceptionMessage foo
|
|
*/
|
|
public function testThrowingExceptionInDerefMarksAsFailed()
|
|
{
|
|
$deferred = new Deferred();
|
|
$f = new FutureValue(
|
|
$deferred->promise(),
|
|
function () {
|
|
throw new \Exception('foo');
|
|
}
|
|
);
|
|
$f->wait();
|
|
}
|
|
}
|
|
|