2016-08-22 12:24:10 -07:00
using Microsoft.Build.Construction ;
using Microsoft.DotNet.ProjectJsonMigration ;
using Microsoft.DotNet.ProjectModel ;
using Microsoft.DotNet.Tools.Test.Utilities ;
using NuGet.Frameworks ;
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Threading.Tasks ;
using Xunit ;
using FluentAssertions ;
using System.IO ;
2016-08-23 13:50:05 -07:00
using System.Runtime.InteropServices ;
2016-08-22 12:24:10 -07:00
using Microsoft.DotNet.Tools.Common ;
using Microsoft.DotNet.Cli ;
2016-08-23 13:50:05 -07:00
using Microsoft.DotNet.Tools.Migrate ;
2016-08-22 12:24:10 -07:00
using Build3Command = Microsoft . DotNet . Tools . Test . Utilities . Build3Command ;
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-08-22 12:24:10 -07:00
namespace Microsoft.DotNet.Migration.Tests
{
public class GivenThatIWantToMigrateTestApps : TestBase
{
[Theory]
// TODO: Standalone apps [InlineData("TestAppSimple", false)]
// https://github.com/dotnet/sdk/issues/73 [InlineData("TestAppWithLibrary/TestApp", false)]
2016-08-23 13:50:05 -07:00
[InlineData("TestAppWithRuntimeOptions")]
2016-09-08 14:40:46 -07:00
[InlineData("TestAppWithContents")]
2016-08-23 13:50:05 -07:00
public void It_migrates_apps ( string projectName )
2016-08-22 12:24:10 -07:00
{
2016-10-14 00:06:35 -07:00
var projectDirectory = TestAssetsManager . CreateTestInstance ( projectName , callingMethod : "i" )
. 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-08-22 12:24:10 -07:00
2016-10-04 16:48:14 -07:00
public void It_migrates_signed_apps ( string projectName )
{
var projectDirectory = TestAssetsManager . CreateTestInstance ( "TestAppWithSigning" , callingMethod : "i" ) . WithLockFiles ( ) . Path ;
CleanBinObj ( projectDirectory ) ;
var outputComparisonData = BuildProjectJsonMigrateBuildMSBuild ( projectDirectory , projectName ) ;
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-03 20:10:09 -07:00
[Fact(Skip="https://github.com/dotnet/cli/issues/4299")]
2016-08-23 13:50:05 -07:00
public void It_migrates_dotnet_new_web_with_outputs_containing_project_json_outputs ( )
{
2016-10-14 00:06:35 -07:00
var testInstance = TestAssetsManager
. CreateTestInstance ( "ProjectJsonWebTemplate" ) ;
var projectDirectory = testInstance . Path ;
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]
// TODO: Enable this when X-Targeting is in
// [InlineData("TestLibraryWithMultipleFrameworks")]
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 =
TestAssetsManager . CreateTestInstance ( projectName , callingMethod : "i" ) . 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")]
[InlineData("TestLibraryWithConfiguration")]
public void It_migrates_a_library ( string projectName )
{
var projectDirectory =
TestAssetsManager . CreateTestInstance ( projectName , callingMethod : "i" ) . 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 ( ) ;
VerifyAllMSBuildOutputsRunnable ( projectDirectory ) ;
}
2016-10-10 18:01:59 -07:00
[Theory]
// https://github.com/dotnet/cli/issues/4313
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
}
private void VerifyMigration ( IEnumerable < string > expectedProjects , string rootDir )
2016-09-26 14:16:17 -07:00
{
2016-10-05 16:25:04 -07: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 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-08-23 13:50:05 -07:00
Restore ( 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
{
Restore3 ( dir ) ;
}
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 )
{
var projectFile = Path . Combine ( projectDirectory , "project.json" ) ;
2016-10-14 00:06:35 -07:00
2016-08-22 12:24:10 -07:00
var result = new BuildCommand ( projectPath : projectFile )
. ExecuteWithCapturedOutput ( ) ;
result . Should ( ) . Pass ( ) ;
}
2016-10-11 11:19:04 -07:00
private void MigrateProject ( 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-08-22 12:24:10 -07:00
private void Restore ( string projectDirectory )
{
new TestCommand ( "dotnet" )
. WithWorkingDirectory ( projectDirectory )
. Execute ( "restore" )
2016-10-14 00:06:35 -07:00
. Should ( ) . Pass ( ) ;
2016-08-22 12:24:10 -07:00
}
2016-10-03 20:10:09 -07:00
private void Restore3 ( string projectDirectory , string projectName = null )
2016-09-27 19:25:13 -07:00
{
2016-10-03 20:10:09 -07:00
var command = new Restore3Command ( )
. WithWorkingDirectory ( projectDirectory ) ;
if ( projectName ! = null )
{
2016-10-14 00:06:35 -07:00
command . Execute ( $"{projectName}.csproj /p:SkipInvalidConfigurations=true" )
. Should ( ) . Pass ( ) ;
2016-10-03 20:10:09 -07:00
}
else
{
2016-10-14 00:06:35 -07:00
command . Execute ( "/p:SkipInvalidConfigurations=true" )
. Should ( ) . Pass ( ) ;
2016-10-04 10:39:55 -07:00
}
2016-09-27 19:25:13 -07:00
}
private string BuildMSBuild ( string projectDirectory , string projectName , string configuration = "Debug" )
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-08-22 12:24:10 -07:00
var result = new Build3Command ( )
. WithWorkingDirectory ( projectDirectory )
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-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-08-22 12:24:10 -07:00
}
}