public function test_integration_ShouldHonorWaitingTimes()
 {
     /*
      * Scenario:
      * 7 requests, 3 proxies
      * 1 - proxy_0 => successful request
      * 2 - proxy_1 => successful request
      * 3 - proxy_2 => successful request
      * 4 - proxy_0 => has to wait 5 seconds
      *   - proxy_2 => successful request
      * 5 - proxy_1 => has to wait 24 seconds
      *   - proxy_2 => has to wait 1 seconds
      *   - proxy_0 => failed request
      * 6 - proxy_2 => successful request
      * 7 - proxy_2 => has to wait 5 seconds
      *   - proxy_1 => has to wait 4 seconds
      *   - proxy_0 => has to wait 3 seconds
      * // sleep for 3 seconds - test by event
      *   - proxy_1 => has to wait 1 seconds
      *   - proxy_2 => has to wait 2 seconds
      *   - proxy_0 => successful request
      */
     $client = new Client();
     $numbers = [10, 0, 10];
     $times = [5, 10, 10, 20, 23, 30, 30, 30, 35];
     $h = $this->getHelper($numbers, $times);
     $interval = new RandomTimeInterval(0, 15, $h->getRandomMock(), $h->getTimeMock());
     $proxy0 = new RotatingProxy("0", null, 5, 10, $interval);
     $numbers = [29];
     $times = [5, 10, 10, 30, 30, 33, 33];
     $h = $this->getHelper($numbers, $times);
     $interval = new RandomTimeInterval(0, 15, $h->getRandomMock(), $h->getTimeMock());
     $proxy1 = new RotatingProxy("1", null, 5, 10, $interval);
     $numbers = [5, 8, 10];
     $times = [5, 10, 13, 20, 20, 25, 25, 30, 30, 33, 33];
     $h = $this->getHelper($numbers, $times);
     $interval = new RandomTimeInterval(0, 15, $h->getRandomMock(), $h->getTimeMock());
     $proxy2 = new RotatingProxy("2", null, 5, 10, $interval);
     $proxies = [$proxy0->getProxyString() => $proxy0, $proxy1->getProxyString() => $proxy1, $proxy2->getProxyString() => $proxy2];
     $success = true;
     $fail = false;
     $responses2Proxy = [[$success, $proxy0], [$success, $proxy1], [$success, $proxy2], [null, $proxy0], [$success, $proxy2], [null, $proxy1], [null, $proxy2], [$fail, $proxy0], [$success, $proxy2], [null, $proxy2], [null, $proxy1], [null, $proxy0], [null, $proxy1], [null, $proxy2], [$success, $proxy0]];
     $randKeys = [];
     $responses = [];
     foreach ($responses2Proxy as $key => $val) {
         $randKeys[] = array_search($val[1], $proxies);
         if ($val[0] !== null) {
             $responses[] = $val[0] ? new Response(200) : new Response(403);
         }
     }
     $h = $this->getHelper(null, null, $randKeys);
     $useOwnIp = false;
     $rotator = new ProxyRotator($proxies, $useOwnIp, $h->getRandomMock());
     $sub = new RotatingProxySubscriber($rotator);
     $mock = new Mock($responses);
     // Add the mock subscriber to the client.
     $client->getEmitter()->attach($mock);
     $client->getEmitter()->attach($sub);
     // build requests - we need to do this _after_ the $mock hast been attached to the client,
     // otherwise a real request is sent.
     $requests = [];
     foreach ($responses as $key => $val) {
         $req = $client->createRequest("GET");
         $req->getConfig()->set("request_id", $key);
         $requests[$key] = $req;
     }
     $checkState = function ($curProxy) use(&$responses2Proxy) {
         while (count($responses2Proxy) > 0) {
             $el = array_shift($responses2Proxy);
             if ($el === null) {
                 break;
             }
             if ($el[0] !== null) {
                 $this->assertEquals($curProxy, $el[1]->getProxyString());
                 break;
             }
         }
     };
     $sucFn = function (RequestInterface $request) use($checkState) {
         $proxy = $request->getConfig()->get("proxy");
         $checkState($proxy);
         //            echo "Success at request ".($request->getConfig()->get("request_id")+1)." using proxy ".$proxy."\n";
     };
     $errFn = function (RequestInterface $request, Exception $e) use($checkState) {
         $proxy = $request->getConfig()->get("proxy");
         $checkState($proxy);
         //            echo "Error at request ".($request->getConfig()->get("request_id")+1)." using proxy ".$proxy.": ".$e->getMessage()."\n";
     };
     $options = ["complete" => function (CompleteEvent $ev) use($sucFn) {
         $sucFn($ev->getRequest());
     }, "error" => function (ErrorEvent $ev) use($errFn) {
         $errFn($ev->getRequest(), $ev->getException());
     }];
     $pool = new Pool($client, $requests, $options);
     $pool->wait();
 }
 /**
  * @param RequestInterface $request
  * @return RequestInterface
  */
 public function setupRequest(RequestInterface $request)
 {
     $identitiy = $this->getCurrentIdentity();
     if ($identitiy->getCookieJar() != null) {
         //todo
         // this seems pretty hacky... is there a better way to replace the cookie container of a request?
         // > Currently not @see https://github.com/guzzle/guzzle/issues/1028#issuecomment-96253542 - maybe with Guzzle 6
         // remove current cookie subscribers
         $emitter = $request->getEmitter();
         foreach ($emitter->listeners("complete") as $listener) {
             if (is_array($listener) && $listener[0] instanceof Cookie) {
                 $emitter->detach($listener[0]);
             }
         }
         // set new Cookie subscriber
         $cookie = new Cookie($identitiy->getCookieJar());
         $emitter->attach($cookie);
     }
     if ($identitiy->getUserAgent() != null) {
         $request->setHeader("user-agent", $identitiy->getUserAgent());
     }
     $headers = $identitiy->getDefaultRequestHeaders();
     if ($headers != null) {
         foreach ($headers as $key => $val) {
             $request->setHeader($key, $val);
         }
     }
     if ($identitiy->getReferer() != null && trim($identitiy->getReferer()) != "") {
         $request->setHeader("referer", $identitiy->getReferer());
     }
     $request = parent::setupRequest($request);
     return $request;
 }
 public function test_ShouldCallRestart()
 {
     $timeMock = $this->getMock(TimeIntervalInterface::class);
     $timeMock->expects($this->once())->method("restart");
     /** @var TimeIntervalInterface $timeMock */
     $rp = new RotatingProxy("test", null, -1, -1, $timeMock);
     $rp->restartWaitingTime();
 }