2016-08-22 19:24:10 +00:00
|
|
|
|
using Microsoft.Build.Construction;
|
2016-10-18 01:02:10 +00:00
|
|
|
|
using Microsoft.DotNet.TestFramework;
|
2016-08-22 19:24:10 +00:00
|
|
|
|
using Microsoft.DotNet.Tools.Test.Utilities;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using Xunit;
|
|
|
|
|
using FluentAssertions;
|
|
|
|
|
using System.IO;
|
2016-08-23 20:50:05 +00:00
|
|
|
|
using Microsoft.DotNet.Tools.Migrate;
|
2016-08-22 19:24:10 +00:00
|
|
|
|
using Build3Command = Microsoft.DotNet.Tools.Test.Utilities.Build3Command;
|
2016-09-19 20:25:40 +00:00
|
|
|
|
using BuildCommand = Microsoft.DotNet.Tools.Test.Utilities.BuildCommand;
|
2016-10-04 23:48:14 +00:00
|
|
|
|
using System.Runtime.Loader;
|
2016-10-20 22:04:53 +00:00
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
using Newtonsoft.Json.Linq;
|
2016-08-22 19:24:10 +00:00
|
|
|
|
|
|
|
|
|
namespace Microsoft.DotNet.Migration.Tests
|
|
|
|
|
{
|
|
|
|
|
public class GivenThatIWantToMigrateTestApps : TestBase
|
|
|
|
|
{
|
|
|
|
|
[Theory]
|
2016-08-23 20:50:05 +00:00
|
|
|
|
[InlineData("TestAppWithRuntimeOptions")]
|
2016-09-08 21:40:46 +00:00
|
|
|
|
[InlineData("TestAppWithContents")]
|
2016-08-23 20:50:05 +00:00
|
|
|
|
public void It_migrates_apps(string projectName)
|
2016-08-22 19:24:10 +00:00
|
|
|
|
{
|
2016-10-14 07:06:35 +00:00
|
|
|
|
var projectDirectory = TestAssetsManager.CreateTestInstance(projectName, callingMethod: "i")
|
|
|
|
|
.WithLockFiles()
|
|
|
|
|
.Path;
|
2016-09-29 20:05:27 +00:00
|
|
|
|
|
|
|
|
|
CleanBinObj(projectDirectory);
|
|
|
|
|
|
2016-09-28 02:25:13 +00:00
|
|
|
|
var outputComparisonData = BuildProjectJsonMigrateBuildMSBuild(projectDirectory, projectName);
|
2016-08-22 19:24:10 +00:00
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
var outputsIdentical =
|
|
|
|
|
outputComparisonData.ProjectJsonBuildOutputs.SetEquals(outputComparisonData.MSBuildBuildOutputs);
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-08-22 19:24:10 +00:00
|
|
|
|
if (!outputsIdentical)
|
|
|
|
|
{
|
2016-08-23 20:50:05 +00:00
|
|
|
|
OutputDiagnostics(outputComparisonData);
|
|
|
|
|
}
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
outputsIdentical.Should().BeTrue();
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
VerifyAllMSBuildOutputsRunnable(projectDirectory);
|
|
|
|
|
}
|
2016-08-22 19:24:10 +00:00
|
|
|
|
|
2016-10-21 03:15:42 +00:00
|
|
|
|
[Fact]
|
|
|
|
|
public void It_migrates_signed_apps()
|
2016-10-04 23:48:14 +00:00
|
|
|
|
{
|
|
|
|
|
var projectDirectory = TestAssetsManager.CreateTestInstance("TestAppWithSigning", callingMethod: "i").WithLockFiles().Path;
|
|
|
|
|
|
|
|
|
|
CleanBinObj(projectDirectory);
|
|
|
|
|
|
2016-10-21 03:15:42 +00:00
|
|
|
|
var outputComparisonData = BuildProjectJsonMigrateBuildMSBuild(projectDirectory, "TestAppWithSigning");
|
2016-10-04 23:48:14 +00:00
|
|
|
|
|
|
|
|
|
var outputsIdentical =
|
|
|
|
|
outputComparisonData.ProjectJsonBuildOutputs.SetEquals(outputComparisonData.MSBuildBuildOutputs);
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-10-04 23:48:14 +00:00
|
|
|
|
if (!outputsIdentical)
|
|
|
|
|
{
|
|
|
|
|
OutputDiagnostics(outputComparisonData);
|
|
|
|
|
}
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-10-04 23:48:14 +00:00
|
|
|
|
outputsIdentical.Should().BeTrue();
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-10-04 23:48:14 +00:00
|
|
|
|
VerifyAllMSBuildOutputsRunnable(projectDirectory);
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-10-04 23:48:14 +00:00
|
|
|
|
VerifyAllMSBuildOutputsAreSigned(projectDirectory);
|
|
|
|
|
}
|
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
[Fact]
|
|
|
|
|
public void It_migrates_dotnet_new_console_with_identical_outputs()
|
|
|
|
|
{
|
2016-10-14 07:06:35 +00:00
|
|
|
|
var testInstance = TestAssetsManager
|
|
|
|
|
.CreateTestInstance("ProjectJsonConsoleTemplate");
|
|
|
|
|
|
|
|
|
|
var projectDirectory = testInstance.Path;
|
2016-10-04 03:10:09 +00:00
|
|
|
|
|
2016-10-14 07:06:35 +00:00
|
|
|
|
var outputComparisonData = GetComparisonData(projectDirectory);
|
2016-08-22 19:24:10 +00:00
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
var outputsIdentical =
|
|
|
|
|
outputComparisonData.ProjectJsonBuildOutputs.SetEquals(outputComparisonData.MSBuildBuildOutputs);
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
if (!outputsIdentical)
|
|
|
|
|
{
|
|
|
|
|
OutputDiagnostics(outputComparisonData);
|
2016-08-22 19:24:10 +00:00
|
|
|
|
}
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-08-22 19:24:10 +00:00
|
|
|
|
outputsIdentical.Should().BeTrue();
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
VerifyAllMSBuildOutputsRunnable(projectDirectory);
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-20 22:04:53 +00:00
|
|
|
|
[Fact]
|
|
|
|
|
public void It_migrates_old_dotnet_new_web_without_tools_with_outputs_containing_project_json_outputs()
|
2016-08-23 20:50:05 +00:00
|
|
|
|
{
|
2016-10-14 07:06:35 +00:00
|
|
|
|
var testInstance = TestAssetsManager
|
2016-10-20 22:04:53 +00:00
|
|
|
|
.CreateTestInstance("ProjectJsonWebTemplate")
|
|
|
|
|
.WithLockFiles();
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
|
|
|
|
var projectDirectory = testInstance.Path;
|
|
|
|
|
|
2016-10-20 22:04:53 +00:00
|
|
|
|
var globalDirectory = Path.Combine(projectDirectory, "..");
|
|
|
|
|
var projectJsonFile = Path.Combine(projectDirectory, "project.json");
|
|
|
|
|
|
|
|
|
|
WriteGlobalJson(globalDirectory);
|
|
|
|
|
var projectJson = JObject.Parse(File.ReadAllText(projectJsonFile));
|
|
|
|
|
projectJson.Remove("tools");
|
|
|
|
|
File.WriteAllText(projectJsonFile, projectJson.ToString());
|
|
|
|
|
|
2016-10-14 07:06:35 +00:00
|
|
|
|
var outputComparisonData = GetComparisonData(projectDirectory);
|
2016-08-22 19:24:10 +00:00
|
|
|
|
|
2016-09-01 18:42:35 +00:00
|
|
|
|
var outputsIdentical =
|
|
|
|
|
outputComparisonData.ProjectJsonBuildOutputs.SetEquals(outputComparisonData.MSBuildBuildOutputs);
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-09-01 18:42:35 +00:00
|
|
|
|
if (!outputsIdentical)
|
2016-08-22 19:24:10 +00:00
|
|
|
|
{
|
2016-08-23 20:50:05 +00:00
|
|
|
|
OutputDiagnostics(outputComparisonData);
|
2016-08-22 19:24:10 +00:00
|
|
|
|
}
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-09-01 18:42:35 +00:00
|
|
|
|
outputsIdentical.Should().BeTrue();
|
2016-08-22 19:24:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-09-15 22:54:10 +00:00
|
|
|
|
[Theory]
|
2016-10-20 22:33:47 +00:00
|
|
|
|
[InlineData("TestLibraryWithTwoFrameworks")]
|
2016-09-15 23:30:39 +00:00
|
|
|
|
public void It_migrates_projects_with_multiple_TFMs(string projectName)
|
2016-09-15 22:54:10 +00:00
|
|
|
|
{
|
|
|
|
|
var projectDirectory =
|
|
|
|
|
TestAssetsManager.CreateTestInstance(projectName, callingMethod: "i").WithLockFiles().Path;
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-09-28 02:25:13 +00:00
|
|
|
|
var outputComparisonData = BuildProjectJsonMigrateBuildMSBuild(projectDirectory, projectName);
|
2016-09-15 22:54:10 +00:00
|
|
|
|
|
|
|
|
|
var outputsIdentical =
|
|
|
|
|
outputComparisonData.ProjectJsonBuildOutputs.SetEquals(outputComparisonData.MSBuildBuildOutputs);
|
|
|
|
|
|
|
|
|
|
if (!outputsIdentical)
|
|
|
|
|
{
|
|
|
|
|
OutputDiagnostics(outputComparisonData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
outputsIdentical.Should().BeTrue();
|
|
|
|
|
}
|
|
|
|
|
|
2016-08-22 19:24:10 +00:00
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData("TestAppWithLibrary/TestLibrary")]
|
|
|
|
|
[InlineData("TestLibraryWithAnalyzer")]
|
|
|
|
|
[InlineData("TestLibraryWithConfiguration")]
|
|
|
|
|
public void It_migrates_a_library(string projectName)
|
|
|
|
|
{
|
|
|
|
|
var projectDirectory =
|
|
|
|
|
TestAssetsManager.CreateTestInstance(projectName, callingMethod: "i").WithLockFiles().Path;
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-09-29 20:05:27 +00:00
|
|
|
|
var outputComparisonData = BuildProjectJsonMigrateBuildMSBuild(projectDirectory, Path.GetFileNameWithoutExtension(projectName));
|
2016-08-22 19:24:10 +00:00
|
|
|
|
|
2016-09-01 18:42:35 +00:00
|
|
|
|
var outputsIdentical =
|
|
|
|
|
outputComparisonData.ProjectJsonBuildOutputs.SetEquals(outputComparisonData.MSBuildBuildOutputs);
|
2016-08-22 19:24:10 +00:00
|
|
|
|
|
2016-09-01 18:42:35 +00:00
|
|
|
|
if (!outputsIdentical)
|
2016-08-22 19:24:10 +00:00
|
|
|
|
{
|
2016-08-23 20:50:05 +00:00
|
|
|
|
OutputDiagnostics(outputComparisonData);
|
2016-08-22 19:24:10 +00:00
|
|
|
|
}
|
2016-09-01 18:42:35 +00:00
|
|
|
|
|
|
|
|
|
outputsIdentical.Should().BeTrue();
|
2016-08-22 19:24:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-09-23 07:30:41 +00:00
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData("ProjectA", "ProjectA,ProjectB,ProjectC,ProjectD,ProjectE")]
|
|
|
|
|
[InlineData("ProjectB", "ProjectB,ProjectC,ProjectD,ProjectE")]
|
|
|
|
|
[InlineData("ProjectC", "ProjectC,ProjectD,ProjectE")]
|
|
|
|
|
[InlineData("ProjectD", "ProjectD")]
|
|
|
|
|
[InlineData("ProjectE", "ProjectE")]
|
|
|
|
|
public void It_migrates_root_project_and_references(string projectName, string expectedProjects)
|
|
|
|
|
{
|
|
|
|
|
var projectDirectory =
|
|
|
|
|
TestAssetsManager.CreateTestInstance("TestAppDependencyGraph", callingMethod: $"{projectName}.RefsTest").Path;
|
|
|
|
|
|
2016-10-04 17:39:55 +00:00
|
|
|
|
MigrateProject(new [] { Path.Combine(projectDirectory, projectName) });
|
2016-09-23 07:30:41 +00:00
|
|
|
|
|
|
|
|
|
string[] migratedProjects = expectedProjects.Split(new char[] { ',' });
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-09-26 21:16:17 +00:00
|
|
|
|
VerifyMigration(migratedProjects, projectDirectory);
|
2016-09-23 07:30:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData("ProjectA")]
|
|
|
|
|
[InlineData("ProjectB")]
|
|
|
|
|
[InlineData("ProjectC")]
|
|
|
|
|
[InlineData("ProjectD")]
|
|
|
|
|
[InlineData("ProjectE")]
|
|
|
|
|
public void It_migrates_root_project_and_skips_references(string projectName)
|
|
|
|
|
{
|
|
|
|
|
var projectDirectory =
|
|
|
|
|
TestAssetsManager.CreateTestInstance("TestAppDependencyGraph", callingMethod: $"{projectName}.SkipRefsTest").Path;
|
|
|
|
|
|
2016-10-04 17:39:55 +00:00
|
|
|
|
MigrateProject(new [] { Path.Combine(projectDirectory, projectName), "--skip-project-references" });
|
2016-09-26 21:16:17 +00:00
|
|
|
|
|
|
|
|
|
VerifyMigration(Enumerable.Repeat(projectName, 1), projectDirectory);
|
|
|
|
|
}
|
|
|
|
|
|
2016-09-26 22:30:51 +00:00
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData(true)]
|
|
|
|
|
[InlineData(false)]
|
|
|
|
|
public void It_migrates_all_projects_in_given_directory(bool skipRefs)
|
2016-09-26 21:16:17 +00:00
|
|
|
|
{
|
2016-09-26 22:30:51 +00:00
|
|
|
|
var projectDirectory = TestAssetsManager.CreateTestInstance("TestAppDependencyGraph", callingMethod: $"MigrateDirectory.SkipRefs.{skipRefs}").Path;
|
2016-09-26 21:16:17 +00:00
|
|
|
|
|
2016-09-26 22:30:51 +00:00
|
|
|
|
if (skipRefs)
|
|
|
|
|
{
|
2016-10-04 17:39:55 +00:00
|
|
|
|
MigrateProject(new [] { projectDirectory, "--skip-project-references" });
|
2016-09-26 22:30:51 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2016-10-04 17:39:55 +00:00
|
|
|
|
MigrateProject(new [] { projectDirectory });
|
2016-09-26 22:30:51 +00:00
|
|
|
|
}
|
2016-09-23 07:30:41 +00:00
|
|
|
|
|
2016-10-04 17:39:55 +00:00
|
|
|
|
string[] migratedProjects = new string[] { "ProjectA", "ProjectB", "ProjectC", "ProjectD", "ProjectE", "ProjectF", "ProjectG", "ProjectH", "ProjectI", "ProjectJ" };
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-09-26 21:16:17 +00:00
|
|
|
|
VerifyMigration(migratedProjects, projectDirectory);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void It_migrates_given_project_json()
|
|
|
|
|
{
|
|
|
|
|
var projectDirectory = TestAssetsManager.CreateTestInstance("TestAppDependencyGraph").Path;
|
|
|
|
|
|
|
|
|
|
var project = Path.Combine(projectDirectory, "ProjectA", "project.json");
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-10-04 17:39:55 +00:00
|
|
|
|
MigrateProject(new [] { project });
|
2016-09-26 21:16:17 +00:00
|
|
|
|
|
|
|
|
|
string[] migratedProjects = new string[] { "ProjectA", "ProjectB", "ProjectC", "ProjectD", "ProjectE" };
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-09-26 21:16:17 +00:00
|
|
|
|
VerifyMigration(migratedProjects, projectDirectory);
|
2016-09-23 07:30:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-10-03 17:58:32 +00:00
|
|
|
|
[Fact]
|
|
|
|
|
// regression test for https://github.com/dotnet/cli/issues/4269
|
|
|
|
|
public void It_migrates_and_builds_P2P_references()
|
2016-09-24 00:02:46 +00:00
|
|
|
|
{
|
2016-10-03 17:58:32 +00:00
|
|
|
|
var assetsDir = TestAssetsManager.CreateTestInstance("TestAppDependencyGraph").WithLockFiles().Path;
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-10-03 17:58:32 +00:00
|
|
|
|
var projectDirectory = Path.Combine(assetsDir, "ProjectF");
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-10-04 17:39:55 +00:00
|
|
|
|
var restoreDirectories = new string[]
|
|
|
|
|
{
|
|
|
|
|
projectDirectory,
|
|
|
|
|
Path.Combine(assetsDir, "ProjectG")
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var outputComparisonData = BuildProjectJsonMigrateBuildMSBuild(projectDirectory, "ProjectF", new [] { projectDirectory }, restoreDirectories);
|
2016-10-03 17:58:32 +00:00
|
|
|
|
|
|
|
|
|
var outputsIdentical = outputComparisonData.ProjectJsonBuildOutputs
|
|
|
|
|
.SetEquals(outputComparisonData.MSBuildBuildOutputs);
|
|
|
|
|
|
|
|
|
|
if (!outputsIdentical)
|
|
|
|
|
{
|
|
|
|
|
OutputDiagnostics(outputComparisonData);
|
|
|
|
|
}
|
2016-09-24 00:02:46 +00:00
|
|
|
|
|
2016-10-03 17:58:32 +00:00
|
|
|
|
outputsIdentical.Should().BeTrue();
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-10-03 17:58:32 +00:00
|
|
|
|
VerifyAllMSBuildOutputsRunnable(projectDirectory);
|
2016-09-24 00:02:46 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-10-04 17:39:55 +00:00
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData("src", "ProjectH")]
|
|
|
|
|
[InlineData("src with spaces", "ProjectJ")]
|
|
|
|
|
public void It_migrates_and_builds_projects_in_global_json(string path, string projectName)
|
|
|
|
|
{
|
|
|
|
|
var assetsDir = TestAssetsManager.CreateTestInstance(Path.Combine("TestAppDependencyGraph", "ProjectsWithGlobalJson"),
|
|
|
|
|
callingMethod: $"ProjectsWithGlobalJson.{projectName}")
|
|
|
|
|
.WithLockFiles().Path;
|
|
|
|
|
var globalJson = Path.Combine(assetsDir, "global.json");
|
|
|
|
|
|
|
|
|
|
var restoreDirectories = new string[]
|
|
|
|
|
{
|
|
|
|
|
Path.Combine(assetsDir, "src", "ProjectH"),
|
|
|
|
|
Path.Combine(assetsDir, "src", "ProjectI"),
|
|
|
|
|
Path.Combine(assetsDir, "src with spaces", "ProjectJ")
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var projectDirectory = Path.Combine(assetsDir, path, projectName);
|
|
|
|
|
|
|
|
|
|
var outputComparisonData = BuildProjectJsonMigrateBuildMSBuild(projectDirectory,
|
|
|
|
|
projectName,
|
|
|
|
|
new [] { globalJson },
|
|
|
|
|
restoreDirectories);
|
|
|
|
|
|
|
|
|
|
var outputsIdentical = outputComparisonData.ProjectJsonBuildOutputs
|
2016-10-14 07:06:35 +00:00
|
|
|
|
.SetEquals(outputComparisonData.MSBuildBuildOutputs);
|
2016-10-04 17:39:55 +00:00
|
|
|
|
|
|
|
|
|
if (!outputsIdentical)
|
|
|
|
|
{
|
|
|
|
|
OutputDiagnostics(outputComparisonData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
outputsIdentical.Should().BeTrue();
|
|
|
|
|
VerifyAllMSBuildOutputsRunnable(projectDirectory);
|
|
|
|
|
}
|
2016-10-11 01:01:59 +00:00
|
|
|
|
|
|
|
|
|
[Theory]
|
2016-10-11 18:19:04 +00:00
|
|
|
|
[InlineData(true)]
|
|
|
|
|
[InlineData(false)]
|
|
|
|
|
public void Migration_outputs_error_when_no_projects_found(bool useGlobalJson)
|
2016-10-11 01:01:59 +00:00
|
|
|
|
{
|
2016-10-11 18:19:04 +00:00
|
|
|
|
var projectDirectory = TestAssetsManager.CreateTestDirectory("Migration_outputs_error_when_no_projects_found");
|
|
|
|
|
|
|
|
|
|
string argstr = string.Empty;
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-10-11 18:19:04 +00:00
|
|
|
|
string errorMessage = string.Empty;
|
2016-10-04 17:39:55 +00:00
|
|
|
|
|
2016-10-11 01:01:59 +00:00
|
|
|
|
if (useGlobalJson)
|
|
|
|
|
{
|
2016-10-11 18:19:04 +00:00
|
|
|
|
var globalJsonPath = Path.Combine(projectDirectory.Path, "global.json");
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-10-11 18:19:04 +00:00
|
|
|
|
using (FileStream fs = File.Create(globalJsonPath))
|
|
|
|
|
{
|
|
|
|
|
using (StreamWriter sw = new StreamWriter(fs))
|
|
|
|
|
{
|
|
|
|
|
sw.WriteLine("{");
|
|
|
|
|
sw.WriteLine("\"projects\": [ \".\" ]");
|
|
|
|
|
sw.WriteLine("}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
argstr = globalJsonPath;
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-10-11 18:19:04 +00:00
|
|
|
|
errorMessage = "Unable to find any projects in global.json";
|
2016-10-11 01:01:59 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2016-10-11 18:19:04 +00:00
|
|
|
|
argstr = projectDirectory.Path;
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-10-11 18:19:04 +00:00
|
|
|
|
errorMessage = $"No project.json file found in '{projectDirectory.Path}'";
|
2016-10-11 01:01:59 +00:00
|
|
|
|
}
|
2016-10-11 18:19:04 +00:00
|
|
|
|
|
|
|
|
|
var result = new TestCommand("dotnet")
|
|
|
|
|
.WithWorkingDirectory(projectDirectory.Path)
|
|
|
|
|
.ExecuteWithCapturedOutput($"migrate {argstr}");
|
|
|
|
|
|
|
|
|
|
// Expecting an error exit code.
|
|
|
|
|
result.ExitCode.Should().Be(1);
|
|
|
|
|
|
|
|
|
|
// Verify the error messages. Note that debug builds also show the call stack, so we search
|
|
|
|
|
// for the error strings that should be present (rather than an exact match).
|
|
|
|
|
result.StdErr.Should().Contain(errorMessage);
|
|
|
|
|
result.StdErr.Should().Contain("Migration failed.");
|
2016-10-11 01:01:59 +00:00
|
|
|
|
}
|
2016-10-18 01:02:10 +00:00
|
|
|
|
|
|
|
|
|
[WindowsOnlyTheory]
|
|
|
|
|
[InlineData("DesktopTestProjects", "AutoAddDesktopReferencesDuringMigrate", true)]
|
|
|
|
|
[InlineData("TestProjects", "TestAppSimple", false)]
|
|
|
|
|
public void It_auto_add_desktop_references_during_migrate(string testGroup, string projectName, bool isDesktopApp)
|
|
|
|
|
{
|
|
|
|
|
var testAssetManager = GetTestGroupTestAssetsManager(testGroup);
|
|
|
|
|
var projectDirectory = testAssetManager.CreateTestInstance(projectName, callingMethod: "i").WithLockFiles().Path;
|
|
|
|
|
|
|
|
|
|
CleanBinObj(projectDirectory);
|
|
|
|
|
MigrateProject(new string[] { projectDirectory });
|
|
|
|
|
Restore3(projectDirectory);
|
|
|
|
|
BuildMSBuild(projectDirectory, projectName);
|
|
|
|
|
VerifyAutoInjectedDesktopReferences(projectDirectory, projectName, isDesktopApp);
|
|
|
|
|
VerifyAllMSBuildOutputsRunnable(projectDirectory);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void VerifyAutoInjectedDesktopReferences(string projectDirectory, string projectName, bool shouldBePresent)
|
|
|
|
|
{
|
|
|
|
|
if (projectName != null)
|
|
|
|
|
{
|
|
|
|
|
projectName = projectName + ".csproj";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var root = ProjectRootElement.Open(Path.Combine(projectDirectory, projectName));
|
|
|
|
|
var autoInjectedReferences = root.Items.Where(i => i.ItemType == "Reference" && (i.Include == "System" || i.Include == "Microsoft.CSharp"));
|
|
|
|
|
if (shouldBePresent)
|
|
|
|
|
{
|
|
|
|
|
autoInjectedReferences.Should().HaveCount(2);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
autoInjectedReferences.Should().BeEmpty();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-11 01:01:59 +00:00
|
|
|
|
private void VerifyMigration(IEnumerable<string> expectedProjects, string rootDir)
|
2016-09-26 21:16:17 +00:00
|
|
|
|
{
|
2016-10-05 23:25:04 +00:00
|
|
|
|
var migratedProjects = Directory.EnumerateFiles(rootDir, "project.json", SearchOption.AllDirectories)
|
|
|
|
|
.Where(s => Directory.EnumerateFiles(Path.GetDirectoryName(s), "*.csproj").Count() == 1)
|
|
|
|
|
.Where(s => Path.GetFileName(Path.GetDirectoryName(s)).Contains("Project"))
|
|
|
|
|
.Select(s => Path.GetFileName(Path.GetDirectoryName(s)));
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-09-26 21:16:17 +00:00
|
|
|
|
migratedProjects.Should().BeEquivalentTo(expectedProjects);
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-14 07:06:35 +00:00
|
|
|
|
private MigratedBuildComparisonData GetComparisonData(string projectDirectory)
|
2016-08-22 19:24:10 +00:00
|
|
|
|
{
|
2016-09-03 00:59:13 +00:00
|
|
|
|
File.Copy("NuGet.tempaspnetpatch.config", Path.Combine(projectDirectory, "NuGet.Config"));
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
Restore(projectDirectory);
|
2016-08-22 19:24:10 +00:00
|
|
|
|
|
2016-09-28 02:25:13 +00:00
|
|
|
|
var outputComparisonData =
|
2016-10-04 17:39:55 +00:00
|
|
|
|
BuildProjectJsonMigrateBuildMSBuild(projectDirectory, Path.GetFileNameWithoutExtension(projectDirectory));
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
return outputComparisonData;
|
2016-08-22 19:24:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
private void VerifyAllMSBuildOutputsRunnable(string projectDirectory)
|
2016-08-22 19:24:10 +00:00
|
|
|
|
{
|
|
|
|
|
var dllFileName = Path.GetFileName(projectDirectory) + ".dll";
|
|
|
|
|
|
|
|
|
|
var runnableDlls = Directory.EnumerateFiles(Path.Combine(projectDirectory, "bin"), dllFileName,
|
|
|
|
|
SearchOption.AllDirectories);
|
|
|
|
|
|
|
|
|
|
foreach (var dll in runnableDlls)
|
|
|
|
|
{
|
2016-10-04 17:39:55 +00:00
|
|
|
|
new TestCommand("dotnet").ExecuteWithCapturedOutput($"\"{dll}\"").Should().Pass();
|
2016-08-22 19:24:10 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-04 23:48:14 +00:00
|
|
|
|
private void VerifyAllMSBuildOutputsAreSigned(string projectDirectory)
|
|
|
|
|
{
|
|
|
|
|
var dllFileName = Path.GetFileName(projectDirectory) + ".dll";
|
|
|
|
|
|
|
|
|
|
var runnableDlls = Directory.EnumerateFiles(Path.Combine(projectDirectory, "bin"), dllFileName,
|
|
|
|
|
SearchOption.AllDirectories);
|
|
|
|
|
|
|
|
|
|
foreach (var dll in runnableDlls)
|
|
|
|
|
{
|
|
|
|
|
var assemblyName = AssemblyLoadContext.GetAssemblyName(dll);
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-10-04 23:48:14 +00:00
|
|
|
|
var token = assemblyName.GetPublicKeyToken();
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-10-04 23:48:14 +00:00
|
|
|
|
token.Should().NotBeNullOrEmpty();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-04 17:39:55 +00:00
|
|
|
|
private MigratedBuildComparisonData BuildProjectJsonMigrateBuildMSBuild(string projectDirectory,
|
|
|
|
|
string projectName)
|
|
|
|
|
{
|
2016-10-14 07:06:35 +00:00
|
|
|
|
return BuildProjectJsonMigrateBuildMSBuild(projectDirectory,
|
|
|
|
|
projectName,
|
|
|
|
|
new [] { projectDirectory },
|
|
|
|
|
new [] { projectDirectory });
|
2016-10-04 17:39:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MigratedBuildComparisonData BuildProjectJsonMigrateBuildMSBuild(string projectDirectory,
|
|
|
|
|
string projectName,
|
|
|
|
|
string[] migrateArgs,
|
|
|
|
|
string[] restoreDirectories)
|
2016-08-23 20:50:05 +00:00
|
|
|
|
{
|
|
|
|
|
BuildProjectJson(projectDirectory);
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
var projectJsonBuildOutputs = new HashSet<string>(CollectBuildOutputs(projectDirectory));
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
CleanBinObj(projectDirectory);
|
|
|
|
|
|
2016-09-22 04:23:50 +00:00
|
|
|
|
// Remove lock file for migration
|
2016-10-04 17:39:55 +00:00
|
|
|
|
foreach(var dir in restoreDirectories)
|
|
|
|
|
{
|
|
|
|
|
File.Delete(Path.Combine(dir, "project.lock.json"));
|
|
|
|
|
}
|
2016-09-27 04:40:11 +00:00
|
|
|
|
|
2016-10-04 17:39:55 +00:00
|
|
|
|
MigrateProject(migrateArgs);
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-09-27 04:40:11 +00:00
|
|
|
|
DeleteXproj(projectDirectory);
|
2016-10-03 17:58:32 +00:00
|
|
|
|
|
2016-10-04 17:39:55 +00:00
|
|
|
|
foreach(var dir in restoreDirectories)
|
2016-10-03 17:58:32 +00:00
|
|
|
|
{
|
|
|
|
|
Restore3(dir);
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-04 03:10:09 +00:00
|
|
|
|
BuildMSBuild(projectDirectory, projectName);
|
2016-08-23 20:50:05 +00:00
|
|
|
|
|
|
|
|
|
var msbuildBuildOutputs = new HashSet<string>(CollectBuildOutputs(projectDirectory));
|
|
|
|
|
|
|
|
|
|
return new MigratedBuildComparisonData(projectJsonBuildOutputs, msbuildBuildOutputs);
|
|
|
|
|
}
|
|
|
|
|
|
2016-08-22 19:24:10 +00:00
|
|
|
|
private IEnumerable<string> CollectBuildOutputs(string projectDirectory)
|
|
|
|
|
{
|
|
|
|
|
var fullBinPath = Path.GetFullPath(Path.Combine(projectDirectory, "bin"));
|
|
|
|
|
|
|
|
|
|
return Directory.EnumerateFiles(fullBinPath, "*", SearchOption.AllDirectories)
|
|
|
|
|
.Select(p => Path.GetFullPath(p).Substring(fullBinPath.Length));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void CleanBinObj(string projectDirectory)
|
|
|
|
|
{
|
|
|
|
|
var dirs = new string[] { Path.Combine(projectDirectory, "bin"), Path.Combine(projectDirectory, "obj") };
|
|
|
|
|
|
|
|
|
|
foreach (var dir in dirs)
|
|
|
|
|
{
|
2016-09-29 20:05:27 +00:00
|
|
|
|
if(Directory.Exists(dir))
|
|
|
|
|
{
|
|
|
|
|
Directory.Delete(dir, true);
|
|
|
|
|
}
|
2016-08-22 19:24:10 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void BuildProjectJson(string projectDirectory)
|
|
|
|
|
{
|
|
|
|
|
var projectFile = Path.Combine(projectDirectory, "project.json");
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-08-22 19:24:10 +00:00
|
|
|
|
var result = new BuildCommand(projectPath: projectFile)
|
|
|
|
|
.ExecuteWithCapturedOutput();
|
|
|
|
|
|
|
|
|
|
result.Should().Pass();
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-11 18:19:04 +00:00
|
|
|
|
private void MigrateProject(string[] migrateArgs)
|
2016-08-22 19:24:10 +00:00
|
|
|
|
{
|
2016-08-23 20:50:05 +00:00
|
|
|
|
var result =
|
2016-10-04 17:39:55 +00:00
|
|
|
|
MigrateCommand.Run(migrateArgs);
|
2016-08-23 20:50:05 +00:00
|
|
|
|
|
2016-10-11 18:19:04 +00:00
|
|
|
|
result.Should().Be(0);
|
2016-08-23 20:50:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-08-22 19:24:10 +00:00
|
|
|
|
private void Restore(string projectDirectory)
|
|
|
|
|
{
|
|
|
|
|
new TestCommand("dotnet")
|
|
|
|
|
.WithWorkingDirectory(projectDirectory)
|
|
|
|
|
.Execute("restore")
|
2016-10-14 07:06:35 +00:00
|
|
|
|
.Should().Pass();
|
2016-08-22 19:24:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-10-04 03:10:09 +00:00
|
|
|
|
private void Restore3(string projectDirectory, string projectName=null)
|
2016-09-28 02:25:13 +00:00
|
|
|
|
{
|
2016-10-04 03:10:09 +00:00
|
|
|
|
var command = new Restore3Command()
|
|
|
|
|
.WithWorkingDirectory(projectDirectory);
|
|
|
|
|
|
|
|
|
|
if (projectName != null)
|
|
|
|
|
{
|
2016-10-20 22:19:35 +00:00
|
|
|
|
command.Execute($"{projectName}.csproj /p:SkipInvalidConfigurations=true;_InvalidConfigurationWarning=false")
|
2016-10-14 07:06:35 +00:00
|
|
|
|
.Should().Pass();
|
2016-10-04 03:10:09 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2016-10-20 22:19:35 +00:00
|
|
|
|
command.Execute("/p:SkipInvalidConfigurations=true;_InvalidConfigurationWarning=false")
|
2016-10-14 07:06:35 +00:00
|
|
|
|
.Should().Pass();
|
2016-10-04 17:39:55 +00:00
|
|
|
|
}
|
2016-09-28 02:25:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private string BuildMSBuild(string projectDirectory, string projectName, string configuration="Debug")
|
2016-08-22 19:24:10 +00:00
|
|
|
|
{
|
2016-10-04 03:10:09 +00:00
|
|
|
|
if (projectName != null)
|
|
|
|
|
{
|
|
|
|
|
projectName = projectName + ".csproj";
|
|
|
|
|
}
|
|
|
|
|
|
2016-09-08 21:40:46 +00:00
|
|
|
|
DeleteXproj(projectDirectory);
|
|
|
|
|
|
2016-08-22 19:24:10 +00:00
|
|
|
|
var result = new Build3Command()
|
|
|
|
|
.WithWorkingDirectory(projectDirectory)
|
2016-10-04 03:10:09 +00:00
|
|
|
|
.ExecuteWithCapturedOutput($"{projectName} /p:Configuration={configuration}");
|
2016-08-23 20:50:05 +00:00
|
|
|
|
|
2016-08-22 19:24:10 +00:00
|
|
|
|
result
|
2016-10-14 07:06:35 +00:00
|
|
|
|
.Should().Pass();
|
2016-08-22 19:24:10 +00:00
|
|
|
|
|
|
|
|
|
return result.StdOut;
|
|
|
|
|
}
|
2016-08-23 20:50:05 +00:00
|
|
|
|
|
2016-09-08 21:40:46 +00:00
|
|
|
|
private void DeleteXproj(string projectDirectory)
|
|
|
|
|
{
|
|
|
|
|
var xprojFiles = Directory.EnumerateFiles(projectDirectory, "*.xproj");
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-09-08 21:40:46 +00:00
|
|
|
|
foreach (var xprojFile in xprojFiles)
|
|
|
|
|
{
|
|
|
|
|
File.Delete(xprojFile);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
private void OutputDiagnostics(MigratedBuildComparisonData comparisonData)
|
|
|
|
|
{
|
|
|
|
|
OutputDiagnostics(comparisonData.MSBuildBuildOutputs, comparisonData.ProjectJsonBuildOutputs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OutputDiagnostics(HashSet<string> msbuildBuildOutputs, HashSet<string> projectJsonBuildOutputs)
|
|
|
|
|
{
|
|
|
|
|
Console.WriteLine("Project.json Outputs:");
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
Console.WriteLine(string.Join("\n", projectJsonBuildOutputs));
|
|
|
|
|
|
|
|
|
|
Console.WriteLine("");
|
|
|
|
|
|
|
|
|
|
Console.WriteLine("MSBuild Outputs:");
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
Console.WriteLine(string.Join("\n", msbuildBuildOutputs));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private class MigratedBuildComparisonData
|
|
|
|
|
{
|
|
|
|
|
public HashSet<string> ProjectJsonBuildOutputs { get; }
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
public HashSet<string> MSBuildBuildOutputs { get; }
|
|
|
|
|
|
|
|
|
|
public MigratedBuildComparisonData(HashSet<string> projectJsonBuildOutputs,
|
|
|
|
|
HashSet<string> msBuildBuildOutputs)
|
|
|
|
|
{
|
|
|
|
|
ProjectJsonBuildOutputs = projectJsonBuildOutputs;
|
2016-10-14 07:06:35 +00:00
|
|
|
|
|
2016-08-23 20:50:05 +00:00
|
|
|
|
MSBuildBuildOutputs = msBuildBuildOutputs;
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-10-20 22:04:53 +00:00
|
|
|
|
|
|
|
|
|
private void WriteGlobalJson(string globalDirectory)
|
|
|
|
|
{
|
|
|
|
|
var file = Path.Combine(globalDirectory, "global.json");
|
|
|
|
|
File.WriteAllText(file, @"
|
|
|
|
|
{
|
|
|
|
|
""projects"": [ ]
|
|
|
|
|
}");
|
|
|
|
|
}
|
2016-08-22 19:24:10 +00:00
|
|
|
|
}
|
|
|
|
|
}
|