@Test
  public void testSetServerSendInCaseOfThreadDuration() throws UnsupportedEncodingException {
    when(mockServerSpan.getSpan()).thenReturn(mockSpan);
    when(mockServerSpanState.getCurrentServerSpan()).thenReturn(mockServerSpan);
    when(mockServerSpanState.getServerSpanThreadDuration()).thenReturn(DURATION_MS);
    when(mockServerSpanState.getServerEndPoint()).thenReturn(mockEndPoint);
    serverTracer.setServerSend();
    verify(mockServerSpanState, times(3)).getCurrentServerSpan();
    verify(mockServerSpanState, times(2)).getServerEndPoint();

    final Annotation expectedServerSendAnnotation = new Annotation();
    expectedServerSendAnnotation.setHost(mockEndPoint);
    expectedServerSendAnnotation.setValue(zipkinCoreConstants.SERVER_SEND);
    expectedServerSendAnnotation.setTimestamp(CURRENT_TIME_MICROSECONDS);

    final BinaryAnnotation expectedThreadDurationAnnotation = new BinaryAnnotation();
    expectedThreadDurationAnnotation.setAnnotation_type(AnnotationType.STRING);
    expectedThreadDurationAnnotation.setHost(mockEndPoint);
    expectedThreadDurationAnnotation.setKey(BraveAnnotations.THREAD_DURATION);
    final ByteBuffer bb = ByteBuffer.wrap(String.valueOf(DURATION_MS).getBytes("UTF-8"));
    expectedThreadDurationAnnotation.setValue(bb);

    verify(mockSpan).addToAnnotations(expectedServerSendAnnotation);
    verify(mockSpan).addToBinary_annotations(expectedThreadDurationAnnotation);

    verify(mockServerSpanState).getServerSpanThreadDuration();
    verify(mockSpanCollector).collect(mockSpan);
    verify(mockServerSpanState).setCurrentServerSpan(null);
    verifyNoMoreInteractions(mockServerSpanState, mockSpanCollector, mockSpan);
  }
 public ZipkinSpanBuilder data(Map<String, String> data) {
   List<BinaryAnnotation> binaryAnnotations = Lists.newArrayList();
   for (Entry<String, String> entry : data.entrySet()) {
     BinaryAnnotation binaryAnnotation = new BinaryAnnotation();
     binaryAnnotation.setAnnotation_type(AnnotationType.BYTES);
     binaryAnnotation.setKey(entry.getKey());
     binaryAnnotation.setValue(entry.getValue().getBytes());
     binaryAnnotation.setHost(endPoint);
     binaryAnnotations.add(binaryAnnotation);
   }
   zipkinSpan.setBinary_annotations(binaryAnnotations);
   return this;
 }
  /** {@inheritDoc} */
  @Override
  public void addDefaultAnnotation(final String key, final String value) {
    Validate.notEmpty(key);
    Validate.notNull(value);

    try {
      final ByteBuffer bb = ByteBuffer.wrap(value.getBytes(UTF_8));

      final BinaryAnnotation binaryAnnotation = new BinaryAnnotation();
      binaryAnnotation.setKey(key);
      binaryAnnotation.setValue(bb);
      binaryAnnotation.setAnnotation_type(AnnotationType.STRING);
      defaultAnnotations.add(binaryAnnotation);

    } catch (final UnsupportedEncodingException e) {
      throw new IllegalStateException(e);
    }
  }