From 11531f2187fdd9fe10b0ef0725b89f3d2be3d420 Mon Sep 17 00:00:00 2001 From: Mike Goldsmith Date: Mon, 10 Dec 2018 15:28:17 +0000 Subject: [PATCH] Add bool to manage whether a tracer has been registered in GlobalTracer (#114) * add isRegistered internal bool to GlobalTracer - add s_isRegistered bool - set s_isregistered when Registering a tracer - add unit test to verify registering a NoopTracer set the s_isRegistered bool - move ResetTracer logic to GlobalTracer as internal function instead of test utility for easier reusability * re-add GlobalTracerTestUtil and use that to reset isRegistered bool --- src/OpenTracing/Util/GlobalTracer.cs | 8 +++++++- test/OpenTracing.Tests/Util/GlobalTracerTestUtil.cs | 2 ++ test/OpenTracing.Tests/Util/GlobalTracerTests.cs | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/OpenTracing/Util/GlobalTracer.cs b/src/OpenTracing/Util/GlobalTracer.cs index 2ddbf1b..a159b07 100644 --- a/src/OpenTracing/Util/GlobalTracer.cs +++ b/src/OpenTracing/Util/GlobalTracer.cs @@ -29,6 +29,8 @@ public sealed class GlobalTracer : ITracer { private static readonly object s_lock = new object(); + private static bool s_isRegistered; + /// /// Singleton instance. /// @@ -59,7 +61,7 @@ public sealed class GlobalTracer : ITracer /// Whether a tracer has been registered. public static bool IsRegistered() { - return !(s_instance._tracer is NoopTracer); + return s_isRegistered; } /// @@ -82,12 +84,16 @@ public static void Register(ITracer tracer) lock (s_lock) { if (tracer == s_instance._tracer) + { + s_isRegistered = true; return; + } if (IsRegistered()) throw new InvalidOperationException("There is already a current global Tracer registered."); s_instance._tracer = tracer; + s_isRegistered = true; } } diff --git a/test/OpenTracing.Tests/Util/GlobalTracerTestUtil.cs b/test/OpenTracing.Tests/Util/GlobalTracerTestUtil.cs index 938fbc8..d7dbc52 100644 --- a/test/OpenTracing.Tests/Util/GlobalTracerTestUtil.cs +++ b/test/OpenTracing.Tests/Util/GlobalTracerTestUtil.cs @@ -7,6 +7,7 @@ namespace OpenTracing.Tests.Util public static class GlobalTracerTestUtil { private static FieldInfo s_tracerField = typeof(GlobalTracer).GetField("_tracer", BindingFlags.NonPublic | BindingFlags.Instance); + private static FieldInfo s_isRegisteredField = typeof(GlobalTracer).GetField("s_isRegistered", BindingFlags.NonPublic | BindingFlags.Static); /// /// Resets the to its initial, unregistered state. @@ -24,6 +25,7 @@ public static void SetGlobalTracerUnconditionally(ITracer tracer) { GlobalTracer globalTracer = (GlobalTracer)GlobalTracer.Instance; s_tracerField.SetValue(globalTracer, tracer); + s_isRegisteredField.SetValue(globalTracer, false); } } } diff --git a/test/OpenTracing.Tests/Util/GlobalTracerTests.cs b/test/OpenTracing.Tests/Util/GlobalTracerTests.cs index 7cb56bf..2eb6a00 100644 --- a/test/OpenTracing.Tests/Util/GlobalTracerTests.cs +++ b/test/OpenTracing.Tests/Util/GlobalTracerTests.cs @@ -61,6 +61,14 @@ public void Registering_null_fails() Assert.Throws(() => GlobalTracer.Register(null)); } + [Fact] + public void Registering_NoopTracer_indicates_tracer_has_been_registered() + { + Assert.False(GlobalTracer.IsRegistered()); + GlobalTracer.Register(NoopTracerFactory.Create()); + Assert.True(GlobalTracer.IsRegistered()); + } + [Fact] public void NoopTracer_is_set_by_default() {