summaryrefslogtreecommitdiff
path: root/server/vendor/guzzlehttp/promises/tests/EachPromiseTest.php
diff options
context:
space:
mode:
authorroot <root@kabir-PC>2016-03-23 11:31:51 +0100
committerroot <root@kabir-PC>2016-03-23 11:31:51 +0100
commita26989103d70fb0dd3ff6834de107cae246778c3 (patch)
tree0f243c83b790ffb57f19261fc2a509131f6776ce /server/vendor/guzzlehttp/promises/tests/EachPromiseTest.php
parent1342db60283cb61a1c3810993575d35b9fb33ac0 (diff)
parent6e78d76f887d1149ea85bfb06db7ee7ad7435f5a (diff)
Merge branch 'develop' of https://github.com/manzerbredes/istic-openstack into develop
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);
+ }
}