diff --git a/src/ServiceControl.MultiInstance.AcceptanceTests/Recoverability/WhenRetryingSameMessageMultipleTimes.cs b/src/ServiceControl.MultiInstance.AcceptanceTests/Recoverability/WhenRetryingSameMessageMultipleTimes.cs index fbb94d1a1c..9083dbe760 100644 --- a/src/ServiceControl.MultiInstance.AcceptanceTests/Recoverability/WhenRetryingSameMessageMultipleTimes.cs +++ b/src/ServiceControl.MultiInstance.AcceptanceTests/Recoverability/WhenRetryingSameMessageMultipleTimes.cs @@ -21,52 +21,50 @@ public enum RetryType Edit } - [Explicit] [TestCase(new[] { RetryType.NoEdit, RetryType.NoEdit, RetryType.Edit })] - [TestCase(new[] { RetryType.Edit, RetryType.NoEdit, RetryType.Edit })] - [TestCase(new[] { RetryType.NoEdit, RetryType.Edit, RetryType.NoEdit })] + [TestCase(new[] { RetryType.Edit, RetryType.NoEdit, RetryType.Edit, RetryType.NoEdit })] + //[TestCase(new[] { RetryType.NoEdit, RetryType.Edit, RetryType.NoEdit, RetryType.Edit })] [TestCase(new[] { RetryType.Edit, RetryType.Edit, RetryType.NoEdit })] public async Task WithMixOfRetryTypes(RetryType[] retryTypes) { CustomServiceControlPrimarySettings = s => { s.AllowMessageEditing = true; }; - await Define() + await Define(context => context.NumberOfRetriesToComplete = retryTypes.Length) .WithEndpoint(b => b.When(bus => bus.SendLocal(new MyMessage())).DoNotFailOnErrorMessages()) .Done(async c => { - if (c.RetryCount >= retryTypes.Length) // Are all retries done? + if (c.ExceptionsRetried >= c.NumberOfRetriesToComplete) // Are all retries done? { return !(await GetAllFailedMessage(ServiceControlInstanceName, FailedMessageStatus.Unresolved)) .HasResult; // Should return true if all failed messages are no longer unresolved } - if (retryTypes[c.RetryCount] == RetryType.Edit) + if (c.ExceptionsRetried >= c.ExceptionsThrown) { - var results = await GetAllFailedMessage(ServiceControlInstanceName, - FailedMessageStatus.Unresolved); - if (!results.HasResult) - { - return false; // No failed messages yet - } - - var result = results.Items.Single(); + return false; + } - c.MessageId = result.MessageId; + var results = await GetAllFailedMessage(ServiceControlInstanceName, FailedMessageStatus.Unresolved); + if (!results.HasResult) + { + return false; // No failed messages yet } - var failedMessage = await GetFailedMessage(c.UniqueMessageId, ServiceControlInstanceName, FailedMessageStatus.Unresolved); + var mostRecentFailure = results.Items.Single(); + + var failedMessage = await GetFailedMessage(mostRecentFailure.Id, ServiceControlInstanceName, FailedMessageStatus.Unresolved); if (!failedMessage.HasResult) { return false; // No failed message yet } - if (retryTypes[c.RetryCount] == RetryType.Edit) + if (retryTypes[c.ExceptionsThrown - 1] == RetryType.Edit) { await this.Post($"/api/edit/{failedMessage.Item.UniqueMessageId}", new { - MessageBody = $"{{ \"Name\": \"Hello {c.RetryCount}\" }}", + MessageBody = $"{{ \"Name\": \"Hello {c.ExceptionsThrown}\" }}", MessageHeaders = failedMessage.Item.ProcessingAttempts[^1].Headers }, null, ServiceControlInstanceName); @@ -76,13 +74,12 @@ await this.Post($"/api/edit/{failedMessage.Item.UniqueMessageId}", await this.Post($"/api/errors/{failedMessage.Item.UniqueMessageId}/retry", null, null, ServiceControlInstanceName); } - - c.RetryCount++; + c.ExceptionsRetried++; return false; }) - .Run(TimeSpan.FromMinutes(2)); + .Run(TimeSpan.FromSeconds(15)); } class FailureEndpoint : EndpointConfigurationBuilder @@ -97,8 +94,9 @@ public Task Handle(MyMessage message, IMessageHandlerContext context) testContext.MessageId = context.MessageId.Replace(@"\", "-"); testContext.EndpointNameOfReceivingEndpoint = settings.EndpointName(); - if (testContext.RetryCount < 3) + if (testContext.ExceptionsThrown < testContext.NumberOfRetriesToComplete) { + testContext.ExceptionsThrown++; Console.Out.WriteLine("Throwing exception"); throw new Exception("Simulated exception"); } @@ -122,7 +120,9 @@ class MyContext : ScenarioContext public string EndpointNameOfReceivingEndpoint { get; set; } public string UniqueMessageId => DeterministicGuid.MakeId(MessageId, EndpointNameOfReceivingEndpoint).ToString(); - public int RetryCount { get; set; } + public int ExceptionsThrown { get; set; } + public int ExceptionsRetried { get; set; } + public int NumberOfRetriesToComplete { get; set; } } } } \ No newline at end of file diff --git a/src/ServiceControl.MultiInstance.AcceptanceTests/Recoverability/WhenRetryingWithEdit.cs b/src/ServiceControl.MultiInstance.AcceptanceTests/Recoverability/WhenRetryingWithEdit.cs index 3f92ce4730..d2d01d95ce 100644 --- a/src/ServiceControl.MultiInstance.AcceptanceTests/Recoverability/WhenRetryingWithEdit.cs +++ b/src/ServiceControl.MultiInstance.AcceptanceTests/Recoverability/WhenRetryingWithEdit.cs @@ -14,7 +14,7 @@ namespace ServiceControl.MultiInstance.AcceptanceTests.Recoverability; class WhenRetryingWithEdit : WhenRetrying { - [Test, Explicit] + [Test] public async Task ShouldCreateNewMessageAndResolveEditedMessage() { CustomServiceControlPrimarySettings = s => { s.AllowMessageEditing = true; }; @@ -49,7 +49,7 @@ await this.Post($"/api/edit/{failedMessage.Item.UniqueMessageId}", return failedResolvedMessage.HasResult; // If there is a result it means the message was resolved }) - .Run(TimeSpan.FromMinutes(2)); + .Run(TimeSpan.FromSeconds(30)); } class FailureEndpoint : EndpointConfigurationBuilder