mirror of
https://github.com/danog/amp.git
synced 2025-01-21 21:01:16 +01:00
Put Loop::execute() $callback into Driver::defer()
This also ensures that potential throwing in the callback will be handled inside a potential error handler instead of immediately falling through.
This commit is contained in:
parent
64494951ff
commit
b197b2c07d
@ -16,7 +16,7 @@
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Interop\\Async\\Loop\\": "test"
|
||||
"Interop\\Async\\Loop\\Test\\": "test"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -72,8 +72,7 @@ final class Loop
|
||||
self::$level++;
|
||||
|
||||
try {
|
||||
$callback();
|
||||
|
||||
self::$driver->defer($callback);
|
||||
self::$driver->run();
|
||||
} finally {
|
||||
self::$driver = $previousDriver;
|
||||
|
46
test/DummyDriver.php
Normal file
46
test/DummyDriver.php
Normal file
@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace Interop\Async\Loop\Test;
|
||||
|
||||
class DummyDriver implements \Interop\Async\Loop\Driver
|
||||
{
|
||||
public $defers;
|
||||
public $handler;
|
||||
public static $id = "a";
|
||||
|
||||
public function run() {
|
||||
while (list($defer, $data) = array_shift($this->defers)) {
|
||||
try {
|
||||
$defer(self::$id++, $data);
|
||||
} catch (Exception $e) {
|
||||
if ($handler = $this->handler) {
|
||||
$handler($e);
|
||||
} else {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function defer(callable $callback, $data = null) {
|
||||
$this->defers[] = [$callback, $data];
|
||||
}
|
||||
|
||||
public function setErrorHandler(callable $callback = null) {
|
||||
$this->handler = $callback;
|
||||
}
|
||||
|
||||
public function stop() {}
|
||||
public function delay($delay, callable $callback, $data = null) { return self::$id++; }
|
||||
public function repeat($interval, callable $callback, $data = null) { return self::$id++; }
|
||||
public function onReadable($stream, callable $callback, $data = null) { return self::$id++; }
|
||||
public function onWritable($stream, callable $callback, $data = null) { return self::$id++; }
|
||||
public function onSignal($signo, callable $callback, $data = null) { return self::$id++; }
|
||||
public function enable($watcherId) {}
|
||||
public function disable($watcherId) {}
|
||||
public function cancel($watcherId) {}
|
||||
public function reference($watcherId) {}
|
||||
public function unreference($watcherId) {}
|
||||
public function info() {}
|
||||
public function getHandle() {}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace Interop\Async\Loop;
|
||||
namespace Interop\Async\Loop\Test;
|
||||
|
||||
use Interop\Async\Loop;
|
||||
|
||||
@ -16,9 +16,9 @@ class LoopTest extends \PHPUnit_Framework_TestCase
|
||||
* @expectedExceptionMessage new factory while running isn't allowed
|
||||
*/
|
||||
public function setFactoryFailsIfRunning() {
|
||||
$driver = $this->getMockBuilder(Driver::class)->getMock();
|
||||
$driver = new DummyDriver;
|
||||
|
||||
$factory = $this->getMockBuilder(DriverFactory::class)->getMock();
|
||||
$factory = $this->getMockBuilder(Loop\DriverFactory::class)->getMock();
|
||||
$factory->method("create")->willReturn($driver);
|
||||
|
||||
Loop::setFactory($factory);
|
||||
@ -30,8 +30,8 @@ class LoopTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
/** @test */
|
||||
public function executeStackReturnsScopedDriver() {
|
||||
$driver1 = $this->getMockBuilder(Driver::class)->getMock();
|
||||
$driver2 = $this->getMockBuilder(Driver::class)->getMock();
|
||||
$driver1 = new DummyDriver;
|
||||
$driver2 = new DummyDriver;
|
||||
|
||||
Loop::execute(function () use ($driver1, $driver2) {
|
||||
$this->assertSame($driver1, Loop::get());
|
||||
|
Loading…
x
Reference in New Issue
Block a user