Add --retry-failed-tests-delay option to MTP retry package - #7840

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option
May 15, 2026
Merged

Add --retry-failed-tests-delay option to MTP retry package#7840
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option

Conversation

CopilotAI commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

The retry extension had no way to introduce a wait between retry attempts, making it less useful for tests interacting with external systems (message queues, databases, etc.) where a cooldown period reduces flakiness.

Changes

  • New CLI option --retry-failed-tests-delay: accepts a timespan value using the same unit-aware format as --hangdump-timeout (e.g. 200, 1s, 2.5m, 1h; default unit is milliseconds)
  • RetryCommandLineOptionsProvider: registers the option, validates it requires --retry-failed-tests, validates the argument via TimeSpanParser.TryParse, and enforces a valid range (non-negative, no greater than int.MaxValue milliseconds — the Task.Delay maximum)
  • RetryOrchestrator: strips the delay arg from arguments forwarded to child processes (with a bounds check before adding argIndex + 1 to the cleanup list); applies Task.Delay at the top of the retry loop (after attemptCount++, before any per-attempt resources are allocated), skipping the first attempt; uses TryParse with a Length > 0 guard instead of Parse for defensive handling
  • Resources: added description and invalid-argument error strings; description now includes a bare-millisecond example (200) alongside unit-suffixed examples
  • Tests: coverage for valid/invalid timespan values (including whitespace-only and out-of-range inputs), the dependency-on-retry-option validation, and an integration test (RetryFailedTests_WithDelay_StripsDelayFromChildArgs) that verifies the option is correctly stripped from child-process arguments end-to-end

Usage

dotnet test -- --retry-failed-tests 3 --retry-failed-tests-delay 2s

CopilotAI requested review from Copilot and removed request for CopilotApril 25, 2026 20:56
CopilotAI changed the title [WIP] Add --retry-delay-seconds option for MTP retryAdd --retry-failed-tests-delay option to MTP retry packageApr 25, 2026
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
CopilotAI review requested due to automatic review settings May 11, 2026 17:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds a configurable delay between retry attempts for the retry-failed-tests extension to reduce flakiness for external-system-dependent tests.

Changes:

  • Introduces --retry-failed-tests-delay CLI option with unit-aware timespan parsing and validation.
  • Applies an inter-attempt Task.Delay in RetryOrchestrator and strips the option from forwarded child-process args.
  • Updates help text, package docs, resources, and adds unit tests for option validation.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/RetryTests.csAdds unit tests for delay option parsing/validation and dependency on --retry-failed-tests.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.csAdjusts nullability usage (null!) in mocks.
test/IntegrationTests/Microsoft.Testing.Platform.Acceptance.IntegrationTests/HelpInfoAllExtensionsTests.csUpdates expected help output to include the new delay option.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.csRemoves delay arg from forwarded args; parses delay option and delays between attempts.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryCommandLineOptionsProvider.csRegisters the new option and validates dependency + timespan format.
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hant.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hans.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.tr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ru.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pt-BR.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pl.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ko.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ja.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.it.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.fr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.es.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.de.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.cs.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/ExtensionResources.resxAdds delay option description and invalid-argument error string.
src/Platform/Microsoft.Testing.Extensions.Retry/PACKAGE.mdDocuments the new delay feature and CLI option usage.

Copilot's findings

  • Files reviewed: 20/20 changed files
  • Comments generated: 4

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Critical — will cause test failure]HelpInfoAllExtensionsTests.cs: The --help output test was updated for --retry-failed-tests-delay, but the Info_WithAllExtensionsRegistered_OutputFullInfoContent test was not. Because AssertOutputMatchesLines performs sequential line-by-line matching, the test will fail in CI — the actual --info output now includes the delay option under RetryCommandLineOptionsProvider, but the expected pattern jumps straight to TerminalTestReporterCommandLineOptionsProvider. Four lines need to be inserted in the pattern.

  2. [Minor — coverage gap]RetryTests.cs (IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption): The whitespace-only input (" ") takes a distinct early-return path in TimeSpanParser.TryParse but is not included in the [DataRow] set.

  3. [Moderate — missing behavioral coverage] Neither the new unit tests nor the existing RetryFailedTestsTests.cs integration tests verify the actual delay behaviour in RetryOrchestrator: that Task.Delay is applied between retry attempts (not before the first), and that --retry-failed-tests-delay is stripped from the child-process argument list.

Recommendations

  • Add the --retry-failed-tests-delay block to the --info expected-output string in HelpInfoAllExtensionsTests.cs (around line 342, after the --retry-failed-tests-max-tests entry).
  • Add [DataRow(" ")] to IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption.
  • Add an acceptance or unit test that exercises the orchestrator's delay and arg-stripping logic end-to-end.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

…DataRow
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

[Defensive] TimeSpanParser.Parse in orchestrator path (RetryOrchestrator.cs:158)
The orchestrator calls TimeSpanParser.Parse (which throws FormatException) rather than the TryParse pattern used elsewhere in the same method. No bounds check on retryDelayArgs before [0] access either, inconsistent with how cmdRetries is guarded at line 98. Low practical risk since validation runs first, but adds a latent uncaught-exception path.

[Resources] Pipe server created before delay fires (RetryOrchestrator.cs:181 / 282)
RetryFailedTestsPipeServer (OS named-pipe listener) is created ~100 lines before the Task.Delay fires. For large delays (minutes/hours), the pipe holds OS resources for the entire wait period before the child process is launched. Moving the delay to the top of the loop body (immediately after attemptCount++) would scope the pipe server to only the window where it's needed.

Positive Observations

  • Correctness of the retry-delay logic is sound: delay correctly skips attempt 1 (attemptCount > 1), fires before each subsequent attempt, and applies ConfigureAwait(false) throughout.
  • Cancellation token is correctly threaded into Task.Delay — cancellation during the wait will propagate as OperationCanceledException, which is the expected behavior for this framework.
  • Argument stripping (indexToCleanup) correctly removes both the option flag and its value, consistent with all other stripped options.
  • Validation in RetryCommandLineOptionsProvider is complete: dependency on --retry-failed-tests, format validation via TryParse, and test coverage for valid/invalid inputs.
  • TimeSpanParser.TryParse correctly rejects empty strings and invalid formats per the new unit tests.

Overall Assessment

The implementation is logically correct and well-structured. Both findings are minor defensive/resource concerns rather than correctness bugs. No threading issues, security vulnerabilities, or public API breaking changes were identified.


🧠 Reviewed by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 18:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot added needs/attention Needs maintainer attention. and removed needs/author-feedback Waiting on the original author. labels May 11, 2026
…tion
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 19:02
@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review May 13, 2026 09:29
CopilotAI review requested due to automatic review settings May 13, 2026 09:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 21/21 changed files
  • Comments generated: 1

…clude supported range
The error message now mentions the supported range (non-negative and no greater
than 2147483647ms / ~24.20:31:23.647) to clarify that syntactically valid but
out-of-range values like '25d' are also rejected.
Addresses review comment: #7840 (comment)
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 13, 2026 14:31
@Evangelink

Copy link
Copy Markdown
Member

Copilot address review comments

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
ContributorAuthor

Copilot address review comments

The open review comment about the resource string was addressed in commit 9b43a08 — the error message now mentions the supported range: "requires a valid time span value that is non-negative and no greater than 2147483647ms (~24.20:31:23.647) (e.g. 200, 1s, 2.5m, 1h)". All 14 XLF localization files were updated in the same commit.

…eptance test
The MTP --info output sorts options alphabetically per provider, so
--retry-failed-tests-delay must appear between --retry-failed-tests and
--retry-failed-tests-max-percentage, not after --retry-failed-tests-max-tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 15, 2026 08:01

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@Evangelink
Amaury Levé (Evangelink) merged commit ad9849c into mainMay 15, 2026
20 of 22 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/add-retry-delay-seconds-option branch May 15, 2026 17:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot removed the needs/attention Needs maintainer attention. label May 15, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MTP retry: add a --retry-delay-seconds option to add delay in seconds between retries

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add --retry-failed-tests-delay option to MTP retry package - #7840

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option
May 15, 2026
Merged

Add --retry-failed-tests-delay option to MTP retry package#7840
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option

Conversation

CopilotAI commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

The retry extension had no way to introduce a wait between retry attempts, making it less useful for tests interacting with external systems (message queues, databases, etc.) where a cooldown period reduces flakiness.

Changes

  • New CLI option --retry-failed-tests-delay: accepts a timespan value using the same unit-aware format as --hangdump-timeout (e.g. 200, 1s, 2.5m, 1h; default unit is milliseconds)
  • RetryCommandLineOptionsProvider: registers the option, validates it requires --retry-failed-tests, validates the argument via TimeSpanParser.TryParse, and enforces a valid range (non-negative, no greater than int.MaxValue milliseconds — the Task.Delay maximum)
  • RetryOrchestrator: strips the delay arg from arguments forwarded to child processes (with a bounds check before adding argIndex + 1 to the cleanup list); applies Task.Delay at the top of the retry loop (after attemptCount++, before any per-attempt resources are allocated), skipping the first attempt; uses TryParse with a Length > 0 guard instead of Parse for defensive handling
  • Resources: added description and invalid-argument error strings; description now includes a bare-millisecond example (200) alongside unit-suffixed examples
  • Tests: coverage for valid/invalid timespan values (including whitespace-only and out-of-range inputs), the dependency-on-retry-option validation, and an integration test (RetryFailedTests_WithDelay_StripsDelayFromChildArgs) that verifies the option is correctly stripped from child-process arguments end-to-end

Usage

dotnet test -- --retry-failed-tests 3 --retry-failed-tests-delay 2s

CopilotAI requested review from Copilot and removed request for CopilotApril 25, 2026 20:56
CopilotAI changed the title [WIP] Add --retry-delay-seconds option for MTP retryAdd --retry-failed-tests-delay option to MTP retry packageApr 25, 2026
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
CopilotAI review requested due to automatic review settings May 11, 2026 17:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds a configurable delay between retry attempts for the retry-failed-tests extension to reduce flakiness for external-system-dependent tests.

Changes:

  • Introduces --retry-failed-tests-delay CLI option with unit-aware timespan parsing and validation.
  • Applies an inter-attempt Task.Delay in RetryOrchestrator and strips the option from forwarded child-process args.
  • Updates help text, package docs, resources, and adds unit tests for option validation.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/RetryTests.csAdds unit tests for delay option parsing/validation and dependency on --retry-failed-tests.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.csAdjusts nullability usage (null!) in mocks.
test/IntegrationTests/Microsoft.Testing.Platform.Acceptance.IntegrationTests/HelpInfoAllExtensionsTests.csUpdates expected help output to include the new delay option.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.csRemoves delay arg from forwarded args; parses delay option and delays between attempts.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryCommandLineOptionsProvider.csRegisters the new option and validates dependency + timespan format.
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hant.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hans.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.tr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ru.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pt-BR.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pl.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ko.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ja.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.it.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.fr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.es.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.de.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.cs.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/ExtensionResources.resxAdds delay option description and invalid-argument error string.
src/Platform/Microsoft.Testing.Extensions.Retry/PACKAGE.mdDocuments the new delay feature and CLI option usage.

Copilot's findings

  • Files reviewed: 20/20 changed files
  • Comments generated: 4

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Critical — will cause test failure]HelpInfoAllExtensionsTests.cs: The --help output test was updated for --retry-failed-tests-delay, but the Info_WithAllExtensionsRegistered_OutputFullInfoContent test was not. Because AssertOutputMatchesLines performs sequential line-by-line matching, the test will fail in CI — the actual --info output now includes the delay option under RetryCommandLineOptionsProvider, but the expected pattern jumps straight to TerminalTestReporterCommandLineOptionsProvider. Four lines need to be inserted in the pattern.

  2. [Minor — coverage gap]RetryTests.cs (IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption): The whitespace-only input (" ") takes a distinct early-return path in TimeSpanParser.TryParse but is not included in the [DataRow] set.

  3. [Moderate — missing behavioral coverage] Neither the new unit tests nor the existing RetryFailedTestsTests.cs integration tests verify the actual delay behaviour in RetryOrchestrator: that Task.Delay is applied between retry attempts (not before the first), and that --retry-failed-tests-delay is stripped from the child-process argument list.

Recommendations

  • Add the --retry-failed-tests-delay block to the --info expected-output string in HelpInfoAllExtensionsTests.cs (around line 342, after the --retry-failed-tests-max-tests entry).
  • Add [DataRow(" ")] to IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption.
  • Add an acceptance or unit test that exercises the orchestrator's delay and arg-stripping logic end-to-end.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

…DataRow
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

[Defensive] TimeSpanParser.Parse in orchestrator path (RetryOrchestrator.cs:158)
The orchestrator calls TimeSpanParser.Parse (which throws FormatException) rather than the TryParse pattern used elsewhere in the same method. No bounds check on retryDelayArgs before [0] access either, inconsistent with how cmdRetries is guarded at line 98. Low practical risk since validation runs first, but adds a latent uncaught-exception path.

[Resources] Pipe server created before delay fires (RetryOrchestrator.cs:181 / 282)
RetryFailedTestsPipeServer (OS named-pipe listener) is created ~100 lines before the Task.Delay fires. For large delays (minutes/hours), the pipe holds OS resources for the entire wait period before the child process is launched. Moving the delay to the top of the loop body (immediately after attemptCount++) would scope the pipe server to only the window where it's needed.

Positive Observations

  • Correctness of the retry-delay logic is sound: delay correctly skips attempt 1 (attemptCount > 1), fires before each subsequent attempt, and applies ConfigureAwait(false) throughout.
  • Cancellation token is correctly threaded into Task.Delay — cancellation during the wait will propagate as OperationCanceledException, which is the expected behavior for this framework.
  • Argument stripping (indexToCleanup) correctly removes both the option flag and its value, consistent with all other stripped options.
  • Validation in RetryCommandLineOptionsProvider is complete: dependency on --retry-failed-tests, format validation via TryParse, and test coverage for valid/invalid inputs.
  • TimeSpanParser.TryParse correctly rejects empty strings and invalid formats per the new unit tests.

Overall Assessment

The implementation is logically correct and well-structured. Both findings are minor defensive/resource concerns rather than correctness bugs. No threading issues, security vulnerabilities, or public API breaking changes were identified.


🧠 Reviewed by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 18:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot added needs/attention Needs maintainer attention. and removed needs/author-feedback Waiting on the original author. labels May 11, 2026
…tion
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 19:02
@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review May 13, 2026 09:29
CopilotAI review requested due to automatic review settings May 13, 2026 09:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 21/21 changed files
  • Comments generated: 1

…clude supported range
The error message now mentions the supported range (non-negative and no greater
than 2147483647ms / ~24.20:31:23.647) to clarify that syntactically valid but
out-of-range values like '25d' are also rejected.
Addresses review comment: #7840 (comment)
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 13, 2026 14:31
@Evangelink

Copy link
Copy Markdown
Member

Copilot address review comments

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
ContributorAuthor

Copilot address review comments

The open review comment about the resource string was addressed in commit 9b43a08 — the error message now mentions the supported range: "requires a valid time span value that is non-negative and no greater than 2147483647ms (~24.20:31:23.647) (e.g. 200, 1s, 2.5m, 1h)". All 14 XLF localization files were updated in the same commit.

…eptance test
The MTP --info output sorts options alphabetically per provider, so
--retry-failed-tests-delay must appear between --retry-failed-tests and
--retry-failed-tests-max-percentage, not after --retry-failed-tests-max-tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 15, 2026 08:01

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@Evangelink
Amaury Levé (Evangelink) merged commit ad9849c into mainMay 15, 2026
20 of 22 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/add-retry-delay-seconds-option branch May 15, 2026 17:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot removed the needs/attention Needs maintainer attention. label May 15, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MTP retry: add a --retry-delay-seconds option to add delay in seconds between retries

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add --retry-failed-tests-delay option to MTP retry package - #7840

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option
May 15, 2026
Merged

Add --retry-failed-tests-delay option to MTP retry package#7840
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option

Conversation

CopilotAI commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

The retry extension had no way to introduce a wait between retry attempts, making it less useful for tests interacting with external systems (message queues, databases, etc.) where a cooldown period reduces flakiness.

Changes

  • New CLI option --retry-failed-tests-delay: accepts a timespan value using the same unit-aware format as --hangdump-timeout (e.g. 200, 1s, 2.5m, 1h; default unit is milliseconds)
  • RetryCommandLineOptionsProvider: registers the option, validates it requires --retry-failed-tests, validates the argument via TimeSpanParser.TryParse, and enforces a valid range (non-negative, no greater than int.MaxValue milliseconds — the Task.Delay maximum)
  • RetryOrchestrator: strips the delay arg from arguments forwarded to child processes (with a bounds check before adding argIndex + 1 to the cleanup list); applies Task.Delay at the top of the retry loop (after attemptCount++, before any per-attempt resources are allocated), skipping the first attempt; uses TryParse with a Length > 0 guard instead of Parse for defensive handling
  • Resources: added description and invalid-argument error strings; description now includes a bare-millisecond example (200) alongside unit-suffixed examples
  • Tests: coverage for valid/invalid timespan values (including whitespace-only and out-of-range inputs), the dependency-on-retry-option validation, and an integration test (RetryFailedTests_WithDelay_StripsDelayFromChildArgs) that verifies the option is correctly stripped from child-process arguments end-to-end

Usage

dotnet test -- --retry-failed-tests 3 --retry-failed-tests-delay 2s

CopilotAI requested review from Copilot and removed request for CopilotApril 25, 2026 20:56
CopilotAI changed the title [WIP] Add --retry-delay-seconds option for MTP retryAdd --retry-failed-tests-delay option to MTP retry packageApr 25, 2026
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
CopilotAI review requested due to automatic review settings May 11, 2026 17:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds a configurable delay between retry attempts for the retry-failed-tests extension to reduce flakiness for external-system-dependent tests.

Changes:

  • Introduces --retry-failed-tests-delay CLI option with unit-aware timespan parsing and validation.
  • Applies an inter-attempt Task.Delay in RetryOrchestrator and strips the option from forwarded child-process args.
  • Updates help text, package docs, resources, and adds unit tests for option validation.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/RetryTests.csAdds unit tests for delay option parsing/validation and dependency on --retry-failed-tests.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.csAdjusts nullability usage (null!) in mocks.
test/IntegrationTests/Microsoft.Testing.Platform.Acceptance.IntegrationTests/HelpInfoAllExtensionsTests.csUpdates expected help output to include the new delay option.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.csRemoves delay arg from forwarded args; parses delay option and delays between attempts.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryCommandLineOptionsProvider.csRegisters the new option and validates dependency + timespan format.
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hant.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hans.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.tr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ru.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pt-BR.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pl.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ko.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ja.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.it.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.fr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.es.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.de.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.cs.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/ExtensionResources.resxAdds delay option description and invalid-argument error string.
src/Platform/Microsoft.Testing.Extensions.Retry/PACKAGE.mdDocuments the new delay feature and CLI option usage.

Copilot's findings

  • Files reviewed: 20/20 changed files
  • Comments generated: 4

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Critical — will cause test failure]HelpInfoAllExtensionsTests.cs: The --help output test was updated for --retry-failed-tests-delay, but the Info_WithAllExtensionsRegistered_OutputFullInfoContent test was not. Because AssertOutputMatchesLines performs sequential line-by-line matching, the test will fail in CI — the actual --info output now includes the delay option under RetryCommandLineOptionsProvider, but the expected pattern jumps straight to TerminalTestReporterCommandLineOptionsProvider. Four lines need to be inserted in the pattern.

  2. [Minor — coverage gap]RetryTests.cs (IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption): The whitespace-only input (" ") takes a distinct early-return path in TimeSpanParser.TryParse but is not included in the [DataRow] set.

  3. [Moderate — missing behavioral coverage] Neither the new unit tests nor the existing RetryFailedTestsTests.cs integration tests verify the actual delay behaviour in RetryOrchestrator: that Task.Delay is applied between retry attempts (not before the first), and that --retry-failed-tests-delay is stripped from the child-process argument list.

Recommendations

  • Add the --retry-failed-tests-delay block to the --info expected-output string in HelpInfoAllExtensionsTests.cs (around line 342, after the --retry-failed-tests-max-tests entry).
  • Add [DataRow(" ")] to IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption.
  • Add an acceptance or unit test that exercises the orchestrator's delay and arg-stripping logic end-to-end.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

…DataRow
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

[Defensive] TimeSpanParser.Parse in orchestrator path (RetryOrchestrator.cs:158)
The orchestrator calls TimeSpanParser.Parse (which throws FormatException) rather than the TryParse pattern used elsewhere in the same method. No bounds check on retryDelayArgs before [0] access either, inconsistent with how cmdRetries is guarded at line 98. Low practical risk since validation runs first, but adds a latent uncaught-exception path.

[Resources] Pipe server created before delay fires (RetryOrchestrator.cs:181 / 282)
RetryFailedTestsPipeServer (OS named-pipe listener) is created ~100 lines before the Task.Delay fires. For large delays (minutes/hours), the pipe holds OS resources for the entire wait period before the child process is launched. Moving the delay to the top of the loop body (immediately after attemptCount++) would scope the pipe server to only the window where it's needed.

Positive Observations

  • Correctness of the retry-delay logic is sound: delay correctly skips attempt 1 (attemptCount > 1), fires before each subsequent attempt, and applies ConfigureAwait(false) throughout.
  • Cancellation token is correctly threaded into Task.Delay — cancellation during the wait will propagate as OperationCanceledException, which is the expected behavior for this framework.
  • Argument stripping (indexToCleanup) correctly removes both the option flag and its value, consistent with all other stripped options.
  • Validation in RetryCommandLineOptionsProvider is complete: dependency on --retry-failed-tests, format validation via TryParse, and test coverage for valid/invalid inputs.
  • TimeSpanParser.TryParse correctly rejects empty strings and invalid formats per the new unit tests.

Overall Assessment

The implementation is logically correct and well-structured. Both findings are minor defensive/resource concerns rather than correctness bugs. No threading issues, security vulnerabilities, or public API breaking changes were identified.


🧠 Reviewed by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 18:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot added needs/attention Needs maintainer attention. and removed needs/author-feedback Waiting on the original author. labels May 11, 2026
…tion
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 19:02
@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review May 13, 2026 09:29
CopilotAI review requested due to automatic review settings May 13, 2026 09:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 21/21 changed files
  • Comments generated: 1

…clude supported range
The error message now mentions the supported range (non-negative and no greater
than 2147483647ms / ~24.20:31:23.647) to clarify that syntactically valid but
out-of-range values like '25d' are also rejected.
Addresses review comment: #7840 (comment)
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 13, 2026 14:31
@Evangelink

Copy link
Copy Markdown
Member

Copilot address review comments

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
ContributorAuthor

Copilot address review comments

The open review comment about the resource string was addressed in commit 9b43a08 — the error message now mentions the supported range: "requires a valid time span value that is non-negative and no greater than 2147483647ms (~24.20:31:23.647) (e.g. 200, 1s, 2.5m, 1h)". All 14 XLF localization files were updated in the same commit.

…eptance test
The MTP --info output sorts options alphabetically per provider, so
--retry-failed-tests-delay must appear between --retry-failed-tests and
--retry-failed-tests-max-percentage, not after --retry-failed-tests-max-tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 15, 2026 08:01

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@Evangelink
Amaury Levé (Evangelink) merged commit ad9849c into mainMay 15, 2026
20 of 22 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/add-retry-delay-seconds-option branch May 15, 2026 17:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot removed the needs/attention Needs maintainer attention. label May 15, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MTP retry: add a --retry-delay-seconds option to add delay in seconds between retries

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add --retry-failed-tests-delay option to MTP retry package - #7840

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option
May 15, 2026
Merged

Add --retry-failed-tests-delay option to MTP retry package#7840
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option

Conversation

CopilotAI commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

The retry extension had no way to introduce a wait between retry attempts, making it less useful for tests interacting with external systems (message queues, databases, etc.) where a cooldown period reduces flakiness.

Changes

  • New CLI option --retry-failed-tests-delay: accepts a timespan value using the same unit-aware format as --hangdump-timeout (e.g. 200, 1s, 2.5m, 1h; default unit is milliseconds)
  • RetryCommandLineOptionsProvider: registers the option, validates it requires --retry-failed-tests, validates the argument via TimeSpanParser.TryParse, and enforces a valid range (non-negative, no greater than int.MaxValue milliseconds — the Task.Delay maximum)
  • RetryOrchestrator: strips the delay arg from arguments forwarded to child processes (with a bounds check before adding argIndex + 1 to the cleanup list); applies Task.Delay at the top of the retry loop (after attemptCount++, before any per-attempt resources are allocated), skipping the first attempt; uses TryParse with a Length > 0 guard instead of Parse for defensive handling
  • Resources: added description and invalid-argument error strings; description now includes a bare-millisecond example (200) alongside unit-suffixed examples
  • Tests: coverage for valid/invalid timespan values (including whitespace-only and out-of-range inputs), the dependency-on-retry-option validation, and an integration test (RetryFailedTests_WithDelay_StripsDelayFromChildArgs) that verifies the option is correctly stripped from child-process arguments end-to-end

Usage

dotnet test -- --retry-failed-tests 3 --retry-failed-tests-delay 2s

CopilotAI requested review from Copilot and removed request for CopilotApril 25, 2026 20:56
CopilotAI changed the title [WIP] Add --retry-delay-seconds option for MTP retryAdd --retry-failed-tests-delay option to MTP retry packageApr 25, 2026
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
CopilotAI review requested due to automatic review settings May 11, 2026 17:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds a configurable delay between retry attempts for the retry-failed-tests extension to reduce flakiness for external-system-dependent tests.

Changes:

  • Introduces --retry-failed-tests-delay CLI option with unit-aware timespan parsing and validation.
  • Applies an inter-attempt Task.Delay in RetryOrchestrator and strips the option from forwarded child-process args.
  • Updates help text, package docs, resources, and adds unit tests for option validation.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/RetryTests.csAdds unit tests for delay option parsing/validation and dependency on --retry-failed-tests.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.csAdjusts nullability usage (null!) in mocks.
test/IntegrationTests/Microsoft.Testing.Platform.Acceptance.IntegrationTests/HelpInfoAllExtensionsTests.csUpdates expected help output to include the new delay option.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.csRemoves delay arg from forwarded args; parses delay option and delays between attempts.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryCommandLineOptionsProvider.csRegisters the new option and validates dependency + timespan format.
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hant.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hans.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.tr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ru.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pt-BR.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pl.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ko.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ja.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.it.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.fr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.es.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.de.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.cs.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/ExtensionResources.resxAdds delay option description and invalid-argument error string.
src/Platform/Microsoft.Testing.Extensions.Retry/PACKAGE.mdDocuments the new delay feature and CLI option usage.

Copilot's findings

  • Files reviewed: 20/20 changed files
  • Comments generated: 4

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Critical — will cause test failure]HelpInfoAllExtensionsTests.cs: The --help output test was updated for --retry-failed-tests-delay, but the Info_WithAllExtensionsRegistered_OutputFullInfoContent test was not. Because AssertOutputMatchesLines performs sequential line-by-line matching, the test will fail in CI — the actual --info output now includes the delay option under RetryCommandLineOptionsProvider, but the expected pattern jumps straight to TerminalTestReporterCommandLineOptionsProvider. Four lines need to be inserted in the pattern.

  2. [Minor — coverage gap]RetryTests.cs (IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption): The whitespace-only input (" ") takes a distinct early-return path in TimeSpanParser.TryParse but is not included in the [DataRow] set.

  3. [Moderate — missing behavioral coverage] Neither the new unit tests nor the existing RetryFailedTestsTests.cs integration tests verify the actual delay behaviour in RetryOrchestrator: that Task.Delay is applied between retry attempts (not before the first), and that --retry-failed-tests-delay is stripped from the child-process argument list.

Recommendations

  • Add the --retry-failed-tests-delay block to the --info expected-output string in HelpInfoAllExtensionsTests.cs (around line 342, after the --retry-failed-tests-max-tests entry).
  • Add [DataRow(" ")] to IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption.
  • Add an acceptance or unit test that exercises the orchestrator's delay and arg-stripping logic end-to-end.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

…DataRow
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

[Defensive] TimeSpanParser.Parse in orchestrator path (RetryOrchestrator.cs:158)
The orchestrator calls TimeSpanParser.Parse (which throws FormatException) rather than the TryParse pattern used elsewhere in the same method. No bounds check on retryDelayArgs before [0] access either, inconsistent with how cmdRetries is guarded at line 98. Low practical risk since validation runs first, but adds a latent uncaught-exception path.

[Resources] Pipe server created before delay fires (RetryOrchestrator.cs:181 / 282)
RetryFailedTestsPipeServer (OS named-pipe listener) is created ~100 lines before the Task.Delay fires. For large delays (minutes/hours), the pipe holds OS resources for the entire wait period before the child process is launched. Moving the delay to the top of the loop body (immediately after attemptCount++) would scope the pipe server to only the window where it's needed.

Positive Observations

  • Correctness of the retry-delay logic is sound: delay correctly skips attempt 1 (attemptCount > 1), fires before each subsequent attempt, and applies ConfigureAwait(false) throughout.
  • Cancellation token is correctly threaded into Task.Delay — cancellation during the wait will propagate as OperationCanceledException, which is the expected behavior for this framework.
  • Argument stripping (indexToCleanup) correctly removes both the option flag and its value, consistent with all other stripped options.
  • Validation in RetryCommandLineOptionsProvider is complete: dependency on --retry-failed-tests, format validation via TryParse, and test coverage for valid/invalid inputs.
  • TimeSpanParser.TryParse correctly rejects empty strings and invalid formats per the new unit tests.

Overall Assessment

The implementation is logically correct and well-structured. Both findings are minor defensive/resource concerns rather than correctness bugs. No threading issues, security vulnerabilities, or public API breaking changes were identified.


🧠 Reviewed by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 18:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot added needs/attention Needs maintainer attention. and removed needs/author-feedback Waiting on the original author. labels May 11, 2026
…tion
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 19:02
@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review May 13, 2026 09:29
CopilotAI review requested due to automatic review settings May 13, 2026 09:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 21/21 changed files
  • Comments generated: 1

…clude supported range
The error message now mentions the supported range (non-negative and no greater
than 2147483647ms / ~24.20:31:23.647) to clarify that syntactically valid but
out-of-range values like '25d' are also rejected.
Addresses review comment: #7840 (comment)
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 13, 2026 14:31
@Evangelink

Copy link
Copy Markdown
Member

Copilot address review comments

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
ContributorAuthor

Copilot address review comments

The open review comment about the resource string was addressed in commit 9b43a08 — the error message now mentions the supported range: "requires a valid time span value that is non-negative and no greater than 2147483647ms (~24.20:31:23.647) (e.g. 200, 1s, 2.5m, 1h)". All 14 XLF localization files were updated in the same commit.

…eptance test
The MTP --info output sorts options alphabetically per provider, so
--retry-failed-tests-delay must appear between --retry-failed-tests and
--retry-failed-tests-max-percentage, not after --retry-failed-tests-max-tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 15, 2026 08:01

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@Evangelink
Amaury Levé (Evangelink) merged commit ad9849c into mainMay 15, 2026
20 of 22 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/add-retry-delay-seconds-option branch May 15, 2026 17:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot removed the needs/attention Needs maintainer attention. label May 15, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MTP retry: add a --retry-delay-seconds option to add delay in seconds between retries

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add --retry-failed-tests-delay option to MTP retry package - #7840

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option
May 15, 2026
Merged

Add --retry-failed-tests-delay option to MTP retry package#7840
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option

Conversation

CopilotAI commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

The retry extension had no way to introduce a wait between retry attempts, making it less useful for tests interacting with external systems (message queues, databases, etc.) where a cooldown period reduces flakiness.

Changes

  • New CLI option --retry-failed-tests-delay: accepts a timespan value using the same unit-aware format as --hangdump-timeout (e.g. 200, 1s, 2.5m, 1h; default unit is milliseconds)
  • RetryCommandLineOptionsProvider: registers the option, validates it requires --retry-failed-tests, validates the argument via TimeSpanParser.TryParse, and enforces a valid range (non-negative, no greater than int.MaxValue milliseconds — the Task.Delay maximum)
  • RetryOrchestrator: strips the delay arg from arguments forwarded to child processes (with a bounds check before adding argIndex + 1 to the cleanup list); applies Task.Delay at the top of the retry loop (after attemptCount++, before any per-attempt resources are allocated), skipping the first attempt; uses TryParse with a Length > 0 guard instead of Parse for defensive handling
  • Resources: added description and invalid-argument error strings; description now includes a bare-millisecond example (200) alongside unit-suffixed examples
  • Tests: coverage for valid/invalid timespan values (including whitespace-only and out-of-range inputs), the dependency-on-retry-option validation, and an integration test (RetryFailedTests_WithDelay_StripsDelayFromChildArgs) that verifies the option is correctly stripped from child-process arguments end-to-end

Usage

dotnet test -- --retry-failed-tests 3 --retry-failed-tests-delay 2s

CopilotAI requested review from Copilot and removed request for CopilotApril 25, 2026 20:56
CopilotAI changed the title [WIP] Add --retry-delay-seconds option for MTP retryAdd --retry-failed-tests-delay option to MTP retry packageApr 25, 2026
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
CopilotAI review requested due to automatic review settings May 11, 2026 17:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds a configurable delay between retry attempts for the retry-failed-tests extension to reduce flakiness for external-system-dependent tests.

Changes:

  • Introduces --retry-failed-tests-delay CLI option with unit-aware timespan parsing and validation.
  • Applies an inter-attempt Task.Delay in RetryOrchestrator and strips the option from forwarded child-process args.
  • Updates help text, package docs, resources, and adds unit tests for option validation.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/RetryTests.csAdds unit tests for delay option parsing/validation and dependency on --retry-failed-tests.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.csAdjusts nullability usage (null!) in mocks.
test/IntegrationTests/Microsoft.Testing.Platform.Acceptance.IntegrationTests/HelpInfoAllExtensionsTests.csUpdates expected help output to include the new delay option.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.csRemoves delay arg from forwarded args; parses delay option and delays between attempts.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryCommandLineOptionsProvider.csRegisters the new option and validates dependency + timespan format.
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hant.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hans.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.tr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ru.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pt-BR.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pl.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ko.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ja.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.it.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.fr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.es.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.de.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.cs.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/ExtensionResources.resxAdds delay option description and invalid-argument error string.
src/Platform/Microsoft.Testing.Extensions.Retry/PACKAGE.mdDocuments the new delay feature and CLI option usage.

Copilot's findings

  • Files reviewed: 20/20 changed files
  • Comments generated: 4

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Critical — will cause test failure]HelpInfoAllExtensionsTests.cs: The --help output test was updated for --retry-failed-tests-delay, but the Info_WithAllExtensionsRegistered_OutputFullInfoContent test was not. Because AssertOutputMatchesLines performs sequential line-by-line matching, the test will fail in CI — the actual --info output now includes the delay option under RetryCommandLineOptionsProvider, but the expected pattern jumps straight to TerminalTestReporterCommandLineOptionsProvider. Four lines need to be inserted in the pattern.

  2. [Minor — coverage gap]RetryTests.cs (IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption): The whitespace-only input (" ") takes a distinct early-return path in TimeSpanParser.TryParse but is not included in the [DataRow] set.

  3. [Moderate — missing behavioral coverage] Neither the new unit tests nor the existing RetryFailedTestsTests.cs integration tests verify the actual delay behaviour in RetryOrchestrator: that Task.Delay is applied between retry attempts (not before the first), and that --retry-failed-tests-delay is stripped from the child-process argument list.

Recommendations

  • Add the --retry-failed-tests-delay block to the --info expected-output string in HelpInfoAllExtensionsTests.cs (around line 342, after the --retry-failed-tests-max-tests entry).
  • Add [DataRow(" ")] to IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption.
  • Add an acceptance or unit test that exercises the orchestrator's delay and arg-stripping logic end-to-end.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

…DataRow
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

[Defensive] TimeSpanParser.Parse in orchestrator path (RetryOrchestrator.cs:158)
The orchestrator calls TimeSpanParser.Parse (which throws FormatException) rather than the TryParse pattern used elsewhere in the same method. No bounds check on retryDelayArgs before [0] access either, inconsistent with how cmdRetries is guarded at line 98. Low practical risk since validation runs first, but adds a latent uncaught-exception path.

[Resources] Pipe server created before delay fires (RetryOrchestrator.cs:181 / 282)
RetryFailedTestsPipeServer (OS named-pipe listener) is created ~100 lines before the Task.Delay fires. For large delays (minutes/hours), the pipe holds OS resources for the entire wait period before the child process is launched. Moving the delay to the top of the loop body (immediately after attemptCount++) would scope the pipe server to only the window where it's needed.

Positive Observations

  • Correctness of the retry-delay logic is sound: delay correctly skips attempt 1 (attemptCount > 1), fires before each subsequent attempt, and applies ConfigureAwait(false) throughout.
  • Cancellation token is correctly threaded into Task.Delay — cancellation during the wait will propagate as OperationCanceledException, which is the expected behavior for this framework.
  • Argument stripping (indexToCleanup) correctly removes both the option flag and its value, consistent with all other stripped options.
  • Validation in RetryCommandLineOptionsProvider is complete: dependency on --retry-failed-tests, format validation via TryParse, and test coverage for valid/invalid inputs.
  • TimeSpanParser.TryParse correctly rejects empty strings and invalid formats per the new unit tests.

Overall Assessment

The implementation is logically correct and well-structured. Both findings are minor defensive/resource concerns rather than correctness bugs. No threading issues, security vulnerabilities, or public API breaking changes were identified.


🧠 Reviewed by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 18:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot added needs/attention Needs maintainer attention. and removed needs/author-feedback Waiting on the original author. labels May 11, 2026
…tion
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 19:02
@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review May 13, 2026 09:29
CopilotAI review requested due to automatic review settings May 13, 2026 09:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 21/21 changed files
  • Comments generated: 1

…clude supported range
The error message now mentions the supported range (non-negative and no greater
than 2147483647ms / ~24.20:31:23.647) to clarify that syntactically valid but
out-of-range values like '25d' are also rejected.
Addresses review comment: #7840 (comment)
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 13, 2026 14:31
@Evangelink

Copy link
Copy Markdown
Member

Copilot address review comments

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
ContributorAuthor

Copilot address review comments

The open review comment about the resource string was addressed in commit 9b43a08 — the error message now mentions the supported range: "requires a valid time span value that is non-negative and no greater than 2147483647ms (~24.20:31:23.647) (e.g. 200, 1s, 2.5m, 1h)". All 14 XLF localization files were updated in the same commit.

…eptance test
The MTP --info output sorts options alphabetically per provider, so
--retry-failed-tests-delay must appear between --retry-failed-tests and
--retry-failed-tests-max-percentage, not after --retry-failed-tests-max-tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 15, 2026 08:01

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@Evangelink
Amaury Levé (Evangelink) merged commit ad9849c into mainMay 15, 2026
20 of 22 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/add-retry-delay-seconds-option branch May 15, 2026 17:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot removed the needs/attention Needs maintainer attention. label May 15, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MTP retry: add a --retry-delay-seconds option to add delay in seconds between retries

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add --retry-failed-tests-delay option to MTP retry package - #7840

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option
May 15, 2026
Merged

Add --retry-failed-tests-delay option to MTP retry package#7840
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option

Conversation

CopilotAI commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

The retry extension had no way to introduce a wait between retry attempts, making it less useful for tests interacting with external systems (message queues, databases, etc.) where a cooldown period reduces flakiness.

Changes

  • New CLI option --retry-failed-tests-delay: accepts a timespan value using the same unit-aware format as --hangdump-timeout (e.g. 200, 1s, 2.5m, 1h; default unit is milliseconds)
  • RetryCommandLineOptionsProvider: registers the option, validates it requires --retry-failed-tests, validates the argument via TimeSpanParser.TryParse, and enforces a valid range (non-negative, no greater than int.MaxValue milliseconds — the Task.Delay maximum)
  • RetryOrchestrator: strips the delay arg from arguments forwarded to child processes (with a bounds check before adding argIndex + 1 to the cleanup list); applies Task.Delay at the top of the retry loop (after attemptCount++, before any per-attempt resources are allocated), skipping the first attempt; uses TryParse with a Length > 0 guard instead of Parse for defensive handling
  • Resources: added description and invalid-argument error strings; description now includes a bare-millisecond example (200) alongside unit-suffixed examples
  • Tests: coverage for valid/invalid timespan values (including whitespace-only and out-of-range inputs), the dependency-on-retry-option validation, and an integration test (RetryFailedTests_WithDelay_StripsDelayFromChildArgs) that verifies the option is correctly stripped from child-process arguments end-to-end

Usage

dotnet test -- --retry-failed-tests 3 --retry-failed-tests-delay 2s

CopilotAI requested review from Copilot and removed request for CopilotApril 25, 2026 20:56
CopilotAI changed the title [WIP] Add --retry-delay-seconds option for MTP retryAdd --retry-failed-tests-delay option to MTP retry packageApr 25, 2026
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
CopilotAI review requested due to automatic review settings May 11, 2026 17:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds a configurable delay between retry attempts for the retry-failed-tests extension to reduce flakiness for external-system-dependent tests.

Changes:

  • Introduces --retry-failed-tests-delay CLI option with unit-aware timespan parsing and validation.
  • Applies an inter-attempt Task.Delay in RetryOrchestrator and strips the option from forwarded child-process args.
  • Updates help text, package docs, resources, and adds unit tests for option validation.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/RetryTests.csAdds unit tests for delay option parsing/validation and dependency on --retry-failed-tests.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.csAdjusts nullability usage (null!) in mocks.
test/IntegrationTests/Microsoft.Testing.Platform.Acceptance.IntegrationTests/HelpInfoAllExtensionsTests.csUpdates expected help output to include the new delay option.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.csRemoves delay arg from forwarded args; parses delay option and delays between attempts.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryCommandLineOptionsProvider.csRegisters the new option and validates dependency + timespan format.
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hant.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hans.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.tr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ru.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pt-BR.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pl.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ko.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ja.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.it.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.fr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.es.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.de.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.cs.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/ExtensionResources.resxAdds delay option description and invalid-argument error string.
src/Platform/Microsoft.Testing.Extensions.Retry/PACKAGE.mdDocuments the new delay feature and CLI option usage.

Copilot's findings

  • Files reviewed: 20/20 changed files
  • Comments generated: 4

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Critical — will cause test failure]HelpInfoAllExtensionsTests.cs: The --help output test was updated for --retry-failed-tests-delay, but the Info_WithAllExtensionsRegistered_OutputFullInfoContent test was not. Because AssertOutputMatchesLines performs sequential line-by-line matching, the test will fail in CI — the actual --info output now includes the delay option under RetryCommandLineOptionsProvider, but the expected pattern jumps straight to TerminalTestReporterCommandLineOptionsProvider. Four lines need to be inserted in the pattern.

  2. [Minor — coverage gap]RetryTests.cs (IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption): The whitespace-only input (" ") takes a distinct early-return path in TimeSpanParser.TryParse but is not included in the [DataRow] set.

  3. [Moderate — missing behavioral coverage] Neither the new unit tests nor the existing RetryFailedTestsTests.cs integration tests verify the actual delay behaviour in RetryOrchestrator: that Task.Delay is applied between retry attempts (not before the first), and that --retry-failed-tests-delay is stripped from the child-process argument list.

Recommendations

  • Add the --retry-failed-tests-delay block to the --info expected-output string in HelpInfoAllExtensionsTests.cs (around line 342, after the --retry-failed-tests-max-tests entry).
  • Add [DataRow(" ")] to IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption.
  • Add an acceptance or unit test that exercises the orchestrator's delay and arg-stripping logic end-to-end.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

…DataRow
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

[Defensive] TimeSpanParser.Parse in orchestrator path (RetryOrchestrator.cs:158)
The orchestrator calls TimeSpanParser.Parse (which throws FormatException) rather than the TryParse pattern used elsewhere in the same method. No bounds check on retryDelayArgs before [0] access either, inconsistent with how cmdRetries is guarded at line 98. Low practical risk since validation runs first, but adds a latent uncaught-exception path.

[Resources] Pipe server created before delay fires (RetryOrchestrator.cs:181 / 282)
RetryFailedTestsPipeServer (OS named-pipe listener) is created ~100 lines before the Task.Delay fires. For large delays (minutes/hours), the pipe holds OS resources for the entire wait period before the child process is launched. Moving the delay to the top of the loop body (immediately after attemptCount++) would scope the pipe server to only the window where it's needed.

Positive Observations

  • Correctness of the retry-delay logic is sound: delay correctly skips attempt 1 (attemptCount > 1), fires before each subsequent attempt, and applies ConfigureAwait(false) throughout.
  • Cancellation token is correctly threaded into Task.Delay — cancellation during the wait will propagate as OperationCanceledException, which is the expected behavior for this framework.
  • Argument stripping (indexToCleanup) correctly removes both the option flag and its value, consistent with all other stripped options.
  • Validation in RetryCommandLineOptionsProvider is complete: dependency on --retry-failed-tests, format validation via TryParse, and test coverage for valid/invalid inputs.
  • TimeSpanParser.TryParse correctly rejects empty strings and invalid formats per the new unit tests.

Overall Assessment

The implementation is logically correct and well-structured. Both findings are minor defensive/resource concerns rather than correctness bugs. No threading issues, security vulnerabilities, or public API breaking changes were identified.


🧠 Reviewed by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 18:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot added needs/attention Needs maintainer attention. and removed needs/author-feedback Waiting on the original author. labels May 11, 2026
…tion
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 19:02
@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review May 13, 2026 09:29
CopilotAI review requested due to automatic review settings May 13, 2026 09:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 21/21 changed files
  • Comments generated: 1

…clude supported range
The error message now mentions the supported range (non-negative and no greater
than 2147483647ms / ~24.20:31:23.647) to clarify that syntactically valid but
out-of-range values like '25d' are also rejected.
Addresses review comment: #7840 (comment)
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 13, 2026 14:31
@Evangelink

Copy link
Copy Markdown
Member

Copilot address review comments

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
ContributorAuthor

Copilot address review comments

The open review comment about the resource string was addressed in commit 9b43a08 — the error message now mentions the supported range: "requires a valid time span value that is non-negative and no greater than 2147483647ms (~24.20:31:23.647) (e.g. 200, 1s, 2.5m, 1h)". All 14 XLF localization files were updated in the same commit.

…eptance test
The MTP --info output sorts options alphabetically per provider, so
--retry-failed-tests-delay must appear between --retry-failed-tests and
--retry-failed-tests-max-percentage, not after --retry-failed-tests-max-tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 15, 2026 08:01

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@Evangelink
Amaury Levé (Evangelink) merged commit ad9849c into mainMay 15, 2026
20 of 22 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/add-retry-delay-seconds-option branch May 15, 2026 17:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot removed the needs/attention Needs maintainer attention. label May 15, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MTP retry: add a --retry-delay-seconds option to add delay in seconds between retries

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add --retry-failed-tests-delay option to MTP retry package - #7840

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option
May 15, 2026
Merged

Add --retry-failed-tests-delay option to MTP retry package#7840
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option

Conversation

CopilotAI commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

The retry extension had no way to introduce a wait between retry attempts, making it less useful for tests interacting with external systems (message queues, databases, etc.) where a cooldown period reduces flakiness.

Changes

  • New CLI option --retry-failed-tests-delay: accepts a timespan value using the same unit-aware format as --hangdump-timeout (e.g. 200, 1s, 2.5m, 1h; default unit is milliseconds)
  • RetryCommandLineOptionsProvider: registers the option, validates it requires --retry-failed-tests, validates the argument via TimeSpanParser.TryParse, and enforces a valid range (non-negative, no greater than int.MaxValue milliseconds — the Task.Delay maximum)
  • RetryOrchestrator: strips the delay arg from arguments forwarded to child processes (with a bounds check before adding argIndex + 1 to the cleanup list); applies Task.Delay at the top of the retry loop (after attemptCount++, before any per-attempt resources are allocated), skipping the first attempt; uses TryParse with a Length > 0 guard instead of Parse for defensive handling
  • Resources: added description and invalid-argument error strings; description now includes a bare-millisecond example (200) alongside unit-suffixed examples
  • Tests: coverage for valid/invalid timespan values (including whitespace-only and out-of-range inputs), the dependency-on-retry-option validation, and an integration test (RetryFailedTests_WithDelay_StripsDelayFromChildArgs) that verifies the option is correctly stripped from child-process arguments end-to-end

Usage

dotnet test -- --retry-failed-tests 3 --retry-failed-tests-delay 2s

CopilotAI requested review from Copilot and removed request for CopilotApril 25, 2026 20:56
CopilotAI changed the title [WIP] Add --retry-delay-seconds option for MTP retryAdd --retry-failed-tests-delay option to MTP retry packageApr 25, 2026
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
CopilotAI review requested due to automatic review settings May 11, 2026 17:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds a configurable delay between retry attempts for the retry-failed-tests extension to reduce flakiness for external-system-dependent tests.

Changes:

  • Introduces --retry-failed-tests-delay CLI option with unit-aware timespan parsing and validation.
  • Applies an inter-attempt Task.Delay in RetryOrchestrator and strips the option from forwarded child-process args.
  • Updates help text, package docs, resources, and adds unit tests for option validation.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/RetryTests.csAdds unit tests for delay option parsing/validation and dependency on --retry-failed-tests.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.csAdjusts nullability usage (null!) in mocks.
test/IntegrationTests/Microsoft.Testing.Platform.Acceptance.IntegrationTests/HelpInfoAllExtensionsTests.csUpdates expected help output to include the new delay option.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.csRemoves delay arg from forwarded args; parses delay option and delays between attempts.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryCommandLineOptionsProvider.csRegisters the new option and validates dependency + timespan format.
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hant.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hans.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.tr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ru.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pt-BR.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pl.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ko.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ja.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.it.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.fr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.es.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.de.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.cs.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/ExtensionResources.resxAdds delay option description and invalid-argument error string.
src/Platform/Microsoft.Testing.Extensions.Retry/PACKAGE.mdDocuments the new delay feature and CLI option usage.

Copilot's findings

  • Files reviewed: 20/20 changed files
  • Comments generated: 4

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Critical — will cause test failure]HelpInfoAllExtensionsTests.cs: The --help output test was updated for --retry-failed-tests-delay, but the Info_WithAllExtensionsRegistered_OutputFullInfoContent test was not. Because AssertOutputMatchesLines performs sequential line-by-line matching, the test will fail in CI — the actual --info output now includes the delay option under RetryCommandLineOptionsProvider, but the expected pattern jumps straight to TerminalTestReporterCommandLineOptionsProvider. Four lines need to be inserted in the pattern.

  2. [Minor — coverage gap]RetryTests.cs (IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption): The whitespace-only input (" ") takes a distinct early-return path in TimeSpanParser.TryParse but is not included in the [DataRow] set.

  3. [Moderate — missing behavioral coverage] Neither the new unit tests nor the existing RetryFailedTestsTests.cs integration tests verify the actual delay behaviour in RetryOrchestrator: that Task.Delay is applied between retry attempts (not before the first), and that --retry-failed-tests-delay is stripped from the child-process argument list.

Recommendations

  • Add the --retry-failed-tests-delay block to the --info expected-output string in HelpInfoAllExtensionsTests.cs (around line 342, after the --retry-failed-tests-max-tests entry).
  • Add [DataRow(" ")] to IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption.
  • Add an acceptance or unit test that exercises the orchestrator's delay and arg-stripping logic end-to-end.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

…DataRow
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

[Defensive] TimeSpanParser.Parse in orchestrator path (RetryOrchestrator.cs:158)
The orchestrator calls TimeSpanParser.Parse (which throws FormatException) rather than the TryParse pattern used elsewhere in the same method. No bounds check on retryDelayArgs before [0] access either, inconsistent with how cmdRetries is guarded at line 98. Low practical risk since validation runs first, but adds a latent uncaught-exception path.

[Resources] Pipe server created before delay fires (RetryOrchestrator.cs:181 / 282)
RetryFailedTestsPipeServer (OS named-pipe listener) is created ~100 lines before the Task.Delay fires. For large delays (minutes/hours), the pipe holds OS resources for the entire wait period before the child process is launched. Moving the delay to the top of the loop body (immediately after attemptCount++) would scope the pipe server to only the window where it's needed.

Positive Observations

  • Correctness of the retry-delay logic is sound: delay correctly skips attempt 1 (attemptCount > 1), fires before each subsequent attempt, and applies ConfigureAwait(false) throughout.
  • Cancellation token is correctly threaded into Task.Delay — cancellation during the wait will propagate as OperationCanceledException, which is the expected behavior for this framework.
  • Argument stripping (indexToCleanup) correctly removes both the option flag and its value, consistent with all other stripped options.
  • Validation in RetryCommandLineOptionsProvider is complete: dependency on --retry-failed-tests, format validation via TryParse, and test coverage for valid/invalid inputs.
  • TimeSpanParser.TryParse correctly rejects empty strings and invalid formats per the new unit tests.

Overall Assessment

The implementation is logically correct and well-structured. Both findings are minor defensive/resource concerns rather than correctness bugs. No threading issues, security vulnerabilities, or public API breaking changes were identified.


🧠 Reviewed by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 18:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot added needs/attention Needs maintainer attention. and removed needs/author-feedback Waiting on the original author. labels May 11, 2026
…tion
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 19:02
@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review May 13, 2026 09:29
CopilotAI review requested due to automatic review settings May 13, 2026 09:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 21/21 changed files
  • Comments generated: 1

…clude supported range
The error message now mentions the supported range (non-negative and no greater
than 2147483647ms / ~24.20:31:23.647) to clarify that syntactically valid but
out-of-range values like '25d' are also rejected.
Addresses review comment: #7840 (comment)
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 13, 2026 14:31
@Evangelink

Copy link
Copy Markdown
Member

Copilot address review comments

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
ContributorAuthor

Copilot address review comments

The open review comment about the resource string was addressed in commit 9b43a08 — the error message now mentions the supported range: "requires a valid time span value that is non-negative and no greater than 2147483647ms (~24.20:31:23.647) (e.g. 200, 1s, 2.5m, 1h)". All 14 XLF localization files were updated in the same commit.

…eptance test
The MTP --info output sorts options alphabetically per provider, so
--retry-failed-tests-delay must appear between --retry-failed-tests and
--retry-failed-tests-max-percentage, not after --retry-failed-tests-max-tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 15, 2026 08:01

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@Evangelink
Amaury Levé (Evangelink) merged commit ad9849c into mainMay 15, 2026
20 of 22 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/add-retry-delay-seconds-option branch May 15, 2026 17:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot removed the needs/attention Needs maintainer attention. label May 15, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MTP retry: add a --retry-delay-seconds option to add delay in seconds between retries

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add --retry-failed-tests-delay option to MTP retry package - #7840

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option
May 15, 2026
Merged

Add --retry-failed-tests-delay option to MTP retry package#7840
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
copilot/add-retry-delay-seconds-option

Conversation

CopilotAI commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

The retry extension had no way to introduce a wait between retry attempts, making it less useful for tests interacting with external systems (message queues, databases, etc.) where a cooldown period reduces flakiness.

Changes

  • New CLI option --retry-failed-tests-delay: accepts a timespan value using the same unit-aware format as --hangdump-timeout (e.g. 200, 1s, 2.5m, 1h; default unit is milliseconds)
  • RetryCommandLineOptionsProvider: registers the option, validates it requires --retry-failed-tests, validates the argument via TimeSpanParser.TryParse, and enforces a valid range (non-negative, no greater than int.MaxValue milliseconds — the Task.Delay maximum)
  • RetryOrchestrator: strips the delay arg from arguments forwarded to child processes (with a bounds check before adding argIndex + 1 to the cleanup list); applies Task.Delay at the top of the retry loop (after attemptCount++, before any per-attempt resources are allocated), skipping the first attempt; uses TryParse with a Length > 0 guard instead of Parse for defensive handling
  • Resources: added description and invalid-argument error strings; description now includes a bare-millisecond example (200) alongside unit-suffixed examples
  • Tests: coverage for valid/invalid timespan values (including whitespace-only and out-of-range inputs), the dependency-on-retry-option validation, and an integration test (RetryFailedTests_WithDelay_StripsDelayFromChildArgs) that verifies the option is correctly stripped from child-process arguments end-to-end

Usage

dotnet test -- --retry-failed-tests 3 --retry-failed-tests-delay 2s

CopilotAI requested review from Copilot and removed request for CopilotApril 25, 2026 20:56
CopilotAI changed the title [WIP] Add --retry-delay-seconds option for MTP retryAdd --retry-failed-tests-delay option to MTP retry packageApr 25, 2026
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
CopilotAI review requested due to automatic review settings May 11, 2026 17:08

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds a configurable delay between retry attempts for the retry-failed-tests extension to reduce flakiness for external-system-dependent tests.

Changes:

  • Introduces --retry-failed-tests-delay CLI option with unit-aware timespan parsing and validation.
  • Applies an inter-attempt Task.Delay in RetryOrchestrator and strips the option from forwarded child-process args.
  • Updates help text, package docs, resources, and adds unit tests for option validation.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/RetryTests.csAdds unit tests for delay option parsing/validation and dependency on --retry-failed-tests.
test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.csAdjusts nullability usage (null!) in mocks.
test/IntegrationTests/Microsoft.Testing.Platform.Acceptance.IntegrationTests/HelpInfoAllExtensionsTests.csUpdates expected help output to include the new delay option.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.csRemoves delay arg from forwarded args; parses delay option and delays between attempts.
src/Platform/Microsoft.Testing.Extensions.Retry/RetryCommandLineOptionsProvider.csRegisters the new option and validates dependency + timespan format.
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hant.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.zh-Hans.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.tr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ru.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pt-BR.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.pl.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ko.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.ja.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.it.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.fr.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.es.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.de.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/xlf/ExtensionResources.cs.xlfAdds new resource strings for delay option description/error (untranslated “new” entries).
src/Platform/Microsoft.Testing.Extensions.Retry/Resources/ExtensionResources.resxAdds delay option description and invalid-argument error string.
src/Platform/Microsoft.Testing.Extensions.Retry/PACKAGE.mdDocuments the new delay feature and CLI option usage.

Copilot's findings

  • Files reviewed: 20/20 changed files
  • Comments generated: 4

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Critical — will cause test failure]HelpInfoAllExtensionsTests.cs: The --help output test was updated for --retry-failed-tests-delay, but the Info_WithAllExtensionsRegistered_OutputFullInfoContent test was not. Because AssertOutputMatchesLines performs sequential line-by-line matching, the test will fail in CI — the actual --info output now includes the delay option under RetryCommandLineOptionsProvider, but the expected pattern jumps straight to TerminalTestReporterCommandLineOptionsProvider. Four lines need to be inserted in the pattern.

  2. [Minor — coverage gap]RetryTests.cs (IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption): The whitespace-only input (" ") takes a distinct early-return path in TimeSpanParser.TryParse but is not included in the [DataRow] set.

  3. [Moderate — missing behavioral coverage] Neither the new unit tests nor the existing RetryFailedTestsTests.cs integration tests verify the actual delay behaviour in RetryOrchestrator: that Task.Delay is applied between retry attempts (not before the first), and that --retry-failed-tests-delay is stripped from the child-process argument list.

Recommendations

  • Add the --retry-failed-tests-delay block to the --info expected-output string in HelpInfoAllExtensionsTests.cs (around line 342, after the --retry-failed-tests-max-tests entry).
  • Add [DataRow(" ")] to IsInvalid_If_InvalidTimeSpan_Is_Provided_For_DelayOption.
  • Add an acceptance or unit test that exercises the orchestrator's delay and arg-stripping logic end-to-end.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

…DataRow
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

[Defensive] TimeSpanParser.Parse in orchestrator path (RetryOrchestrator.cs:158)
The orchestrator calls TimeSpanParser.Parse (which throws FormatException) rather than the TryParse pattern used elsewhere in the same method. No bounds check on retryDelayArgs before [0] access either, inconsistent with how cmdRetries is guarded at line 98. Low practical risk since validation runs first, but adds a latent uncaught-exception path.

[Resources] Pipe server created before delay fires (RetryOrchestrator.cs:181 / 282)
RetryFailedTestsPipeServer (OS named-pipe listener) is created ~100 lines before the Task.Delay fires. For large delays (minutes/hours), the pipe holds OS resources for the entire wait period before the child process is launched. Moving the delay to the top of the loop body (immediately after attemptCount++) would scope the pipe server to only the window where it's needed.

Positive Observations

  • Correctness of the retry-delay logic is sound: delay correctly skips attempt 1 (attemptCount > 1), fires before each subsequent attempt, and applies ConfigureAwait(false) throughout.
  • Cancellation token is correctly threaded into Task.Delay — cancellation during the wait will propagate as OperationCanceledException, which is the expected behavior for this framework.
  • Argument stripping (indexToCleanup) correctly removes both the option flag and its value, consistent with all other stripped options.
  • Validation in RetryCommandLineOptionsProvider is complete: dependency on --retry-failed-tests, format validation via TryParse, and test coverage for valid/invalid inputs.
  • TimeSpanParser.TryParse correctly rejects empty strings and invalid formats per the new unit tests.

Overall Assessment

The implementation is logically correct and well-structured. Both findings are minor defensive/resource concerns rather than correctness bugs. No threading issues, security vulnerabilities, or public API breaking changes were identified.


🧠 Reviewed by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Comment threadsrc/Platform/Microsoft.Testing.Extensions.Retry/RetryOrchestrator.cs Outdated
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 18:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot added needs/attention Needs maintainer attention. and removed needs/author-feedback Waiting on the original author. labels May 11, 2026
…tion
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 11, 2026 19:02
@Evangelink
Amaury Levé (Evangelink) marked this pull request as ready for review May 13, 2026 09:29
CopilotAI review requested due to automatic review settings May 13, 2026 09:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 21/21 changed files
  • Comments generated: 1

…clude supported range
The error message now mentions the supported range (non-negative and no greater
than 2147483647ms / ~24.20:31:23.647) to clarify that syntactically valid but
out-of-range values like '25d' are also rejected.
Addresses review comment: #7840 (comment)
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI requested review from Copilot and removed request for CopilotMay 13, 2026 14:31
@Evangelink

Copy link
Copy Markdown
Member

Copilot address review comments

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
ContributorAuthor

Copilot address review comments

The open review comment about the resource string was addressed in commit 9b43a08 — the error message now mentions the supported range: "requires a valid time span value that is non-negative and no greater than 2147483647ms (~24.20:31:23.647) (e.g. 200, 1s, 2.5m, 1h)". All 14 XLF localization files were updated in the same commit.

…eptance test
The MTP --info output sorts options alphabetically per provider, so
--retry-failed-tests-delay must appear between --retry-failed-tests and
--retry-failed-tests-max-percentage, not after --retry-failed-tests-max-tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 15, 2026 08:01

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@Evangelink
Amaury Levé (Evangelink) merged commit ad9849c into mainMay 15, 2026
20 of 22 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the copilot/add-retry-delay-seconds-option branch May 15, 2026 17:00
@microsoft-github-policy-servicemicrosoft-github-policy-serviceBot removed the needs/attention Needs maintainer attention. label May 15, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MTP retry: add a --retry-delay-seconds option to add delay in seconds between retries

4 participants

@Evangelink@Youssef1313