diff --git a/sdk/core/Azure.Core.TestFramework/src/RecordedTestAttribute.cs b/sdk/core/Azure.Core.TestFramework/src/RecordedTestAttribute.cs index 3429e740885a..19ff8b42aad8 100644 --- a/sdk/core/Azure.Core.TestFramework/src/RecordedTestAttribute.cs +++ b/sdk/core/Azure.Core.TestFramework/src/RecordedTestAttribute.cs @@ -100,33 +100,51 @@ public override TestResult Execute(TestExecutionContext context) if (resultMessage.Contains(typeof(TestTimeoutException).FullName)) { - // retry once - context.CurrentResult = context.CurrentTest.MakeTestResult(); - context.CurrentResult = innerCommand.Execute(context); + return HandleTestTimeout(context, originalResult); + } + } - if (IsTestFailed(context)) - { - context.CurrentResult.SetResult( - ResultState.Error, - "The test timed out twice:" + Environment.NewLine + - $"First attempt: {originalResult.Message}" + Environment.NewLine + - $"Second attempt: {context.CurrentResult.Message}"); - } - else - { - context.CurrentResult.SetResult( - context.CurrentResult.ResultState, - "Test timed out in initial run, but was retried successfully."); - } + CheckForIgnoredServiceErrors(context); + return context.CurrentResult; + } + private TestResult HandleTestTimeout(TestExecutionContext context, TestResult originalResult) + { + var results = new List { originalResult }; + + for (int retryCount = 0; retryCount < 2; retryCount++) + { + // Create a new TestResult instance + context.CurrentResult = context.CurrentTest.MakeTestResult(); + // Run the test again + context.CurrentResult = innerCommand.Execute(context); + results.Add(context.CurrentResult); + + if (!IsTestFailed(context)) + { + context.CurrentResult.SetResult( + ResultState.Success, + ConstructRetryMessage("Test timed out initially, but passed on retry", results)); return context.CurrentResult; } } - CheckForIgnoredServiceErrors(context); + context.CurrentResult.SetResult( + ResultState.Error, + ConstructRetryMessage("The test timed out on all attempts", results)); + return context.CurrentResult; } + private static string ConstructRetryMessage(string header, IEnumerable results) + { + var attemptDetails = string.Join(Environment.NewLine, + results.Select((r, i) => + $"Attempt {i + 1}: {r.Message ?? "Passed"}")); + + return header + ":" + Environment.NewLine + attemptDetails + Environment.NewLine; + } + private void CheckForIgnoredServiceErrors(TestExecutionContext context) { // Check if there are any service errors we should ignore.