Skip to content

Fix non-deterministic branch coverage in HedgingExecutionContext hedging delay tests#2997

Merged
martincostello merged 3 commits into
mainfrom
copilot/investigate-test-coverage-hedging-context
Mar 19, 2026
Merged

Fix non-deterministic branch coverage in HedgingExecutionContext hedging delay tests#2997
martincostello merged 3 commits into
mainfrom
copilot/investigate-test-coverage-hedging-context

Conversation

Copilot AI commented Mar 19, 2026

Copy link
Copy Markdown
Contributor

The mutation tests for HedgingExecutionContext<T> were flaky because the condition at line 132 (if (!whenAnyHedgedTask.IsCompleted)) was not reliably exercised by both branches. The single existing test advanced the fake clock by a full day, firing both the hedging delay timer and the primary task timer simultaneously — making the outcome of the IsCompleted check dependent on non-deterministic async continuation scheduling.

Changes

  • Replaced TryWaitForCompletedExecutionAsync_HedgedExecution_Ok with two deterministic, explicitly-asserted tests:
    • DelayFiresFirst_ReturnsNull — primary task delay (1 h) exceeds hedging delay (5 s); advancing only 10 s fires the hedging delay while the primary is still running, so whenAnyHedgedTask.IsCompleted is deterministically false and the method deterministically returns null (result.ShouldBeNull()).
    • TaskCompletesBeforeDelay_ReturnsTask — primary task delay (5 s) is less than hedging delay (1 h); advancing only 10 s completes the primary before the hedging delay timer fires, so whenAnyHedgedTask.IsCompleted is deterministically true and the method deterministically returns the completed execution (result.ShouldNotBeNull()).
  • Both tests are parameterised with continueOnCapturedContext = true/false, preserving the original ConfigureAwait flag coverage.

With these changes, inverting the condition at line 132 will always cause at least one test to fail.

Confirm the following

  • I started this PR by branching from the head of the default branch
  • I have targeted the PR to merge into the default branch
  • I have included unit tests for the issue/feature
  • I have successfully run a local build

💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

…ing delay tests

Replace the single non-deterministic TryWaitForCompletedExecutionAsync_HedgedExecution_Ok
test with two focused, deterministic tests:

1. DelayFiresFirst_ReturnsNull: primary task delay (1h) > hedging delay (5s).
   Advance only 10s to fire the hedging delay without completing the primary,
   so whenAnyHedgedTask.IsCompleted is deterministically false → returns null.

2. TaskCompletesBeforeDelay_ReturnsTask: primary task delay (5s) < hedging delay (1h).
   Advance only 10s to complete the primary without firing the hedging delay timer,
   so whenAnyHedgedTask.IsCompleted is deterministically true → returns non-null.

Both tests assert the return value explicitly so mutation tests reliably fail
when the condition at HedgingExecutionContext.cs:132 is inverted.

Co-authored-by: martincostello <1439341+martincostello@users.noreply.github.com>
Copilot AI changed the title [WIP] Investigate and improve test coverage for HedgingExecutionContext Fix non-deterministic branch coverage in HedgingExecutionContext hedging delay tests Mar 19, 2026
Copilot AI requested a review from martincostello March 19, 2026 17:01
@codecov

codecov Bot commented Mar 19, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 96.15%. Comparing base (fee0048) to head (04043fe).
⚠️ Report is 5 commits behind head on main.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #2997   +/-   ##
=======================================
  Coverage   96.15%   96.15%           
=======================================
  Files         310      310           
  Lines        7135     7135           
  Branches     1005     1005           
=======================================
  Hits         6861     6861           
  Misses        221      221           
  Partials       53       53           
Flag Coverage Δ
linux 96.15% <ø> (ø)
macos 96.15% <ø> (ø)
windows 96.15% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Refactoring to make the tests a bit more readable and a little less repetitive.
@martincostello martincostello marked this pull request as ready for review March 19, 2026 18:17
Copilot AI review requested due to automatic review settings March 19, 2026 18:17
@martincostello martincostello enabled auto-merge (squash) March 19, 2026 18:17
@martincostello martincostello merged commit 51c138e into main Mar 19, 2026
30 checks passed
@martincostello martincostello deleted the copilot/investigate-test-coverage-hedging-context branch March 19, 2026 18:18

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes flaky mutation/branch coverage around the whenAnyHedgedTask.IsCompleted check in HedgingExecutionContext<T>.TryWaitForCompletedExecutionAsync(...) by replacing a timing-racy hedging-delay test with two deterministic tests that explicitly drive each branch.

Changes:

  • Replaced the previous single hedging-delay test with two deterministic tests that separately assert the “delay fires first” and “task completes first” outcomes.
  • Preserved continueOnCapturedContext = true/false coverage for both new tests.
  • Minor refactors/cleanup in the test file (consistent attribute ordering, reuse of common TimeSpan values, a few additional safety assertions).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

This was referenced Jun 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants