private function runConnectionTest($queue, $stream, $msg, $statusCode = null)
 {
     $obj = new \stdClass();
     $er = null;
     $client = new Client();
     $request = $client->createRequest('PUT', Server::$url, ['body' => $stream]);
     $request->getEmitter()->on('error', function (ErrorEvent $e) use(&$er) {
         $er = $e;
     });
     $transaction = $this->getMockBuilder('GuzzleHttp\\Adapter\\Transaction')->setMethods(['getResponse', 'setResponse'])->setConstructorArgs([$client, $request])->getMock();
     $transaction->expects($this->any())->method('setResponse')->will($this->returnCallback(function ($r) use(&$obj) {
         $obj->res = $r;
     }));
     $transaction->expects($this->any())->method('getResponse')->will($this->returnCallback(function () use($obj, &$called) {
         $caller = debug_backtrace()[6]['function'];
         if ($caller == 'addHandle') {
             return null;
         } elseif ($caller == 'validateResponseWasSet') {
             return ++$called == 2 ? $obj->res : null;
         } else {
             return $obj->res;
         }
     }));
     $a = new MultiAdapter(new MessageFactory());
     Server::flush();
     Server::enqueue($queue);
     $a->sendAll(new \ArrayIterator([$transaction]), 10);
     if ($msg) {
         $this->assertNotNull($er);
         $this->assertContains($msg, $er->getException()->getMessage());
     } else {
         $this->assertEquals($statusCode, $transaction->getResponse()->getStatusCode());
     }
 }
 public function testThrowsImmediatelyWhenInstructed()
 {
     Server::flush();
     Server::enqueue(["HTTP/1.1 501\r\nContent-Length: 0\r\n\r\n"]);
     $c = new Client(['base_url' => Server::$url]);
     $request = $c->createRequest('GET', '/');
     $request->getEmitter()->on('error', function (ErrorEvent $e) {
         $e->throwImmediately(true);
     });
     $transactions = [new Transaction($c, $request)];
     $a = new MultiAdapter(new MessageFactory());
     try {
         $a->sendAll(new \ArrayIterator($transactions), 1);
         $this->fail('Did not throw');
     } catch (RequestException $e) {
         $this->assertSame($request, $e->getRequest());
     }
 }
 public function testCreatesAndReleasesHandlesWhenNeeded()
 {
     $a = new MultiAdapter(new MessageFactory());
     $c = new Client(['adapter' => $a, 'base_url' => Server::$url]);
     Server::flush();
     Server::enqueue(["HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"]);
     $ef = function (ErrorEvent $e) {
         throw $e->getException();
     };
     $request1 = $c->createRequest('GET', '/');
     $request1->getEmitter()->on('headers', function () use($a, $c, $ef) {
         $a->send(new Transaction($c, $c->createRequest('GET', '/', ['events' => ['headers' => function () use($a, $c, $ef) {
             $r = $c->createRequest('GET', '/', ['events' => ['error' => ['fn' => $ef, 'priority' => 9999]]]);
             $r->getEmitter()->once('headers', function () use($a, $c, $r) {
                 $a->send(new Transaction($c, $r));
             });
             $a->send(new Transaction($c, $r));
             // Now, reuse an existing handle
             $a->send(new Transaction($c, $r));
         }, 'error' => ['fn' => $ef, 'priority' => 9999]]])));
     });
     $request1->getEmitter()->on('error', $ef);
     $transactions = [new Transaction($c, $request1), new Transaction($c, $c->createRequest('PUT')), new Transaction($c, $c->createRequest('HEAD'))];
     $a->sendAll(new \ArrayIterator($transactions), 2);
     foreach ($transactions as $index => $t) {
         $response = $t->getResponse();
         $this->assertInstanceOf('GuzzleHttp\\Message\\ResponseInterface', $response, 'Transaction at index ' . $index . ' did not populate response');
         $this->assertEquals(200, $response->getStatusCode());
     }
 }