@@ -199,6 +199,53 @@ public StreamObserver<Integer> invoke(StreamObserver<Integer> responseObserver)
199
199
callObserver .get ().onCompleted ();
200
200
}
201
201
202
+ @ Test
203
+ public void onCloseHandlerCalledIfSetInStreamingClientCall () throws Exception {
204
+ final AtomicBoolean onCloseHandlerCalled = new AtomicBoolean ();
205
+ ServerCallHandler <Integer , Integer > callHandler = ServerCalls .asyncBidiStreamingCall (
206
+ new ServerCalls .BidiStreamingMethod <Integer , Integer >() {
207
+ @ Override
208
+ public StreamObserver <Integer > invoke (StreamObserver <Integer > responseObserver ) {
209
+ ServerCallStreamObserver <Integer > serverCallObserver =
210
+ (ServerCallStreamObserver <Integer >) responseObserver ;
211
+ serverCallObserver .setOnCloseHandler (new Runnable () {
212
+ @ Override
213
+ public void run () {
214
+ onCloseHandlerCalled .set (true );
215
+ }
216
+ });
217
+ return new ServerCalls .NoopStreamObserver <>();
218
+ }
219
+ });
220
+ ServerCall .Listener <Integer > callListener = callHandler .startCall (serverCall , new Metadata ());
221
+ callListener .onComplete ();
222
+ assertTrue (onCloseHandlerCalled .get ());
223
+ }
224
+
225
+ @ Test
226
+ public void onCloseHandlerCalledIfSetInUnaryClientCall () throws Exception {
227
+ final AtomicBoolean onCloseHandlerCalled = new AtomicBoolean ();
228
+ ServerCallHandler <Integer , Integer > callHandler = ServerCalls .asyncServerStreamingCall (
229
+ new ServerCalls .ServerStreamingMethod <Integer , Integer >() {
230
+ @ Override
231
+ public void invoke (Integer request , StreamObserver <Integer > responseObserver ) {
232
+ ServerCallStreamObserver <Integer > serverCallObserver =
233
+ (ServerCallStreamObserver <Integer >) responseObserver ;
234
+ serverCallObserver .setOnCloseHandler (new Runnable () {
235
+ @ Override
236
+ public void run () {
237
+ onCloseHandlerCalled .set (true );
238
+ }
239
+ });
240
+ }
241
+ });
242
+ ServerCall .Listener <Integer > callListener = callHandler .startCall (serverCall , new Metadata ());
243
+ callListener .onMessage (0 );
244
+ callListener .onHalfClose ();
245
+ callListener .onComplete ();
246
+ assertTrue (onCloseHandlerCalled .get ());
247
+ }
248
+
202
249
@ Test
203
250
public void cannotSetOnCancelHandlerAfterServiceInvocation () throws Exception {
204
251
final AtomicReference <ServerCallStreamObserver <Integer >> callObserver =
@@ -255,6 +302,31 @@ public void run() {
255
302
}
256
303
}
257
304
305
+ @ Test
306
+ public void cannotSetOnCloseHandlerAfterServiceInvocation () throws Exception {
307
+ final AtomicReference <ServerCallStreamObserver <Integer >> callObserver = new AtomicReference <>();
308
+ ServerCallHandler <Integer , Integer > callHandler = ServerCalls .asyncBidiStreamingCall (
309
+ new ServerCalls .BidiStreamingMethod <Integer , Integer >() {
310
+ @ Override
311
+ public StreamObserver <Integer > invoke (StreamObserver <Integer > responseObserver ) {
312
+ callObserver .set ((ServerCallStreamObserver <Integer >) responseObserver );
313
+ return new ServerCalls .NoopStreamObserver <>();
314
+ }
315
+ });
316
+ ServerCall .Listener <Integer > callListener = callHandler .startCall (serverCall , new Metadata ());
317
+ callListener .onMessage (1 );
318
+ try {
319
+ callObserver .get ().setOnCloseHandler (new Runnable () {
320
+ @ Override
321
+ public void run () {
322
+ }
323
+ });
324
+ fail ("Cannot set onReady after service invocation" );
325
+ } catch (IllegalStateException expected ) {
326
+ // Expected
327
+ }
328
+ }
329
+
258
330
@ Test
259
331
public void cannotDisableAutoRequestAfterServiceInvocation () throws Exception {
260
332
final AtomicReference <ServerCallStreamObserver <Integer >> callObserver =
0 commit comments