Пример #1
0
        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;
            }
        }
Пример #2
0
        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());
        }