diff --git a/src/WireMock.Net/Server/FluentMockServer.LogEntries.cs b/src/WireMock.Net/Server/FluentMockServer.LogEntries.cs index 2bfa01e3..25b7da47 100644 --- a/src/WireMock.Net/Server/FluentMockServer.LogEntries.cs +++ b/src/WireMock.Net/Server/FluentMockServer.LogEntries.cs @@ -19,7 +19,21 @@ namespace WireMock.Server [PublicAPI] public event NotifyCollectionChangedEventHandler LogEntriesChanged { - add => _options.LogEntries.CollectionChanged += value; + add + { + _options.LogEntries.CollectionChanged += (sender, eventRecordArgs) => + { + try + { + value(sender, eventRecordArgs); + } + catch (Exception exception) + { + _options.Logger.Error("Error calling the LogEntriesChanged event handler: {0}", exception.Message); + } + }; + } + remove => _options.LogEntries.CollectionChanged -= value; } diff --git a/test/WireMock.Net.Tests/ObservableLogEntriesTest.cs b/test/WireMock.Net.Tests/ObservableLogEntriesTest.cs index b4396344..13c657de 100644 --- a/test/WireMock.Net.Tests/ObservableLogEntriesTest.cs +++ b/test/WireMock.Net.Tests/ObservableLogEntriesTest.cs @@ -5,16 +5,48 @@ using System.Net; using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using Moq; using NFluent; +using WireMock.Logging; using WireMock.RequestBuilders; using WireMock.ResponseBuilders; using WireMock.Server; +using WireMock.Settings; using Xunit; namespace WireMock.Net.Tests { public class ObservableLogEntriesTest { + [Fact] + public async void FluentMockServer_LogEntriesChanged_WithException_Should_LogError() + { + // Assign + string path = $"/log_{Guid.NewGuid()}"; + var loggerMock = new Mock(); + loggerMock.Setup(l => l.Error(It.IsAny(), It.IsAny())); + var settings = new FluentMockServerSettings + { + Logger = loggerMock.Object + }; + var server = FluentMockServer.Start(settings); + + server + .Given(Request.Create() + .WithPath(path) + .UsingGet()) + .RespondWith(Response.Create() + .WithBody(@"{ msg: ""Hello world!""}")); + + server.LogEntriesChanged += (sender, args) => throw new Exception(); + + // Act + await new HttpClient().GetAsync($"http://localhost:{server.Ports[0]}{path}"); + + // Assert + loggerMock.Verify(l => l.Error(It.IsAny(), It.IsAny()), Times.Once); + } + [Fact] public async void FluentMockServer_LogEntriesChanged() {