dotnet-installer/src/dotnet/commands/dotnet-test/Program.cs

122 lines
4.1 KiB
C#
Raw Normal View History

2015-11-30 16:24:03 -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;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using Microsoft.DotNet.Cli.Utils;
using Microsoft.DotNet.ProjectModel;
using Microsoft.Extensions.PlatformAbstractions;
2015-11-30 16:24:03 -08:00
namespace Microsoft.DotNet.Tools.Test
{
public class TestCommand
2015-11-30 16:24:03 -08:00
{
private readonly IDotnetTestRunnerFactory _dotnetTestRunnerFactory;
public TestCommand(IDotnetTestRunnerFactory testRunnerFactory)
{
_dotnetTestRunnerFactory = testRunnerFactory;
}
public int DoRun(string[] args)
2015-11-30 16:24:03 -08:00
{
DebugHelper.HandleDebugSwitch(ref args);
var dotnetTestParams = new DotnetTestParams();
2015-11-30 16:24:03 -08:00
dotnetTestParams.Parse(args);
try
2015-11-30 16:24:03 -08:00
{
if (dotnetTestParams.Help)
{
return 0;
}
// Register for parent process's exit event
if (dotnetTestParams.ParentProcessId.HasValue)
2015-11-30 16:24:03 -08:00
{
RegisterForParentProcessExit(dotnetTestParams.ParentProcessId.Value);
}
var projectContexts = CreateProjectContexts(dotnetTestParams.ProjectPath, dotnetTestParams.Runtime);
var projectContext = projectContexts.First();
var testRunner = projectContext.ProjectFile.TestRunner;
2015-11-30 16:24:03 -08:00
IDotnetTestRunner dotnetTestRunner = _dotnetTestRunnerFactory.Create(dotnetTestParams.Port);
return dotnetTestRunner.RunTests(projectContext, dotnetTestParams);
}
catch (InvalidOperationException ex)
2015-11-30 16:24:03 -08:00
{
TestHostTracing.Source.TraceEvent(TraceEventType.Error, 0, ex.ToString());
return -1;
2015-11-30 16:24:03 -08:00
}
catch (Exception ex)
2015-11-30 16:24:03 -08:00
{
TestHostTracing.Source.TraceEvent(TraceEventType.Error, 0, ex.ToString());
return -2;
2015-11-30 16:24:03 -08:00
}
}
public static int Run(string[] args)
{
var testCommand = new TestCommand(new DotnetTestRunnerFactory());
return testCommand.DoRun(args);
}
2015-11-30 16:24:03 -08:00
private static void RegisterForParentProcessExit(int id)
{
var parentProcess = Process.GetProcesses().FirstOrDefault(p => p.Id == id);
if (parentProcess != null)
{
parentProcess.EnableRaisingEvents = true;
parentProcess.Exited += (sender, eventArgs) =>
{
TestHostTracing.Source.TraceEvent(
TraceEventType.Information,
0,
"Killing the current process as parent process has exited.");
Process.GetCurrentProcess().Kill();
};
}
else
{
TestHostTracing.Source.TraceEvent(
TraceEventType.Information,
0,
"Failed to register for parent process's exit event. " +
$"Parent process with id '{id}' was not found.");
}
}
private static IEnumerable<ProjectContext> CreateProjectContexts(string projectPath, string runtime)
2015-11-30 16:24:03 -08:00
{
projectPath = projectPath ?? Directory.GetCurrentDirectory();
if (!projectPath.EndsWith(Project.FileName))
{
projectPath = Path.Combine(projectPath, Project.FileName);
}
if (!File.Exists(projectPath))
{
throw new InvalidOperationException($"{projectPath} does not exist.");
}
var runtimeIdentifiers = !string.IsNullOrEmpty(runtime) ?
new[] { runtime } :
PlatformServices.Default.Runtime.GetAllCandidateRuntimeIdentifiers();
return ProjectContext.CreateContextForEachFramework(projectPath).Select(context => context.CreateRuntimeContext(runtimeIdentifiers));
2015-11-30 16:24:03 -08:00
}
}
}