2016-02-12 18:22:35 -08:00
// 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.Collections.Generic ;
using System.Diagnostics ;
using FluentAssertions ;
using Microsoft.DotNet.Tools.Test ;
using Microsoft.Extensions.Testing.Abstractions ;
using Moq ;
using Newtonsoft.Json.Linq ;
using Xunit ;
namespace Microsoft.Dotnet.Tools.Test.Tests
{
public class GivenATestExecutionGetTestRunnerProcessStartInfoMessageHandler
{
private const int TestRunnerPort = 1 ;
private const string AssemblyUnderTest = "assembly.dll" ;
private GetTestRunnerProcessStartInfoMessageHandler _testGetTestRunnerProcessStartInfoMessageHandler ;
private Message _validMessage ;
2016-03-01 21:53:51 -08:00
private TestStartInfo _testStartInfo ;
2016-03-03 17:43:42 -08:00
private List < string > _testsToRun ;
2016-02-12 18:22:35 -08:00
private Mock < ITestRunner > _testRunnerMock ;
private Mock < ITestRunnerFactory > _testRunnerFactoryMock ;
private Mock < IReportingChannel > _adapterChannelMock ;
private Mock < IReportingChannel > _testRunnerChannelMock ;
private Mock < IReportingChannelFactory > _reportingChannelFactoryMock ;
private Mock < IDotnetTest > _dotnetTestMock ;
private RunTestsArgumentsBuilder _argumentsBuilder ;
public GivenATestExecutionGetTestRunnerProcessStartInfoMessageHandler ( )
{
2016-03-03 17:43:42 -08:00
_testsToRun = new List < string > { "test1" , "test2" } ;
2016-02-12 18:22:35 -08:00
_validMessage = new Message
{
MessageType = TestMessageTypes . TestExecutionGetTestRunnerProcessStartInfo ,
2016-03-03 17:43:42 -08:00
Payload = JToken . FromObject ( new RunTestsMessage { Tests = _testsToRun } )
2016-02-12 18:22:35 -08:00
} ;
_dotnetTestMock = new Mock < IDotnetTest > ( ) ;
_dotnetTestMock . Setup ( d = > d . State ) . Returns ( DotnetTestState . VersionCheckCompleted ) ;
_dotnetTestMock . Setup ( d = > d . PathToAssemblyUnderTest ) . Returns ( AssemblyUnderTest ) ;
2016-03-01 21:53:51 -08:00
_testStartInfo = new TestStartInfo
{
FileName = "runner" ,
Arguments = "arguments"
} ;
2016-02-12 18:22:35 -08:00
_testRunnerMock = new Mock < ITestRunner > ( ) ;
2016-03-01 21:53:51 -08:00
_testRunnerMock . Setup ( t = > t . GetProcessStartInfo ( ) ) . Returns ( _testStartInfo ) ;
2016-02-12 18:22:35 -08:00
_testRunnerFactoryMock = new Mock < ITestRunnerFactory > ( ) ;
_testRunnerFactoryMock
. Setup ( c = > c . CreateTestRunner ( It . IsAny < RunTestsArgumentsBuilder > ( ) ) )
. Callback < ITestRunnerArgumentsBuilder > ( r = > _argumentsBuilder = r as RunTestsArgumentsBuilder )
. Returns ( _testRunnerMock . Object ) ;
_adapterChannelMock = new Mock < IReportingChannel > ( ) ;
_testRunnerChannelMock = new Mock < IReportingChannel > ( ) ;
_testRunnerChannelMock . Setup ( t = > t . Port ) . Returns ( TestRunnerPort ) ;
_reportingChannelFactoryMock = new Mock < IReportingChannelFactory > ( ) ;
_reportingChannelFactoryMock . Setup ( r = >
2016-03-03 17:43:42 -08:00
r . CreateTestRunnerChannel ( ) ) . Returns ( _testRunnerChannelMock . Object ) ;
2016-02-12 18:22:35 -08:00
_testGetTestRunnerProcessStartInfoMessageHandler = new GetTestRunnerProcessStartInfoMessageHandler (
_testRunnerFactoryMock . Object ,
_adapterChannelMock . Object ,
_reportingChannelFactoryMock . Object ) ;
}
[Fact]
2016-02-23 18:13:00 -08:00
public void It_returns_NoOp_if_the_dotnet_test_state_is_not_VersionCheckCompleted_or_InitialState ( )
2016-02-12 18:22:35 -08:00
{
var dotnetTestMock = new Mock < IDotnetTest > ( ) ;
dotnetTestMock . Setup ( d = > d . State ) . Returns ( DotnetTestState . Terminated ) ;
var nextState = _testGetTestRunnerProcessStartInfoMessageHandler . HandleMessage (
dotnetTestMock . Object ,
_validMessage ) ;
nextState . Should ( ) . Be ( DotnetTestState . NoOp ) ;
}
[Fact]
public void It_returns_NoOp_if_the_message_is_not_TestDiscoveryStart ( )
{
var nextState = _testGetTestRunnerProcessStartInfoMessageHandler . HandleMessage (
_dotnetTestMock . Object ,
new Message { MessageType = "Something different from TestDiscovery.Start" } ) ;
nextState . Should ( ) . Be ( DotnetTestState . NoOp ) ;
}
[Fact]
2016-02-23 18:13:00 -08:00
public void It_returns_TestExecutionSentTestRunnerProcessStartInfo_when_it_handles_the_message_and_current_state_is_InitialState ( )
{
var dotnetTestMock = new Mock < IDotnetTest > ( ) ;
dotnetTestMock . Setup ( d = > d . State ) . Returns ( DotnetTestState . InitialState ) ;
var nextState = _testGetTestRunnerProcessStartInfoMessageHandler . HandleMessage (
dotnetTestMock . Object ,
_validMessage ) ;
nextState . Should ( ) . Be ( DotnetTestState . TestExecutionSentTestRunnerProcessStartInfo ) ;
}
[Fact]
public void It_returns_TestExecutionSentTestRunnerProcessStartInfo_when_it_handles_the_message_and_current_state_is_VersionCheckCompleted ( )
2016-02-12 18:22:35 -08:00
{
var nextState = _testGetTestRunnerProcessStartInfoMessageHandler . HandleMessage (
_dotnetTestMock . Object ,
_validMessage ) ;
nextState . Should ( ) . Be ( DotnetTestState . TestExecutionSentTestRunnerProcessStartInfo ) ;
}
[Fact]
public void It_gets_the_process_start_info_from_the_test_runner_when_it_handles_the_message ( )
{
_testGetTestRunnerProcessStartInfoMessageHandler . HandleMessage (
_dotnetTestMock . Object ,
_validMessage ) ;
_testRunnerMock . Verify ( t = > t . GetProcessStartInfo ( ) , Times . Once ) ;
}
[Fact]
public void It_sends_the_process_start_info_when_it_handles_the_message ( )
{
_adapterChannelMock . Setup ( r = > r . Send ( It . Is < Message > ( m = >
m . MessageType = = TestMessageTypes . TestExecutionTestRunnerProcessStartInfo & &
2016-03-01 21:53:51 -08:00
m . Payload . ToObject < ProcessStartInfo > ( ) . FileName = = _testStartInfo . FileName & &
m . Payload . ToObject < ProcessStartInfo > ( ) . Arguments = = _testStartInfo . Arguments ) ) ) . Verifiable ( ) ;
2016-02-12 18:22:35 -08:00
_testGetTestRunnerProcessStartInfoMessageHandler . HandleMessage (
_dotnetTestMock . Object ,
_validMessage ) ;
_adapterChannelMock . Verify ( ) ;
}
[Fact]
public void It_creates_a_new_reporting_channel ( )
{
_testGetTestRunnerProcessStartInfoMessageHandler . HandleMessage (
_dotnetTestMock . Object ,
_validMessage ) ;
2016-03-03 17:43:42 -08:00
_reportingChannelFactoryMock . Verify ( r = > r . CreateTestRunnerChannel ( ) , Times . Once ) ;
2016-02-12 18:22:35 -08:00
}
2016-02-24 16:53:16 -08:00
[Fact]
public void It_calls_accept_on_the_test_runner_channel ( )
{
_testGetTestRunnerProcessStartInfoMessageHandler . HandleMessage (
_dotnetTestMock . Object ,
_validMessage ) ;
2016-03-08 15:53:21 -08:00
_testRunnerChannelMock . Verify ( t = > t . Connect ( ) , Times . Once ) ;
2016-02-24 16:53:16 -08:00
}
2016-02-12 18:22:35 -08:00
[Fact]
public void It_makes_dotnet_test_listen_on_the_test_runner_port_for_messages_when_it_handles_the_message ( )
{
_testGetTestRunnerProcessStartInfoMessageHandler . HandleMessage (
_dotnetTestMock . Object ,
_validMessage ) ;
_dotnetTestMock . Verify ( d = > d . StartListeningTo ( _testRunnerChannelMock . Object ) , Times . Once ) ;
}
2016-03-03 17:43:42 -08:00
[Fact]
public void It_sets_the_TestsToRun_of_DotnetTest ( )
{
_testGetTestRunnerProcessStartInfoMessageHandler . HandleMessage (
_dotnetTestMock . Object ,
_validMessage ) ;
_dotnetTestMock . VerifySet ( d = > d . TestsToRun = _testsToRun ) ;
}
2016-02-12 18:22:35 -08:00
[Fact]
public void It_passes_the_right_arguments_to_the_run_tests_arguments_builder ( )
{
_testGetTestRunnerProcessStartInfoMessageHandler . HandleMessage (
_dotnetTestMock . Object ,
_validMessage ) ;
_argumentsBuilder . Should ( ) . NotBeNull ( ) ;
var arguments = _argumentsBuilder . BuildArguments ( ) ;
arguments . Should ( ) . Contain ( "--port" , $"{TestRunnerPort}" ) ;
arguments . Should ( ) . Contain ( $"{AssemblyUnderTest}" ) ;
}
}
}