package com.github.kristofa.brave.http;
import java.net.URI;
import java.util.Collection;
import com.github.kristofa.brave.IdConversion;
import com.github.kristofa.brave.KeyValueAnnotation;
import com.github.kristofa.brave.SpanId;
import com.github.kristofa.brave.TraceData;
import org.junit.Before;
import org.junit.Test;
import zipkin.TraceKeys;
import static junit.framework.Assert.assertNull;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class HttpServerRequestAdapterTest {
private final static String TRACE_ID = "7a842183262a6c62";
private final static String SPAN_ID = "bf38b90488a1e481";
private final static String PARENT_SPAN_ID = "8000000000000000";
private HttpServerRequestAdapter adapter;
private HttpServerRequest serverRequest;
private SpanNameProvider spanNameProvider;
@Before
public void setup() {
serverRequest = mock(HttpServerRequest.class);
spanNameProvider = mock(SpanNameProvider.class);
adapter = new HttpServerRequestAdapter(serverRequest, spanNameProvider);
}
@Test
public void getTraceDataNoSampledHeader() {
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.Sampled.getName())).thenReturn(null);
TraceData traceData = adapter.getTraceData();
assertNotNull(traceData);
assertNull(traceData.getSample());
assertNull(traceData.getSpanId());
}
@Test
public void getTraceDataSampledFalse() {
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.Sampled.getName())).thenReturn("false");
TraceData traceData = adapter.getTraceData();
assertNotNull(traceData);
assertFalse(traceData.getSample());
assertNull(traceData.getSpanId());
}
@Test
public void getTraceDataSampledFalseUpperCase() {
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.Sampled.getName())).thenReturn("FALSE");
TraceData traceData = adapter.getTraceData();
assertNotNull(traceData);
assertFalse(traceData.getSample());
assertNull(traceData.getSpanId());
}
/**
* This is according to the zipkin 'spec'.
*/
@Test
public void getTraceDataSampledZero() {
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.Sampled.getName())).thenReturn("0");
TraceData traceData = adapter.getTraceData();
assertNotNull(traceData);
assertFalse(traceData.getSample());
assertNull(traceData.getSpanId());
}
@Test
public void getTraceDataSampledTrueNoOtherTraceHeaders() {
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.Sampled.getName())).thenReturn("true");
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.TraceId.getName())).thenReturn(null);
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.SpanId.getName())).thenReturn(null);
TraceData traceData = adapter.getTraceData();
assertNotNull(traceData);
assertNull(traceData.getSample());
assertNull(traceData.getSpanId());
}
@Test
public void getTraceDataSampledTrueNoParentId() {
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.Sampled.getName())).thenReturn("true");
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.TraceId.getName())).thenReturn(TRACE_ID);
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.SpanId.getName())).thenReturn(SPAN_ID);
TraceData traceData = adapter.getTraceData();
assertNotNull(traceData);
assertTrue(traceData.getSample());
SpanId spanId = traceData.getSpanId();
assertNotNull(spanId);
assertEquals(IdConversion.convertToLong(TRACE_ID), spanId.traceId);
assertEquals(IdConversion.convertToLong(SPAN_ID), spanId.spanId);
assertNull(spanId.nullableParentId());
}
/**
* This is according to the zipkin 'spec'.
*/
@Test
public void getTraceDataSampledOneNoParentId() {
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.Sampled.getName())).thenReturn("1");
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.TraceId.getName())).thenReturn(TRACE_ID);
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.SpanId.getName())).thenReturn(SPAN_ID);
TraceData traceData = adapter.getTraceData();
assertNotNull(traceData);
assertTrue(traceData.getSample());
SpanId spanId = traceData.getSpanId();
assertNotNull(spanId);
assertEquals(IdConversion.convertToLong(TRACE_ID), spanId.traceId);
assertEquals(IdConversion.convertToLong(SPAN_ID), spanId.spanId);
assertNull(spanId.nullableParentId());
}
@Test
public void supports128BitTraceIdHeader() {
String upper64Bits = "48485a3953bb6124";
String lower64Bits = "48485a3953bb6124";
String hex128Bits = upper64Bits + lower64Bits;
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.Sampled.getName())).thenReturn("1");
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.TraceId.getName())).thenReturn(hex128Bits);
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.SpanId.getName())).thenReturn(lower64Bits);
TraceData traceData = adapter.getTraceData();
assertNotNull(traceData);
assertTrue(traceData.getSample());
SpanId spanId = traceData.getSpanId();
assertNotNull(spanId);
assertEquals(IdConversion.convertToLong(upper64Bits), spanId.traceIdHigh);
assertEquals(IdConversion.convertToLong(lower64Bits), spanId.traceId);
assertEquals(IdConversion.convertToLong(lower64Bits), spanId.spanId);
assertNull(spanId.nullableParentId());
}
@Test
public void getTraceDataSampledTrueWithParentId() {
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.Sampled.getName())).thenReturn("true");
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.TraceId.getName())).thenReturn(TRACE_ID);
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.SpanId.getName())).thenReturn(SPAN_ID);
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.ParentSpanId.getName())).thenReturn(PARENT_SPAN_ID);
TraceData traceData = adapter.getTraceData();
assertNotNull(traceData);
assertTrue(traceData.getSample());
SpanId spanId = traceData.getSpanId();
assertNotNull(spanId);
assertEquals(IdConversion.convertToLong(TRACE_ID), spanId.traceId);
assertEquals(IdConversion.convertToLong(SPAN_ID), spanId.spanId);
assertEquals(IdConversion.convertToLong(PARENT_SPAN_ID), spanId.parentId);
}
@Test
public void fullUriAnnotation() throws Exception {
when(serverRequest.getUri()).thenReturn(new URI("http://youruri.com/a/b?myquery=you"));
Collection<KeyValueAnnotation> annotations = adapter.requestAnnotations();
assertEquals(1, annotations.size());
KeyValueAnnotation a = annotations.iterator().next();
assertEquals(TraceKeys.HTTP_URL, a.getKey());
assertEquals("http://youruri.com/a/b?myquery=you", a.getValue());
}
/**
* When the caller propagates IDs, but not a sampling decision, the local process should decide.
*/
@Test
public void getTraceData_externallyProvidedIds() {
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.TraceId.getName())).thenReturn(TRACE_ID);
when(serverRequest.getHttpHeaderValue(BraveHttpHeaders.SpanId.getName())).thenReturn(SPAN_ID);
TraceData traceData = adapter.getTraceData();
assertNotNull(traceData);
assertNull(traceData.getSample());
SpanId spanId = traceData.getSpanId();
assertNotNull(spanId);
assertEquals(IdConversion.convertToLong(TRACE_ID), spanId.traceId);
assertEquals(IdConversion.convertToLong(SPAN_ID), spanId.spanId);
assertNull(spanId.nullableParentId());
}
}