Skip to content

Commit

Permalink
Add bool to manage whether a tracer has been registered in GlobalTrac…
Browse files Browse the repository at this point in the history
…er (#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
  • Loading branch information
MikeGoldsmith committed Dec 10, 2018
1 parent d003497 commit 11531f2
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/OpenTracing/Util/GlobalTracer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ public sealed class GlobalTracer : ITracer
{
private static readonly object s_lock = new object();

private static bool s_isRegistered;

/// <summary>
/// Singleton instance.
/// <para/>
Expand Down Expand Up @@ -59,7 +61,7 @@ public sealed class GlobalTracer : ITracer
/// <returns>Whether a tracer has been registered.</returns>
public static bool IsRegistered()
{
return !(s_instance._tracer is NoopTracer);
return s_isRegistered;
}

/// <summary>
Expand All @@ -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;
}
}

Expand Down
2 changes: 2 additions & 0 deletions test/OpenTracing.Tests/Util/GlobalTracerTestUtil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);

/// <summary>
/// Resets the <see cref="GlobalTracer"/> to its initial, unregistered state.
Expand All @@ -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);
}
}
}
8 changes: 8 additions & 0 deletions test/OpenTracing.Tests/Util/GlobalTracerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,14 @@ public void Registering_null_fails()
Assert.Throws<ArgumentNullException>(() => 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()
{
Expand Down

0 comments on commit 11531f2

Please sign in to comment.