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 4e99b52 commit d300c88
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ protected virtual Task BeforeTestAssemblyFinishedAsync()
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
10 changes: 8 additions & 2 deletions src/xunit.execution/Sdk/SynchronousMessageBus.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,15 @@ namespace Xunit.Sdk
/// </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 = messageSink;
this.stopOnFail = stopOnFail;
}

/// <summary/>
Expand All @@ -21,7 +24,10 @@ public SynchronousMessageBus(IMessageSink messageSink)
/// <summary/>
public bool QueueMessage(IMessageSinkMessage message)
{
return messageSink.OnMessage(message);
if (stopOnFail && message is ITestFailed)
continueRunning = false;

return messageSink.OnMessage(message) && continueRunning;
}
}
}
31 changes: 27 additions & 4 deletions test/test.xunit.execution/Sdk/SynchronousMessageBusTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,32 @@ public void MessagesAreDispatchedImmediatelyFromBus()
[Fact]
public void BusShouldReportShutdownWhenMessageSinkReturnsFalse()
{
using (var bus = new SynchronousMessageBus(SpyMessageSink.Create(returnResult: false)))
{
Assert.False(bus.QueueMessage(Substitute.For<IMessageSinkMessage>()));
}
using var bus = new SynchronousMessageBus(SpyMessageSink.Create(returnResult: false));

Assert.False(bus.QueueMessage(Substitute.For<IMessageSinkMessage>()));
}

[Fact]
public void WhenStopOnFailIsFalse_WithFailedTest_BusShouldNotReportShutdown()
{
var testPassedMessage = Substitute.For<ITestPassed>();
var testFailedMessage = Substitute.For<ITestFailed>();
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 = Substitute.For<ITestPassed>();
var testFailedMessage = Substitute.For<ITestFailed>();
using var bus = new SynchronousMessageBus(SpyMessageSink.Create(), stopOnFail: true);

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

0 comments on commit d300c88

Please sign in to comment.