package brave.jaxrs2; import brave.Tracing; import brave.http.HttpTracing; import java.io.IOException; import java.net.URI; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.container.AsyncResponse; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ResourceInfo; import javax.ws.rs.container.Suspended; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class TracingContainerFilterTest { Tracing tracing = Tracing.newBuilder().build(); TracingContainerFilter filter = new TracingContainerFilter(HttpTracing.create(tracing)); @Mock ContainerRequestContext context; @Mock UriInfo uriInfo; @Mock ResourceInfo resourceInfo; @GET @Path("foo") public Response get() { return Response.status(200).build(); } @GET @Path("async") public void async(@Suspended AsyncResponse response) throws IOException { } @Before public void basic() { when(context.getMethod()).thenReturn("GET"); when(context.getUriInfo()).thenReturn(uriInfo); when(uriInfo.getRequestUri()).thenReturn(URI.create("/foo")); } @Test public void setsSpanInScope_methodWithoutSuspendedParam() throws NoSuchMethodException { filter.resourceInfo = resourceInfo; when(resourceInfo.getResourceMethod()).thenReturn(getClass().getMethod("get")); filter.filter(context); assertThat(tracing.currentTraceContext().get()) .isNotNull(); } @Test public void doesntSetSpanInScope_suspendedMethod() throws NoSuchMethodException { filter.resourceInfo = resourceInfo; when(resourceInfo.getResourceMethod()).thenReturn( getClass().getMethod("async", AsyncResponse.class)); filter.filter(context); assertThat(tracing.currentTraceContext().get()) .isNull(); } /** * If we don't know the resource info, we don't know if a method is async or not. We can't set a * span in scope as it might leak. */ @Test public void doesntSetSpanInScope_unknownMethod() { filter.filter(context); assertThat(tracing.currentTraceContext().get()) .isNull(); } }