Cover superseded retry slow-test tracking - #10840

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825
Aug 28, 2026
Merged

Cover superseded retry slow-test tracking#10840
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825

Conversation

@Evangelink

Copy link
Copy Markdown
Member

SlowTestReporterBase must keep tracking a test node when a terminal update represents a superseded retry attempt, because a later attempt is still running. This adds focused coverage so that behavior cannot regress unnoticed.

The test sends an in-progress update followed by a failed superseded retry update, then verifies the slow-test notice still appears after the threshold. The shared test message helper now accepts optional retry metadata.

Testing

  • GitHubActionsSlowTestReporterTests: 12 passed

Fixes#10825

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI balanced review requested due to automatic review settings August 28, 2026 13:22

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Verdict: Clean — no issues found.

This PR adds a focused unit test (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) that exercises the IsSupersededRetryAttempt() guard in SlowTestReporterBase.ConsumeAsync (line 147 of SlowTestReporterBase.cs). I verified the production code: when a terminal update carries a superseded retry attempt, the test is intentionally not removed from _inProgress, so the slow-test scan continues to surface it. The test correctly validates this by:

  1. Sending an InProgress message to start tracking.
  2. Sending a Failed message with RetryAttemptProperty(1, isSuperseded: true) — this should not stop tracking.
  3. Running ScanOnceAsync past the threshold and asserting a notice was still emitted.
DimensionFinding
Algorithmic Correctness✅ Test logic matches production behavior at the IsSupersededRetryAttempt() branch.
Test Quality✅ Follows existing test patterns (ConsumeAsync_TerminalState_StopsTrackingAsync, ConsumeAsync_ExecutionCompleted_StopsTrackingAsync). Naming is clear and consistent.
API Surface✅ No public API changes — CreateMessage helper gains an optional RetryAttemptProperty? parameter, internal to the test file.
Style & Conventions✅ Consistent with codebase style.
All other dimensionsN/A — this is a test-only change with no production code, localization, public API, or cross-TFM impact.

No inline comments needed — the diff is clean and well-scoped.

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Expert test review — PR #10840

GradeTestMutationNotesHow to improve
A (90–100)new GitHubActionsSlowTestReporterTests.
ConsumeAsync_
SupersededRetryAttempt_
KeepsTrackingAsync
2/2 killedDirectly exercises the new IsSupersededRetryAttempt guard, verifying tracking survives a superseded terminal update and the scan still emits the notice at threshold.

Only one production-facing test method changed in this PR: GitHubActionsSlowTestReporterTests.ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync (new). The CreateMessage helper was also extended with an optional retryAttempt parameter but is not itself a test. The new test correctly asserts both that the notice is still emitted (proving the in-progress test was not dropped) and that the message content matches the expected test name, giving good coverage against inverting or removing the !update.TestNode.IsSupersededRetryAttempt() check in SlowTestReporterBase.ConsumeAsync. No actionable findings.

This advisory comment was generated automatically. Grades are heuristic and informational — they do not block merging. Suggestions on the Files changed tab can be applied with one click. Re-run with /review-tests.

🤖 Automated content by GitHub Copilot. Generated by the Test Reviewer on PR (on open / sync) workflow. · auto · 44.3 AIC · ⌖ 1.1 AIC · ⊞ 16.9K · [◷]( · )

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 review overview

Review tier: Balanced
Findings: None

What changed in this PR

Adds focused regression coverage ensuring superseded retry attempts remain tracked by the slow-test reporter.

Changes:

  • Tests superseded terminal retry handling.
  • Extends the message helper with optional retry metadata.
FileDescription
GitHubActionsSlowTestReporterTests.csAdds retry-tracking coverage and helper support.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Aug 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🧵 Parallel-safety audit — PR #10840

Parallelization — test assembly audited:

Test assemblyScopeWorkersAnalyzer coverage
Microsoft.Testing.Extensions.UnitTestsMethodLevel ([assembly: Parallelize(Scope = ExecutionScope.MethodLevel, Workers = 0)] in Program.cs)CPU countcoverable once MSTEST0074–0077 ship (attribute-based opt-in)

Only one file changed: test/UnitTests/Microsoft.Testing.Extensions.UnitTests/GitHubActionsSlowTestReporterTests.cs, which adds a new [TestMethod] (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) and extends the private CreateMessage helper with an optional retryAttempt parameter.

Findings: A (global-state) 0 · B (paths) 0 · C (declaration) 0 · D (over-serialization) 0 — by severity: Critical 0 · High 0 · Warning 0 · Info 0.

Nothing in the new test or the extended helper touches process-global state, shared filesystem paths, or [ResourceLock]/[DoNotParallelize] declarations:

  • All state is local to the test method: a fresh CapturingOutputDevice, GitHubActionsSlowTestReporter, and FixedClock are constructed per test (as every sibling test in this class already does), so nothing is shared across concurrently-running tests.
  • The shared private static readonly DateTimeOffset Start field is read-only after initialization — not mutated by this or any other test in the class — so it is not a race.
  • CreateMessage's new retryAttempt parameter only adds a property to a locally-created PropertyBag; no static or process-wide state is touched.
  • No environment variables, current directory, console redirection, culture, or filesystem paths are involved.
  • No [ResourceLock] / [DoNotParallelize] declarations were added, removed, or already exist in this file, so there is no declaration-reconciliation (category C) concern.

This is a clean, additive unit test change with no parallel-safety impact under the detected MethodLevel scope.

Advisory only — heuristic, non-blocking. Re-run with /parallel-audit. This audit answers "is it parallel-safe?"; for testability, smells, or flakiness see the detect-static-dependencies / test-smell-detection / test-anti-patterns analyses.

🤖 Automated content by GitHub Copilot. Generated by the Parallel-safety audit on PR (on open / sync) workflow. · auto · 69.9 AIC · ⌖ 1.1 AIC · ⊞ 24.8K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit 79ef263 into mainAug 28, 2026
39 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/fix-issue-10825 branch August 28, 2026 14:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[test-improver] Cover superseded retry-attempt branch in SlowTestReporterBase

3 participants

@Evangelink@0101
, '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

Cover superseded retry slow-test tracking - #10840

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825
Aug 28, 2026
Merged

Cover superseded retry slow-test tracking#10840
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825

Conversation

@Evangelink

Copy link
Copy Markdown
Member

SlowTestReporterBase must keep tracking a test node when a terminal update represents a superseded retry attempt, because a later attempt is still running. This adds focused coverage so that behavior cannot regress unnoticed.

The test sends an in-progress update followed by a failed superseded retry update, then verifies the slow-test notice still appears after the threshold. The shared test message helper now accepts optional retry metadata.

Testing

  • GitHubActionsSlowTestReporterTests: 12 passed

Fixes#10825

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI balanced review requested due to automatic review settings August 28, 2026 13:22

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Verdict: Clean — no issues found.

This PR adds a focused unit test (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) that exercises the IsSupersededRetryAttempt() guard in SlowTestReporterBase.ConsumeAsync (line 147 of SlowTestReporterBase.cs). I verified the production code: when a terminal update carries a superseded retry attempt, the test is intentionally not removed from _inProgress, so the slow-test scan continues to surface it. The test correctly validates this by:

  1. Sending an InProgress message to start tracking.
  2. Sending a Failed message with RetryAttemptProperty(1, isSuperseded: true) — this should not stop tracking.
  3. Running ScanOnceAsync past the threshold and asserting a notice was still emitted.
DimensionFinding
Algorithmic Correctness✅ Test logic matches production behavior at the IsSupersededRetryAttempt() branch.
Test Quality✅ Follows existing test patterns (ConsumeAsync_TerminalState_StopsTrackingAsync, ConsumeAsync_ExecutionCompleted_StopsTrackingAsync). Naming is clear and consistent.
API Surface✅ No public API changes — CreateMessage helper gains an optional RetryAttemptProperty? parameter, internal to the test file.
Style & Conventions✅ Consistent with codebase style.
All other dimensionsN/A — this is a test-only change with no production code, localization, public API, or cross-TFM impact.

No inline comments needed — the diff is clean and well-scoped.

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Expert test review — PR #10840

GradeTestMutationNotesHow to improve
A (90–100)new GitHubActionsSlowTestReporterTests.
ConsumeAsync_
SupersededRetryAttempt_
KeepsTrackingAsync
2/2 killedDirectly exercises the new IsSupersededRetryAttempt guard, verifying tracking survives a superseded terminal update and the scan still emits the notice at threshold.

Only one production-facing test method changed in this PR: GitHubActionsSlowTestReporterTests.ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync (new). The CreateMessage helper was also extended with an optional retryAttempt parameter but is not itself a test. The new test correctly asserts both that the notice is still emitted (proving the in-progress test was not dropped) and that the message content matches the expected test name, giving good coverage against inverting or removing the !update.TestNode.IsSupersededRetryAttempt() check in SlowTestReporterBase.ConsumeAsync. No actionable findings.

This advisory comment was generated automatically. Grades are heuristic and informational — they do not block merging. Suggestions on the Files changed tab can be applied with one click. Re-run with /review-tests.

🤖 Automated content by GitHub Copilot. Generated by the Test Reviewer on PR (on open / sync) workflow. · auto · 44.3 AIC · ⌖ 1.1 AIC · ⊞ 16.9K · [◷]( · )

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 review overview

Review tier: Balanced
Findings: None

What changed in this PR

Adds focused regression coverage ensuring superseded retry attempts remain tracked by the slow-test reporter.

Changes:

  • Tests superseded terminal retry handling.
  • Extends the message helper with optional retry metadata.
FileDescription
GitHubActionsSlowTestReporterTests.csAdds retry-tracking coverage and helper support.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Aug 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🧵 Parallel-safety audit — PR #10840

Parallelization — test assembly audited:

Test assemblyScopeWorkersAnalyzer coverage
Microsoft.Testing.Extensions.UnitTestsMethodLevel ([assembly: Parallelize(Scope = ExecutionScope.MethodLevel, Workers = 0)] in Program.cs)CPU countcoverable once MSTEST0074–0077 ship (attribute-based opt-in)

Only one file changed: test/UnitTests/Microsoft.Testing.Extensions.UnitTests/GitHubActionsSlowTestReporterTests.cs, which adds a new [TestMethod] (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) and extends the private CreateMessage helper with an optional retryAttempt parameter.

Findings: A (global-state) 0 · B (paths) 0 · C (declaration) 0 · D (over-serialization) 0 — by severity: Critical 0 · High 0 · Warning 0 · Info 0.

Nothing in the new test or the extended helper touches process-global state, shared filesystem paths, or [ResourceLock]/[DoNotParallelize] declarations:

  • All state is local to the test method: a fresh CapturingOutputDevice, GitHubActionsSlowTestReporter, and FixedClock are constructed per test (as every sibling test in this class already does), so nothing is shared across concurrently-running tests.
  • The shared private static readonly DateTimeOffset Start field is read-only after initialization — not mutated by this or any other test in the class — so it is not a race.
  • CreateMessage's new retryAttempt parameter only adds a property to a locally-created PropertyBag; no static or process-wide state is touched.
  • No environment variables, current directory, console redirection, culture, or filesystem paths are involved.
  • No [ResourceLock] / [DoNotParallelize] declarations were added, removed, or already exist in this file, so there is no declaration-reconciliation (category C) concern.

This is a clean, additive unit test change with no parallel-safety impact under the detected MethodLevel scope.

Advisory only — heuristic, non-blocking. Re-run with /parallel-audit. This audit answers "is it parallel-safe?"; for testability, smells, or flakiness see the detect-static-dependencies / test-smell-detection / test-anti-patterns analyses.

🤖 Automated content by GitHub Copilot. Generated by the Parallel-safety audit on PR (on open / sync) workflow. · auto · 69.9 AIC · ⌖ 1.1 AIC · ⊞ 24.8K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit 79ef263 into mainAug 28, 2026
39 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/fix-issue-10825 branch August 28, 2026 14:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[test-improver] Cover superseded retry-attempt branch in SlowTestReporterBase

3 participants

@Evangelink@0101
, '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

Cover superseded retry slow-test tracking - #10840

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825
Aug 28, 2026
Merged

Cover superseded retry slow-test tracking#10840
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825

Conversation

@Evangelink

Copy link
Copy Markdown
Member

SlowTestReporterBase must keep tracking a test node when a terminal update represents a superseded retry attempt, because a later attempt is still running. This adds focused coverage so that behavior cannot regress unnoticed.

The test sends an in-progress update followed by a failed superseded retry update, then verifies the slow-test notice still appears after the threshold. The shared test message helper now accepts optional retry metadata.

Testing

  • GitHubActionsSlowTestReporterTests: 12 passed

Fixes#10825

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI balanced review requested due to automatic review settings August 28, 2026 13:22

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Verdict: Clean — no issues found.

This PR adds a focused unit test (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) that exercises the IsSupersededRetryAttempt() guard in SlowTestReporterBase.ConsumeAsync (line 147 of SlowTestReporterBase.cs). I verified the production code: when a terminal update carries a superseded retry attempt, the test is intentionally not removed from _inProgress, so the slow-test scan continues to surface it. The test correctly validates this by:

  1. Sending an InProgress message to start tracking.
  2. Sending a Failed message with RetryAttemptProperty(1, isSuperseded: true) — this should not stop tracking.
  3. Running ScanOnceAsync past the threshold and asserting a notice was still emitted.
DimensionFinding
Algorithmic Correctness✅ Test logic matches production behavior at the IsSupersededRetryAttempt() branch.
Test Quality✅ Follows existing test patterns (ConsumeAsync_TerminalState_StopsTrackingAsync, ConsumeAsync_ExecutionCompleted_StopsTrackingAsync). Naming is clear and consistent.
API Surface✅ No public API changes — CreateMessage helper gains an optional RetryAttemptProperty? parameter, internal to the test file.
Style & Conventions✅ Consistent with codebase style.
All other dimensionsN/A — this is a test-only change with no production code, localization, public API, or cross-TFM impact.

No inline comments needed — the diff is clean and well-scoped.

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Expert test review — PR #10840

GradeTestMutationNotesHow to improve
A (90–100)new GitHubActionsSlowTestReporterTests.
ConsumeAsync_
SupersededRetryAttempt_
KeepsTrackingAsync
2/2 killedDirectly exercises the new IsSupersededRetryAttempt guard, verifying tracking survives a superseded terminal update and the scan still emits the notice at threshold.

Only one production-facing test method changed in this PR: GitHubActionsSlowTestReporterTests.ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync (new). The CreateMessage helper was also extended with an optional retryAttempt parameter but is not itself a test. The new test correctly asserts both that the notice is still emitted (proving the in-progress test was not dropped) and that the message content matches the expected test name, giving good coverage against inverting or removing the !update.TestNode.IsSupersededRetryAttempt() check in SlowTestReporterBase.ConsumeAsync. No actionable findings.

This advisory comment was generated automatically. Grades are heuristic and informational — they do not block merging. Suggestions on the Files changed tab can be applied with one click. Re-run with /review-tests.

🤖 Automated content by GitHub Copilot. Generated by the Test Reviewer on PR (on open / sync) workflow. · auto · 44.3 AIC · ⌖ 1.1 AIC · ⊞ 16.9K · [◷]( · )

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 review overview

Review tier: Balanced
Findings: None

What changed in this PR

Adds focused regression coverage ensuring superseded retry attempts remain tracked by the slow-test reporter.

Changes:

  • Tests superseded terminal retry handling.
  • Extends the message helper with optional retry metadata.
FileDescription
GitHubActionsSlowTestReporterTests.csAdds retry-tracking coverage and helper support.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Aug 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🧵 Parallel-safety audit — PR #10840

Parallelization — test assembly audited:

Test assemblyScopeWorkersAnalyzer coverage
Microsoft.Testing.Extensions.UnitTestsMethodLevel ([assembly: Parallelize(Scope = ExecutionScope.MethodLevel, Workers = 0)] in Program.cs)CPU countcoverable once MSTEST0074–0077 ship (attribute-based opt-in)

Only one file changed: test/UnitTests/Microsoft.Testing.Extensions.UnitTests/GitHubActionsSlowTestReporterTests.cs, which adds a new [TestMethod] (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) and extends the private CreateMessage helper with an optional retryAttempt parameter.

Findings: A (global-state) 0 · B (paths) 0 · C (declaration) 0 · D (over-serialization) 0 — by severity: Critical 0 · High 0 · Warning 0 · Info 0.

Nothing in the new test or the extended helper touches process-global state, shared filesystem paths, or [ResourceLock]/[DoNotParallelize] declarations:

  • All state is local to the test method: a fresh CapturingOutputDevice, GitHubActionsSlowTestReporter, and FixedClock are constructed per test (as every sibling test in this class already does), so nothing is shared across concurrently-running tests.
  • The shared private static readonly DateTimeOffset Start field is read-only after initialization — not mutated by this or any other test in the class — so it is not a race.
  • CreateMessage's new retryAttempt parameter only adds a property to a locally-created PropertyBag; no static or process-wide state is touched.
  • No environment variables, current directory, console redirection, culture, or filesystem paths are involved.
  • No [ResourceLock] / [DoNotParallelize] declarations were added, removed, or already exist in this file, so there is no declaration-reconciliation (category C) concern.

This is a clean, additive unit test change with no parallel-safety impact under the detected MethodLevel scope.

Advisory only — heuristic, non-blocking. Re-run with /parallel-audit. This audit answers "is it parallel-safe?"; for testability, smells, or flakiness see the detect-static-dependencies / test-smell-detection / test-anti-patterns analyses.

🤖 Automated content by GitHub Copilot. Generated by the Parallel-safety audit on PR (on open / sync) workflow. · auto · 69.9 AIC · ⌖ 1.1 AIC · ⊞ 24.8K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit 79ef263 into mainAug 28, 2026
39 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/fix-issue-10825 branch August 28, 2026 14:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[test-improver] Cover superseded retry-attempt branch in SlowTestReporterBase

3 participants

@Evangelink@0101
, '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

Cover superseded retry slow-test tracking - #10840

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825
Aug 28, 2026
Merged

Cover superseded retry slow-test tracking#10840
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825

Conversation

@Evangelink

Copy link
Copy Markdown
Member

SlowTestReporterBase must keep tracking a test node when a terminal update represents a superseded retry attempt, because a later attempt is still running. This adds focused coverage so that behavior cannot regress unnoticed.

The test sends an in-progress update followed by a failed superseded retry update, then verifies the slow-test notice still appears after the threshold. The shared test message helper now accepts optional retry metadata.

Testing

  • GitHubActionsSlowTestReporterTests: 12 passed

Fixes#10825

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI balanced review requested due to automatic review settings August 28, 2026 13:22

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Verdict: Clean — no issues found.

This PR adds a focused unit test (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) that exercises the IsSupersededRetryAttempt() guard in SlowTestReporterBase.ConsumeAsync (line 147 of SlowTestReporterBase.cs). I verified the production code: when a terminal update carries a superseded retry attempt, the test is intentionally not removed from _inProgress, so the slow-test scan continues to surface it. The test correctly validates this by:

  1. Sending an InProgress message to start tracking.
  2. Sending a Failed message with RetryAttemptProperty(1, isSuperseded: true) — this should not stop tracking.
  3. Running ScanOnceAsync past the threshold and asserting a notice was still emitted.
DimensionFinding
Algorithmic Correctness✅ Test logic matches production behavior at the IsSupersededRetryAttempt() branch.
Test Quality✅ Follows existing test patterns (ConsumeAsync_TerminalState_StopsTrackingAsync, ConsumeAsync_ExecutionCompleted_StopsTrackingAsync). Naming is clear and consistent.
API Surface✅ No public API changes — CreateMessage helper gains an optional RetryAttemptProperty? parameter, internal to the test file.
Style & Conventions✅ Consistent with codebase style.
All other dimensionsN/A — this is a test-only change with no production code, localization, public API, or cross-TFM impact.

No inline comments needed — the diff is clean and well-scoped.

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Expert test review — PR #10840

GradeTestMutationNotesHow to improve
A (90–100)new GitHubActionsSlowTestReporterTests.
ConsumeAsync_
SupersededRetryAttempt_
KeepsTrackingAsync
2/2 killedDirectly exercises the new IsSupersededRetryAttempt guard, verifying tracking survives a superseded terminal update and the scan still emits the notice at threshold.

Only one production-facing test method changed in this PR: GitHubActionsSlowTestReporterTests.ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync (new). The CreateMessage helper was also extended with an optional retryAttempt parameter but is not itself a test. The new test correctly asserts both that the notice is still emitted (proving the in-progress test was not dropped) and that the message content matches the expected test name, giving good coverage against inverting or removing the !update.TestNode.IsSupersededRetryAttempt() check in SlowTestReporterBase.ConsumeAsync. No actionable findings.

This advisory comment was generated automatically. Grades are heuristic and informational — they do not block merging. Suggestions on the Files changed tab can be applied with one click. Re-run with /review-tests.

🤖 Automated content by GitHub Copilot. Generated by the Test Reviewer on PR (on open / sync) workflow. · auto · 44.3 AIC · ⌖ 1.1 AIC · ⊞ 16.9K · [◷]( · )

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 review overview

Review tier: Balanced
Findings: None

What changed in this PR

Adds focused regression coverage ensuring superseded retry attempts remain tracked by the slow-test reporter.

Changes:

  • Tests superseded terminal retry handling.
  • Extends the message helper with optional retry metadata.
FileDescription
GitHubActionsSlowTestReporterTests.csAdds retry-tracking coverage and helper support.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Aug 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🧵 Parallel-safety audit — PR #10840

Parallelization — test assembly audited:

Test assemblyScopeWorkersAnalyzer coverage
Microsoft.Testing.Extensions.UnitTestsMethodLevel ([assembly: Parallelize(Scope = ExecutionScope.MethodLevel, Workers = 0)] in Program.cs)CPU countcoverable once MSTEST0074–0077 ship (attribute-based opt-in)

Only one file changed: test/UnitTests/Microsoft.Testing.Extensions.UnitTests/GitHubActionsSlowTestReporterTests.cs, which adds a new [TestMethod] (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) and extends the private CreateMessage helper with an optional retryAttempt parameter.

Findings: A (global-state) 0 · B (paths) 0 · C (declaration) 0 · D (over-serialization) 0 — by severity: Critical 0 · High 0 · Warning 0 · Info 0.

Nothing in the new test or the extended helper touches process-global state, shared filesystem paths, or [ResourceLock]/[DoNotParallelize] declarations:

  • All state is local to the test method: a fresh CapturingOutputDevice, GitHubActionsSlowTestReporter, and FixedClock are constructed per test (as every sibling test in this class already does), so nothing is shared across concurrently-running tests.
  • The shared private static readonly DateTimeOffset Start field is read-only after initialization — not mutated by this or any other test in the class — so it is not a race.
  • CreateMessage's new retryAttempt parameter only adds a property to a locally-created PropertyBag; no static or process-wide state is touched.
  • No environment variables, current directory, console redirection, culture, or filesystem paths are involved.
  • No [ResourceLock] / [DoNotParallelize] declarations were added, removed, or already exist in this file, so there is no declaration-reconciliation (category C) concern.

This is a clean, additive unit test change with no parallel-safety impact under the detected MethodLevel scope.

Advisory only — heuristic, non-blocking. Re-run with /parallel-audit. This audit answers "is it parallel-safe?"; for testability, smells, or flakiness see the detect-static-dependencies / test-smell-detection / test-anti-patterns analyses.

🤖 Automated content by GitHub Copilot. Generated by the Parallel-safety audit on PR (on open / sync) workflow. · auto · 69.9 AIC · ⌖ 1.1 AIC · ⊞ 24.8K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit 79ef263 into mainAug 28, 2026
39 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/fix-issue-10825 branch August 28, 2026 14:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[test-improver] Cover superseded retry-attempt branch in SlowTestReporterBase

3 participants

@Evangelink@0101
, '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

Cover superseded retry slow-test tracking - #10840

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825
Aug 28, 2026
Merged

Cover superseded retry slow-test tracking#10840
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825

Conversation

@Evangelink

Copy link
Copy Markdown
Member

SlowTestReporterBase must keep tracking a test node when a terminal update represents a superseded retry attempt, because a later attempt is still running. This adds focused coverage so that behavior cannot regress unnoticed.

The test sends an in-progress update followed by a failed superseded retry update, then verifies the slow-test notice still appears after the threshold. The shared test message helper now accepts optional retry metadata.

Testing

  • GitHubActionsSlowTestReporterTests: 12 passed

Fixes#10825

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI balanced review requested due to automatic review settings August 28, 2026 13:22

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Verdict: Clean — no issues found.

This PR adds a focused unit test (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) that exercises the IsSupersededRetryAttempt() guard in SlowTestReporterBase.ConsumeAsync (line 147 of SlowTestReporterBase.cs). I verified the production code: when a terminal update carries a superseded retry attempt, the test is intentionally not removed from _inProgress, so the slow-test scan continues to surface it. The test correctly validates this by:

  1. Sending an InProgress message to start tracking.
  2. Sending a Failed message with RetryAttemptProperty(1, isSuperseded: true) — this should not stop tracking.
  3. Running ScanOnceAsync past the threshold and asserting a notice was still emitted.
DimensionFinding
Algorithmic Correctness✅ Test logic matches production behavior at the IsSupersededRetryAttempt() branch.
Test Quality✅ Follows existing test patterns (ConsumeAsync_TerminalState_StopsTrackingAsync, ConsumeAsync_ExecutionCompleted_StopsTrackingAsync). Naming is clear and consistent.
API Surface✅ No public API changes — CreateMessage helper gains an optional RetryAttemptProperty? parameter, internal to the test file.
Style & Conventions✅ Consistent with codebase style.
All other dimensionsN/A — this is a test-only change with no production code, localization, public API, or cross-TFM impact.

No inline comments needed — the diff is clean and well-scoped.

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Expert test review — PR #10840

GradeTestMutationNotesHow to improve
A (90–100)new GitHubActionsSlowTestReporterTests.
ConsumeAsync_
SupersededRetryAttempt_
KeepsTrackingAsync
2/2 killedDirectly exercises the new IsSupersededRetryAttempt guard, verifying tracking survives a superseded terminal update and the scan still emits the notice at threshold.

Only one production-facing test method changed in this PR: GitHubActionsSlowTestReporterTests.ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync (new). The CreateMessage helper was also extended with an optional retryAttempt parameter but is not itself a test. The new test correctly asserts both that the notice is still emitted (proving the in-progress test was not dropped) and that the message content matches the expected test name, giving good coverage against inverting or removing the !update.TestNode.IsSupersededRetryAttempt() check in SlowTestReporterBase.ConsumeAsync. No actionable findings.

This advisory comment was generated automatically. Grades are heuristic and informational — they do not block merging. Suggestions on the Files changed tab can be applied with one click. Re-run with /review-tests.

🤖 Automated content by GitHub Copilot. Generated by the Test Reviewer on PR (on open / sync) workflow. · auto · 44.3 AIC · ⌖ 1.1 AIC · ⊞ 16.9K · [◷]( · )

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 review overview

Review tier: Balanced
Findings: None

What changed in this PR

Adds focused regression coverage ensuring superseded retry attempts remain tracked by the slow-test reporter.

Changes:

  • Tests superseded terminal retry handling.
  • Extends the message helper with optional retry metadata.
FileDescription
GitHubActionsSlowTestReporterTests.csAdds retry-tracking coverage and helper support.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Aug 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🧵 Parallel-safety audit — PR #10840

Parallelization — test assembly audited:

Test assemblyScopeWorkersAnalyzer coverage
Microsoft.Testing.Extensions.UnitTestsMethodLevel ([assembly: Parallelize(Scope = ExecutionScope.MethodLevel, Workers = 0)] in Program.cs)CPU countcoverable once MSTEST0074–0077 ship (attribute-based opt-in)

Only one file changed: test/UnitTests/Microsoft.Testing.Extensions.UnitTests/GitHubActionsSlowTestReporterTests.cs, which adds a new [TestMethod] (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) and extends the private CreateMessage helper with an optional retryAttempt parameter.

Findings: A (global-state) 0 · B (paths) 0 · C (declaration) 0 · D (over-serialization) 0 — by severity: Critical 0 · High 0 · Warning 0 · Info 0.

Nothing in the new test or the extended helper touches process-global state, shared filesystem paths, or [ResourceLock]/[DoNotParallelize] declarations:

  • All state is local to the test method: a fresh CapturingOutputDevice, GitHubActionsSlowTestReporter, and FixedClock are constructed per test (as every sibling test in this class already does), so nothing is shared across concurrently-running tests.
  • The shared private static readonly DateTimeOffset Start field is read-only after initialization — not mutated by this or any other test in the class — so it is not a race.
  • CreateMessage's new retryAttempt parameter only adds a property to a locally-created PropertyBag; no static or process-wide state is touched.
  • No environment variables, current directory, console redirection, culture, or filesystem paths are involved.
  • No [ResourceLock] / [DoNotParallelize] declarations were added, removed, or already exist in this file, so there is no declaration-reconciliation (category C) concern.

This is a clean, additive unit test change with no parallel-safety impact under the detected MethodLevel scope.

Advisory only — heuristic, non-blocking. Re-run with /parallel-audit. This audit answers "is it parallel-safe?"; for testability, smells, or flakiness see the detect-static-dependencies / test-smell-detection / test-anti-patterns analyses.

🤖 Automated content by GitHub Copilot. Generated by the Parallel-safety audit on PR (on open / sync) workflow. · auto · 69.9 AIC · ⌖ 1.1 AIC · ⊞ 24.8K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit 79ef263 into mainAug 28, 2026
39 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/fix-issue-10825 branch August 28, 2026 14:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[test-improver] Cover superseded retry-attempt branch in SlowTestReporterBase

3 participants

@Evangelink@0101
, '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

Cover superseded retry slow-test tracking - #10840

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825
Aug 28, 2026
Merged

Cover superseded retry slow-test tracking#10840
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825

Conversation

@Evangelink

Copy link
Copy Markdown
Member

SlowTestReporterBase must keep tracking a test node when a terminal update represents a superseded retry attempt, because a later attempt is still running. This adds focused coverage so that behavior cannot regress unnoticed.

The test sends an in-progress update followed by a failed superseded retry update, then verifies the slow-test notice still appears after the threshold. The shared test message helper now accepts optional retry metadata.

Testing

  • GitHubActionsSlowTestReporterTests: 12 passed

Fixes#10825

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI balanced review requested due to automatic review settings August 28, 2026 13:22

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Verdict: Clean — no issues found.

This PR adds a focused unit test (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) that exercises the IsSupersededRetryAttempt() guard in SlowTestReporterBase.ConsumeAsync (line 147 of SlowTestReporterBase.cs). I verified the production code: when a terminal update carries a superseded retry attempt, the test is intentionally not removed from _inProgress, so the slow-test scan continues to surface it. The test correctly validates this by:

  1. Sending an InProgress message to start tracking.
  2. Sending a Failed message with RetryAttemptProperty(1, isSuperseded: true) — this should not stop tracking.
  3. Running ScanOnceAsync past the threshold and asserting a notice was still emitted.
DimensionFinding
Algorithmic Correctness✅ Test logic matches production behavior at the IsSupersededRetryAttempt() branch.
Test Quality✅ Follows existing test patterns (ConsumeAsync_TerminalState_StopsTrackingAsync, ConsumeAsync_ExecutionCompleted_StopsTrackingAsync). Naming is clear and consistent.
API Surface✅ No public API changes — CreateMessage helper gains an optional RetryAttemptProperty? parameter, internal to the test file.
Style & Conventions✅ Consistent with codebase style.
All other dimensionsN/A — this is a test-only change with no production code, localization, public API, or cross-TFM impact.

No inline comments needed — the diff is clean and well-scoped.

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Expert test review — PR #10840

GradeTestMutationNotesHow to improve
A (90–100)new GitHubActionsSlowTestReporterTests.
ConsumeAsync_
SupersededRetryAttempt_
KeepsTrackingAsync
2/2 killedDirectly exercises the new IsSupersededRetryAttempt guard, verifying tracking survives a superseded terminal update and the scan still emits the notice at threshold.

Only one production-facing test method changed in this PR: GitHubActionsSlowTestReporterTests.ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync (new). The CreateMessage helper was also extended with an optional retryAttempt parameter but is not itself a test. The new test correctly asserts both that the notice is still emitted (proving the in-progress test was not dropped) and that the message content matches the expected test name, giving good coverage against inverting or removing the !update.TestNode.IsSupersededRetryAttempt() check in SlowTestReporterBase.ConsumeAsync. No actionable findings.

This advisory comment was generated automatically. Grades are heuristic and informational — they do not block merging. Suggestions on the Files changed tab can be applied with one click. Re-run with /review-tests.

🤖 Automated content by GitHub Copilot. Generated by the Test Reviewer on PR (on open / sync) workflow. · auto · 44.3 AIC · ⌖ 1.1 AIC · ⊞ 16.9K · [◷]( · )

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 review overview

Review tier: Balanced
Findings: None

What changed in this PR

Adds focused regression coverage ensuring superseded retry attempts remain tracked by the slow-test reporter.

Changes:

  • Tests superseded terminal retry handling.
  • Extends the message helper with optional retry metadata.
FileDescription
GitHubActionsSlowTestReporterTests.csAdds retry-tracking coverage and helper support.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Aug 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🧵 Parallel-safety audit — PR #10840

Parallelization — test assembly audited:

Test assemblyScopeWorkersAnalyzer coverage
Microsoft.Testing.Extensions.UnitTestsMethodLevel ([assembly: Parallelize(Scope = ExecutionScope.MethodLevel, Workers = 0)] in Program.cs)CPU countcoverable once MSTEST0074–0077 ship (attribute-based opt-in)

Only one file changed: test/UnitTests/Microsoft.Testing.Extensions.UnitTests/GitHubActionsSlowTestReporterTests.cs, which adds a new [TestMethod] (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) and extends the private CreateMessage helper with an optional retryAttempt parameter.

Findings: A (global-state) 0 · B (paths) 0 · C (declaration) 0 · D (over-serialization) 0 — by severity: Critical 0 · High 0 · Warning 0 · Info 0.

Nothing in the new test or the extended helper touches process-global state, shared filesystem paths, or [ResourceLock]/[DoNotParallelize] declarations:

  • All state is local to the test method: a fresh CapturingOutputDevice, GitHubActionsSlowTestReporter, and FixedClock are constructed per test (as every sibling test in this class already does), so nothing is shared across concurrently-running tests.
  • The shared private static readonly DateTimeOffset Start field is read-only after initialization — not mutated by this or any other test in the class — so it is not a race.
  • CreateMessage's new retryAttempt parameter only adds a property to a locally-created PropertyBag; no static or process-wide state is touched.
  • No environment variables, current directory, console redirection, culture, or filesystem paths are involved.
  • No [ResourceLock] / [DoNotParallelize] declarations were added, removed, or already exist in this file, so there is no declaration-reconciliation (category C) concern.

This is a clean, additive unit test change with no parallel-safety impact under the detected MethodLevel scope.

Advisory only — heuristic, non-blocking. Re-run with /parallel-audit. This audit answers "is it parallel-safe?"; for testability, smells, or flakiness see the detect-static-dependencies / test-smell-detection / test-anti-patterns analyses.

🤖 Automated content by GitHub Copilot. Generated by the Parallel-safety audit on PR (on open / sync) workflow. · auto · 69.9 AIC · ⌖ 1.1 AIC · ⊞ 24.8K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit 79ef263 into mainAug 28, 2026
39 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/fix-issue-10825 branch August 28, 2026 14:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[test-improver] Cover superseded retry-attempt branch in SlowTestReporterBase

3 participants

@Evangelink@0101
, '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

Cover superseded retry slow-test tracking - #10840

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825
Aug 28, 2026
Merged

Cover superseded retry slow-test tracking#10840
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825

Conversation

@Evangelink

Copy link
Copy Markdown
Member

SlowTestReporterBase must keep tracking a test node when a terminal update represents a superseded retry attempt, because a later attempt is still running. This adds focused coverage so that behavior cannot regress unnoticed.

The test sends an in-progress update followed by a failed superseded retry update, then verifies the slow-test notice still appears after the threshold. The shared test message helper now accepts optional retry metadata.

Testing

  • GitHubActionsSlowTestReporterTests: 12 passed

Fixes#10825

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI balanced review requested due to automatic review settings August 28, 2026 13:22

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Verdict: Clean — no issues found.

This PR adds a focused unit test (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) that exercises the IsSupersededRetryAttempt() guard in SlowTestReporterBase.ConsumeAsync (line 147 of SlowTestReporterBase.cs). I verified the production code: when a terminal update carries a superseded retry attempt, the test is intentionally not removed from _inProgress, so the slow-test scan continues to surface it. The test correctly validates this by:

  1. Sending an InProgress message to start tracking.
  2. Sending a Failed message with RetryAttemptProperty(1, isSuperseded: true) — this should not stop tracking.
  3. Running ScanOnceAsync past the threshold and asserting a notice was still emitted.
DimensionFinding
Algorithmic Correctness✅ Test logic matches production behavior at the IsSupersededRetryAttempt() branch.
Test Quality✅ Follows existing test patterns (ConsumeAsync_TerminalState_StopsTrackingAsync, ConsumeAsync_ExecutionCompleted_StopsTrackingAsync). Naming is clear and consistent.
API Surface✅ No public API changes — CreateMessage helper gains an optional RetryAttemptProperty? parameter, internal to the test file.
Style & Conventions✅ Consistent with codebase style.
All other dimensionsN/A — this is a test-only change with no production code, localization, public API, or cross-TFM impact.

No inline comments needed — the diff is clean and well-scoped.

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Expert test review — PR #10840

GradeTestMutationNotesHow to improve
A (90–100)new GitHubActionsSlowTestReporterTests.
ConsumeAsync_
SupersededRetryAttempt_
KeepsTrackingAsync
2/2 killedDirectly exercises the new IsSupersededRetryAttempt guard, verifying tracking survives a superseded terminal update and the scan still emits the notice at threshold.

Only one production-facing test method changed in this PR: GitHubActionsSlowTestReporterTests.ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync (new). The CreateMessage helper was also extended with an optional retryAttempt parameter but is not itself a test. The new test correctly asserts both that the notice is still emitted (proving the in-progress test was not dropped) and that the message content matches the expected test name, giving good coverage against inverting or removing the !update.TestNode.IsSupersededRetryAttempt() check in SlowTestReporterBase.ConsumeAsync. No actionable findings.

This advisory comment was generated automatically. Grades are heuristic and informational — they do not block merging. Suggestions on the Files changed tab can be applied with one click. Re-run with /review-tests.

🤖 Automated content by GitHub Copilot. Generated by the Test Reviewer on PR (on open / sync) workflow. · auto · 44.3 AIC · ⌖ 1.1 AIC · ⊞ 16.9K · [◷]( · )

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 review overview

Review tier: Balanced
Findings: None

What changed in this PR

Adds focused regression coverage ensuring superseded retry attempts remain tracked by the slow-test reporter.

Changes:

  • Tests superseded terminal retry handling.
  • Extends the message helper with optional retry metadata.
FileDescription
GitHubActionsSlowTestReporterTests.csAdds retry-tracking coverage and helper support.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Aug 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🧵 Parallel-safety audit — PR #10840

Parallelization — test assembly audited:

Test assemblyScopeWorkersAnalyzer coverage
Microsoft.Testing.Extensions.UnitTestsMethodLevel ([assembly: Parallelize(Scope = ExecutionScope.MethodLevel, Workers = 0)] in Program.cs)CPU countcoverable once MSTEST0074–0077 ship (attribute-based opt-in)

Only one file changed: test/UnitTests/Microsoft.Testing.Extensions.UnitTests/GitHubActionsSlowTestReporterTests.cs, which adds a new [TestMethod] (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) and extends the private CreateMessage helper with an optional retryAttempt parameter.

Findings: A (global-state) 0 · B (paths) 0 · C (declaration) 0 · D (over-serialization) 0 — by severity: Critical 0 · High 0 · Warning 0 · Info 0.

Nothing in the new test or the extended helper touches process-global state, shared filesystem paths, or [ResourceLock]/[DoNotParallelize] declarations:

  • All state is local to the test method: a fresh CapturingOutputDevice, GitHubActionsSlowTestReporter, and FixedClock are constructed per test (as every sibling test in this class already does), so nothing is shared across concurrently-running tests.
  • The shared private static readonly DateTimeOffset Start field is read-only after initialization — not mutated by this or any other test in the class — so it is not a race.
  • CreateMessage's new retryAttempt parameter only adds a property to a locally-created PropertyBag; no static or process-wide state is touched.
  • No environment variables, current directory, console redirection, culture, or filesystem paths are involved.
  • No [ResourceLock] / [DoNotParallelize] declarations were added, removed, or already exist in this file, so there is no declaration-reconciliation (category C) concern.

This is a clean, additive unit test change with no parallel-safety impact under the detected MethodLevel scope.

Advisory only — heuristic, non-blocking. Re-run with /parallel-audit. This audit answers "is it parallel-safe?"; for testability, smells, or flakiness see the detect-static-dependencies / test-smell-detection / test-anti-patterns analyses.

🤖 Automated content by GitHub Copilot. Generated by the Parallel-safety audit on PR (on open / sync) workflow. · auto · 69.9 AIC · ⌖ 1.1 AIC · ⊞ 24.8K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit 79ef263 into mainAug 28, 2026
39 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/fix-issue-10825 branch August 28, 2026 14:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[test-improver] Cover superseded retry-attempt branch in SlowTestReporterBase

3 participants

@Evangelink@0101
, '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

Cover superseded retry slow-test tracking - #10840

Merged
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825
Aug 28, 2026
Merged

Cover superseded retry slow-test tracking#10840
Amaury Levé (Evangelink) merged 1 commit into
mainfrom
dev/amauryleve/fix-issue-10825

Conversation

@Evangelink

Copy link
Copy Markdown
Member

SlowTestReporterBase must keep tracking a test node when a terminal update represents a superseded retry attempt, because a later attempt is still running. This adds focused coverage so that behavior cannot regress unnoticed.

The test sends an in-progress update followed by a failed superseded retry update, then verifies the slow-test notice still appears after the threshold. The shared test message helper now accepts optional retry metadata.

Testing

  • GitHubActionsSlowTestReporterTests: 12 passed

Fixes#10825

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
CopilotAI balanced review requested due to automatic review settings August 28, 2026 13:22

@github-actionsgithub-actionsBot 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.

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Review Summary

Verdict: Clean — no issues found.

This PR adds a focused unit test (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) that exercises the IsSupersededRetryAttempt() guard in SlowTestReporterBase.ConsumeAsync (line 147 of SlowTestReporterBase.cs). I verified the production code: when a terminal update carries a superseded retry attempt, the test is intentionally not removed from _inProgress, so the slow-test scan continues to surface it. The test correctly validates this by:

  1. Sending an InProgress message to start tracking.
  2. Sending a Failed message with RetryAttemptProperty(1, isSuperseded: true) — this should not stop tracking.
  3. Running ScanOnceAsync past the threshold and asserting a notice was still emitted.
DimensionFinding
Algorithmic Correctness✅ Test logic matches production behavior at the IsSupersededRetryAttempt() branch.
Test Quality✅ Follows existing test patterns (ConsumeAsync_TerminalState_StopsTrackingAsync, ConsumeAsync_ExecutionCompleted_StopsTrackingAsync). Naming is clear and consistent.
API Surface✅ No public API changes — CreateMessage helper gains an optional RetryAttemptProperty? parameter, internal to the test file.
Style & Conventions✅ Consistent with codebase style.
All other dimensionsN/A — this is a test-only change with no production code, localization, public API, or cross-TFM impact.

No inline comments needed — the diff is clean and well-scoped.

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Expert test review — PR #10840

GradeTestMutationNotesHow to improve
A (90–100)new GitHubActionsSlowTestReporterTests.
ConsumeAsync_
SupersededRetryAttempt_
KeepsTrackingAsync
2/2 killedDirectly exercises the new IsSupersededRetryAttempt guard, verifying tracking survives a superseded terminal update and the scan still emits the notice at threshold.

Only one production-facing test method changed in this PR: GitHubActionsSlowTestReporterTests.ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync (new). The CreateMessage helper was also extended with an optional retryAttempt parameter but is not itself a test. The new test correctly asserts both that the notice is still emitted (proving the in-progress test was not dropped) and that the message content matches the expected test name, giving good coverage against inverting or removing the !update.TestNode.IsSupersededRetryAttempt() check in SlowTestReporterBase.ConsumeAsync. No actionable findings.

This advisory comment was generated automatically. Grades are heuristic and informational — they do not block merging. Suggestions on the Files changed tab can be applied with one click. Re-run with /review-tests.

🤖 Automated content by GitHub Copilot. Generated by the Test Reviewer on PR (on open / sync) workflow. · auto · 44.3 AIC · ⌖ 1.1 AIC · ⊞ 16.9K · [◷]( · )

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 review overview

Review tier: Balanced
Findings: None

What changed in this PR

Adds focused regression coverage ensuring superseded retry attempts remain tracked by the slow-test reporter.

Changes:

  • Tests superseded terminal retry handling.
  • Extends the message helper with optional retry metadata.
FileDescription
GitHubActionsSlowTestReporterTests.csAdds retry-tracking coverage and helper support.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@EvangelinkAmaury Levé (Evangelink) added the state/needs-review Awaiting review from the team. label Aug 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🧵 Parallel-safety audit — PR #10840

Parallelization — test assembly audited:

Test assemblyScopeWorkersAnalyzer coverage
Microsoft.Testing.Extensions.UnitTestsMethodLevel ([assembly: Parallelize(Scope = ExecutionScope.MethodLevel, Workers = 0)] in Program.cs)CPU countcoverable once MSTEST0074–0077 ship (attribute-based opt-in)

Only one file changed: test/UnitTests/Microsoft.Testing.Extensions.UnitTests/GitHubActionsSlowTestReporterTests.cs, which adds a new [TestMethod] (ConsumeAsync_SupersededRetryAttempt_KeepsTrackingAsync) and extends the private CreateMessage helper with an optional retryAttempt parameter.

Findings: A (global-state) 0 · B (paths) 0 · C (declaration) 0 · D (over-serialization) 0 — by severity: Critical 0 · High 0 · Warning 0 · Info 0.

Nothing in the new test or the extended helper touches process-global state, shared filesystem paths, or [ResourceLock]/[DoNotParallelize] declarations:

  • All state is local to the test method: a fresh CapturingOutputDevice, GitHubActionsSlowTestReporter, and FixedClock are constructed per test (as every sibling test in this class already does), so nothing is shared across concurrently-running tests.
  • The shared private static readonly DateTimeOffset Start field is read-only after initialization — not mutated by this or any other test in the class — so it is not a race.
  • CreateMessage's new retryAttempt parameter only adds a property to a locally-created PropertyBag; no static or process-wide state is touched.
  • No environment variables, current directory, console redirection, culture, or filesystem paths are involved.
  • No [ResourceLock] / [DoNotParallelize] declarations were added, removed, or already exist in this file, so there is no declaration-reconciliation (category C) concern.

This is a clean, additive unit test change with no parallel-safety impact under the detected MethodLevel scope.

Advisory only — heuristic, non-blocking. Re-run with /parallel-audit. This audit answers "is it parallel-safe?"; for testability, smells, or flakiness see the detect-static-dependencies / test-smell-detection / test-anti-patterns analyses.

🤖 Automated content by GitHub Copilot. Generated by the Parallel-safety audit on PR (on open / sync) workflow. · auto · 69.9 AIC · ⌖ 1.1 AIC · ⊞ 24.8K · [◷]( · )

@Evangelink
Amaury Levé (Evangelink) merged commit 79ef263 into mainAug 28, 2026
39 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/fix-issue-10825 branch August 28, 2026 14:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/needs-reviewAwaiting review from the team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[test-improver] Cover superseded retry-attempt branch in SlowTestReporterBase

3 participants

@Evangelink@0101