137 lines
5.6 KiB
C#
137 lines
5.6 KiB
C#
// 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.InteropServices;
|
|
|
|
namespace Microsoft.DotNet.TestFramework
|
|
{
|
|
public class TestInstance
|
|
{
|
|
private string _testDestination;
|
|
private string _testAssetRoot;
|
|
|
|
internal TestInstance(string testAssetRoot, string testDestination)
|
|
{
|
|
if (string.IsNullOrEmpty(testAssetRoot))
|
|
{
|
|
throw new ArgumentException("testScenario");
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(testDestination))
|
|
{
|
|
throw new ArgumentException("testDestination");
|
|
}
|
|
|
|
_testAssetRoot = testAssetRoot;
|
|
_testDestination = testDestination;
|
|
|
|
if (Directory.Exists(testDestination))
|
|
{
|
|
Directory.Delete(testDestination, true);
|
|
}
|
|
|
|
Directory.CreateDirectory(testDestination);
|
|
CopySource();
|
|
}
|
|
|
|
private void CopySource()
|
|
{
|
|
var sourceDirs = Directory.GetDirectories(_testAssetRoot, "*", SearchOption.AllDirectories)
|
|
.Where(dir =>
|
|
{
|
|
dir = dir.ToLower();
|
|
return !dir.EndsWith($"{Path.DirectorySeparatorChar}bin")
|
|
&& !dir.Contains($"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}")
|
|
&& !dir.EndsWith($"{Path.DirectorySeparatorChar}obj")
|
|
&& !dir.Contains($"{Path.DirectorySeparatorChar}obj{Path.DirectorySeparatorChar}");
|
|
});
|
|
|
|
foreach (string sourceDir in sourceDirs)
|
|
{
|
|
Directory.CreateDirectory(sourceDir.Replace(_testAssetRoot, _testDestination));
|
|
}
|
|
|
|
var sourceFiles = Directory.GetFiles(_testAssetRoot, "*.*", SearchOption.AllDirectories)
|
|
.Where(file =>
|
|
{
|
|
file = file.ToLower();
|
|
return !file.EndsWith("project.lock.json")
|
|
&& !file.Contains($"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}")
|
|
&& !file.Contains($"{Path.DirectorySeparatorChar}obj{Path.DirectorySeparatorChar}");
|
|
});
|
|
|
|
foreach (string srcFile in sourceFiles)
|
|
{
|
|
string destFile = srcFile.Replace(_testAssetRoot, _testDestination);
|
|
File.Copy(srcFile, destFile, true);
|
|
FixTimeStamp(srcFile, destFile);
|
|
}
|
|
}
|
|
|
|
public TestInstance WithLockFiles()
|
|
{
|
|
foreach (string lockFile in Directory.GetFiles(_testAssetRoot, "project.lock.json", SearchOption.AllDirectories))
|
|
{
|
|
string destinationLockFile = lockFile.Replace(_testAssetRoot, _testDestination);
|
|
File.Copy(lockFile, destinationLockFile, true);
|
|
FixTimeStamp(lockFile, destinationLockFile);
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
public TestInstance WithBuildArtifacts()
|
|
{
|
|
var binDirs = Directory.GetDirectories(_testAssetRoot, "*", SearchOption.AllDirectories)
|
|
.Where(dir =>
|
|
{
|
|
dir = dir.ToLower();
|
|
return dir.EndsWith($"{Path.DirectorySeparatorChar}bin")
|
|
|| dir.Contains($"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}")
|
|
|| dir.EndsWith($"{Path.DirectorySeparatorChar}obj")
|
|
|| dir.Contains($"{Path.DirectorySeparatorChar}obj{Path.DirectorySeparatorChar}");
|
|
});
|
|
|
|
foreach (string dirPath in binDirs)
|
|
{
|
|
Directory.CreateDirectory(dirPath.Replace(_testAssetRoot, _testDestination));
|
|
}
|
|
|
|
var binFiles = Directory.GetFiles(_testAssetRoot, "*.*", SearchOption.AllDirectories)
|
|
.Where(file =>
|
|
{
|
|
file = file.ToLower();
|
|
return file.Contains($"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}")
|
|
|| file.Contains($"{Path.DirectorySeparatorChar}obj{Path.DirectorySeparatorChar}");
|
|
});
|
|
|
|
foreach (string binFile in binFiles)
|
|
{
|
|
string destFile = binFile.Replace(_testAssetRoot, _testDestination);
|
|
File.Copy(binFile, destFile, true);
|
|
FixTimeStamp(binFile, destFile);
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
public string TestRoot
|
|
{
|
|
get { return _testDestination; }
|
|
}
|
|
|
|
private static void FixTimeStamp(string originalFile, string newFile)
|
|
{
|
|
// workaround for https://github.com/dotnet/corefx/issues/6083
|
|
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|
{
|
|
var originalTime = File.GetLastWriteTime(originalFile);
|
|
File.SetLastWriteTime(newFile, originalTime);
|
|
}
|
|
}
|
|
}
|
|
}
|