Skip to content

Commit

Permalink
xunit/visualstudio.xunit#392: stopOnFail is ignored when synchronous …
Browse files Browse the repository at this point in the history
…message reporting is requested
  • Loading branch information
bradwilson committed Nov 12, 2023
1 parent 16d2eac commit 47be96c
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 3 deletions.
24 changes: 24 additions & 0 deletions src/xunit.v3.core.tests/Internal/SynchronousMessageBusTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,28 @@ public void BusShouldReportShutdownWhenMessageSinkReturnsFalse()

Assert.False(bus.QueueMessage(new _MessageSinkMessage()));
}

[Fact]
public void WhenStopOnFailIsFalse_WithFailedTest_BusShouldNotReportShutdown()
{
var testPassedMessage = TestData.TestPassed();
var testFailedMessage = TestData.TestFailed();
using var bus = new SynchronousMessageBus(SpyMessageSink.Create(), stopOnFail: false);

Assert.True(bus.QueueMessage(testPassedMessage));
Assert.True(bus.QueueMessage(testFailedMessage));
Assert.True(bus.QueueMessage(testPassedMessage));
}

[Fact]
public void WhenStopOnFailIsTrue_WithFailedTest_BusShouldReportShutdown()
{
var testPassedMessage = TestData.TestPassed();
var testFailedMessage = TestData.TestFailed();
using var bus = new SynchronousMessageBus(SpyMessageSink.Create(), stopOnFail: true);

Assert.True(bus.QueueMessage(testPassedMessage));
Assert.False(bus.QueueMessage(testFailedMessage));
Assert.False(bus.QueueMessage(testPassedMessage));
}
}
12 changes: 10 additions & 2 deletions src/xunit.v3.core/Internal/SynchronousMessageBus.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,17 @@ namespace Xunit.Internal;
/// </summary>
public class SynchronousMessageBus : IMessageBus
{
volatile bool continueRunning = true;
readonly _IMessageSink messageSink;
readonly bool stopOnFail;

/// <summary/>
public SynchronousMessageBus(_IMessageSink messageSink)
public SynchronousMessageBus(
_IMessageSink messageSink,
bool stopOnFail = false)
{
this.messageSink = Guard.ArgumentNotNull(messageSink);
this.stopOnFail = stopOnFail;
}

/// <summary/>
Expand All @@ -28,6 +33,9 @@ public bool QueueMessage(_MessageSinkMessage message)
{
Guard.ArgumentNotNull(message);

return messageSink.OnMessage(message);
if (stopOnFail && message is _TestFailed)
continueRunning = false;

return messageSink.OnMessage(message) && continueRunning;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ public abstract class TestAssemblyRunnerContext<TTestCase> : IAsyncLifetime
protected virtual IMessageBus CreateMessageBus()
{
if (ExecutionOptions.SynchronousMessageReportingOrDefault())
return new SynchronousMessageBus(ExecutionMessageSink);
return new SynchronousMessageBus(ExecutionMessageSink, ExecutionOptions.StopOnTestFailOrDefault());

return new MessageBus(ExecutionMessageSink, ExecutionOptions.StopOnTestFailOrDefault());
}
Expand Down

0 comments on commit 47be96c

Please sign in to comment.