Refactor TestFramework
Remove TestScenario and add TestAssetsManager which manages the TestAssets folder.
This commit is contained in:
parent
d1d14283a1
commit
b239c548a4
4 changed files with 118 additions and 132 deletions
|
@ -0,0 +1,101 @@
|
||||||
|
// 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.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.DotNet.Cli.Utils;
|
||||||
|
|
||||||
|
namespace Microsoft.DotNet.TestFramework
|
||||||
|
{
|
||||||
|
public class TestAssetsManager
|
||||||
|
{
|
||||||
|
public string AssetsRoot
|
||||||
|
{
|
||||||
|
get; private set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TestAssetsManager(string assetsRoot, bool skipRestore = true, bool skipBuild = true)
|
||||||
|
{
|
||||||
|
if (!Directory.Exists(assetsRoot))
|
||||||
|
{
|
||||||
|
throw new DirectoryNotFoundException($"Directory not found at '{assetsRoot}'");
|
||||||
|
}
|
||||||
|
|
||||||
|
AssetsRoot = assetsRoot;
|
||||||
|
|
||||||
|
if (!skipRestore)
|
||||||
|
{
|
||||||
|
Restore();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!skipBuild)
|
||||||
|
{
|
||||||
|
Build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Restore()
|
||||||
|
{
|
||||||
|
string[] restoreArgs = new string[] { "restore", AssetsRoot };
|
||||||
|
|
||||||
|
Console.WriteLine("Executing - 'dotnet {0}'", string.Join(" ", restoreArgs));
|
||||||
|
var commandResult = Command.Create("dotnet", restoreArgs)
|
||||||
|
.CaptureStdOut()
|
||||||
|
.CaptureStdErr()
|
||||||
|
.Execute();
|
||||||
|
|
||||||
|
int exitCode = commandResult.ExitCode;
|
||||||
|
|
||||||
|
if (exitCode != 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine(commandResult.StdOut);
|
||||||
|
Console.WriteLine(commandResult.StdErr);
|
||||||
|
string message = string.Format("Command Failed - 'dotnet {0}' with exit code - {1}", string.Join(" ", restoreArgs), exitCode);
|
||||||
|
throw new Exception(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Build()
|
||||||
|
{
|
||||||
|
var projects = Directory.GetFiles(AssetsRoot, "project.json", SearchOption.AllDirectories);
|
||||||
|
foreach (var project in projects)
|
||||||
|
{
|
||||||
|
string[] buildArgs = new string[] { "build", project };
|
||||||
|
|
||||||
|
Console.WriteLine("Executing - 'dotnet {0}'", string.Join(" ", buildArgs));
|
||||||
|
var commandResult = Command.Create("dotnet", buildArgs)
|
||||||
|
.CaptureStdOut()
|
||||||
|
.CaptureStdErr()
|
||||||
|
.Execute();
|
||||||
|
|
||||||
|
int exitCode = commandResult.ExitCode;
|
||||||
|
|
||||||
|
if (exitCode != 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine(commandResult.StdOut);
|
||||||
|
Console.WriteLine(commandResult.StdErr);
|
||||||
|
string message = string.Format("Command Failed - 'dotnet {0}' with exit code - {1}", string.Join(" ", buildArgs), exitCode);
|
||||||
|
throw new Exception(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public TestInstance CreateTestInstance(string testProjectName, [CallerMemberName] string callingMethod = "", string identifier = "")
|
||||||
|
{
|
||||||
|
string testProjectDir = Path.Combine(AssetsRoot, testProjectName);
|
||||||
|
|
||||||
|
if (!Directory.Exists(testProjectDir))
|
||||||
|
{
|
||||||
|
throw new Exception($"Cannot find '{testProjectName}' at '{AssetsRoot}'");
|
||||||
|
}
|
||||||
|
|
||||||
|
string testDestination = Path.Combine(AppContext.BaseDirectory, callingMethod + identifier, testProjectName);
|
||||||
|
var testInstance = new TestInstance(testProjectDir, testDestination);
|
||||||
|
return testInstance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,13 +12,13 @@ namespace Microsoft.DotNet.TestFramework
|
||||||
public class TestInstance
|
public class TestInstance
|
||||||
{
|
{
|
||||||
private string _testDestination;
|
private string _testDestination;
|
||||||
private TestScenario _testScenario;
|
private string _testAssetRoot;
|
||||||
|
|
||||||
internal TestInstance(TestScenario testScenario, string testDestination)
|
internal TestInstance(string testAssetRoot, string testDestination)
|
||||||
{
|
{
|
||||||
if (testScenario == null)
|
if (string.IsNullOrEmpty(testAssetRoot))
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException("testScenario");
|
throw new ArgumentException("testScenario");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(testDestination))
|
if (string.IsNullOrEmpty(testDestination))
|
||||||
|
@ -26,7 +26,7 @@ namespace Microsoft.DotNet.TestFramework
|
||||||
throw new ArgumentException("testDestination");
|
throw new ArgumentException("testDestination");
|
||||||
}
|
}
|
||||||
|
|
||||||
_testScenario = testScenario;
|
_testAssetRoot = testAssetRoot;
|
||||||
_testDestination = testDestination;
|
_testDestination = testDestination;
|
||||||
|
|
||||||
if (Directory.Exists(testDestination))
|
if (Directory.Exists(testDestination))
|
||||||
|
@ -40,7 +40,7 @@ namespace Microsoft.DotNet.TestFramework
|
||||||
|
|
||||||
private void CopySource()
|
private void CopySource()
|
||||||
{
|
{
|
||||||
var sourceDirs = Directory.GetDirectories(_testScenario.SourceRoot, "*", SearchOption.AllDirectories)
|
var sourceDirs = Directory.GetDirectories(_testAssetRoot, "*", SearchOption.AllDirectories)
|
||||||
.Where(dir =>
|
.Where(dir =>
|
||||||
{
|
{
|
||||||
dir = dir.ToLower();
|
dir = dir.ToLower();
|
||||||
|
@ -50,10 +50,10 @@ namespace Microsoft.DotNet.TestFramework
|
||||||
|
|
||||||
foreach (string sourceDir in sourceDirs)
|
foreach (string sourceDir in sourceDirs)
|
||||||
{
|
{
|
||||||
Directory.CreateDirectory(sourceDir.Replace(_testScenario.SourceRoot, _testDestination));
|
Directory.CreateDirectory(sourceDir.Replace(_testAssetRoot, _testDestination));
|
||||||
}
|
}
|
||||||
|
|
||||||
var sourceFiles = Directory.GetFiles(_testScenario.SourceRoot, "*.*", SearchOption.AllDirectories)
|
var sourceFiles = Directory.GetFiles(_testAssetRoot, "*.*", SearchOption.AllDirectories)
|
||||||
.Where(file =>
|
.Where(file =>
|
||||||
{
|
{
|
||||||
file = file.ToLower();
|
file = file.ToLower();
|
||||||
|
@ -63,24 +63,24 @@ namespace Microsoft.DotNet.TestFramework
|
||||||
|
|
||||||
foreach (string srcFile in sourceFiles)
|
foreach (string srcFile in sourceFiles)
|
||||||
{
|
{
|
||||||
File.Copy(srcFile, srcFile.Replace(_testScenario.SourceRoot, _testDestination), true);
|
File.Copy(srcFile, srcFile.Replace(_testAssetRoot, _testDestination), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public TestInstance WithLockFiles()
|
public TestInstance WithLockFiles()
|
||||||
{
|
{
|
||||||
foreach (string lockFile in Directory.GetFiles(_testScenario.SourceRoot, "project.lock.json", SearchOption.AllDirectories))
|
foreach (string lockFile in Directory.GetFiles(_testAssetRoot, "project.lock.json", SearchOption.AllDirectories))
|
||||||
{
|
{
|
||||||
string destinationLockFile = lockFile.Replace(_testScenario.SourceRoot, _testDestination);
|
string destinationLockFile = lockFile.Replace(_testAssetRoot, _testDestination);
|
||||||
File.Copy(lockFile, destinationLockFile, true);
|
File.Copy(lockFile, destinationLockFile, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TestInstance WithBinaries()
|
public TestInstance WithBuildArtifacts()
|
||||||
{
|
{
|
||||||
var binDirs = Directory.GetDirectories(_testScenario.SourceRoot, "*", SearchOption.AllDirectories)
|
var binDirs = Directory.GetDirectories(_testAssetRoot, "*", SearchOption.AllDirectories)
|
||||||
.Where(dir =>
|
.Where(dir =>
|
||||||
{
|
{
|
||||||
dir = dir.ToLower();
|
dir = dir.ToLower();
|
||||||
|
@ -90,10 +90,10 @@ namespace Microsoft.DotNet.TestFramework
|
||||||
|
|
||||||
foreach (string dirPath in binDirs)
|
foreach (string dirPath in binDirs)
|
||||||
{
|
{
|
||||||
Directory.CreateDirectory(dirPath.Replace(_testScenario.SourceRoot, _testDestination));
|
Directory.CreateDirectory(dirPath.Replace(_testAssetRoot, _testDestination));
|
||||||
}
|
}
|
||||||
|
|
||||||
var binFiles = Directory.GetFiles(_testScenario.SourceRoot, "*.*", SearchOption.AllDirectories)
|
var binFiles = Directory.GetFiles(_testAssetRoot, "*.*", SearchOption.AllDirectories)
|
||||||
.Where(file =>
|
.Where(file =>
|
||||||
{
|
{
|
||||||
file = file.ToLower();
|
file = file.ToLower();
|
||||||
|
@ -102,7 +102,7 @@ namespace Microsoft.DotNet.TestFramework
|
||||||
|
|
||||||
foreach (string binFile in binFiles)
|
foreach (string binFile in binFiles)
|
||||||
{
|
{
|
||||||
File.Copy(binFile, binFile.Replace(_testScenario.SourceRoot, _testDestination), true);
|
File.Copy(binFile, binFile.Replace(_testAssetRoot, _testDestination), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
|
|
|
@ -1,115 +0,0 @@
|
||||||
// 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.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.DotNet.Cli.Utils;
|
|
||||||
|
|
||||||
namespace Microsoft.DotNet.TestFramework
|
|
||||||
{
|
|
||||||
public class TestScenario
|
|
||||||
{
|
|
||||||
private static IDictionary<string, TestScenario> _scenarioCache = new Dictionary<string, TestScenario>();
|
|
||||||
|
|
||||||
private TestScenario(string testSourceRoot, bool skipRestore, bool skipBuild)
|
|
||||||
{
|
|
||||||
SourceRoot = testSourceRoot;
|
|
||||||
Projects = GetAllProjects(SourceRoot);
|
|
||||||
|
|
||||||
if (!skipRestore)
|
|
||||||
{
|
|
||||||
Restore();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!skipBuild)
|
|
||||||
{
|
|
||||||
Build();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private IEnumerable<string> Projects
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string SourceRoot
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
private set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TestScenario Create(string testSourceRoot, bool skipRestore = false, bool skipBuild = false)
|
|
||||||
{
|
|
||||||
TestScenario testScenario;
|
|
||||||
lock (_scenarioCache)
|
|
||||||
{
|
|
||||||
if (!_scenarioCache.TryGetValue(testSourceRoot, out testScenario))
|
|
||||||
{
|
|
||||||
testScenario = new TestScenario(testSourceRoot, skipRestore, skipBuild);
|
|
||||||
_scenarioCache.Add(testSourceRoot, testScenario);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return testScenario;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TestInstance CreateTestInstance([CallerMemberName] string callingMethod = "", string identifier = "")
|
|
||||||
{
|
|
||||||
string projectName = new DirectoryInfo(SourceRoot).Name;
|
|
||||||
string testDestination = Path.Combine(AppContext.BaseDirectory, callingMethod + identifier, projectName);
|
|
||||||
var testInstance = new TestInstance(this, testDestination);
|
|
||||||
return testInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void Build()
|
|
||||||
{
|
|
||||||
foreach (var project in Projects)
|
|
||||||
{
|
|
||||||
string[] buildArgs = new string[] { "build", project };
|
|
||||||
var commandResult = Command.Create("dotnet", buildArgs)
|
|
||||||
.CaptureStdOut()
|
|
||||||
.CaptureStdErr()
|
|
||||||
.Execute();
|
|
||||||
|
|
||||||
Console.WriteLine(commandResult.StdOut);
|
|
||||||
Console.WriteLine(commandResult.StdErr);
|
|
||||||
int exitCode = commandResult.ExitCode;
|
|
||||||
|
|
||||||
if (exitCode != 0)
|
|
||||||
{
|
|
||||||
|
|
||||||
string message = string.Format("Command Failed - 'dotnet {0}' with exit code - {1}", string.Join(" ", buildArgs), exitCode);
|
|
||||||
throw new Exception(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static IEnumerable<string> GetAllProjects(string sourceRoot)
|
|
||||||
{
|
|
||||||
return Directory.GetFiles(sourceRoot, "project.json", SearchOption.AllDirectories);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void Restore()
|
|
||||||
{
|
|
||||||
string[] restoreArgs = new string[] { "restore", SourceRoot };
|
|
||||||
var commandResult = Command.Create("dotnet", restoreArgs)
|
|
||||||
.CaptureStdOut()
|
|
||||||
.CaptureStdErr()
|
|
||||||
.Execute();
|
|
||||||
|
|
||||||
Console.WriteLine(commandResult.StdOut);
|
|
||||||
Console.WriteLine(commandResult.StdErr);
|
|
||||||
int exitCode = commandResult.ExitCode;
|
|
||||||
|
|
||||||
if (exitCode != 0)
|
|
||||||
{
|
|
||||||
string message = string.Format("Command Failed - 'dotnet {0}' with exit code - {1}", string.Join(" ", restoreArgs), exitCode);
|
|
||||||
throw new Exception(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.DotNet.Cli.Utils": "1.0.0-*",
|
"Microsoft.DotNet.Cli.Utils": "1.0.0-*",
|
||||||
"NETStandard.Library": "1.0.0-rc2-23728"
|
"NETStandard.Library": "1.0.0-rc2-23811"
|
||||||
},
|
},
|
||||||
|
|
||||||
"frameworks": {
|
"frameworks": {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue