public void LogsDataLossEventsWhenExceptionisNull() { using (var listener = new TestEventListener()) { // Arrange: const long AllKeywords = -1; listener.EnableEvents(TelemetryChannelEventSource.Log, EventLevel.LogAlways, (EventKeywords)AllKeywords); Transmission enqueuedTransmission = null; var transmitter = new StubTransmitter(new BackoffLogicManager(TimeSpan.FromMilliseconds(10))) { OnEnqueue = transmission => { enqueuedTransmission = transmission; } }; var policy = new ErrorHandlingTransmissionPolicy(); policy.Initialize(transmitter); var failedTransmission = new StubTransmission(); // Act: transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(failedTransmission, null, null)); // Assert: var traces = listener.Messages.Where(item => item.Level == EventLevel.Error).ToList(); Assert.AreEqual(1, traces.Count); Assert.AreEqual(69, traces[0].EventId); // failed to send Assert.AreEqual("Unknown Exception Message", traces[0].Payload[1]); } }
public void NoWarningLogsWhenResponseIsPartiallSuccess() { // ErrorHandlingTransmissionPolicy does retry only for a whitelisted set of status codes. For // partial success (206) status, there should be no warnings as this is handled by separate // Retry policy. This test is to validate that no warning is logged. using (var listener = new TestEventListener()) { // Arrange: const long AllKeywords = -1; listener.EnableEvents(TelemetryChannelEventSource.Log, EventLevel.LogAlways, (EventKeywords)AllKeywords); Transmission enqueuedTransmission = null; var transmitter = new StubTransmitter(new BackoffLogicManager(TimeSpan.FromMilliseconds(10))) { OnEnqueue = transmission => { enqueuedTransmission = transmission; } }; var policy = new ErrorHandlingTransmissionPolicy(); policy.Initialize(transmitter); var failedTransmission = new StubTransmission(); // Act: var res = new HttpWebResponseWrapper(); res.StatusCode = 206; // Sucess transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(failedTransmission, null, res)); // Assert: var traces = listener.Messages.Where(item => item.Level == EventLevel.Warning).ToList(); Assert.AreEqual(0, traces.Count); } }
public void RetriesFailedTransmissionInfinitely() { Transmission enqueuedTransmission = null; var transmitter = new StubTransmitter(new TestableBackoffLogicManager(TimeSpan.FromMilliseconds(10))); transmitter.OnEnqueue = transmission => { enqueuedTransmission = transmission; }; var policy = new ErrorHandlingTransmissionPolicy(); policy.Initialize(transmitter); var failedTransmission = new StubTransmission(); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(failedTransmission, new Exception("Error"), new HttpWebResponseWrapper() { StatusCode = ResponseStatusCodes.InternalServerError })); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(failedTransmission, new Exception("Error"), new HttpWebResponseWrapper() { StatusCode = ResponseStatusCodes.InternalServerError })); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(failedTransmission, new Exception("Error"), new HttpWebResponseWrapper() { StatusCode = ResponseStatusCodes.InternalServerError })); Assert.AreSame(failedTransmission, enqueuedTransmission); }
public void LogsAdditionalTracesIfResponseIsProvided() { using (var listener = new TestEventListener()) { // Arrange: const long AllKeywords = -1; listener.EnableEvents(TelemetryChannelEventSource.Log, EventLevel.LogAlways, (EventKeywords)AllKeywords); Transmission enqueuedTransmission = null; var transmitter = new StubTransmitter(new BackoffLogicManager(TimeSpan.FromMilliseconds(10))) { OnEnqueue = transmission => { enqueuedTransmission = transmission; } }; var policy = new ErrorHandlingTransmissionPolicy(); policy.Initialize(transmitter); var failedTransmission = new StubTransmission(); var response = new HttpWebResponseWrapper { Content = BackendResponseHelper.CreateBackendResponse(2, 1, new[] { "123" }) }; // Act: transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(failedTransmission, CreateException(statusCode: 408), response)); // Assert: var traces = listener.Messages.Where(item => item.Level == EventLevel.Warning).ToList(); Assert.AreEqual(2, traces.Count); Assert.AreEqual(23, traces[0].EventId); // failed to send Assert.AreEqual(7, traces[1].EventId); // additional trace Assert.AreEqual("Explanation", traces[1].Payload[0]); } }
public void LogsWarningWhenDataLossIntentional() { // ErrorHandlingTransmissionPolicy does retry only for a whitelisted set of status codes. For // others telemetry is dropped. This test is to validate that those are logged. using (var listener = new TestEventListener()) { // Arrange: const long AllKeywords = -1; listener.EnableEvents(TelemetryChannelEventSource.Log, EventLevel.LogAlways, (EventKeywords)AllKeywords); Transmission enqueuedTransmission = null; var transmitter = new StubTransmitter(new BackoffLogicManager(TimeSpan.FromMilliseconds(10))) { OnEnqueue = transmission => { enqueuedTransmission = transmission; } }; var policy = new ErrorHandlingTransmissionPolicy(); policy.Initialize(transmitter); var failedTransmission = new StubTransmission(); // Act: var res = new HttpWebResponseWrapper(); res.StatusCode = 8989; // some status code not whitelisted for retry. transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(failedTransmission, null, res)); // Assert: var traces = listener.Messages.Where(item => item.Level == EventLevel.Warning).ToList(); Assert.AreEqual(1, traces.Count); Assert.AreEqual(71, traces[0].EventId); // failed to send Assert.AreEqual("8989", traces[0].Payload[1]); } }
public void KeepsTransmissionSenderPausedWhenAdditionalTransmissionsFail() { var transmitter = new StubTransmitter(new TestableBackoffLogicManager(TimeSpan.FromMinutes(1))); var policy = new ErrorHandlingTransmissionPolicy(); policy.Initialize(transmitter); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(new StubTransmission(), CreateException(statusCode: 408))); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(new StubTransmission(), CreateException(statusCode: 408))); Thread.Sleep(TimeSpan.FromMilliseconds(30)); Assert.AreEqual(0, policy.MaxSenderCapacity); }
private static void CatchesAndLogsExceptionThrownByTransmitter(ErrorHandlingTransmissionPolicy policy, StubTransmitter transmitter, Exception exception) { policy.Initialize(transmitter); using (var listener = new TestEventListener()) { const long AllKeywords = -1; listener.EnableEvents(TelemetryChannelEventSource.Log, EventLevel.Warning, (EventKeywords)AllKeywords); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(new StubTransmission(), CreateException(statusCode: 408))); EventWrittenEventArgs error = listener.Messages.First(args => args.EventId == 23); AssertEx.Contains(exception.Message, (string)error.Payload[1], StringComparison.Ordinal); } }
public void StopsTransmissionSendingWhenTransmissionTimesOut() { var policyApplied = new AutoResetEvent(false); var transmitter = new StubTransmitter(new TestableBackoffLogicManager(TimeSpan.FromSeconds(10))); transmitter.OnApplyPolicies = () => { policyApplied.Set(); }; var policy = new ErrorHandlingTransmissionPolicy(); policy.Initialize(transmitter); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(new StubTransmission(), CreateException(statusCode: 408))); Assert.IsTrue(policyApplied.WaitOne(100)); Assert.AreEqual(0, policy.MaxSenderCapacity); }
public void ResumesTransmissionSenderAfterPauseDuration() { var policyApplied = new AutoResetEvent(false); var transmitter = new StubTransmitter(new TestableBackoffLogicManager(TimeSpan.FromMilliseconds(1))); transmitter.OnApplyPolicies = () => { policyApplied.Set(); }; var policy = new ErrorHandlingTransmissionPolicy(); policy.Initialize(transmitter); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(new StubTransmission(), CreateException(statusCode: 408))); Assert.True(policyApplied.WaitOne(100)); Assert.True(policyApplied.WaitOne(100)); Assert.Null(policy.MaxSenderCapacity); }
public void RetriesFailedTransmissionIfItsNumberOfAttemptsDidNotReachMaximum() { Transmission enqueuedTransmission = null; var transmitter = new StubTransmitter(); transmitter.OnEnqueue = transmission => { enqueuedTransmission = transmission; }; var policy = new ErrorHandlingTransmissionPolicy(); policy.Initialize(transmitter); var failedTransmission = new StubTransmission(); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(failedTransmission, CreateException(statusCode: 408))); Assert.AreSame(failedTransmission, enqueuedTransmission); }
public void DoesNotRetrySuccessfulTransmission() { Transmission enqueuedTransmission = null; var transmitter = new StubTransmitter(); transmitter.OnEnqueue = transmission => { enqueuedTransmission = transmission; }; var policy = new ErrorHandlingTransmissionPolicy(); policy.Initialize(transmitter); var successfulTransmission = new StubTransmission(); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(successfulTransmission)); Assert.IsNull(enqueuedTransmission); Assert.AreEqual(0, transmitter.BackoffLogicManager.ConsecutiveErrors); }
private void ResumesTransmissionSenderAfterPauseDuration(int responseStatusCode) { var policyApplied = new AutoResetEvent(false); var transmitter = new StubTransmitter(new TestableBackoffLogicManager(TimeSpan.FromMilliseconds(1))); transmitter.OnApplyPolicies = () => { policyApplied.Set(); }; var policy = new ErrorHandlingTransmissionPolicy(); policy.Initialize(transmitter); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(new StubTransmission(), new Exception("Error"), new HttpWebResponseWrapper() { StatusCode = responseStatusCode })); Assert.IsTrue(policyApplied.WaitOne(100)); Assert.IsTrue(policyApplied.WaitOne(100)); Assert.IsNull(policy.MaxSenderCapacity); }
public void RetriesFailedTransmissionInfinitely() { Transmission enqueuedTransmission = null; var transmitter = new StubTransmitter(new TestableBackoffLogicManager(TimeSpan.FromMilliseconds(10))); transmitter.OnEnqueue = transmission => { enqueuedTransmission = transmission; }; var policy = new ErrorHandlingTransmissionPolicy(); policy.Initialize(transmitter); var failedTransmission = new StubTransmission(); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(failedTransmission, CreateException(statusCode: 408))); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(failedTransmission, CreateException(statusCode: 408))); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(failedTransmission, CreateException(statusCode: 408))); Assert.AreSame(failedTransmission, enqueuedTransmission); }
public void RetriesFailedTransmissionIfItsNumberOfAttemptsDidNotReachMaximum() { Transmission enqueuedTransmission = null; var transmitter = new StubTransmitter(); transmitter.OnEnqueue = transmission => { enqueuedTransmission = transmission; }; var policy = new ErrorHandlingTransmissionPolicy(); policy.Initialize(transmitter); var failedTransmission = new StubTransmission(); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(failedTransmission, new Exception("Error"), new HttpWebResponseWrapper() { StatusCode = ResponseStatusCodes.InternalServerError })); Assert.AreSame(failedTransmission, enqueuedTransmission); }
public void RetriesFailedTransmissionIfItsNumberOfAttemptsDidNotReachMaximum() { Transmission enqueuedTransmission = null; var transmitter = new StubTransmitter(); transmitter.OnEnqueue = transmission => { enqueuedTransmission = transmission; }; var policy = new ErrorHandlingTransmissionPolicy(); policy.Initialize(transmitter); var failedTransmission = new StubTransmission(); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(failedTransmission, CreateException(statusCode: 408))); Assert.Same(failedTransmission, enqueuedTransmission); }
private static void CatchesAndLogsExceptionThrownByTransmitter(ErrorHandlingTransmissionPolicy policy, StubTransmitter transmitter, Exception exception) { policy.Initialize(transmitter); using (var listener = new TestEventListener()) { const long AllKeywords = -1; listener.EnableEvents(TelemetryChannelEventSource.Log, EventLevel.Warning, (EventKeywords)AllKeywords); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(new StubTransmission(), CreateException(statusCode: 408))); EventWrittenEventArgs error = listener.Messages.First(args => args.EventId == 23); Assert.Contains(exception.Message, (string)error.Payload[1], StringComparison.Ordinal); } }
public void DoesNotRetrySuccessfulTransmission() { Transmission enqueuedTransmission = null; var transmitter = new StubTransmitter(); transmitter.OnEnqueue = transmission => { enqueuedTransmission = transmission; }; var policy = new ErrorHandlingTransmissionPolicy(); policy.Initialize(transmitter); var successfulTransmission = new StubTransmission(); transmitter.OnTransmissionSent(new TransmissionProcessedEventArgs(successfulTransmission)); Assert.Null(enqueuedTransmission); Assert.Equal(0, policy.ConsecutiveErrors); }