summaryrefslogtreecommitdiff
path: root/server/vendor/guzzlehttp/promises/tests/EachPromiseTest.php
diff options
context:
space:
mode:
authormanzerbredes <loic.guegan_secondary@yahoo.fr>2016-03-15 16:17:39 +0100
committermanzerbredes <loic.guegan_secondary@yahoo.fr>2016-03-15 16:17:39 +0100
commit26d10bc0fa4befbac54453228ae1ce89021bdec2 (patch)
tree029d7240ecf7416205e5f76cf9107a6b5bdf8ca3 /server/vendor/guzzlehttp/promises/tests/EachPromiseTest.php
parent8ad216dedf017f3d6de047a25d08db3b98e16361 (diff)
parent03ef74d0cfe675a6e18a91f039182ca1b248d8f5 (diff)
Merge branch 'develop' into loic
Diffstat (limited to 'server/vendor/guzzlehttp/promises/tests/EachPromiseTest.php')
-rw-r--r--server/vendor/guzzlehttp/promises/tests/EachPromiseTest.php48
1 files changed, 45 insertions, 3 deletions
diff --git a/server/vendor/guzzlehttp/promises/tests/EachPromiseTest.php b/server/vendor/guzzlehttp/promises/tests/EachPromiseTest.php
index 0a0a851..08af2a0 100644
--- a/server/vendor/guzzlehttp/promises/tests/EachPromiseTest.php
+++ b/server/vendor/guzzlehttp/promises/tests/EachPromiseTest.php
@@ -39,8 +39,8 @@ class EachPromiseTest extends \PHPUnit_Framework_TestCase
public function testIsWaitable()
{
- $a = new Promise(function () use (&$a) { $a->resolve('a'); });
- $b = new Promise(function () use (&$b) { $b->resolve('b'); });
+ $a = $this->createSelfResolvingPromise('a');
+ $b = $this->createSelfResolvingPromise('b');
$called = [];
$each = new EachPromise([$a, $b], [
'fulfilled' => function ($value) use (&$called) { $called[] = $value; }
@@ -54,7 +54,7 @@ class EachPromiseTest extends \PHPUnit_Framework_TestCase
public function testCanResolveBeforeConsumingAll()
{
$called = 0;
- $a = new Promise(function () use (&$a) { $a->resolve('a'); });
+ $a = $this->createSelfResolvingPromise('a');
$b = new Promise(function () { $this->fail(); });
$each = new EachPromise([$a, $b], [
'fulfilled' => function ($value, $idx, Promise $aggregate) use (&$called) {
@@ -291,4 +291,46 @@ class EachPromiseTest extends \PHPUnit_Framework_TestCase
}
$this->assertEquals(range(0, 9), $results);
}
+
+ private function createSelfResolvingPromise($value)
+ {
+ $p = new Promise(function () use (&$p, $value) {
+ $p->resolve($value);
+ });
+
+ return $p;
+ }
+
+ public function testMutexPreventsGeneratorRecursion()
+ {
+ $results = $promises = [];
+ for ($i = 0; $i < 20; $i++) {
+ $p = $this->createSelfResolvingPromise($i);
+ $pending[] = $p;
+ $promises[] = $p;
+ }
+
+ $iter = function () use (&$promises, &$pending) {
+ foreach ($promises as $promise) {
+ // Resolve a promises, which will trigger the then() function,
+ // which would cause the EachPromise to try to add more
+ // promises to the queue. Without a lock, this would trigger
+ // a "Cannot resume an already running generator" fatal error.
+ if ($p = array_pop($pending)) {
+ $p->wait();
+ }
+ yield $promise;
+ }
+ };
+
+ $each = new EachPromise($iter(), [
+ 'concurrency' => 5,
+ 'fulfilled' => function ($r) use (&$results, &$pending) {
+ $results[] = $r;
+ }
+ ]);
+
+ $each->promise()->wait();
+ $this->assertCount(20, $results);
+ }
}