From 3076d7b7a499d1d7d3d2bc447d989e383dbb1b40 Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Wed, 19 Jul 2017 10:17:23 +0200 Subject: add tests for active span management --- .../src/main/scala/kamon/trace/ActiveSpan.scala | 3 - .../test/scala/kamon/testkit/SpanInspector.scala | 8 +-- .../kamon/trace/ActiveSpanManagementSpec.scala | 71 ++++++++++++++++++++++ 3 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 kamon-core/src/test/scala/kamon/trace/ActiveSpanManagementSpec.scala (limited to 'kamon-core') diff --git a/kamon-core/src/main/scala/kamon/trace/ActiveSpan.scala b/kamon-core/src/main/scala/kamon/trace/ActiveSpan.scala index 68ef2254..c30a7157 100644 --- a/kamon-core/src/main/scala/kamon/trace/ActiveSpan.scala +++ b/kamon-core/src/main/scala/kamon/trace/ActiveSpan.scala @@ -61,9 +61,6 @@ object ActiveSpan { override def setOperationName(operationName: String): Span = wrappedSpan.setOperationName(operationName) - override def finish(): Unit = - wrappedSpan.finish() - override def finish(finishMicros: Long): Unit = wrappedSpan.finish(finishMicros) diff --git a/kamon-core/src/test/scala/kamon/testkit/SpanInspector.scala b/kamon-core/src/test/scala/kamon/testkit/SpanInspector.scala index 3ef1012b..e00c8b26 100644 --- a/kamon-core/src/test/scala/kamon/testkit/SpanInspector.scala +++ b/kamon-core/src/test/scala/kamon/testkit/SpanInspector.scala @@ -8,7 +8,7 @@ import scala.reflect.ClassTag import scala.util.Try class SpanInspector(span: Span) { - private val (realSpan, spanData) = { + private val (realSpan, spanData) = Try { val realSpan = span match { case _: Span.Real => span case a: ActiveSpan => @@ -17,10 +17,10 @@ class SpanInspector(span: Span) { val spanData = invoke[Span.Real, FinishedSpan](realSpan, "toFinishedSpan", classOf[Long] -> Long.box(Clock.microTimestamp())) (realSpan, spanData) - } + }.getOrElse((null, null)) - def nonEmpty: Boolean = - !span.isInstanceOf[Span.Empty] + def isEmpty: Boolean = + realSpan == null def spanTag(key: String): Option[Span.TagValue] = spanData.tags.get(key) diff --git a/kamon-core/src/test/scala/kamon/trace/ActiveSpanManagementSpec.scala b/kamon-core/src/test/scala/kamon/trace/ActiveSpanManagementSpec.scala new file mode 100644 index 00000000..ebee9f66 --- /dev/null +++ b/kamon-core/src/test/scala/kamon/trace/ActiveSpanManagementSpec.scala @@ -0,0 +1,71 @@ +package kamon.trace + +import kamon.Kamon +import kamon.testkit.SpanInspector +import kamon.trace.Span.Annotation +import kamon.util.Clock +import org.scalatest.{Matchers, WordSpec} + +class ActiveSpanManagementSpec extends WordSpec with Matchers { + + "Kamon acting as a ActiveSpanSource" should { + "return a ActiveSpan wrapping a empty span when there is no currently active Span" in { + inspect(Kamon.activeSpan()) shouldBe empty + } + + "safely operate on a ActiveSpan that wraps a empty Span" in { + val activeSpan = Kamon.activeSpan() + val activeSpanData = inspect(Kamon.activeSpan()) + activeSpanData shouldBe empty + + activeSpan + .setOperationName("test") + .addBaggage("key", "value") + .addMetricTag("key", "value") + .addSpanTag("string", "string") + .addSpanTag("number", 42) + .addSpanTag("boolean-true", true) + .addSpanTag("boolean-false", false) + .annotate(Annotation(Clock.microTimestamp(), "event", Map("k" -> "v"))) + + val baggage = activeSpan.context().baggage + baggage.add("key", "value") + baggage.get("key") shouldBe empty + baggage.getAll() shouldBe empty + + val continuation = activeSpan.capture() + val activatedSpan = continuation.activate() + inspect(Kamon.activeSpan()) shouldBe empty + activatedSpan.deactivate() + + inspect(Kamon.activeSpan()) shouldBe empty + } + + "set a Span as active when using makeActive" in { + val span = Kamon.buildSpan("mySpan").start() + val activeSpan = Kamon.makeActive(span) + Kamon.activeSpan() shouldBe theSameInstanceAs(activeSpan) + activeSpan.deactivate() + } + + "set a Span as active when using startActive" in { + val activeSpan = Kamon.buildSpan("mySpan").startActive() + Kamon.activeSpan() shouldBe theSameInstanceAs(activeSpan) + activeSpan.deactivate() + } + + "restore the previously active Span when a ActiveSpan gets deactivated" in { + val previouslyActiveSpan = Kamon.activeSpan() + inspect(Kamon.activeSpan()) shouldBe empty + + val activeSpan = Kamon.buildSpan("mySpan").startActive() + Kamon.activeSpan() shouldBe theSameInstanceAs(activeSpan) + activeSpan.deactivate() + + Kamon.activeSpan() shouldBe theSameInstanceAs(previouslyActiveSpan) + } + } + + def inspect(span: Span): SpanInspector = + SpanInspector(span) +} -- cgit v1.2.3