package com.github.kristofa.brave.grpc;
import com.github.kristofa.brave.IdConversion;
import com.github.kristofa.brave.SpanId;
import com.github.kristofa.brave.TraceData;
import com.github.kristofa.brave.grpc.BraveGrpcServerInterceptor.GrpcServerRequestAdapter;
import io.grpc.Metadata;
import io.grpc.ServerCall;
import io.grpc.examples.helloworld.GreeterGrpc;
import org.junit.Before;
import org.junit.Test;
import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class GrpcServerRequestAdapterTest {
private static final String TRACE_ID = "7a842183262a6c62";
private static final String SPAN_ID = "bf38b90488a1e481";
private static final String PARENT_SPAN_ID = "8000000000000000";
Metadata metadata = new Metadata();
GrpcServerRequestAdapter adapter;
@Before
public void initMocks() {
ServerCall serverCall = mock(ServerCall.class);
when(serverCall.getMethodDescriptor()).thenReturn(GreeterGrpc.METHOD_SAY_HELLO);
adapter = new GrpcServerRequestAdapter(serverCall, metadata);
}
@Test
public void getTraceDataNoSampledHeader() {
TraceData traceData = adapter.getTraceData();
assertNotNull(traceData);
assertNull(traceData.getSample());
assertNull(traceData.getSpanId());
}
@Test
public void getTraceDataSampledFalse() {
metadata.put(BravePropagationKeys.Sampled, "false");
TraceData traceData = adapter.getTraceData();
assertNotNull(traceData);
assertFalse(traceData.getSample());
assertNull(traceData.getSpanId());
}
@Test
public void getTraceDataSampledFalseUpperCase() {
metadata.put(BravePropagationKeys.Sampled, "FALSE");
TraceData traceData = adapter.getTraceData();
assertNotNull(traceData);
assertFalse(traceData.getSample());
assertNull(traceData.getSpanId());
}
/**
* This is according to the zipkin 'spec'.
*/
@Test
public void getTraceDataSampledZero() {
metadata.put(BravePropagationKeys.Sampled, "0");
TraceData traceData = adapter.getTraceData();
assertNotNull(traceData);
assertFalse(traceData.getSample());
assertNull(traceData.getSpanId());
}
@Test
public void getTraceDataSampledTrueNoOtherTraceHeaders() {
metadata.put(BravePropagationKeys.Sampled, "1");
TraceData traceData = adapter.getTraceData();
assertNotNull(traceData);
assertNull(traceData.getSample());
assertNull(traceData.getSpanId());
}
@Test
public void getTraceDataSampledTrueNoParentId() {
metadata.put(BravePropagationKeys.Sampled, "true");
metadata.put(BravePropagationKeys.TraceId, TRACE_ID);
metadata.put(BravePropagationKeys.SpanId, 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() {
metadata.put(BravePropagationKeys.Sampled, "1");
metadata.put(BravePropagationKeys.TraceId, TRACE_ID);
metadata.put(BravePropagationKeys.SpanId, 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;
metadata.put(BravePropagationKeys.Sampled, "1");
metadata.put(BravePropagationKeys.TraceId, hex128Bits);
metadata.put(BravePropagationKeys.SpanId, 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() {
metadata.put(BravePropagationKeys.Sampled, "true");
metadata.put(BravePropagationKeys.TraceId, TRACE_ID);
metadata.put(BravePropagationKeys.SpanId, SPAN_ID);
metadata.put(BravePropagationKeys.ParentSpanId, 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);
}
/**
* When the caller propagates IDs, but not a sampling decision, the local process should decide.
*/
@Test
public void getTraceData_externallyProvidedIds() {
metadata.put(BravePropagationKeys.TraceId, TRACE_ID);
metadata.put(BravePropagationKeys.SpanId, 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());
}
}