2016-08-22 12:24:10 -07:00
using Microsoft.Build.Construction ;
2016-10-18 01:02:10 +00:00
using Microsoft.DotNet.TestFramework ;
2016-08-22 12:24:10 -07: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 13:50:05 -07:00
using Microsoft.DotNet.Tools.Migrate ;
2016-09-19 13:25:40 -07:00
using BuildCommand = Microsoft . DotNet . Tools . Test . Utilities . BuildCommand ;
2016-10-04 16:48:14 -07:00
using System.Runtime.Loader ;
2016-10-20 15:04:53 -07:00
using Newtonsoft.Json.Linq ;
2016-08-22 12:24:10 -07:00
2016-10-29 01:58:37 -07:00
using MigrateCommand = Microsoft . DotNet . Tools . Migrate . MigrateCommand ;
2016-08-22 12:24:10 -07:00
namespace Microsoft.DotNet.Migration.Tests
{
public class GivenThatIWantToMigrateTestApps : TestBase
{
[Theory]
2016-08-23 13:50:05 -07:00
[InlineData("TestAppWithRuntimeOptions")]
2016-09-08 14:40:46 -07:00
[InlineData("TestAppWithContents")]
2016-10-26 15:13:39 -07:00
[InlineData("AppWithAssemblyInfo")]
2016-10-28 19:03:03 -07:00
public void It_migrates_apps ( string projectName )
2016-08-22 12:24:10 -07:00
{
2016-10-27 18:46:43 -07:00
var projectDirectory = TestAssetsManager . CreateTestInstance ( projectName , identifier : projectName )
2016-10-14 00:06:35 -07:00
. WithLockFiles ( )
. Path ;
2016-09-29 13:05:27 -07:00
CleanBinObj ( projectDirectory ) ;
2016-09-27 19:25:13 -07:00
var outputComparisonData = BuildProjectJsonMigrateBuildMSBuild ( projectDirectory , projectName ) ;
2016-08-22 12:24:10 -07:00
2016-08-23 13:50:05 -07:00
var outputsIdentical =
outputComparisonData . ProjectJsonBuildOutputs . SetEquals ( outputComparisonData . MSBuildBuildOutputs ) ;
2016-10-14 00:06:35 -07:00
2016-08-22 12:24:10 -07:00
if ( ! outputsIdentical )
{
2016-08-23 13:50:05 -07:00
OutputDiagnostics ( outputComparisonData ) ;
}
2016-10-14 00:06:35 -07:00
2016-08-23 13:50:05 -07:00
outputsIdentical . Should ( ) . BeTrue ( ) ;
2016-10-14 00:06:35 -07:00
2016-08-23 13:50:05 -07:00
VerifyAllMSBuildOutputsRunnable ( projectDirectory ) ;
2016-10-12 16:22:58 -07:00
var outputCsProj = Path . Combine ( projectDirectory , projectName + ".csproj" ) ;
var csproj = File . ReadAllText ( outputCsProj ) ;
2016-10-28 11:38:42 -07:00
csproj . EndsWith ( "\n" ) . Should ( ) . Be ( true ) ;
2016-08-23 13:50:05 -07:00
}
2016-08-22 12:24:10 -07:00
2016-10-20 20:15:42 -07:00
[Fact]
public void It_migrates_signed_apps ( )
2016-10-04 16:48:14 -07:00
{
2016-10-27 18:46:43 -07:00
var projectDirectory = TestAssetsManager . CreateTestInstance ( "TestAppWithSigning" ) . WithLockFiles ( ) . Path ;
2016-10-04 16:48:14 -07:00
CleanBinObj ( projectDirectory ) ;
2016-10-20 20:15:42 -07:00
var outputComparisonData = BuildProjectJsonMigrateBuildMSBuild ( projectDirectory , "TestAppWithSigning" ) ;
2016-10-04 16:48:14 -07:00
var outputsIdentical =
outputComparisonData . ProjectJsonBuildOutputs . SetEquals ( outputComparisonData . MSBuildBuildOutputs ) ;
2016-10-14 00:06:35 -07:00
2016-10-04 16:48:14 -07:00
if ( ! outputsIdentical )
{
OutputDiagnostics ( outputComparisonData ) ;
}
2016-10-14 00:06:35 -07:00
2016-10-04 16:48:14 -07:00
outputsIdentical . Should ( ) . BeTrue ( ) ;
2016-10-14 00:06:35 -07:00
2016-10-04 16:48:14 -07:00
VerifyAllMSBuildOutputsRunnable ( projectDirectory ) ;
2016-10-14 00:06:35 -07:00
2016-10-04 16:48:14 -07:00
VerifyAllMSBuildOutputsAreSigned ( projectDirectory ) ;
}
2016-08-23 13:50:05 -07:00
[Fact]
public void It_migrates_dotnet_new_console_with_identical_outputs ( )
{
2016-10-14 00:06:35 -07:00
var testInstance = TestAssetsManager
. CreateTestInstance ( "ProjectJsonConsoleTemplate" ) ;
var projectDirectory = testInstance . Path ;
2016-10-03 20:10:09 -07:00
2016-10-14 00:06:35 -07:00
var outputComparisonData = GetComparisonData ( projectDirectory ) ;
2016-08-22 12:24:10 -07:00
2016-08-23 13:50:05 -07:00
var outputsIdentical =
outputComparisonData . ProjectJsonBuildOutputs . SetEquals ( outputComparisonData . MSBuildBuildOutputs ) ;
2016-10-14 00:06:35 -07:00
2016-08-23 13:50:05 -07:00
if ( ! outputsIdentical )
{
OutputDiagnostics ( outputComparisonData ) ;
2016-08-22 12:24:10 -07:00
}
2016-10-14 00:06:35 -07:00
2016-08-22 12:24:10 -07:00
outputsIdentical . Should ( ) . BeTrue ( ) ;
2016-10-14 00:06:35 -07:00
2016-08-23 13:50:05 -07:00
VerifyAllMSBuildOutputsRunnable ( projectDirectory ) ;
}
2016-10-28 19:09:04 -07:00
[Fact(Skip="Final tools version missing.")]
2016-10-20 15:04:53 -07:00
public void It_migrates_old_dotnet_new_web_without_tools_with_outputs_containing_project_json_outputs ( )
2016-08-23 13:50:05 -07:00
{
2016-10-14 00:06:35 -07:00
var testInstance = TestAssetsManager
2016-10-20 15:04:53 -07:00
. CreateTestInstance ( "ProjectJsonWebTemplate" )
. WithLockFiles ( ) ;
2016-10-14 00:06:35 -07:00
var projectDirectory = testInstance . Path ;
2016-10-20 15:04:53 -07: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 00:06:35 -07:00
var outputComparisonData = GetComparisonData ( projectDirectory ) ;
2016-08-22 12:24:10 -07:00
2016-09-01 13:42:35 -05:00
var outputsIdentical =
outputComparisonData . ProjectJsonBuildOutputs . SetEquals ( outputComparisonData . MSBuildBuildOutputs ) ;
2016-10-14 00:06:35 -07:00
2016-09-01 13:42:35 -05:00
if ( ! outputsIdentical )
2016-08-22 12:24:10 -07:00
{
2016-08-23 13:50:05 -07:00
OutputDiagnostics ( outputComparisonData ) ;
2016-08-22 12:24:10 -07:00
}
2016-10-14 00:06:35 -07:00
2016-09-01 13:42:35 -05:00
outputsIdentical . Should ( ) . BeTrue ( ) ;
2016-08-22 12:24:10 -07:00
}
2016-09-15 15:54:10 -07:00
[Theory]
2016-10-20 15:33:47 -07:00
[InlineData("TestLibraryWithTwoFrameworks")]
2016-09-15 16:30:39 -07:00
public void It_migrates_projects_with_multiple_TFMs ( string projectName )
2016-09-15 15:54:10 -07:00
{
var projectDirectory =
2016-10-27 18:46:43 -07:00
TestAssetsManager . CreateTestInstance ( projectName , identifier : projectName ) . WithLockFiles ( ) . Path ;
2016-10-14 00:06:35 -07:00
2016-09-27 19:25:13 -07:00
var outputComparisonData = BuildProjectJsonMigrateBuildMSBuild ( projectDirectory , projectName ) ;
2016-09-15 15:54:10 -07:00
var outputsIdentical =
outputComparisonData . ProjectJsonBuildOutputs . SetEquals ( outputComparisonData . MSBuildBuildOutputs ) ;
if ( ! outputsIdentical )
{
OutputDiagnostics ( outputComparisonData ) ;
}
outputsIdentical . Should ( ) . BeTrue ( ) ;
}
2016-08-22 12:24:10 -07:00
[Theory]
[InlineData("TestAppWithLibrary/TestLibrary")]
[InlineData("TestLibraryWithAnalyzer")]
2016-10-27 18:46:43 -07:00
[InlineData("PJTestLibraryWithConfiguration")]
2016-08-22 12:24:10 -07:00
public void It_migrates_a_library ( string projectName )
{
var projectDirectory =
2016-10-27 18:46:43 -07:00
TestAssetsManager . CreateTestInstance ( projectName , identifier : projectName ) . WithLockFiles ( ) . Path ;
2016-10-14 00:06:35 -07:00
2016-09-29 13:05:27 -07:00
var outputComparisonData = BuildProjectJsonMigrateBuildMSBuild ( projectDirectory , Path . GetFileNameWithoutExtension ( projectName ) ) ;
2016-08-22 12:24:10 -07:00
2016-09-01 13:42:35 -05:00
var outputsIdentical =
outputComparisonData . ProjectJsonBuildOutputs . SetEquals ( outputComparisonData . MSBuildBuildOutputs ) ;
2016-08-22 12:24:10 -07:00
2016-09-01 13:42:35 -05:00
if ( ! outputsIdentical )
2016-08-22 12:24:10 -07:00
{
2016-08-23 13:50:05 -07:00
OutputDiagnostics ( outputComparisonData ) ;
2016-08-22 12:24:10 -07:00
}
2016-09-01 13:42:35 -05:00
outputsIdentical . Should ( ) . BeTrue ( ) ;
2016-08-22 12:24:10 -07:00
}
2016-09-23 00:30:41 -07: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 10:39:55 -07:00
MigrateProject ( new [ ] { Path . Combine ( projectDirectory , projectName ) } ) ;
2016-09-23 00:30:41 -07:00
string [ ] migratedProjects = expectedProjects . Split ( new char [ ] { ',' } ) ;
2016-10-14 00:06:35 -07:00
2016-09-26 14:16:17 -07:00
VerifyMigration ( migratedProjects , projectDirectory ) ;
2016-09-23 00:30:41 -07: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 10:39:55 -07:00
MigrateProject ( new [ ] { Path . Combine ( projectDirectory , projectName ) , "--skip-project-references" } ) ;
2016-09-26 14:16:17 -07:00
VerifyMigration ( Enumerable . Repeat ( projectName , 1 ) , projectDirectory ) ;
}
2016-09-26 15:30:51 -07:00
[Theory]
[InlineData(true)]
[InlineData(false)]
public void It_migrates_all_projects_in_given_directory ( bool skipRefs )
2016-09-26 14:16:17 -07:00
{
2016-09-26 15:30:51 -07:00
var projectDirectory = TestAssetsManager . CreateTestInstance ( "TestAppDependencyGraph" , callingMethod : $"MigrateDirectory.SkipRefs.{skipRefs}" ) . Path ;
2016-09-26 14:16:17 -07:00
2016-09-26 15:30:51 -07:00
if ( skipRefs )
{
2016-10-04 10:39:55 -07:00
MigrateProject ( new [ ] { projectDirectory , "--skip-project-references" } ) ;
2016-09-26 15:30:51 -07:00
}
else
{
2016-10-04 10:39:55 -07:00
MigrateProject ( new [ ] { projectDirectory } ) ;
2016-09-26 15:30:51 -07:00
}
2016-09-23 00:30:41 -07:00
2016-10-04 10:39:55 -07:00
string [ ] migratedProjects = new string [ ] { "ProjectA" , "ProjectB" , "ProjectC" , "ProjectD" , "ProjectE" , "ProjectF" , "ProjectG" , "ProjectH" , "ProjectI" , "ProjectJ" } ;
2016-10-14 00:06:35 -07:00
2016-09-26 14:16:17 -07: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 00:06:35 -07:00
2016-10-04 10:39:55 -07:00
MigrateProject ( new [ ] { project } ) ;
2016-09-26 14:16:17 -07:00
string [ ] migratedProjects = new string [ ] { "ProjectA" , "ProjectB" , "ProjectC" , "ProjectD" , "ProjectE" } ;
2016-10-14 00:06:35 -07:00
2016-09-26 14:16:17 -07:00
VerifyMigration ( migratedProjects , projectDirectory ) ;
2016-09-23 00:30:41 -07:00
}
2016-10-03 10:58:32 -07:00
[Fact]
// regression test for https://github.com/dotnet/cli/issues/4269
public void It_migrates_and_builds_P2P_references ( )
2016-09-23 17:02:46 -07:00
{
2016-10-03 10:58:32 -07:00
var assetsDir = TestAssetsManager . CreateTestInstance ( "TestAppDependencyGraph" ) . WithLockFiles ( ) . Path ;
2016-10-14 00:06:35 -07:00
2016-10-03 10:58:32 -07:00
var projectDirectory = Path . Combine ( assetsDir , "ProjectF" ) ;
2016-10-14 00:06:35 -07:00
2016-10-04 10:39:55 -07:00
var restoreDirectories = new string [ ]
{
projectDirectory ,
Path . Combine ( assetsDir , "ProjectG" )
} ;
var outputComparisonData = BuildProjectJsonMigrateBuildMSBuild ( projectDirectory , "ProjectF" , new [ ] { projectDirectory } , restoreDirectories ) ;
2016-10-03 10:58:32 -07:00
var outputsIdentical = outputComparisonData . ProjectJsonBuildOutputs
. SetEquals ( outputComparisonData . MSBuildBuildOutputs ) ;
if ( ! outputsIdentical )
{
OutputDiagnostics ( outputComparisonData ) ;
}
2016-09-23 17:02:46 -07:00
2016-10-03 10:58:32 -07:00
outputsIdentical . Should ( ) . BeTrue ( ) ;
2016-10-14 00:06:35 -07:00
2016-10-03 10:58:32 -07:00
VerifyAllMSBuildOutputsRunnable ( projectDirectory ) ;
2016-09-23 17:02:46 -07:00
}
2016-10-04 10:39:55 -07: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 00:06:35 -07:00
. SetEquals ( outputComparisonData . MSBuildBuildOutputs ) ;
2016-10-04 10:39:55 -07:00
if ( ! outputsIdentical )
{
OutputDiagnostics ( outputComparisonData ) ;
}
outputsIdentical . Should ( ) . BeTrue ( ) ;
2016-10-27 18:46:43 -07:00
2016-10-04 10:39:55 -07:00
VerifyAllMSBuildOutputsRunnable ( projectDirectory ) ;
}
2016-10-10 18:01:59 -07:00
[Theory]
2016-10-11 11:19:04 -07:00
[InlineData(true)]
[InlineData(false)]
public void Migration_outputs_error_when_no_projects_found ( bool useGlobalJson )
2016-10-10 18:01:59 -07:00
{
2016-10-11 11:19:04 -07:00
var projectDirectory = TestAssetsManager . CreateTestDirectory ( "Migration_outputs_error_when_no_projects_found" ) ;
string argstr = string . Empty ;
2016-10-14 00:06:35 -07:00
2016-10-11 11:19:04 -07:00
string errorMessage = string . Empty ;
2016-10-04 10:39:55 -07:00
2016-10-10 18:01:59 -07:00
if ( useGlobalJson )
{
2016-10-11 11:19:04 -07:00
var globalJsonPath = Path . Combine ( projectDirectory . Path , "global.json" ) ;
2016-10-14 00:06:35 -07:00
2016-10-11 11:19:04 -07: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 00:06:35 -07:00
2016-10-11 11:19:04 -07:00
errorMessage = "Unable to find any projects in global.json" ;
2016-10-10 18:01:59 -07:00
}
else
{
2016-10-11 11:19:04 -07:00
argstr = projectDirectory . Path ;
2016-10-14 00:06:35 -07:00
2016-10-11 11:19:04 -07:00
errorMessage = $"No project.json file found in '{projectDirectory.Path}'" ;
2016-10-10 18:01:59 -07:00
}
2016-10-11 11:19:04 -07: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-10 18:01:59 -07:00
}
2016-10-18 01:02:10 +00:00
2016-10-26 22:23:40 +00:00
[Fact]
public void It_migrates_and_publishes_projects_with_runtimes ( )
{
2016-10-27 18:46:43 -07:00
var projectName = "PJTestAppSimple" ;
2016-10-29 01:58:37 -07:00
var projectDirectory = TestAssetsManager
. CreateTestInstance ( projectName )
. WithLockFiles ( )
. Path ;
2016-10-26 22:23:40 +00:00
CleanBinObj ( projectDirectory ) ;
BuildProjectJsonMigrateBuildMSBuild ( projectDirectory , projectName ) ;
PublishMSBuild ( projectDirectory , projectName , "win7-x64" ) ;
}
2016-10-18 01:02:10 +00:00
[WindowsOnlyTheory]
[InlineData("DesktopTestProjects", "AutoAddDesktopReferencesDuringMigrate", true)]
2016-10-27 18:46:43 -07:00
[InlineData("TestProjects", "PJTestAppSimple", false)]
2016-10-18 01:02:10 +00:00
public void It_auto_add_desktop_references_during_migrate ( string testGroup , string projectName , bool isDesktopApp )
{
2016-10-31 16:22:10 -07:00
var runtime = DotnetLegacyRuntimeIdentifiers . InferLegacyRestoreRuntimeIdentifier ( ) ;
2016-10-18 01:02:10 +00:00
var testAssetManager = GetTestGroupTestAssetsManager ( testGroup ) ;
2016-10-27 18:46:43 -07:00
var projectDirectory = testAssetManager . CreateTestInstance ( projectName ) . WithLockFiles ( ) . Path ;
2016-10-18 01:02:10 +00:00
CleanBinObj ( projectDirectory ) ;
MigrateProject ( new string [ ] { projectDirectory } ) ;
2016-10-31 16:22:10 -07:00
Restore ( projectDirectory , runtime : runtime ) ;
BuildMSBuild ( projectDirectory , projectName , runtime : runtime ) ;
2016-10-18 01:02:10 +00:00
VerifyAutoInjectedDesktopReferences ( projectDirectory , projectName , isDesktopApp ) ;
VerifyAllMSBuildOutputsRunnable ( projectDirectory ) ;
}
2016-10-27 18:10:12 -07:00
[Fact]
public void It_builds_a_migrated_app_with_a_indirect_dependency ( )
{
const string projectName = "ProjectA" ;
var solutionDirectory =
TestAssetsManager . CreateTestInstance ( "TestAppDependencyGraph" , callingMethod : "p" ) . Path ;
var projectDirectory = Path . Combine ( solutionDirectory , projectName ) ;
MigrateProject ( new string [ ] { projectDirectory } ) ;
2016-10-27 20:56:36 -07:00
Restore ( projectDirectory ) ;
2016-10-27 18:10:12 -07:00
BuildMSBuild ( projectDirectory , projectName ) ;
VerifyAllMSBuildOutputsRunnable ( projectDirectory ) ;
}
2016-10-28 17:27:07 -07:00
[Fact]
public void It_migrates_project_with_output_name ( )
{
string projectName = "AppWithOutputAssemblyName" ;
string expectedOutputName = "MyApp" ;
var projectDirectory = TestAssetsManager . CreateTestInstance ( projectName , callingMethod : $"It_migrates_{projectName}" )
. WithLockFiles ( )
. Path ;
string expectedCsprojPath = Path . Combine ( projectDirectory , $"{projectName}.csproj" ) ;
if ( File . Exists ( expectedCsprojPath ) )
{
File . Delete ( expectedCsprojPath ) ;
}
CleanBinObj ( projectDirectory ) ;
MigrateProject ( projectDirectory ) ;
File . Exists ( expectedCsprojPath ) . Should ( ) . BeTrue ( ) ;
Restore ( projectDirectory , projectName ) ;
BuildMSBuild ( projectDirectory , projectName ) ;
Directory . EnumerateFiles ( Path . Combine ( projectDirectory , "bin" ) , $"{expectedOutputName}.pdb" , SearchOption . AllDirectories )
. Count ( ) . Should ( ) . Be ( 1 ) ;
}
2016-10-31 16:34:37 -07:00
[Theory]
[InlineData("LibraryWithoutNetStandardLibRef")]
[InlineData("LibraryWithNetStandardLibRef")]
public void It_migrates_and_builds_library ( string projectName )
{
var projectDirectory = TestAssetsManager . CreateTestInstance ( projectName ,
callingMethod : $"{nameof(It_migrates_and_builds_library)}-projectName" ) . Path ;
MigrateProject ( projectDirectory ) ;
Restore ( projectDirectory , projectName ) ;
BuildMSBuild ( projectDirectory , projectName ) ;
}
2016-10-18 01:02:10 +00:00
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-10 18:01:59 -07:00
private void VerifyMigration ( IEnumerable < string > expectedProjects , string rootDir )
2016-09-26 14:16:17 -07:00
{
2016-10-29 01:58:37 -07:00
var migratedProjects = Directory . EnumerateFiles ( rootDir , "*.csproj" , SearchOption . AllDirectories )
2016-10-05 16:25:04 -07:00
. 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 00:06:35 -07:00
2016-09-26 14:16:17 -07:00
migratedProjects . Should ( ) . BeEquivalentTo ( expectedProjects ) ;
}
2016-10-14 00:06:35 -07:00
private MigratedBuildComparisonData GetComparisonData ( string projectDirectory )
2016-08-22 12:24:10 -07:00
{
2016-09-02 17:59:13 -07:00
File . Copy ( "NuGet.tempaspnetpatch.config" , Path . Combine ( projectDirectory , "NuGet.Config" ) ) ;
2016-10-14 00:06:35 -07:00
2016-10-27 18:46:43 -07:00
RestoreProjectJson ( projectDirectory ) ;
2016-08-22 12:24:10 -07:00
2016-09-27 19:25:13 -07:00
var outputComparisonData =
2016-10-04 10:39:55 -07:00
BuildProjectJsonMigrateBuildMSBuild ( projectDirectory , Path . GetFileNameWithoutExtension ( projectDirectory ) ) ;
2016-10-14 00:06:35 -07:00
2016-08-23 13:50:05 -07:00
return outputComparisonData ;
2016-08-22 12:24:10 -07:00
}
2016-08-23 13:50:05 -07:00
private void VerifyAllMSBuildOutputsRunnable ( string projectDirectory )
2016-08-22 12:24:10 -07: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 10:39:55 -07:00
new TestCommand ( "dotnet" ) . ExecuteWithCapturedOutput ( $"\" { dll } \ "" ) . Should ( ) . Pass ( ) ;
2016-08-22 12:24:10 -07:00
}
}
2016-10-04 16:48:14 -07: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 00:06:35 -07:00
2016-10-04 16:48:14 -07:00
var token = assemblyName . GetPublicKeyToken ( ) ;
2016-10-14 00:06:35 -07:00
2016-10-04 16:48:14 -07:00
token . Should ( ) . NotBeNullOrEmpty ( ) ;
}
}
2016-10-04 10:39:55 -07:00
private MigratedBuildComparisonData BuildProjectJsonMigrateBuildMSBuild ( string projectDirectory ,
string projectName )
{
2016-10-14 00:06:35 -07:00
return BuildProjectJsonMigrateBuildMSBuild ( projectDirectory ,
projectName ,
new [ ] { projectDirectory } ,
new [ ] { projectDirectory } ) ;
2016-10-04 10:39:55 -07:00
}
private MigratedBuildComparisonData BuildProjectJsonMigrateBuildMSBuild ( string projectDirectory ,
string projectName ,
string [ ] migrateArgs ,
string [ ] restoreDirectories )
2016-08-23 13:50:05 -07:00
{
BuildProjectJson ( projectDirectory ) ;
2016-10-14 00:06:35 -07:00
2016-08-23 13:50:05 -07:00
var projectJsonBuildOutputs = new HashSet < string > ( CollectBuildOutputs ( projectDirectory ) ) ;
2016-10-14 00:06:35 -07:00
2016-08-23 13:50:05 -07:00
CleanBinObj ( projectDirectory ) ;
2016-09-21 21:23:50 -07:00
// Remove lock file for migration
2016-10-04 10:39:55 -07:00
foreach ( var dir in restoreDirectories )
{
File . Delete ( Path . Combine ( dir , "project.lock.json" ) ) ;
}
2016-09-26 21:40:11 -07:00
2016-10-04 10:39:55 -07:00
MigrateProject ( migrateArgs ) ;
2016-10-14 00:06:35 -07:00
2016-09-26 21:40:11 -07:00
DeleteXproj ( projectDirectory ) ;
2016-10-03 10:58:32 -07:00
2016-10-04 10:39:55 -07:00
foreach ( var dir in restoreDirectories )
2016-10-03 10:58:32 -07:00
{
2016-10-27 18:46:43 -07:00
Restore ( dir ) ;
2016-10-03 10:58:32 -07:00
}
2016-10-03 20:10:09 -07:00
BuildMSBuild ( projectDirectory , projectName ) ;
2016-08-23 13:50:05 -07:00
var msbuildBuildOutputs = new HashSet < string > ( CollectBuildOutputs ( projectDirectory ) ) ;
return new MigratedBuildComparisonData ( projectJsonBuildOutputs , msbuildBuildOutputs ) ;
}
2016-08-22 12:24:10 -07: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 13:05:27 -07:00
if ( Directory . Exists ( dir ) )
{
Directory . Delete ( dir , true ) ;
}
2016-08-22 12:24:10 -07:00
}
}
private void BuildProjectJson ( string projectDirectory )
{
2016-10-27 18:46:43 -07:00
Console . WriteLine ( projectDirectory ) ;
var projectFile = "\"" + Path . Combine ( projectDirectory , "project.json" ) + "\"" ;
2016-10-14 00:06:35 -07:00
2016-10-27 18:46:43 -07:00
var result = new BuildPJCommand ( )
. WithCapturedOutput ( )
. Execute ( projectFile ) ;
2016-08-22 12:24:10 -07:00
result . Should ( ) . Pass ( ) ;
}
2016-10-28 17:27:07 -07:00
private void MigrateProject ( params string [ ] migrateArgs )
2016-08-22 12:24:10 -07:00
{
2016-08-23 13:50:05 -07:00
var result =
2016-10-04 10:39:55 -07:00
MigrateCommand . Run ( migrateArgs ) ;
2016-08-23 13:50:05 -07:00
2016-10-11 11:19:04 -07:00
result . Should ( ) . Be ( 0 ) ;
2016-08-23 13:50:05 -07:00
}
2016-10-27 18:46:43 -07:00
private void RestoreProjectJson ( string projectDirectory )
2016-08-22 12:24:10 -07:00
{
new TestCommand ( "dotnet" )
. WithWorkingDirectory ( projectDirectory )
2016-10-27 18:46:43 -07:00
. Execute ( "restore-projectjson" )
2016-10-14 00:06:35 -07:00
. Should ( ) . Pass ( ) ;
2016-08-22 12:24:10 -07:00
}
2016-10-31 16:22:10 -07:00
private void Restore ( string projectDirectory , string projectName = null , string runtime = null )
2016-09-27 19:25:13 -07:00
{
2016-10-27 18:46:43 -07:00
var command = new RestoreCommand ( )
2016-10-31 16:22:10 -07:00
. WithWorkingDirectory ( projectDirectory )
. WithRuntime ( runtime ) ;
2016-10-03 20:10:09 -07:00
if ( projectName ! = null )
{
2016-10-20 15:19:35 -07:00
command . Execute ( $"{projectName}.csproj /p:SkipInvalidConfigurations=true;_InvalidConfigurationWarning=false" )
2016-10-14 00:06:35 -07:00
. Should ( ) . Pass ( ) ;
2016-10-03 20:10:09 -07:00
}
else
{
2016-10-20 15:19:35 -07:00
command . Execute ( "/p:SkipInvalidConfigurations=true;_InvalidConfigurationWarning=false" )
2016-10-14 00:06:35 -07:00
. Should ( ) . Pass ( ) ;
2016-10-04 10:39:55 -07:00
}
2016-09-27 19:25:13 -07:00
}
2016-10-31 16:22:10 -07:00
private string BuildMSBuild (
string projectDirectory ,
string projectName ,
string configuration = "Debug" ,
string runtime = null )
2016-08-22 12:24:10 -07:00
{
2016-10-03 20:10:09 -07:00
if ( projectName ! = null )
{
projectName = projectName + ".csproj" ;
}
2016-09-08 14:40:46 -07:00
DeleteXproj ( projectDirectory ) ;
2016-10-27 18:46:43 -07:00
var result = new BuildCommand ( )
2016-08-22 12:24:10 -07:00
. WithWorkingDirectory ( projectDirectory )
2016-10-31 16:22:10 -07:00
. WithRuntime ( runtime )
2016-10-03 20:10:09 -07:00
. ExecuteWithCapturedOutput ( $"{projectName} /p:Configuration={configuration}" ) ;
2016-08-23 13:50:05 -07:00
2016-08-22 12:24:10 -07:00
result
2016-10-14 00:06:35 -07:00
. Should ( ) . Pass ( ) ;
2016-08-22 12:24:10 -07:00
return result . StdOut ;
}
2016-08-23 13:50:05 -07:00
2016-10-26 22:23:40 +00:00
private string PublishMSBuild ( string projectDirectory , string projectName , string runtime , string configuration = "Debug" )
{
if ( projectName ! = null )
{
projectName = projectName + ".csproj" ;
}
DeleteXproj ( projectDirectory ) ;
2016-10-27 18:46:43 -07:00
var result = new PublishCommand ( )
2016-10-26 22:23:40 +00:00
. WithRuntime ( runtime )
. WithWorkingDirectory ( projectDirectory )
. ExecuteWithCapturedOutput ( $"{projectName} /p:Configuration={configuration}" ) ;
result . Should ( ) . Pass ( ) ;
return result . StdOut ;
}
2016-09-08 14:40:46 -07:00
private void DeleteXproj ( string projectDirectory )
{
var xprojFiles = Directory . EnumerateFiles ( projectDirectory , "*.xproj" ) ;
2016-10-14 00:06:35 -07:00
2016-09-08 14:40:46 -07:00
foreach ( var xprojFile in xprojFiles )
{
File . Delete ( xprojFile ) ;
}
}
2016-08-23 13:50:05 -07: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 00:06:35 -07:00
2016-08-23 13:50:05 -07:00
Console . WriteLine ( string . Join ( "\n" , projectJsonBuildOutputs ) ) ;
Console . WriteLine ( "" ) ;
Console . WriteLine ( "MSBuild Outputs:" ) ;
2016-10-14 00:06:35 -07:00
2016-08-23 13:50:05 -07:00
Console . WriteLine ( string . Join ( "\n" , msbuildBuildOutputs ) ) ;
}
private class MigratedBuildComparisonData
{
public HashSet < string > ProjectJsonBuildOutputs { get ; }
2016-10-14 00:06:35 -07:00
2016-08-23 13:50:05 -07:00
public HashSet < string > MSBuildBuildOutputs { get ; }
public MigratedBuildComparisonData ( HashSet < string > projectJsonBuildOutputs ,
HashSet < string > msBuildBuildOutputs )
{
ProjectJsonBuildOutputs = projectJsonBuildOutputs ;
2016-10-14 00:06:35 -07:00
2016-08-23 13:50:05 -07:00
MSBuildBuildOutputs = msBuildBuildOutputs ;
}
}
2016-10-20 15:04:53 -07:00
private void WriteGlobalJson ( string globalDirectory )
{
var file = Path . Combine ( globalDirectory , "global.json" ) ;
File . WriteAllText ( file , @ "
{
"" projects "" : [ ]
} ");
}
2016-08-22 12:24:10 -07:00
}
}