public void ExtractExceptionFromPayload_HandleExceptionPayload()
        {
            NullReferenceException exception = new NullReferenceException();
            Exception?result = DiagnosticsObserversInitializer.ExtractExceptionFromPayload(exception);

            Assert.AreEqual(exception, result);
        }
        public void ExtractExceptionFromPayload_HandleExceptionProperty()
        {
            ArgumentException exception = new ArgumentException();
            Exception?        result    = DiagnosticsObserversInitializer.ExtractExceptionFromPayload(new { Exception = exception });

            Assert.AreEqual(exception, result);
        }
        public async Task DiagnosticsObserversInitializer_InvokedProperly()
        {
            string     name   = nameof(DiagnosticsObserversInitializer_InvokedProperly);
            MockLogger logger = new MockLogger();
            Mock <IActivityStartObserver>   startObserver = new Mock <IActivityStartObserver>();
            Mock <IActivityStopObserver>    stopObserver  = new Mock <IActivityStopObserver>();
            DiagnosticsObserversInitializer initializer   = new DiagnosticsObserversInitializer(
                new[] { startObserver.Object },
                new[] { stopObserver.Object },
                logger);

            try
            {
                await initializer.StartAsync(CancellationToken.None).ConfigureAwait(false);

                using DiagnosticListener listener = new DiagnosticListener(name);

                AssertEnabledFor(listener, HttpRequestOutEventName);
                AssertEnabledFor(listener, HttpRequestInEventName);
                AssertEnabledFor(listener, ExceptionEventName);

                AssertEnabledFor(listener, MakeStartName(name));
                AssertEnabledFor(listener, MakeStopName(name));

                Assert.IsFalse(listener.IsEnabled(name, "Should be disabled for other events"));

                Activity activity = new Activity(name);
                object   obj      = new object();

                listener.StartActivity(activity, obj);
                startObserver.Verify(obs => obs.OnStart(activity, obj), Times.Once);

                listener.StopActivity(activity, obj);
                stopObserver.Verify(obs => obs.OnStop(activity, obj), Times.Once);

                Exception exception = new ArithmeticException();
                listener.Write(ExceptionEventName, exception);
                Assert.IsTrue(logger.Exceptions.Contains(exception), "Should log exception event");
            }
            catch
            {
                await initializer.StopAsync(CancellationToken.None).ConfigureAwait(false);

                throw;
            }
        }
        public void ExtractExceptionFromPayload_HandleNullValue()
        {
            Exception?result = DiagnosticsObserversInitializer.ExtractExceptionFromPayload(null);

            Assert.IsNull(result);
        }