diff --git a/opentracing-mock/src/main/java/io/opentracing/mock/MockSpan.java b/opentracing-mock/src/main/java/io/opentracing/mock/MockSpan.java index 5f0a3220..50289ef7 100644 --- a/opentracing-mock/src/main/java/io/opentracing/mock/MockSpan.java +++ b/opentracing-mock/src/main/java/io/opentracing/mock/MockSpan.java @@ -1,5 +1,5 @@ /** - * Copyright 2016 The OpenTracing Authors + * Copyright 2016-2017 The OpenTracing Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at diff --git a/opentracing-mock/src/main/java/io/opentracing/mock/MockTracer.java b/opentracing-mock/src/main/java/io/opentracing/mock/MockTracer.java index c83f9066..dbfa6249 100644 --- a/opentracing-mock/src/main/java/io/opentracing/mock/MockTracer.java +++ b/opentracing-mock/src/main/java/io/opentracing/mock/MockTracer.java @@ -1,5 +1,5 @@ /** - * Copyright 2016 The OpenTracing Authors + * Copyright 2016-2017 The OpenTracing Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at @@ -173,6 +173,9 @@ public Tracer.SpanBuilder withStartTimestamp(long microseconds) { @Override public Span start() { + if (this.startMicros == 0) { + this.startMicros = MockSpan.nowMicros(); + } return new MockSpan(MockTracer.this, this.operationName, this.startMicros, initialTags, this.firstParent); } diff --git a/opentracing-mock/src/test/java/io/opentracing/mock/MockTracerTest.java b/opentracing-mock/src/test/java/io/opentracing/mock/MockTracerTest.java index 178c0caf..ce6461ec 100644 --- a/opentracing-mock/src/test/java/io/opentracing/mock/MockTracerTest.java +++ b/opentracing-mock/src/test/java/io/opentracing/mock/MockTracerTest.java @@ -1,5 +1,5 @@ /** - * Copyright 2016 The OpenTracing Authors + * Copyright 2016-2017 The OpenTracing Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at @@ -13,15 +13,17 @@ */ package io.opentracing.mock; -import io.opentracing.Span; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import java.util.HashMap; import java.util.List; import java.util.Map; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; +import org.junit.Assert; +import org.junit.Test; + +import io.opentracing.Span; public class MockTracerTest { @Test @@ -99,4 +101,38 @@ public void testChildSpan() { assertEquals(parent.context().spanId(), child.parentId()); assertEquals(parent.context().traceId(), child.context().traceId()); } + + @Test + public void testStartTimestamp() throws InterruptedException { + MockTracer tracer = new MockTracer(); + long startMicros; + { + MockTracer.SpanBuilder fooSpan = tracer.buildSpan("foo"); + Thread.sleep(2); + startMicros = System.currentTimeMillis() * 1000; + fooSpan.start().finish(); + } + List finishedSpans = tracer.finishedSpans(); + + Assert.assertEquals(1, finishedSpans.size()); + MockSpan span = finishedSpans.get(0); + Assert.assertTrue(startMicros <= span.startMicros()); + Assert.assertTrue(System.currentTimeMillis() * 1000 >= span.finishMicros()); + } + + @Test + public void testStartExplicitTimestamp() throws InterruptedException { + MockTracer tracer = new MockTracer(); + long startMicros = 2000; + { + tracer.buildSpan("foo") + .withStartTimestamp(startMicros) + .start() + .finish(); + } + List finishedSpans = tracer.finishedSpans(); + + Assert.assertEquals(1, finishedSpans.size()); + Assert.assertEquals(startMicros, finishedSpans.get(0).startMicros()); + } }