23
23
import java .io .PrintWriter ;
24
24
import java .util .Set ;
25
25
import java .util .concurrent .ConcurrentHashMap ;
26
- import java .util .concurrent .CountDownLatch ;
27
26
import java .util .concurrent .ExecutionException ;
28
27
import java .util .concurrent .ExecutorService ;
29
28
import java .util .concurrent .Executors ;
@@ -64,7 +63,7 @@ private TestStream newStream(
64
63
65
64
@ Test
66
65
public void testShutdown_notBlockedBySend () throws InterruptedException , ExecutionException {
67
- TestCallStreamObserver callStreamObserver = new TestCallStreamObserver ( /* waitForSend= */ true );
66
+ TestCallStreamObserver callStreamObserver = TestCallStreamObserver . notReady ( );
68
67
Function <StreamObserver <Integer >, StreamObserver <Integer >> clientFactory =
69
68
ignored -> callStreamObserver ;
70
69
@@ -73,21 +72,24 @@ public void testShutdown_notBlockedBySend() throws InterruptedException, Executi
73
72
ExecutorService sendExecutor = Executors .newSingleThreadExecutor ();
74
73
Future <WindmillStreamShutdownException > sendFuture =
75
74
sendExecutor .submit (
76
- () ->
77
- assertThrows (WindmillStreamShutdownException .class , () -> testStream .testSend (1 )));
78
- testStream .shutdown ();
75
+ () -> {
76
+ // Send a few times to trigger blocking in the CallStreamObserver.
77
+ testStream .testSend ();
78
+ testStream .testSend ();
79
+ return assertThrows (WindmillStreamShutdownException .class , testStream ::testSend );
80
+ });
81
+
82
+ // Wait for 1 send since it always goes through, the rest may buffer.
83
+ callStreamObserver .waitForSends (1 );
79
84
80
- // Sleep a bit to give sendExecutor time to execute the send().
81
- Uninterruptibles .sleepUninterruptibly (100 , TimeUnit .MILLISECONDS );
85
+ testStream .shutdown ();
82
86
83
- callStreamObserver .unblockSend ();
84
87
assertThat (sendFuture .get ()).isInstanceOf (WindmillStreamShutdownException .class );
85
88
}
86
89
87
90
@ Test
88
91
public void testMaybeScheduleHealthCheck () {
89
- TestCallStreamObserver callStreamObserver =
90
- new TestCallStreamObserver (/* waitForSend= */ false );
92
+ TestCallStreamObserver callStreamObserver = TestCallStreamObserver .create ();
91
93
Function <StreamObserver <Integer >, StreamObserver <Integer >> clientFactory =
92
94
ignored -> callStreamObserver ;
93
95
@@ -103,8 +105,7 @@ public void testMaybeScheduleHealthCheck() {
103
105
104
106
@ Test
105
107
public void testMaybeSendHealthCheck_doesNotSendIfLastScheduleLessThanThreshold () {
106
- TestCallStreamObserver callStreamObserver =
107
- new TestCallStreamObserver (/* waitForSend= */ false );
108
+ TestCallStreamObserver callStreamObserver = TestCallStreamObserver .create ();
108
109
Function <StreamObserver <Integer >, StreamObserver <Integer >> clientFactory =
109
110
ignored -> callStreamObserver ;
110
111
@@ -171,8 +172,8 @@ protected boolean hasPendingRequests() {
171
172
@ Override
172
173
protected void startThrottleTimer () {}
173
174
174
- public void testSend (Integer i ) throws WindmillStreamShutdownException {
175
- trySend (i );
175
+ private void testSend () throws WindmillStreamShutdownException {
176
+ trySend (1 );
176
177
}
177
178
178
179
@ Override
@@ -201,38 +202,24 @@ protected void shutdownInternal() {}
201
202
202
203
private static class TestCallStreamObserver extends CallStreamObserver <Integer > {
203
204
private static final Logger LOG = LoggerFactory .getLogger (AbstractWindmillStreamTest .class );
204
- private final CountDownLatch sendBlocker = new CountDownLatch (1 );
205
205
private final AtomicInteger numSends = new AtomicInteger ();
206
+ private final boolean isReady ;
206
207
207
- private final boolean waitForSend ;
208
-
209
- private TestCallStreamObserver (boolean waitForSend ) {
210
- this .waitForSend = waitForSend ;
208
+ private TestCallStreamObserver (boolean isReady ) {
209
+ this .isReady = isReady ;
211
210
}
212
211
213
- private void unblockSend () {
214
- sendBlocker . countDown ( );
212
+ private static TestCallStreamObserver create () {
213
+ return new TestCallStreamObserver ( true );
215
214
}
216
215
217
- private void waitForSendUnblocked () {
218
- try {
219
- int waitedMillis = 0 ;
220
- while (!sendBlocker .await (100 , TimeUnit .MILLISECONDS )) {
221
- waitedMillis += 100 ;
222
- LOG .info ("Waiting from send to be unblocked for {}ms" , waitedMillis );
223
- }
224
- } catch (InterruptedException e ) {
225
- LOG .error ("Interrupted waiting for send()." );
226
- }
216
+ private static TestCallStreamObserver notReady () {
217
+ return new TestCallStreamObserver (false );
227
218
}
228
219
229
220
@ Override
230
221
public void onNext (Integer integer ) {
231
- if (waitForSend ) {
232
- waitForSendUnblocked ();
233
- } else {
234
- numSends .incrementAndGet ();
235
- }
222
+ numSends .incrementAndGet ();
236
223
}
237
224
238
225
private void waitForSends (int expectedSends ) {
@@ -253,7 +240,7 @@ public void onCompleted() {}
253
240
254
241
@ Override
255
242
public boolean isReady () {
256
- return true ;
243
+ return isReady ;
257
244
}
258
245
259
246
@ Override
0 commit comments