dotnet-installer/test/dotnet-test.UnitTests/GivenADotnetTestApp.cs
Livar Cunha 7630337074 Adding unit tests for the state machine of dotnet test. Starting the implementation of a state machine in dotnet test. Right now we only handle the TestSession:Terminate message.
Adding a message handler for the version check message. Also introduced an IDotnetTest that handles state and handlers (the state machine).

Adding the test discover start message handler and introducing a test runner.

Added the handler for the GetTestRunnerProcessInfo message. Also, modified dotnet test to have separate setter for the special message handlers for terminate and unknown messages and added a separate method to add new reporting channels to DotnetTest, so that it can handle the new listener for the test runner.

Added the test runner test discovery handlers.

Added handlers to deal with the test execution itself.

Updated dotnet-test program to use the message handlers during design time.

Added a test for the whole discover tests message flow.

Added a test for the run tests full message exchange.
2016-02-23 11:20:04 -08:00

157 lines
6.4 KiB
C#

// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using FluentAssertions;
using Microsoft.DotNet.Tools.Test;
using Microsoft.Extensions.Testing.Abstractions;
using Moq;
using Xunit;
namespace Microsoft.Dotnet.Tools.Test.Tests
{
public class GivenADotnetTestApp
{
private const string AssemblyUnderTest = "assembly.dll";
private Mock<IReportingChannel> _reportingChannelMock;
private Mock<IDotnetTestMessageHandler> _noOpMessageHandlerMock;
private Mock<IDotnetTestMessageHandler> _realMessageHandlerMock;
private Mock<IDotnetTestMessageHandler> _unknownMessageHandlerMock;
private DotnetTest _dotnetTest;
public GivenADotnetTestApp()
{
_noOpMessageHandlerMock = new Mock<IDotnetTestMessageHandler>();
_noOpMessageHandlerMock
.Setup(mh => mh.HandleMessage(It.IsAny<DotnetTest>(), It.IsAny<Message>()))
.Returns(DotnetTestState.NoOp)
.Verifiable();
_realMessageHandlerMock = new Mock<IDotnetTestMessageHandler>();
_realMessageHandlerMock
.Setup(mh => mh.HandleMessage(It.IsAny<DotnetTest>(), It.Is<Message>(m => m.MessageType == "Test message")))
.Returns(DotnetTestState.VersionCheckCompleted).Callback(() =>
_reportingChannelMock.Raise(r => r.MessageReceived += null, _dotnetTest, new Message
{
MessageType = TestMessageTypes.TestSessionTerminate
}));
_reportingChannelMock = new Mock<IReportingChannel>();
_unknownMessageHandlerMock = new Mock<IDotnetTestMessageHandler>();
_unknownMessageHandlerMock
.Setup(mh => mh.HandleMessage(It.IsAny<DotnetTest>(), It.IsAny<Message>()))
.Throws<InvalidOperationException>();
var testMessagesCollection = new TestMessagesCollection();
_dotnetTest = new DotnetTest(testMessagesCollection, AssemblyUnderTest)
{
TestSessionTerminateMessageHandler = new TestSessionTerminateMessageHandler(testMessagesCollection),
UnknownMessageHandler = _unknownMessageHandlerMock.Object
};
_dotnetTest.StartListeningTo(_reportingChannelMock.Object);
_reportingChannelMock.Raise(r => r.MessageReceived += null, _dotnetTest, new Message
{
MessageType = "Test message"
});
}
[Fact]
public void DotnetTest_handles_TestSession_Terminate_messages_implicitly()
{
_reportingChannelMock.Raise(r => r.MessageReceived += null, _dotnetTest, new Message
{
MessageType = TestMessageTypes.TestSessionTerminate
});
_dotnetTest.StartHandlingMessages();
//just the fact that we are not hanging means we stopped waiting for messages
}
[Fact]
public void DotnetTest_calls_each_MessageHandler_until_one_returns_a_state_different_from_NoOp()
{
var secondNoOpMessageHandler = new Mock<IDotnetTestMessageHandler>();
_dotnetTest
.AddMessageHandler(_noOpMessageHandlerMock.Object)
.AddMessageHandler(_realMessageHandlerMock.Object)
.AddMessageHandler(secondNoOpMessageHandler.Object);
_dotnetTest.StartHandlingMessages();
_noOpMessageHandlerMock.Verify();
_realMessageHandlerMock.Verify();
secondNoOpMessageHandler.Verify(
mh => mh.HandleMessage(It.IsAny<DotnetTest>(), It.IsAny<Message>()),
Times.Never);
}
[Fact]
public void DotnetTest_does_not_send_an_error_when_the_message_gets_handled()
{
_dotnetTest.AddMessageHandler(_realMessageHandlerMock.Object);
_dotnetTest.StartHandlingMessages();
_reportingChannelMock.Verify(r => r.SendError(It.IsAny<string>()), Times.Never);
}
[Fact]
public void DotnetTest_calls_the_unknown_message_handler_when_the_message_is_not_handled()
{
_dotnetTest.AddMessageHandler(_noOpMessageHandlerMock.Object);
Action action = () => _dotnetTest.StartHandlingMessages();
action.ShouldThrow<InvalidOperationException>();
}
[Fact]
public void It_throws_an_InvalidOperationException_if_StartListening_is_called_without_setting_a_TestSessionTerminateMessageHandler()
{
var dotnetTest = new DotnetTest(new TestMessagesCollection(), AssemblyUnderTest)
{
UnknownMessageHandler = new Mock<IDotnetTestMessageHandler>().Object
};
Action action = () => dotnetTest.StartListeningTo(new Mock<IReportingChannel>().Object);
action.ShouldThrow<InvalidOperationException>();
}
[Fact]
public void It_throws_an_InvalidOperationException_if_StartListeningTo_is_called_without_setting_a_UnknownMessageHandler()
{
var dotnetTest = new DotnetTest(new TestMessagesCollection(), AssemblyUnderTest)
{
TestSessionTerminateMessageHandler = new Mock<IDotnetTestMessageHandler>().Object
};
Action action = () => dotnetTest.StartListeningTo(new Mock<IReportingChannel>().Object);
action.ShouldThrow<InvalidOperationException>();
}
[Fact]
public void It_disposes_all_reporting_channels_that_it_was_listening_to_when_it_gets_disposed()
{
var firstReportingChannelMock = new Mock<IReportingChannel>();
var secondReportingChannelMock = new Mock<IReportingChannel>();
using (var dotnetTest = new DotnetTest(new TestMessagesCollection(), AssemblyUnderTest))
{
dotnetTest.TestSessionTerminateMessageHandler = new Mock<IDotnetTestMessageHandler>().Object;
dotnetTest.UnknownMessageHandler = new Mock<IDotnetTestMessageHandler>().Object;
dotnetTest.StartListeningTo(firstReportingChannelMock.Object);
dotnetTest.StartListeningTo(secondReportingChannelMock.Object);
}
firstReportingChannelMock.Verify(r => r.Dispose(), Times.Once);
secondReportingChannelMock.Verify(r => r.Dispose(), Times.Once);
}
}
}