Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<MyContext>()
await Define<MyContext>(context => context.NumberOfRetriesToComplete = retryTypes.Length)
.WithEndpoint<FailureEndpoint>(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<object>($"/api/edit/{failedMessage.Item.UniqueMessageId}",
new
{
MessageBody = $"{{ \"Name\": \"Hello {c.RetryCount}\" }}",
MessageBody = $"{{ \"Name\": \"Hello {c.ExceptionsThrown}\" }}",
MessageHeaders = failedMessage.Item.ProcessingAttempts[^1].Headers
}, null,
ServiceControlInstanceName);
Expand All @@ -76,13 +74,12 @@ await this.Post<object>($"/api/edit/{failedMessage.Item.UniqueMessageId}",
await this.Post<object>($"/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
Expand All @@ -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");
}
Expand All @@ -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; }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ namespace ServiceControl.MultiInstance.AcceptanceTests.Recoverability;

class WhenRetryingWithEdit : WhenRetrying
{
[Test, Explicit]
[Test]
public async Task ShouldCreateNewMessageAndResolveEditedMessage()
{
CustomServiceControlPrimarySettings = s => { s.AllowMessageEditing = true; };
Expand Down Expand Up @@ -49,7 +49,7 @@ await this.Post<object>($"/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
Expand Down