public void IdFormatTests() { try { Activity activity; // Default format is the default (Hierarchical) activity = new Activity("activity1"); activity.Start(); Assert.Equal(ActivityIdFormat.Hierarchical, activity.IdFormat); activity.Stop(); // Set the parent to something that is WC3 by string activity = new Activity("activity2"); activity.SetParentId("00-0123456789ABCDEF0123456789ABCDEF-0123456789ABCDEF-01"); activity.Start(); Assert.Equal(ActivityIdFormat.W3C, activity.IdFormat); Assert.Equal("0123456789ABCDEF0123456789ABCDEF", activity.TraceId.AsHexString); Assert.True(IdIsW3CFormat(activity.Id)); activity.Stop(); // Set the parent to something that is WC3 byt using ActivityTraceId,ActivitySpanId version of SetParentId. activity = new Activity("activity3"); ActivityTraceId activityTraceId = ActivityTraceId.NewTraceId(); activity.SetParentId(activityTraceId, ActivitySpanId.NewSpanId()); activity.Start(); Assert.Equal(ActivityIdFormat.W3C, activity.IdFormat); Assert.Equal(activityTraceId.AsHexString, activity.TraceId.AsHexString); Assert.True(IdIsW3CFormat(activity.Id)); activity.Stop(); // Change DefaultIdFormat to W3C, confirm I get the new format. Activity.DefaultIdFormat = ActivityIdFormat.W3C; activity = new Activity("activity4"); activity.Start(); Assert.Equal(ActivityIdFormat.W3C, activity.IdFormat); Assert.True(IdIsW3CFormat(activity.Id)); activity.Stop(); // But I don't get the default format if parent is hierarchical activity = new Activity("activity5"); string parentId = "|a000b421-5d183ab6.1"; activity.SetParentId(parentId); activity.Start(); Assert.Equal(ActivityIdFormat.Hierarchical, activity.IdFormat); Assert.True(activity.Id.StartsWith(parentId)); // Heirarchical Ids return null ActivityTraceId and ActivitySpanIds Assert.Equal("00000000000000000000000000000000", activity.TraceId.AsHexString); Assert.Equal("0000000000000000", activity.SpanId.AsHexString); activity.Stop(); // But if I set ForceDefaultFormat I get what I asked for (W3C format) Activity.ForceDefaultIdFormat = true; activity = new Activity("activity6"); activity.SetParentId(parentId); activity.Start(); Assert.Equal(ActivityIdFormat.W3C, activity.IdFormat); Assert.True(IdIsW3CFormat(activity.Id)); Assert.NotEqual("00000000000000000000000000000000", activity.TraceId.AsHexString); Assert.NotEqual("0000000000000000", activity.SpanId.AsHexString); /* TraceStateString testing */ // Test TraceStateString (that it inherits from parent) Activity parent = new Activity("parent"); string testString = "MyTestString"; parent.TraceStateString = testString; parent.Start(); Assert.Equal(testString, parent.TraceStateString); activity = new Activity("activity7"); activity.Start(); Assert.Equal(ActivityIdFormat.W3C, activity.IdFormat); Assert.True(IdIsW3CFormat(activity.Id)); Assert.Equal(testString, activity.TraceStateString); // Update child string childTestString = "ChildTestString"; activity.TraceStateString = childTestString; // Confirm that child sees update, but parent does not Assert.Equal(childTestString, activity.TraceStateString); Assert.Equal(testString, parent.TraceStateString); // Update parent string parentTestString = "newTestString"; parent.TraceStateString = parentTestString; // Confirm that parent sees update but child does not. Assert.Equal(childTestString, activity.TraceStateString); Assert.Equal(parentTestString, parent.TraceStateString); activity.Stop(); parent.Stop(); } finally { // Set global settings back to the default, just to put the state back. Activity.ForceDefaultIdFormat = false; Activity.DefaultIdFormat = ActivityIdFormat.Hierarchical; Activity.Current = null; } }
public void ActivityTraceIdTests() { Span <byte> idBytes1 = stackalloc byte[16]; Span <byte> idBytes2 = stackalloc byte[16]; // Empty Constructor string zeros = "00000000000000000000000000000000"; ActivityTraceId emptyId = new ActivityTraceId(); Assert.Equal(zeros, emptyId.AsHexString); emptyId.CopyTo(idBytes1); Assert.Equal(new byte[16], idBytes1.ToArray()); Assert.True(emptyId == new ActivityTraceId()); Assert.True(!(emptyId != new ActivityTraceId())); Assert.True(emptyId.Equals(new ActivityTraceId())); Assert.True(emptyId.Equals((object)new ActivityTraceId())); Assert.Equal(new ActivityTraceId().GetHashCode(), emptyId.GetHashCode()); // NewActivityTraceId ActivityTraceId newId1 = ActivityTraceId.NewTraceId(); Assert.True(IsHex(newId1.AsHexString)); Assert.Equal(32, newId1.AsHexString.Length); ActivityTraceId newId2 = ActivityTraceId.NewTraceId(); Assert.Equal(32, newId1.AsHexString.Length); Assert.NotEqual(newId1.AsHexString, newId2.AsHexString); // Test equality Assert.True(newId1 != newId2); Assert.True(!(newId1 == newId2)); Assert.True(!(newId1.Equals(newId2))); Assert.True(!(newId1.Equals((object)newId2))); Assert.NotEqual(newId1.GetHashCode(), newId2.GetHashCode()); ActivityTraceId newId3 = new ActivityTraceId("00000000000000000000000000000001".AsSpan()); Assert.True(newId3 != emptyId); Assert.True(!(newId3 == emptyId)); Assert.True(!(newId3.Equals(emptyId))); Assert.True(!(newId3.Equals((object)emptyId))); Assert.NotEqual(newId3.GetHashCode(), emptyId.GetHashCode()); // Use in Dictionary (this does assume we have no collisions in IDs over 100 tries (very good). var dict = new Dictionary <ActivityTraceId, string>(); for (int i = 0; i < 100; i++) { var newId7 = ActivityTraceId.NewTraceId(); dict[newId7] = newId7.AsHexString; } int ctr = 0; foreach (string value in dict.Values) { string valueInDict; Assert.True(dict.TryGetValue(new ActivityTraceId(value.AsSpan()), out valueInDict)); Assert.Equal(value, valueInDict); ctr++; } Assert.Equal(100, ctr); // We got out what we put in. // AsBytes and Byte constructor. newId2.CopyTo(idBytes2); ActivityTraceId newId2Clone = new ActivityTraceId(idBytes2); Assert.Equal(newId2.AsHexString, newId2Clone.AsHexString); newId2Clone.CopyTo(idBytes1); Assert.Equal(idBytes2.ToArray(), idBytes1.ToArray()); Assert.True(newId2 == newId2Clone); Assert.True(newId2.Equals(newId2Clone)); Assert.True(newId2.Equals((object)newId2Clone)); Assert.Equal(newId2.GetHashCode(), newId2Clone.GetHashCode()); // String constructor and AsHexString. string idStr = "0123456789ABCDEF0123456789ABCDEF"; ActivityTraceId id = new ActivityTraceId(idStr.AsSpan()); Assert.Equal(idStr, id.AsHexString); // Utf8 Constructor. byte[] idUtf8 = Encoding.UTF8.GetBytes(idStr); ActivityTraceId id1 = new ActivityTraceId(idUtf8, true); Assert.Equal(idStr, id1.AsHexString); // ToString Assert.Equal(idStr, id.ToString()); }