Skip to content

Commit ecd8b94

Browse files
rogeralsingclaude
andcommitted
Fix timed-out tests not being removed from running display
- Added FQN to DisplayName mapping so we can find the right entry - TestHanging now uses DisplayName to remove from display - Added TestRemoved for suspicious tests moved to isolated retry - Tests no longer linger in the running list after timeout Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 6e03559 commit ecd8b94

2 files changed

Lines changed: 15 additions & 1 deletion

File tree

src/Asynkron.TestRunner/LiveDisplay.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,15 @@ public void TestStarted(string displayName)
158158
lock (_lock) _running[Truncate(displayName, ContentWidth)] = DateTime.UtcNow;
159159
}
160160

161+
/// <summary>
162+
/// Removes a test from the running list without marking any status.
163+
/// Used when moving tests to isolated retry.
164+
/// </summary>
165+
public void TestRemoved(string displayName)
166+
{
167+
lock (_lock) _running.Remove(Truncate(displayName, ContentWidth));
168+
}
169+
161170
public void TestPassed(string displayName)
162171
{
163172
lock (_lock)

src/Asynkron.TestRunner/TestRunner.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ private async Task RunWorkerBatchAsync(
256256
var suspectedCrashTests = new HashSet<string>(); // Tests that need isolated retry
257257
var testOutput = new Dictionary<string, StringBuilder>(); // Capture output per test
258258
var testStartTimes = new Dictionary<string, DateTime>();
259+
var fqnToDisplayName = new Dictionary<string, string>(); // Map FQN to DisplayName for proper removal
259260

260261
Log(workerIndex, $"Starting batch: {batch.Count} tests");
261262

@@ -321,7 +322,8 @@ private async Task RunWorkerBatchAsync(
321322
running.Remove(fqn);
322323
pending.Remove(fqn);
323324
lock (results) results.Hanging.Add(fqn);
324-
display.TestHanging(fqn);
325+
var displayName = fqnToDisplayName.GetValueOrDefault(fqn, fqn);
326+
display.TestHanging(displayName);
325327
display.WorkerTestHanging(workerIndex);
326328
ReportCrashedOrHanging(fqn, "hanging", testOutput, $"Test exceeded per-test timeout of {_testTimeoutSeconds * 2}s");
327329
}
@@ -333,6 +335,8 @@ private async Task RunWorkerBatchAsync(
333335
running.Remove(fqn);
334336
pending.Remove(fqn);
335337
suspectedCrashTests.Add(fqn);
338+
var displayName = fqnToDisplayName.GetValueOrDefault(fqn, fqn);
339+
display.TestRemoved(displayName);
336340
}
337341

338342
// Kill worker and restart with remaining tests
@@ -346,6 +350,7 @@ private async Task RunWorkerBatchAsync(
346350
case TestStartedEvent started:
347351
running.Add(started.FullyQualifiedName);
348352
testStartTimes[started.FullyQualifiedName] = DateTime.UtcNow;
353+
fqnToDisplayName[started.FullyQualifiedName] = started.DisplayName;
349354
display.TestStarted(started.DisplayName);
350355
break;
351356

0 commit comments

Comments
 (0)