4040import static org .junit .Assert .fail ;
4141import static org .junit .Assume .assumeTrue ;
4242import static org .mockito .Matchers .any ;
43+ import static org .mockito .Matchers .anyBoolean ;
4344import static org .mockito .Matchers .eq ;
4445import static org .mockito .Matchers .same ;
4546import static org .mockito .Mockito .doAnswer ;
@@ -226,6 +227,7 @@ public void serverNotListening() {
226227 assertCodeEquals (Status .UNAVAILABLE , statusCaptor .getValue ());
227228 inOrder .verify (mockClientTransportListener ).transportTerminated ();
228229 verify (mockClientTransportListener , never ()).transportReady ();
230+ verify (mockClientTransportListener , never ()).transportInUse (anyBoolean ());
229231 }
230232
231233 @ Test
@@ -238,6 +240,7 @@ public void clientStartStop() throws Exception {
238240 inOrder .verify (mockClientTransportListener ).transportShutdown (statusCaptor .capture ());
239241 assertCodeEquals (Status .UNAVAILABLE , statusCaptor .getValue ());
240242 inOrder .verify (mockClientTransportListener ).transportTerminated ();
243+ verify (mockClientTransportListener , never ()).transportInUse (anyBoolean ());
241244 }
242245
243246 @ Test
@@ -256,6 +259,7 @@ public void clientStartAndStopOnceConnected() throws Exception {
256259 server .shutdown ();
257260 assertTrue (serverListener .waitForShutdown (TIMEOUT_MS , TimeUnit .MILLISECONDS ));
258261 server = null ;
262+ verify (mockClientTransportListener , never ()).transportInUse (anyBoolean ());
259263 }
260264
261265 @ Test
@@ -277,6 +281,7 @@ public void openStreamPreventsTermination() throws Exception {
277281
278282 ClientStream clientStream = client .newStream (methodDescriptor , new Metadata ());
279283 clientStream .start (mockClientStreamListener );
284+ verify (mockClientTransportListener , timeout (TIMEOUT_MS )).transportInUse (true );
280285 StreamCreation serverStreamCreation
281286 = serverTransportListener .takeStreamOrFail (TIMEOUT_MS , TimeUnit .MILLISECONDS );
282287 ServerStream serverStream = serverStreamCreation .stream ;
@@ -307,11 +312,13 @@ public void openStreamPreventsTermination() throws Exception {
307312 verify (mockServerStreamListener , timeout (TIMEOUT_MS )).halfClosed ();
308313
309314 verify (mockClientTransportListener , never ()).transportTerminated ();
315+ verify (mockClientTransportListener , never ()).transportInUse (false );
310316 assertFalse (serverTransportListener .isTerminated ());
311317
312318 clientStream .cancel (Status .CANCELLED );
313319
314320 verify (mockClientTransportListener , timeout (TIMEOUT_MS )).transportTerminated ();
321+ verify (mockClientTransportListener , timeout (TIMEOUT_MS )).transportInUse (false );
315322 assertTrue (serverTransportListener .waitForTermination (TIMEOUT_MS , TimeUnit .MILLISECONDS ));
316323 }
317324
@@ -325,6 +332,7 @@ public void shutdownNowKillsClientStream() throws Exception {
325332
326333 ClientStream clientStream = client .newStream (methodDescriptor , new Metadata ());
327334 clientStream .start (mockClientStreamListener );
335+ verify (mockClientTransportListener , timeout (TIMEOUT_MS )).transportInUse (true );
328336 StreamCreation serverStreamCreation
329337 = serverTransportListener .takeStreamOrFail (TIMEOUT_MS , TimeUnit .MILLISECONDS );
330338 ServerStream serverStream = serverStreamCreation .stream ;
@@ -336,6 +344,7 @@ public void shutdownNowKillsClientStream() throws Exception {
336344
337345 verify (mockClientTransportListener , timeout (TIMEOUT_MS )).transportShutdown (any (Status .class ));
338346 verify (mockClientTransportListener , timeout (TIMEOUT_MS )).transportTerminated ();
347+ verify (mockClientTransportListener , timeout (TIMEOUT_MS )).transportInUse (false );
339348 assertTrue (serverTransportListener .waitForTermination (TIMEOUT_MS , TimeUnit .MILLISECONDS ));
340349 assertTrue (serverTransportListener .isTerminated ());
341350
@@ -354,6 +363,7 @@ public void shutdownNowKillsServerStream() throws Exception {
354363
355364 ClientStream clientStream = client .newStream (methodDescriptor , new Metadata ());
356365 clientStream .start (mockClientStreamListener );
366+ verify (mockClientTransportListener , timeout (TIMEOUT_MS )).transportInUse (true );
357367 StreamCreation serverStreamCreation
358368 = serverTransportListener .takeStreamOrFail (TIMEOUT_MS , TimeUnit .MILLISECONDS );
359369 ServerStream serverStream = serverStreamCreation .stream ;
@@ -364,6 +374,7 @@ public void shutdownNowKillsServerStream() throws Exception {
364374
365375 verify (mockClientTransportListener , timeout (TIMEOUT_MS )).transportShutdown (any (Status .class ));
366376 verify (mockClientTransportListener , timeout (TIMEOUT_MS )).transportTerminated ();
377+ verify (mockClientTransportListener , timeout (TIMEOUT_MS )).transportInUse (false );
367378 assertTrue (serverTransportListener .waitForTermination (TIMEOUT_MS , TimeUnit .MILLISECONDS ));
368379 assertTrue (serverTransportListener .isTerminated ());
369380
@@ -387,6 +398,7 @@ public void ping() throws Exception {
387398 assumeTrue (false );
388399 }
389400 verify (mockPingCallback , timeout (TIMEOUT_MS )).onSuccess (Matchers .anyInt ());
401+ verify (mockClientTransportListener , never ()).transportInUse (anyBoolean ());
390402 }
391403
392404 @ Test
@@ -470,9 +482,56 @@ public void newStream_afterTermination() throws Exception {
470482 stream .start (mockClientStreamListener );
471483 verify (mockClientStreamListener , timeout (TIMEOUT_MS ))
472484 .closed (statusCaptor .capture (), any (Metadata .class ));
485+ verify (mockClientTransportListener , never ()).transportInUse (anyBoolean ());
473486 assertCodeEquals (Status .UNAVAILABLE , statusCaptor .getValue ());
474487 }
475488
489+ @ Test
490+ public void transportInUse_normalClose () throws Exception {
491+ server .start (serverListener );
492+ client .start (mockClientTransportListener );
493+ ClientStream stream1 = client .newStream (methodDescriptor , new Metadata ());
494+ stream1 .start (mockClientStreamListener );
495+ verify (mockClientTransportListener , timeout (TIMEOUT_MS )).transportInUse (true );
496+ MockServerTransportListener serverTransportListener
497+ = serverListener .takeListenerOrFail (TIMEOUT_MS , TimeUnit .MILLISECONDS );
498+ StreamCreation serverStreamCreation1
499+ = serverTransportListener .takeStreamOrFail (TIMEOUT_MS , TimeUnit .MILLISECONDS );
500+ ClientStream stream2 = client .newStream (methodDescriptor , new Metadata ());
501+ stream2 .start (mockClientStreamListener );
502+ StreamCreation serverStreamCreation2
503+ = serverTransportListener .takeStreamOrFail (TIMEOUT_MS , TimeUnit .MILLISECONDS );
504+
505+ stream1 .halfClose ();
506+ serverStreamCreation1 .stream .close (Status .OK , new Metadata ());
507+ stream2 .halfClose ();
508+ verify (mockClientTransportListener , never ()).transportInUse (false );
509+ serverStreamCreation2 .stream .close (Status .OK , new Metadata ());
510+ verify (mockClientTransportListener , timeout (TIMEOUT_MS )).transportInUse (false );
511+ // Verify that the callback has been called only once for true and false respectively
512+ verify (mockClientTransportListener ).transportInUse (true );
513+ verify (mockClientTransportListener ).transportInUse (false );
514+ }
515+
516+ @ Test
517+ public void transportInUse_clientCancel () throws Exception {
518+ server .start (serverListener );
519+ client .start (mockClientTransportListener );
520+ ClientStream stream1 = client .newStream (methodDescriptor , new Metadata ());
521+ stream1 .start (mockClientStreamListener );
522+ verify (mockClientTransportListener , timeout (TIMEOUT_MS )).transportInUse (true );
523+ ClientStream stream2 = client .newStream (methodDescriptor , new Metadata ());
524+ stream2 .start (mockClientStreamListener );
525+
526+ stream1 .cancel (Status .CANCELLED );
527+ verify (mockClientTransportListener , never ()).transportInUse (false );
528+ stream2 .cancel (Status .CANCELLED );
529+ verify (mockClientTransportListener , timeout (TIMEOUT_MS )).transportInUse (false );
530+ // Verify that the callback has been called only once for true and false respectively
531+ verify (mockClientTransportListener ).transportInUse (true );
532+ verify (mockClientTransportListener ).transportInUse (false );
533+ }
534+
476535 @ Test
477536 public void basicStream () throws Exception {
478537 server .start (serverListener );
0 commit comments