Honor ThrowOnEventWriteErrors for exceptions thrown by EventListeners (#56232)
authorMiha Zupan <mihazupan.zupan1@gmail.com>
Tue, 27 Jul 2021 09:28:10 +0000 (02:28 -0700)
committerGitHub <noreply@github.com>
Tue, 27 Jul 2021 09:28:10 +0000 (02:28 -0700)
src/libraries/System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsWriteEventToListener.cs
src/libraries/System.Diagnostics.Tracing/tests/CustomEventSources/EventSourceTest.cs
src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs

index a352374..d7c7046 100644 (file)
@@ -448,5 +448,49 @@ namespace BasicEventSourceTests
 
             TestUtilities.CheckNoEventSourcesRunning("Stop");
         }
+
+        [Theory]
+        [InlineData(true)]
+        [InlineData(false)]
+        public void Test_EventListenerThrows_ExceptionIsNotRethrownToCaller(bool setThrowOnEventWriteErrorsFlag)
+        {
+            TestUtilities.CheckNoEventSourcesRunning("Start");
+
+            using (var log = new EventSourceTest(throwOnEventWriteErrors: setThrowOnEventWriteErrorsFlag))
+            {
+                using (var listener = new EventListenerListener())
+                {
+                    listener.EventSourceSynchronousEnable(log);
+
+                    var thrownException = new Exception("Oops");
+                    string outOfBandMessage = null;
+
+                    listener.EventWritten += (_, e) =>
+                    {
+                        if (e.EventId == 0)
+                        {
+                            outOfBandMessage = e.Message;
+                        }
+
+                        throw thrownException;
+                    };
+
+                    try
+                    {
+                        log.Event0();
+                        Assert.False(setThrowOnEventWriteErrorsFlag);
+                    }
+                    catch (EventSourceException ex)
+                    {
+                        Assert.True(setThrowOnEventWriteErrorsFlag);
+                        Assert.Same(thrownException, ex.InnerException);
+                    }
+
+                    Assert.Contains(thrownException.Message, outOfBandMessage);
+                }
+            }
+
+            TestUtilities.CheckNoEventSourcesRunning("Stop");
+        }
     }
 }
index 5cbd28b..7a6734e 100644 (file)
@@ -26,8 +26,9 @@ namespace SdtEventSources
     [EventSource(Guid = "69e2aa3e-083b-5014-cad4-3e511a0b94cf", Name = "EventSourceTest")]
     public sealed class EventSourceTest : EventSource
     {
-        public EventSourceTest(bool useSelfDescribingEvents = false)
-            : base(true)
+        public EventSourceTest(bool useSelfDescribingEvents = false, bool throwOnEventWriteErrors = false)
+            : base((useSelfDescribingEvents ? EventSourceSettings.EtwSelfDescribingEventFormat : EventSourceSettings.EtwManifestEventFormat)
+                  | (throwOnEventWriteErrors ? EventSourceSettings.ThrowOnEventWriteErrors : 0))
         { }
 
         protected override void OnEventCommand(EventCommandEventArgs command)
index 87d09e1..556e4e8 100644 (file)
@@ -2127,7 +2127,7 @@ namespace System.Diagnostics.Tracing
                 }
             }
 
-            if (lastThrownException != null)
+            if (lastThrownException != null && ThrowOnEventWriteErrors)
             {
                 throw new EventSourceException(lastThrownException);
             }