3838import io .grpc .internal .ClientStreamListener .RpcProgress ;
3939import io .grpc .internal .GrpcUtil .Http2Error ;
4040import io .grpc .testing .TestMethodDescriptors ;
41+ import java .util .ArrayDeque ;
4142import java .util .concurrent .atomic .AtomicReference ;
4243import org .junit .Rule ;
4344import org .junit .Test ;
@@ -301,12 +302,14 @@ public void clientStreamTracerFactoryBackwardCompatibility() {
301302 final AtomicReference <Attributes > transportAttrsRef = new AtomicReference <>();
302303 final ClientStreamTracer mockTracer = mock (ClientStreamTracer .class );
303304 final Metadata .Key <String > key = Metadata .Key .of ("fake-key" , Metadata .ASCII_STRING_MARSHALLER );
305+ final ArrayDeque <ClientStreamTracer > tracers = new ArrayDeque <>();
304306 ClientStreamTracer .Factory oldFactoryImpl = new ClientStreamTracer .Factory () {
305307 @ SuppressWarnings ("deprecation" )
306308 @ Override
307309 public ClientStreamTracer newClientStreamTracer (StreamInfo info , Metadata headers ) {
308310 transportAttrsRef .set (info .getTransportAttrs ());
309311 headers .put (key , "fake-value" );
312+ tracers .offer (mockTracer );
310313 return mockTracer ;
311314 }
312315 };
@@ -318,8 +321,12 @@ public ClientStreamTracer newClientStreamTracer(StreamInfo info, Metadata header
318321 Attributes .newBuilder ().set (Attributes .Key .<String >create ("foo" ), "bar" ).build ();
319322 ClientStreamTracer tracer = GrpcUtil .newClientStreamTracer (oldFactoryImpl , info , metadata );
320323 tracer .streamCreated (transAttrs , metadata );
321-
324+ assertThat ( tracers . poll ()). isSameInstanceAs ( mockTracer );
322325 assertThat (transportAttrsRef .get ()).isEqualTo (transAttrs );
323326 assertThat (metadata .get (key )).isEqualTo ("fake-value" );
327+
328+ tracer .streamClosed (Status .UNAVAILABLE );
329+ // verify that newClientStreamTracer() is called no more than once
330+ assertThat (tracers ).isEmpty ();
324331 }
325332}
0 commit comments