/** * @dataProvider requestList */ public function testQueueLimitsNumberOfProcessingRequests(array $queueData, $expectedDuration, $throttleLimit, $threshold = 0.05) { $handler = new HandlerStack(new LoopHandler()); $handler->push(ThrottleMiddleware::create()); $client = new \GuzzleHttp\Client(['handler' => $handler, 'base_uri' => Server::$url, 'timeout' => 10]); $queueEnd = $promises = $responses = $expectedStart = []; Server::start(); Server::enqueue(array_fill(0, count($queueData), new Response())); foreach ($queueData as $queueItem) { list($queueId, $requestDuration, $expectedStartTime) = $queueItem; $options = [RequestOptions::HTTP_ERRORS => false, RequestOptions::HEADERS => ['duration' => $requestDuration], 'throttle_id' => $queueId, 'throttle_limit' => $throttleLimit]; $expectedStart[$queueId] = $expectedStartTime; $promises[] = $client->getAsync('', $options)->then(function () use($queueId, &$queueStart, &$queueEnd) { if (!isset($queueStart[$queueId])) { $queueStart[$queueId] = microtime(true); } $queueEnd[$queueId] = microtime(true); }); } $start = microtime(true); $GLOBALS['s'] = microtime(1); \GuzzleHttp\Promise\all($promises)->wait(); $duration = microtime(true) - $start; $this->assertGreaterThan($expectedDuration - $threshold, $duration); $this->assertLessThan($expectedDuration + $threshold, $duration); foreach ($queueEnd as $i => $endedAt) { $duration = $endedAt - $start; // $this->assertGreaterThan($expectedDuration - $threshold, $endedAt - $start, "Queue #$i started too soon"); // $this->assertLessThan($queueInfo->getExpectedDuration() + $threshold, $queueInfo->getDuration(), "Queue #$i started too late"); // // $this->assertGreaterThan($started + $queueInfo->getExpectedDelay() - $threshold, $queueInfo->getStartedAt(), "Queue #$i popped too early"); // $this->assertLessThan($started + $queueInfo->getExpectedDelay() + $threshold, $queueInfo->getStartedAt(), "Queue #$i popped too late"); } }