22
33namespace React \Tests \HttpClient ;
44
5+ use Clue \React \Block ;
56use React \EventLoop \Factory ;
67use React \HttpClient \Client ;
78use React \HttpClient \Response ;
9+ use React \Promise \Deferred ;
10+ use React \Promise \Stream ;
811use React \Socket \Server ;
912use React \Socket \ConnectionInterface ;
1013
1114class FunctionalIntegrationTest extends TestCase
1215{
16+ /**
17+ * Test timeout to use for local tests.
18+ *
19+ * In practice this would be near 0.001s, but let's leave some time in case
20+ * the local system is currently busy.
21+ *
22+ * @var float
23+ */
24+ const TIMEOUT_LOCAL = 1.0 ;
25+
26+ /**
27+ * Test timeout to use for remote (internet) tests.
28+ *
29+ * In pratice this should be below 1s, but this relies on infrastructure
30+ * outside our control, so consider this a maximum to avoid running for hours.
31+ *
32+ * @var float
33+ */
34+ const TIMEOUT_REMOTE = 10.0 ;
35+
1336 public function testRequestToLocalhostEmitsSingleRemoteConnection ()
1437 {
1538 $ loop = Factory::create ();
@@ -24,9 +47,11 @@ public function testRequestToLocalhostEmitsSingleRemoteConnection()
2447
2548 $ client = new Client ($ loop );
2649 $ request = $ client ->request ('GET ' , 'http://localhost: ' . $ port );
50+
51+ $ promise = Stream \first ($ request , 'close ' );
2752 $ request ->end ();
2853
29- $ loop-> run ( );
54+ Block \await ( $ promise , $ loop, self :: TIMEOUT_LOCAL );
3055 }
3156
3257 public function testRequestLegacyHttpServerWithOnlyLineFeedReturnsSuccessfulResponse ()
@@ -47,9 +72,10 @@ public function testRequestLegacyHttpServerWithOnlyLineFeedReturnsSuccessfulResp
4772 $ response ->on ('data ' , $ once );
4873 });
4974
75+ $ promise = Stream \first ($ request , 'close ' );
5076 $ request ->end ();
5177
52- $ loop-> run ( );
78+ Block \await ( $ promise , $ loop, self :: TIMEOUT_LOCAL );
5379 }
5480
5581 /** @group internet */
@@ -65,9 +91,10 @@ public function testSuccessfulResponseEmitsEnd()
6591 $ response ->on ('end ' , $ once );
6692 });
6793
94+ $ promise = Stream \first ($ request , 'close ' );
6895 $ request ->end ();
6996
70- $ loop-> run ( );
97+ Block \await ( $ promise , $ loop, self :: TIMEOUT_REMOTE );
7198 }
7299
73100 /** @group internet */
@@ -79,19 +106,17 @@ public function testPostDataReturnsData()
79106 $ data = str_repeat ('. ' , 33000 );
80107 $ request = $ client ->request ('POST ' , 'https:// ' . (mt_rand (0 , 1 ) === 0 ? 'eu. ' : '' ) . 'httpbin.org/post ' , array ('Content-Length ' => strlen ($ data )));
81108
82- $ buffer = '' ;
83- $ request ->on ('response ' , function (Response $ response ) use (&$ buffer ) {
84- $ response ->on ('data ' , function ($ chunk ) use (&$ buffer ) {
85- $ buffer .= $ chunk ;
86- });
109+ $ deferred = new Deferred ();
110+ $ request ->on ('response ' , function (Response $ response ) use ($ deferred ) {
111+ $ deferred ->resolve (Stream \buffer ($ response ));
87112 });
88113
89114 $ request ->on ('error ' , 'printf ' );
90115 $ request ->on ('error ' , $ this ->expectCallableNever ());
91116
92117 $ request ->end ($ data );
93118
94- $ loop -> run ( );
119+ $ buffer = Block \await ( $ deferred -> promise (), $ loop , self :: TIMEOUT_REMOTE );
95120
96121 $ this ->assertNotEquals ('' , $ buffer );
97122
@@ -110,19 +135,17 @@ public function testPostJsonReturnsData()
110135 $ data = json_encode (array ('numbers ' => range (1 , 50 )));
111136 $ request = $ client ->request ('POST ' , 'https://httpbin.org/post ' , array ('Content-Length ' => strlen ($ data ), 'Content-Type ' => 'application/json ' ));
112137
113- $ buffer = '' ;
114- $ request ->on ('response ' , function (Response $ response ) use (&$ buffer ) {
115- $ response ->on ('data ' , function ($ chunk ) use (&$ buffer ) {
116- $ buffer .= $ chunk ;
117- });
138+ $ deferred = new Deferred ();
139+ $ request ->on ('response ' , function (Response $ response ) use ($ deferred ) {
140+ $ deferred ->resolve (Stream \buffer ($ response ));
118141 });
119142
120143 $ request ->on ('error ' , 'printf ' );
121144 $ request ->on ('error ' , $ this ->expectCallableNever ());
122145
123146 $ request ->end ($ data );
124147
125- $ loop -> run ( );
148+ $ buffer = Block \await ( $ deferred -> promise (), $ loop , self :: TIMEOUT_REMOTE );
126149
127150 $ this ->assertNotEquals ('' , $ buffer );
128151
@@ -142,7 +165,5 @@ public function testCancelPendingConnectionEmitsClose()
142165 $ request ->on ('close ' , $ this ->expectCallableOnce ());
143166 $ request ->end ();
144167 $ request ->close ();
145-
146- $ loop ->run ();
147168 }
148169}
0 commit comments