CurlMultiHandlerTest.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <?php
  2. namespace GuzzleHttp\Tests\Handler;
  3. use GuzzleHttp\Exception\ConnectException;
  4. use GuzzleHttp\Handler\CurlMultiHandler;
  5. use GuzzleHttp\Promise as P;
  6. use GuzzleHttp\Psr7\Request;
  7. use GuzzleHttp\Psr7\Response;
  8. use GuzzleHttp\Tests\Helpers;
  9. use GuzzleHttp\Tests\Server;
  10. use GuzzleHttp\Utils;
  11. use PHPUnit\Framework\TestCase;
  12. class CurlMultiHandlerTest extends TestCase
  13. {
  14. public function setUp(): void
  15. {
  16. $_SERVER['curl_test'] = true;
  17. unset($_SERVER['_curl_multi']);
  18. }
  19. public function tearDown(): void
  20. {
  21. unset($_SERVER['_curl_multi'], $_SERVER['curl_test']);
  22. }
  23. public function testCanAddCustomCurlOptions()
  24. {
  25. Server::flush();
  26. Server::enqueue([new Response()]);
  27. $a = new CurlMultiHandler(['options' => [
  28. \CURLMOPT_MAXCONNECTS => 5,
  29. ]]);
  30. $request = new Request('GET', Server::$url);
  31. $a($request, []);
  32. self::assertEquals(5, $_SERVER['_curl_multi'][\CURLMOPT_MAXCONNECTS]);
  33. }
  34. public function testSendsRequest()
  35. {
  36. Server::enqueue([new Response()]);
  37. $a = new CurlMultiHandler();
  38. $request = new Request('GET', Server::$url);
  39. $response = $a($request, [])->wait();
  40. self::assertSame(200, $response->getStatusCode());
  41. }
  42. public function testCreatesExceptions()
  43. {
  44. $a = new CurlMultiHandler();
  45. $this->expectException(ConnectException::class);
  46. $this->expectExceptionMessage('cURL error');
  47. $a(new Request('GET', 'http://localhost:123'), [])->wait();
  48. }
  49. public function testCanSetSelectTimeout()
  50. {
  51. $a = new CurlMultiHandler(['select_timeout' => 2]);
  52. self::assertEquals(2, Helpers::readObjectAttribute($a, 'selectTimeout'));
  53. }
  54. public function testCanCancel()
  55. {
  56. Server::flush();
  57. $response = new Response(200);
  58. Server::enqueue(\array_fill_keys(\range(0, 10), $response));
  59. $a = new CurlMultiHandler();
  60. $responses = [];
  61. for ($i = 0; $i < 10; ++$i) {
  62. $response = $a(new Request('GET', Server::$url), []);
  63. $response->cancel();
  64. $responses[] = $response;
  65. }
  66. foreach ($responses as $r) {
  67. self::assertTrue(P\Is::rejected($r));
  68. }
  69. }
  70. public function testCannotCancelFinished()
  71. {
  72. Server::flush();
  73. Server::enqueue([new Response(200)]);
  74. $a = new CurlMultiHandler();
  75. $response = $a(new Request('GET', Server::$url), []);
  76. $response->wait();
  77. $response->cancel();
  78. self::assertTrue(P\Is::fulfilled($response));
  79. }
  80. public function testDelaysConcurrently()
  81. {
  82. Server::flush();
  83. Server::enqueue([new Response()]);
  84. $a = new CurlMultiHandler();
  85. $expected = Utils::currentTime() + (100 / 1000);
  86. $response = $a(new Request('GET', Server::$url), ['delay' => 100]);
  87. $response->wait();
  88. self::assertGreaterThanOrEqual($expected, Utils::currentTime());
  89. }
  90. public function testUsesTimeoutEnvironmentVariables()
  91. {
  92. unset($_SERVER['GUZZLE_CURL_SELECT_TIMEOUT']);
  93. \putenv('GUZZLE_CURL_SELECT_TIMEOUT=');
  94. try {
  95. $a = new CurlMultiHandler();
  96. // Default if no options are given and no environment variable is set
  97. self::assertEquals(1, Helpers::readObjectAttribute($a, 'selectTimeout'));
  98. \putenv('GUZZLE_CURL_SELECT_TIMEOUT=3');
  99. $a = new CurlMultiHandler();
  100. // Handler reads from the environment if no options are given
  101. self::assertEquals(3, Helpers::readObjectAttribute($a, 'selectTimeout'));
  102. } finally {
  103. \putenv('GUZZLE_CURL_SELECT_TIMEOUT=');
  104. }
  105. }
  106. public function throwsWhenAccessingInvalidProperty()
  107. {
  108. $h = new CurlMultiHandler();
  109. $this->expectException(\BadMethodCallException::class);
  110. $h->foo;
  111. }
  112. }