MiddlewareTest.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. // @codingStandardsIgnoreStart
  3. // phpcs:disable PSR1.Classes.ClassDeclaration.MultipleClasses
  4. namespace Qiniu\Tests;
  5. use PHPUnit\Framework\TestCase;
  6. use Qiniu\Http\Client;
  7. use Qiniu\Http\Request;
  8. use Qiniu\Http\Middleware;
  9. use Qiniu\Http\RequestOptions;
  10. class RecorderMiddleware implements Middleware\Middleware
  11. {
  12. /**
  13. * @var array<string>
  14. */
  15. private $orderRecorder;
  16. /**
  17. * @var string
  18. */
  19. private $label;
  20. public function __construct(&$orderRecorder, $label)
  21. {
  22. $this->orderRecorder =& $orderRecorder;
  23. $this->label = $label;
  24. }
  25. public function send($request, $next)
  26. {
  27. $this->orderRecorder[] = "bef_" . $this->label . count($this->orderRecorder);
  28. $response = $next($request);
  29. $this->orderRecorder[] = "aft_" . $this->label . count($this->orderRecorder);
  30. return $response;
  31. }
  32. }
  33. class MiddlewareTest extends TestCase
  34. {
  35. public function testSendWithMiddleware()
  36. {
  37. $orderRecorder = array();
  38. $reqOpt = new RequestOptions();
  39. $reqOpt->middlewares = array(
  40. new RecorderMiddleware($orderRecorder, "A"),
  41. new RecorderMiddleware($orderRecorder, "B")
  42. );
  43. $request = new Request(
  44. "GET",
  45. "https://qiniu.com/index.html",
  46. array(),
  47. null,
  48. $reqOpt
  49. );
  50. $response = Client::sendRequestWithMiddleware($request);
  51. $expectRecords = array(
  52. "bef_A0",
  53. "bef_B1",
  54. "aft_B2",
  55. "aft_A3"
  56. );
  57. $this->assertEquals($expectRecords, $orderRecorder);
  58. $this->assertEquals(200, $response->statusCode);
  59. }
  60. public function testSendWithRetryDomains()
  61. {
  62. $orderRecorder = array();
  63. $reqOpt = new RequestOptions();
  64. $reqOpt->middlewares = array(
  65. new Middleware\RetryDomainsMiddleware(
  66. array(
  67. "unavailable.phpsdk.qiniu.com",
  68. "qiniu.com",
  69. ),
  70. 3
  71. ),
  72. new RecorderMiddleware($orderRecorder, "rec")
  73. );
  74. $request = new Request(
  75. "GET",
  76. "https://fake.phpsdk.qiniu.com/index.html",
  77. array(),
  78. null,
  79. $reqOpt
  80. );
  81. $response = Client::sendRequestWithMiddleware($request);
  82. $expectRecords = array(
  83. // 'fake.phpsdk.qiniu.com' with retried 3 times
  84. 'bef_rec0',
  85. 'aft_rec1',
  86. 'bef_rec2',
  87. 'aft_rec3',
  88. 'bef_rec4',
  89. 'aft_rec5',
  90. // 'unavailable.pysdk.qiniu.com' with retried 3 times
  91. 'bef_rec6',
  92. 'aft_rec7',
  93. 'bef_rec8',
  94. 'aft_rec9',
  95. 'bef_rec10',
  96. 'aft_rec11',
  97. // 'qiniu.com' and it's success
  98. 'bef_rec12',
  99. 'aft_rec13'
  100. );
  101. $this->assertEquals($expectRecords, $orderRecorder);
  102. $this->assertEquals(200, $response->statusCode);
  103. }
  104. public function testSendFailFastWithRetryDomains()
  105. {
  106. $orderRecorder = array();
  107. $reqOpt = new RequestOptions();
  108. $reqOpt->middlewares = array(
  109. new Middleware\RetryDomainsMiddleware(
  110. array(
  111. "unavailable.phpsdk.qiniu.com",
  112. "qiniu.com",
  113. ),
  114. 3,
  115. function () {
  116. return false;
  117. }
  118. ),
  119. new RecorderMiddleware($orderRecorder, "rec")
  120. );
  121. $request = new Request(
  122. "GET",
  123. "https://fake.phpsdk.qiniu.com/index.html",
  124. array(),
  125. null,
  126. $reqOpt
  127. );
  128. $response = Client::sendRequestWithMiddleware($request);
  129. $expectRecords = array(
  130. // 'fake.phpsdk.qiniu.com' will fail fast
  131. 'bef_rec0',
  132. 'aft_rec1'
  133. );
  134. $this->assertEquals($expectRecords, $orderRecorder);
  135. $this->assertEquals(-1, $response->statusCode);
  136. }
  137. }