package com.github.kristofa.brave; import com.twitter.zipkin.gen.Endpoint; import org.junit.Before; import org.junit.Test; import org.mockito.InOrder; import java.util.Arrays; import java.util.Collections; import static org.mockito.Mockito.*; public class ClientRequestInterceptorTest { private static final String SPAN_NAME = "getOrders"; private static final String SERVICE_NAME = "orderService"; private static final int TARGET_IP = 192 << 24 | 168 << 16 | 1; private static final int TARGET_PORT = 80; private static final KeyValueAnnotation ANNOTATION1 = KeyValueAnnotation.create(zipkin.TraceKeys.HTTP_URL, "/orders/user/4543"); private static final KeyValueAnnotation ANNOTATION2 = KeyValueAnnotation.create("http.code", "200"); private ClientRequestInterceptor interceptor; private ClientTracer clientTracer; private ClientRequestAdapter adapter; @Before public void setup() { clientTracer = mock(ClientTracer.class); interceptor = new ClientRequestInterceptor(clientTracer); adapter = mock(ClientRequestAdapter.class); } @Test public void testNoSpanIdReturned() { when(adapter.getSpanName()).thenReturn(SPAN_NAME); when(clientTracer.startNewSpan(SPAN_NAME)).thenReturn(null); interceptor.handle(adapter); InOrder inOrder = inOrder(clientTracer, adapter); inOrder.verify(adapter).getSpanName(); inOrder.verify(clientTracer).startNewSpan(SPAN_NAME); inOrder.verify(adapter).addSpanIdToRequest(null); verifyNoMoreInteractions(clientTracer, adapter); } @Test public void testSpanIdReturnedNoAnnotationsProvided() { when(adapter.getSpanName()).thenReturn(SPAN_NAME); when(adapter.requestAnnotations()).thenReturn(Collections.EMPTY_LIST); SpanId spanId = SpanId.builder().spanId(1L).build(); when(clientTracer.startNewSpan(SPAN_NAME)).thenReturn(spanId); interceptor.handle(adapter); InOrder inOrder = inOrder(clientTracer, adapter); inOrder.verify(adapter).getSpanName(); inOrder.verify(clientTracer).startNewSpan(SPAN_NAME); inOrder.verify(adapter).addSpanIdToRequest(spanId); inOrder.verify(adapter).requestAnnotations(); inOrder.verify(adapter).serverAddress(); inOrder.verify(clientTracer).setClientSent(); verifyNoMoreInteractions(clientTracer, adapter); } @Test public void testSpanIdReturnedAnnotationsProvided() { when(adapter.getSpanName()).thenReturn(SPAN_NAME); when(adapter.requestAnnotations()).thenReturn(Arrays.asList(ANNOTATION1, ANNOTATION2)); SpanId spanId = SpanId.builder().spanId(1L).build(); when(clientTracer.startNewSpan(SPAN_NAME)).thenReturn(spanId); interceptor.handle(adapter); InOrder inOrder = inOrder(clientTracer, adapter); inOrder.verify(adapter).getSpanName(); inOrder.verify(clientTracer).startNewSpan(SPAN_NAME); inOrder.verify(adapter).addSpanIdToRequest(spanId); inOrder.verify(adapter).requestAnnotations(); inOrder.verify(clientTracer).submitBinaryAnnotation(ANNOTATION1.getKey(), ANNOTATION1.getValue()); inOrder.verify(clientTracer).submitBinaryAnnotation(ANNOTATION2.getKey(), ANNOTATION2.getValue()); inOrder.verify(adapter).serverAddress(); inOrder.verify(clientTracer).setClientSent(); verifyNoMoreInteractions(clientTracer, adapter); } @Test public void testServerAddressAdded() { when(adapter.getSpanName()).thenReturn(SPAN_NAME); when(adapter.requestAnnotations()).thenReturn(Collections.EMPTY_LIST); when(adapter.serverAddress()).thenReturn(Endpoint.builder() .serviceName(SERVICE_NAME).ipv4(TARGET_IP).port(TARGET_PORT).build()); SpanId spanId = SpanId.builder().spanId(1L).build(); when(clientTracer.startNewSpan(SPAN_NAME)).thenReturn(spanId); interceptor.handle(adapter); InOrder inOrder = inOrder(clientTracer, adapter); inOrder.verify(adapter).getSpanName(); inOrder.verify(clientTracer).startNewSpan(SPAN_NAME); inOrder.verify(adapter).addSpanIdToRequest(spanId); inOrder.verify(adapter).requestAnnotations(); inOrder.verify(adapter).serverAddress(); inOrder.verify(clientTracer).setClientSent(Endpoint.builder() .ipv4(TARGET_IP).port(TARGET_PORT).serviceName(SERVICE_NAME).build()); verifyNoMoreInteractions(clientTracer, adapter); } }