Add Binding redirects tests
This commit is contained in:
parent
4ccd88d00e
commit
c82d3cc08d
25 changed files with 645 additions and 55 deletions
|
@ -4,6 +4,7 @@
|
|||
<!--To inherit the global NuGet package sources remove the <clear/> line below -->
|
||||
<clear />
|
||||
<add key="cli-deps" value="https://dotnet.myget.org/F/cli-deps/api/v3/index.json" />
|
||||
<add key="coreclr-xunit" value="https://www.myget.org/F/coreclr-xunit/api/v3/index.json" />
|
||||
<add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" />
|
||||
</packageSources>
|
||||
</configuration>
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
||||
<bindingRedirect oldVersion="3.5.0.0" newVersion="8.0.0.0" />
|
||||
<bindingRedirect oldVersion="4.5.0.0" newVersion="8.0.0.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Some.Foo.Assembly" publicKeyToken="814f48568d36eed5" culture="neutral" />
|
||||
<bindingRedirect oldVersion="3.0.0.0" newVersion="5.5.5.1" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
<appSettings>
|
||||
<add key="Setting1" value="Hello"/>
|
||||
<add key="Setting2" value="World"/>
|
||||
</appSettings>
|
||||
</configuration>
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": "1.0.0-*",
|
||||
"compilationOptions": {
|
||||
"emitEntryPoint": true
|
||||
},
|
||||
"compile": [
|
||||
"../src/*.cs"
|
||||
],
|
||||
"dependencies": {
|
||||
"Newtonsoft.Json": "8.0.3",
|
||||
"Microsoft.AspNet.Mvc": "3.0.50813.1",
|
||||
"Unity.Mvc": "3.0.1304",
|
||||
"dotnet-desktop-binding-redirects": "1.0.0-*"
|
||||
},
|
||||
"frameworks": {
|
||||
"net451": {}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": "1.0.0-*",
|
||||
"compilationOptions": {
|
||||
"emitEntryPoint": true
|
||||
},
|
||||
"compile": [
|
||||
"../src/*.cs"
|
||||
],
|
||||
"dependencies": {
|
||||
"Newtonsoft.Json": "8.0.3",
|
||||
"Microsoft.AspNet.Mvc": "3.0.50813.1",
|
||||
"Unity.Mvc": "3.0.1304",
|
||||
"dotnet-desktop-binding-redirects": "1.0.0-*"
|
||||
},
|
||||
"frameworks": {
|
||||
"net451": {}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
namespace BindingRedirects
|
||||
{
|
||||
public class Program
|
||||
{
|
||||
private const string ExpectedNewtonSoftVersion = "8.0.0.0";
|
||||
|
||||
public static int Main(string[] args)
|
||||
{
|
||||
return VerifyJsonLoad();
|
||||
}
|
||||
|
||||
private static int VerifyJsonLoad()
|
||||
{
|
||||
WriteLine("=======Verifying Redirected Newtonsoft.Json assembly load=======");
|
||||
|
||||
int result = 0;
|
||||
|
||||
try
|
||||
{
|
||||
var jsonAsm = typeof(Newtonsoft.Json.JsonConvert).Assembly;
|
||||
var version = jsonAsm.GetName().Version.ToString();
|
||||
if (version != ExpectedNewtonSoftVersion)
|
||||
{
|
||||
WriteLine($"Failure - Newtonsoft.Json: ExpectedVersion - {ExpectedNewtonSoftVersion}, ActualVersion - {version}");
|
||||
result = -1;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
WriteLine($"Failed to load type 'Newtonsoft.Json.JsonConvert'");
|
||||
throw ex;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void WriteLine(string str)
|
||||
{
|
||||
var currentAssembly = Assembly.GetExecutingAssembly().GetName().Name;
|
||||
Console.WriteLine($"{currentAssembly}: {str}");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
namespace BindingRedirects
|
||||
{
|
||||
public class Program
|
||||
{
|
||||
private const string ExpectedNewtonSoftVersion = "8.0.0.0";
|
||||
|
||||
public static int Main(string[] args)
|
||||
{
|
||||
return VerifyJsonLoad();
|
||||
}
|
||||
|
||||
private static int VerifyJsonLoad()
|
||||
{
|
||||
WriteLine("=======Verifying Redirected Newtonsoft.Json assembly load=======");
|
||||
|
||||
int result = 0;
|
||||
|
||||
try
|
||||
{
|
||||
var jsonAsm = typeof(Newtonsoft.Json.JsonConvert).Assembly;
|
||||
var version = jsonAsm.GetName().Version.ToString();
|
||||
if (version != ExpectedNewtonSoftVersion)
|
||||
{
|
||||
WriteLine($"Failure - Newtonsoft.Json: ExpectedVersion - {ExpectedNewtonSoftVersion}, ActualVersion - {version}");
|
||||
result = -1;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
WriteLine($"Failed to load type 'Newtonsoft.Json.JsonConvert'");
|
||||
throw ex;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void WriteLine(string str)
|
||||
{
|
||||
var currentAssembly = Assembly.GetExecutingAssembly().GetName().Name;
|
||||
Console.WriteLine($"{currentAssembly}: {str}");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>281f1cdb-8627-47c7-9bb1-cde8d30d93d1</ProjectGuid>
|
||||
<RootNamespace>dotnet-desktop-binding-redirects</RootNamespace>
|
||||
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||
<OutputPath Condition="'$(OutputPath)'=='' ">..\artifacts\bin\$(MSBuildProjectName)\</OutputPath>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||
</Project>
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": "1.0.0-*",
|
||||
"compilationOptions": {
|
||||
"emitEntryPoint": true
|
||||
},
|
||||
"dependencies": {
|
||||
"Newtonsoft.Json": "5.0.0",
|
||||
"NuGet.Protocol.Core.v3": "3.3.0"
|
||||
},
|
||||
"frameworks": {
|
||||
"net451": {
|
||||
"frameworkAssemblies": {
|
||||
"System.Configuration": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -77,6 +77,16 @@ namespace Microsoft.DotNet.Cli.Build
|
|||
Frameworks = new [] { "net451", "netcoreapp1.0" }
|
||||
},
|
||||
new TestPackageProject()
|
||||
{
|
||||
Name = "dotnet-desktop-binding-redirects",
|
||||
IsTool = true,
|
||||
Path = "TestAssets/TestPackages/dotnet-desktop-binding-redirects",
|
||||
IsApplicable = CurrentPlatform.IsWindows,
|
||||
VersionSuffix = s_testPackageBuildVersionSuffix,
|
||||
Clean = true,
|
||||
Frameworks = new [] { "net451" }
|
||||
},
|
||||
new TestPackageProject()
|
||||
{
|
||||
Name = "dotnet-hello",
|
||||
IsTool = true,
|
||||
|
|
|
@ -39,6 +39,11 @@ namespace Microsoft.DotNet.Cli.Build
|
|||
"Microsoft.Extensions.DependencyModel.Tests"
|
||||
};
|
||||
|
||||
public static readonly string[] WindowsTestProjects = new[]
|
||||
{
|
||||
"binding-redirects.Tests"
|
||||
};
|
||||
|
||||
public static readonly dynamic[] ConditionalTestAssets = new[]
|
||||
{
|
||||
new { Path = "AppWithDirectDependencyDesktopAndPortable", Skip = new Func<bool>(() => !CurrentPlatform.IsWindows) }
|
||||
|
@ -59,9 +64,9 @@ namespace Microsoft.DotNet.Cli.Build
|
|||
[Target(nameof(RestoreTestAssetPackages), nameof(BuildTestAssetPackages))]
|
||||
public static BuildTargetResult SetupTestPackages(BuildTargetContext c) => c.Success();
|
||||
|
||||
[Target(nameof(RestoreTestAssetProjects),
|
||||
nameof(RestoreDesktopTestAssetProjects),
|
||||
nameof(BuildTestAssetProjects),
|
||||
[Target(nameof(RestoreTestAssetProjects),
|
||||
nameof(RestoreDesktopTestAssetProjects),
|
||||
nameof(BuildTestAssetProjects),
|
||||
nameof(BuildDesktopTestAssetProjects))]
|
||||
public static BuildTargetResult SetupTestProjects(BuildTargetContext c) => c.Success();
|
||||
|
||||
|
@ -223,7 +228,7 @@ namespace Microsoft.DotNet.Cli.Build
|
|||
foreach (var packageProject in TestPackageProjects.Projects.Where(p => p.IsApplicable && p.Clean))
|
||||
{
|
||||
Rmdir(Path.Combine(Dirs.NuGetPackages, packageProject.Name));
|
||||
if(packageProject.IsTool)
|
||||
if (packageProject.IsTool)
|
||||
{
|
||||
Rmdir(Path.Combine(Dirs.NuGetPackages, ".tools", packageProject.Name));
|
||||
}
|
||||
|
@ -276,7 +281,7 @@ namespace Microsoft.DotNet.Cli.Build
|
|||
|
||||
var configuration = c.BuildContext.Get<string>("Configuration");
|
||||
|
||||
foreach (var testProject in TestProjects)
|
||||
foreach (var testProject in GetTestProjects())
|
||||
{
|
||||
c.Info($"Building tests: {testProject}");
|
||||
dotnet.Build("--configuration", configuration)
|
||||
|
@ -307,7 +312,7 @@ namespace Microsoft.DotNet.Cli.Build
|
|||
|
||||
// Run the tests and set the VS vars in the environment when running them
|
||||
var failingTests = new List<string>();
|
||||
foreach (var project in TestProjects)
|
||||
foreach (var project in GetTestProjects())
|
||||
{
|
||||
c.Info($"Running tests in: {project}");
|
||||
var result = dotnet.Test("--configuration", configuration, "-xml", $"{project}-testResults.xml", "-notrait", "category=failing")
|
||||
|
@ -354,6 +359,19 @@ namespace Microsoft.DotNet.Cli.Build
|
|||
return c.Success();
|
||||
}
|
||||
|
||||
private static IEnumerable<string> GetTestProjects()
|
||||
{
|
||||
List<string> testProjects = new List<string>();
|
||||
testProjects.AddRange(testProjects);
|
||||
|
||||
if (CurrentPlatform.IsWindows)
|
||||
{
|
||||
testProjects.AddRange(WindowsTestProjects);
|
||||
}
|
||||
|
||||
return testProjects;
|
||||
}
|
||||
|
||||
private static BuildTargetResult BuildTestAssets(BuildTargetContext c, string testAssetsRoot, DotNetCli dotnet, string framework)
|
||||
{
|
||||
CleanBinObj(c, testAssetsRoot);
|
||||
|
|
|
@ -12,6 +12,7 @@ namespace Microsoft.DotNet.Cli.Utils
|
|||
|
||||
public static readonly string ProjectFileName = "project.json";
|
||||
public static readonly string ExeSuffix = CurrentPlatform == Platform.Windows ? ".exe" : string.Empty;
|
||||
public static readonly string ConfigSuffix = ".config";
|
||||
|
||||
// Priority order of runnable suffixes to look for and run
|
||||
public static readonly string[] RunnableSuffixes = CurrentPlatform == Platform.Windows
|
||||
|
|
|
@ -52,15 +52,7 @@ namespace Microsoft.DotNet.Cli.Compiler.Common
|
|||
|
||||
internal static void GenerateBindingRedirects(string configFile, AssemblyRedirect[] bindingRedirects)
|
||||
{
|
||||
XDocument configRoot = null;
|
||||
|
||||
if (File.Exists(configFile))
|
||||
{
|
||||
configRoot = XDocument.Load(configFile);
|
||||
}
|
||||
|
||||
configRoot = configRoot ?? new XDocument();
|
||||
|
||||
XDocument configRoot = File.Exists(configFile) ? XDocument.Load(configFile) : new XDocument();
|
||||
var configuration = GetOrAddElement(configRoot, ConfigurationElementName);
|
||||
var runtime = GetOrAddElement(configuration, RuntimeElementName);
|
||||
var assemblyBindings = GetOrAddElement(runtime, AssemblyBindingElementName);
|
||||
|
@ -93,10 +85,15 @@ namespace Microsoft.DotNet.Cli.Compiler.Common
|
|||
assemblyBindings.Add(dependencyElement);
|
||||
}
|
||||
|
||||
dependencyElement.Add(new XElement(BindingRedirectElementName,
|
||||
new XAttribute(OldVersionAttributeName, redirect.From.Version),
|
||||
new XAttribute(NewVersionAttributeName, redirect.To.Version)
|
||||
));
|
||||
bool redirectExists = dependencyElement.Elements(BindingRedirectElementName).Any(element => IsSameRedirect(redirect, element));
|
||||
|
||||
if (!redirectExists)
|
||||
{
|
||||
dependencyElement.Add(new XElement(BindingRedirectElementName,
|
||||
new XAttribute(OldVersionAttributeName, redirect.From.Version),
|
||||
new XAttribute(NewVersionAttributeName, redirect.To.Version)
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
private static bool IsSameAssembly(AssemblyRedirect redirect, XElement dependentAssemblyElement)
|
||||
|
@ -111,6 +108,16 @@ namespace Microsoft.DotNet.Cli.Compiler.Common
|
|||
(string)identity.Attribute(CultureAttributeName) == redirect.From.Culture;
|
||||
}
|
||||
|
||||
private static bool IsSameRedirect(AssemblyRedirect redirect, XElement bindingRedirectElement)
|
||||
{
|
||||
if (bindingRedirectElement == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return (string)bindingRedirectElement.Attribute(OldVersionAttributeName) == redirect.From.Version.ToString() &&
|
||||
(string)bindingRedirectElement.Attribute(NewVersionAttributeName) == redirect.To.Version.ToString();
|
||||
}
|
||||
|
||||
private static XElement GetOrAddElement(XContainer parent, XName elementName)
|
||||
{
|
||||
XElement element;
|
||||
|
|
|
@ -254,7 +254,7 @@ namespace Microsoft.DotNet.Cli.Compiler.Common
|
|||
public void GenerateBindingRedirects(LibraryExporter exporter)
|
||||
{
|
||||
var outputName = _outputPaths.RuntimeFiles.Assembly;
|
||||
var configFile = outputName + ".config";
|
||||
var configFile = outputName + Constants.ConfigSuffix;
|
||||
|
||||
var existingConfig = new DirectoryInfo(_context.ProjectDirectory)
|
||||
.EnumerateFiles()
|
||||
|
@ -271,12 +271,12 @@ namespace Microsoft.DotNet.Cli.Compiler.Common
|
|||
foreach (var export in exporter.GetDependencies())
|
||||
{
|
||||
var dependencyExecutables = export.RuntimeAssemblyGroups.GetDefaultAssets()
|
||||
.Where(asset => asset.FileName.ToLower().EndsWith(".exe"))
|
||||
.Where(asset => asset.FileName.ToLower().EndsWith(FileNameSuffixes.DotNet.Exe))
|
||||
.Select(asset => Path.Combine(_runtimeOutputPath, asset.FileName));
|
||||
|
||||
foreach (var executable in dependencyExecutables)
|
||||
{
|
||||
configFile = executable + ".config";
|
||||
configFile = executable + Constants.ConfigSuffix;
|
||||
configFiles.Add(configFile);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ namespace Microsoft.DotNet.TestFramework
|
|||
.CaptureStdOut()
|
||||
.CaptureStdErr()
|
||||
.Execute();
|
||||
|
||||
|
||||
int exitCode = commandResult.ExitCode;
|
||||
|
||||
if (exitCode != 0)
|
||||
|
@ -93,7 +93,12 @@ namespace Microsoft.DotNet.TestFramework
|
|||
throw new Exception($"Cannot find '{testProjectName}' at '{AssetsRoot}'");
|
||||
}
|
||||
|
||||
string testDestination = Path.Combine(AppContext.BaseDirectory, callingMethod + identifier, testProjectName);
|
||||
#if NET451
|
||||
string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
|
||||
#else
|
||||
string baseDirectory = AppContext.BaseDirectory;
|
||||
#endif
|
||||
string testDestination = Path.Combine(baseDirectory, callingMethod + identifier, testProjectName);
|
||||
var testInstance = new TestInstance(testProjectDir, testDestination);
|
||||
return testInstance;
|
||||
}
|
||||
|
|
|
@ -63,7 +63,7 @@ namespace Microsoft.DotNet.TestFramework
|
|||
{
|
||||
file = file.ToLower();
|
||||
return !file.EndsWith("project.lock.json")
|
||||
&& !file.Contains($"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}")
|
||||
&& !file.Contains($"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}")
|
||||
&& !file.Contains($"{Path.DirectorySeparatorChar}obj{Path.DirectorySeparatorChar}");
|
||||
});
|
||||
|
||||
|
@ -71,7 +71,6 @@ namespace Microsoft.DotNet.TestFramework
|
|||
{
|
||||
string destFile = srcFile.Replace(_testAssetRoot, _testDestination);
|
||||
File.Copy(srcFile, destFile, true);
|
||||
FixTimeStamp(srcFile, destFile);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -81,7 +80,6 @@ namespace Microsoft.DotNet.TestFramework
|
|||
{
|
||||
string destinationLockFile = lockFile.Replace(_testAssetRoot, _testDestination);
|
||||
File.Copy(lockFile, destinationLockFile, true);
|
||||
FixTimeStamp(lockFile, destinationLockFile);
|
||||
}
|
||||
|
||||
return this;
|
||||
|
@ -93,9 +91,9 @@ namespace Microsoft.DotNet.TestFramework
|
|||
.Where(dir =>
|
||||
{
|
||||
dir = dir.ToLower();
|
||||
return dir.EndsWith($"{Path.DirectorySeparatorChar}bin")
|
||||
return dir.EndsWith($"{Path.DirectorySeparatorChar}bin")
|
||||
|| dir.Contains($"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}")
|
||||
|| dir.EndsWith($"{Path.DirectorySeparatorChar}obj")
|
||||
|| dir.EndsWith($"{Path.DirectorySeparatorChar}obj")
|
||||
|| dir.Contains($"{Path.DirectorySeparatorChar}obj{Path.DirectorySeparatorChar}");
|
||||
});
|
||||
|
||||
|
@ -109,7 +107,7 @@ namespace Microsoft.DotNet.TestFramework
|
|||
{
|
||||
file = file.ToLower();
|
||||
|
||||
var isArtifact = file.Contains($"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}")
|
||||
var isArtifact = file.Contains($"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}")
|
||||
|| file.Contains($"{Path.DirectorySeparatorChar}obj{Path.DirectorySeparatorChar}");
|
||||
|
||||
var isBlackListed = BuildArtifactBlackList.Any(b => file.Contains(b));
|
||||
|
@ -121,7 +119,6 @@ namespace Microsoft.DotNet.TestFramework
|
|||
{
|
||||
string destFile = binFile.Replace(_testAssetRoot, _testDestination);
|
||||
File.Copy(binFile, destFile, true);
|
||||
FixTimeStamp(binFile, destFile);
|
||||
}
|
||||
|
||||
return this;
|
||||
|
@ -131,15 +128,5 @@ namespace Microsoft.DotNet.TestFramework
|
|||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,9 @@
|
|||
"tags": [
|
||||
""
|
||||
],
|
||||
"compilationOptions": {
|
||||
"keyFile": "../../tools/Key.snk"
|
||||
},
|
||||
"projectUrl": "",
|
||||
"licenseUrl": "",
|
||||
"dependencies": {
|
||||
|
@ -14,6 +17,7 @@
|
|||
"imports": [
|
||||
"portable-net45+wp80+win8+wpa81+dnxcore50"
|
||||
]
|
||||
}
|
||||
},
|
||||
"net451": { }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -266,7 +266,11 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
|
|||
|
||||
public string GetExecutableExtension()
|
||||
{
|
||||
#if NET451
|
||||
return ".exe";
|
||||
#else
|
||||
return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : "";
|
||||
#endif
|
||||
}
|
||||
|
||||
private string BuildArgs()
|
||||
|
|
|
@ -104,7 +104,11 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
|
|||
|
||||
public string GetExecutableExtension()
|
||||
{
|
||||
#if NET451
|
||||
return ".exe";
|
||||
#else
|
||||
return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : "";
|
||||
#endif
|
||||
}
|
||||
|
||||
private string BuildArgs()
|
||||
|
|
|
@ -14,6 +14,8 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
|
|||
public class TestCommand
|
||||
{
|
||||
protected string _command;
|
||||
|
||||
private string _baseDirectory;
|
||||
|
||||
public string WorkingDirectory { get; set; }
|
||||
|
||||
|
@ -24,6 +26,11 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
|
|||
public TestCommand(string command)
|
||||
{
|
||||
_command = command;
|
||||
#if NET451
|
||||
_baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
|
||||
#else
|
||||
_baseDirectory = AppContext.BaseDirectory;
|
||||
#endif
|
||||
}
|
||||
|
||||
public virtual CommandResult Execute(string args = "")
|
||||
|
@ -63,7 +70,7 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
|
|||
var command = _command;
|
||||
ResolveCommand(ref command, ref args);
|
||||
var commandPath = Env.GetCommandPath(command, ".exe", ".cmd", "") ??
|
||||
Env.GetCommandPathFromRootPath(AppContext.BaseDirectory, command, ".exe", ".cmd", "");
|
||||
Env.GetCommandPathFromRootPath(_baseDirectory, command, ".exe", ".cmd", "");
|
||||
|
||||
Console.WriteLine($"Executing (Captured Output) - {commandPath} {args}");
|
||||
|
||||
|
@ -102,7 +109,7 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
|
|||
if (!Path.IsPathRooted(executable))
|
||||
{
|
||||
executable = Env.GetCommandPath(executable) ??
|
||||
Env.GetCommandPathFromRootPath(AppContext.BaseDirectory, executable);
|
||||
Env.GetCommandPathFromRootPath(_baseDirectory, executable);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -153,12 +160,17 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
|
|||
Arguments = args,
|
||||
RedirectStandardError = true,
|
||||
RedirectStandardOutput = true,
|
||||
RedirectStandardInput = true
|
||||
RedirectStandardInput = true,
|
||||
UseShellExecute = false
|
||||
};
|
||||
|
||||
foreach (var item in Environment)
|
||||
{
|
||||
#if NET451
|
||||
psi.EnvironmentVariables[item.Key] = item.Value;
|
||||
#else
|
||||
psi.Environment[item.Key] = item.Value;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(WorkingDirectory))
|
||||
|
|
|
@ -8,7 +8,11 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
|
|||
{
|
||||
internal static class ProcessExtensions
|
||||
{
|
||||
#if NET451
|
||||
private static readonly bool _isWindows = true;
|
||||
#else
|
||||
private static readonly bool _isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
|
||||
#endif
|
||||
private static readonly TimeSpan _defaultTimeout = TimeSpan.FromSeconds(30);
|
||||
|
||||
public static void KillTree(this Process process)
|
||||
|
|
|
@ -33,7 +33,11 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
|
|||
return s_repoRoot;
|
||||
}
|
||||
|
||||
string directory = AppContext.BaseDirectory;
|
||||
#if NET451
|
||||
string directory = AppDomain.CurrentDomain.BaseDirectory;
|
||||
#else
|
||||
string directory = AppContext.BaseDirectory;
|
||||
#endif
|
||||
|
||||
while (!Directory.Exists(Path.Combine(directory, ".git")) && directory != null)
|
||||
{
|
||||
|
|
|
@ -5,13 +5,6 @@
|
|||
"keyFile": "../../tools/Key.snk"
|
||||
},
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.App": {
|
||||
"type": "platform",
|
||||
"version": "1.0.0-rc2-*"
|
||||
},
|
||||
"System.Runtime.Serialization.Primitives": "4.1.1-rc2-24022",
|
||||
"System.Collections.Immutable": "1.2.0-rc2-24022",
|
||||
"System.Net.NetworkInformation": "4.1.0-rc2-24022",
|
||||
"FluentAssertions": "4.0.0",
|
||||
"xunit": "2.1.0",
|
||||
"dotnet-test-xunit": "1.0.0-rc2-162081-13",
|
||||
|
@ -27,8 +20,22 @@
|
|||
"netcoreapp1.0": {
|
||||
"imports": [
|
||||
"dotnet5.4",
|
||||
"portable-net451+win8"
|
||||
]
|
||||
"portable-net451+win8"
|
||||
],
|
||||
"Microsoft.NETCore.App": {
|
||||
"type": "platform",
|
||||
"version": "1.0.0-rc2-*"
|
||||
},
|
||||
"System.Runtime.Serialization.Primitives": "4.1.1-rc2-24022",
|
||||
"System.Collections.Immutable": "1.2.0-rc2-24022",
|
||||
"System.Net.NetworkInformation": "4.1.0-rc2-24022"
|
||||
},
|
||||
"net451": {
|
||||
"frameworkAssemblies": {
|
||||
"System.Runtime": {
|
||||
"type": "build"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
287
test/binding-redirects.Tests/BindingRedirectTests.cs
Normal file
287
test/binding-redirects.Tests/BindingRedirectTests.cs
Normal file
|
@ -0,0 +1,287 @@
|
|||
// 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.Configuration;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Xml.Linq;
|
||||
using Microsoft.DotNet.Cli.Utils;
|
||||
using Microsoft.DotNet.Tools.Test.Utilities;
|
||||
using Microsoft.DotNet.TestFramework;
|
||||
using Microsoft.Extensions.PlatformAbstractions;
|
||||
using Xunit;
|
||||
using FluentAssertions;
|
||||
|
||||
namespace Microsoft.DotNet.Tests
|
||||
{
|
||||
public class TestSetupFixture : TestBase
|
||||
{
|
||||
private const string Framework = "net451";
|
||||
private const string Config = "Debug";
|
||||
private const string AppWithConfig = "AppWithRedirectsAndConfig";
|
||||
private const string AppWithoutConfig = "AppWithRedirectsNoConfig";
|
||||
|
||||
private string _Runtime = PlatformServices.Default.Runtime.GetLegacyRestoreRuntimeIdentifier();
|
||||
private string _desktopProjectsRoot = Path.Combine(RepoRoot, "TestAssets", "DesktopTestProjects");
|
||||
private string _buildRelativePath;
|
||||
private string _appWithConfigBuildDir;
|
||||
private string _appWithConfigPublishDir;
|
||||
private string _appWithoutConfigBuildDir;
|
||||
private string _appWithoutConfigPublishDir;
|
||||
private TestInstance _testInstance;
|
||||
|
||||
|
||||
public string AppWithConfigBuildOutput { get; }
|
||||
public string AppWithConfigPublishOutput { get; }
|
||||
public string AppWithoutConfigBuildOutput { get; }
|
||||
public string AppWithoutConfigPublishOutput { get; }
|
||||
|
||||
public TestSetupFixture()
|
||||
{
|
||||
_buildRelativePath = Path.Combine("bin", Config, Framework, _Runtime);
|
||||
var testAssetsMgr = new TestAssetsManager(_desktopProjectsRoot);
|
||||
_testInstance = testAssetsMgr.CreateTestInstance("BindingRedirectSample")
|
||||
.WithLockFiles();
|
||||
|
||||
Setup(AppWithConfig, ref _appWithConfigBuildDir, ref _appWithConfigPublishDir);
|
||||
Setup(AppWithoutConfig, ref _appWithoutConfigBuildDir, ref _appWithoutConfigPublishDir);
|
||||
|
||||
AppWithConfigBuildOutput = Path.Combine(_appWithConfigBuildDir, AppWithConfig + ".exe");
|
||||
AppWithConfigPublishOutput = Path.Combine(_appWithConfigPublishDir, AppWithConfig + ".exe");
|
||||
AppWithoutConfigBuildOutput = Path.Combine(_appWithoutConfigBuildDir, AppWithoutConfig + ".exe");
|
||||
AppWithoutConfigPublishOutput = Path.Combine(_appWithoutConfigPublishDir, AppWithoutConfig + ".exe");
|
||||
}
|
||||
|
||||
private void Setup(string project, ref string buildDir, ref string publishDir)
|
||||
{
|
||||
string projectRoot = Path.Combine(_testInstance.TestRoot, project);
|
||||
buildDir = Path.Combine(projectRoot, _buildRelativePath);
|
||||
publishDir = Path.Combine(projectRoot, "publish");
|
||||
|
||||
var buildCommand = new BuildCommand(projectRoot, framework: Framework, runtime: _Runtime);
|
||||
buildCommand.Execute().Should().Pass();
|
||||
|
||||
var publishCommand = new PublishCommand(projectRoot, output: publishDir, framework: Framework, runtime: _Runtime);
|
||||
publishCommand.Execute().Should().Pass();
|
||||
}
|
||||
}
|
||||
|
||||
public class GivenAnAppWithRedirectsAndExecutableDependency : TestBase, IClassFixture<TestSetupFixture>
|
||||
{
|
||||
private const string ExecutableDependency = "dotnet-desktop-binding-redirects.exe";
|
||||
private TestSetupFixture _testSetup;
|
||||
private string _appWithConfigBuildOutput;
|
||||
private string _appWithoutConfigBuildOutput;
|
||||
private string _appWithConfigPublishOutput;
|
||||
private string _appWithoutConfigPublishOutput;
|
||||
private string _executableDependencyBuildOutput;
|
||||
private string _executableDependencyPublishOutput;
|
||||
|
||||
public GivenAnAppWithRedirectsAndExecutableDependency(TestSetupFixture testSetup)
|
||||
{
|
||||
_testSetup = testSetup;
|
||||
_appWithConfigBuildOutput = _testSetup.AppWithConfigBuildOutput;
|
||||
_appWithConfigPublishOutput = _testSetup.AppWithConfigPublishOutput;
|
||||
_appWithoutConfigBuildOutput = _testSetup.AppWithoutConfigBuildOutput;
|
||||
_appWithoutConfigPublishOutput = _testSetup.AppWithoutConfigPublishOutput;
|
||||
_executableDependencyBuildOutput = Path.Combine(Path.GetDirectoryName(_appWithConfigBuildOutput), ExecutableDependency);
|
||||
_executableDependencyPublishOutput = Path.Combine(Path.GetDirectoryName(_appWithConfigPublishOutput), ExecutableDependency);
|
||||
}
|
||||
|
||||
private static List<string> BindingsAppNoConfig
|
||||
{
|
||||
get
|
||||
{
|
||||
List<string> bindings = new List<string>()
|
||||
{
|
||||
@"<dependentAssembly xmlns=""urn:schemas-microsoft-com:asm.v1"">
|
||||
<assemblyIdentity name=""Newtonsoft.Json"" publicKeyToken=""30ad4fe6b2a6aeed"" culture=""neutral"" />
|
||||
<bindingRedirect oldVersion=""4.5.0.0"" newVersion=""8.0.0.0"" />
|
||||
<bindingRedirect oldVersion=""6.0.0.0"" newVersion=""8.0.0.0"" />
|
||||
</dependentAssembly>",
|
||||
@"<dependentAssembly xmlns=""urn:schemas-microsoft-com:asm.v1"">
|
||||
<assemblyIdentity name=""System.Web.Mvc"" publicKeyToken=""31bf3856ad364e35"" culture=""neutral"" />
|
||||
<bindingRedirect oldVersion=""4.0.0.0"" newVersion=""3.0.0.1"" />
|
||||
</dependentAssembly>"
|
||||
};
|
||||
|
||||
return bindings;
|
||||
}
|
||||
}
|
||||
|
||||
private static List<string> BindingsAppWithConfig
|
||||
{
|
||||
get
|
||||
{
|
||||
List<string> bindings = new List<string>()
|
||||
{
|
||||
@"<dependentAssembly xmlns=""urn:schemas-microsoft-com:asm.v1"">
|
||||
<assemblyIdentity name=""Newtonsoft.Json"" publicKeyToken=""30ad4fe6b2a6aeed"" culture=""neutral"" />
|
||||
<bindingRedirect oldVersion=""3.5.0.0"" newVersion=""8.0.0.0"" />
|
||||
<bindingRedirect oldVersion=""4.5.0.0"" newVersion=""8.0.0.0"" />
|
||||
<bindingRedirect oldVersion=""6.0.0.0"" newVersion=""8.0.0.0"" />
|
||||
</dependentAssembly>",
|
||||
@"<dependentAssembly xmlns=""urn:schemas-microsoft-com:asm.v1"">
|
||||
<assemblyIdentity name=""Some.Foo.Assembly"" publicKeyToken=""814f48568d36eed5"" culture=""neutral"" />
|
||||
<bindingRedirect oldVersion=""3.0.0.0"" newVersion=""5.5.5.1"" />
|
||||
</dependentAssembly>",
|
||||
@"<dependentAssembly xmlns=""urn:schemas-microsoft-com:asm.v1"">
|
||||
<assemblyIdentity name=""System.Web.Mvc"" publicKeyToken=""31bf3856ad364e35"" culture=""neutral"" />
|
||||
<bindingRedirect oldVersion=""4.0.0.0"" newVersion=""3.0.0.1"" />
|
||||
</dependentAssembly>"
|
||||
};
|
||||
|
||||
return bindings;
|
||||
}
|
||||
}
|
||||
|
||||
private static List<XElement> ExpectedBindingsAppNoConfig
|
||||
{
|
||||
get
|
||||
{
|
||||
List<XElement> bindingElements = new List<XElement>();
|
||||
|
||||
foreach (var binding in BindingsAppNoConfig)
|
||||
{
|
||||
bindingElements.Add(XElement.Parse(binding));
|
||||
}
|
||||
|
||||
return bindingElements;
|
||||
}
|
||||
}
|
||||
|
||||
private static List<XElement> ExpectedBindingsAppWithConfig
|
||||
{
|
||||
get
|
||||
{
|
||||
List<XElement> bindingElements = new List<XElement>();
|
||||
|
||||
foreach (var binding in BindingsAppWithConfig)
|
||||
{
|
||||
bindingElements.Add(XElement.Parse(binding));
|
||||
}
|
||||
|
||||
return bindingElements;
|
||||
}
|
||||
}
|
||||
|
||||
private static Dictionary<string, string> ExpectedAppSettings
|
||||
{
|
||||
get
|
||||
{
|
||||
Dictionary<string, string> appSettings = new Dictionary<string, string>()
|
||||
{
|
||||
{"Setting1", "Hello"},
|
||||
{"Setting2", "World"}
|
||||
};
|
||||
|
||||
return appSettings;
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerable<XElement> GetRedirects(string exePath)
|
||||
{
|
||||
var configFile = exePath + ".config";
|
||||
File.Exists(configFile).Should().BeTrue($"Config file not found - {configFile}");
|
||||
var config = ConfigurationManager.OpenExeConfiguration(exePath);
|
||||
var runtimeSectionXml = config.Sections["runtime"].SectionInformation.GetRawXml();
|
||||
var runtimeSectionElement = XElement.Parse(runtimeSectionXml);
|
||||
var redirects = runtimeSectionElement.Elements()
|
||||
.Where(e => e.Name.LocalName == "assemblyBinding").Elements()
|
||||
.Where(e => e.Name.LocalName == "dependentAssembly");
|
||||
return redirects;
|
||||
}
|
||||
|
||||
private void VerifyRedirects(IEnumerable<XElement> redirects, IEnumerable<XElement> generatedBindings)
|
||||
{
|
||||
foreach (var binding in generatedBindings)
|
||||
{
|
||||
var redirect = redirects.SingleOrDefault(r => /*XNode.DeepEquals(r, binding)*/ r.ToString() == binding.ToString());
|
||||
|
||||
redirect.Should().NotBeNull($"Binding not found in runtime section : {Environment.NewLine}{binding}");
|
||||
}
|
||||
}
|
||||
|
||||
private void VerifyAppSettings(string exePath)
|
||||
{
|
||||
var configFile = ConfigurationManager.OpenExeConfiguration(exePath);
|
||||
foreach (var appSetting in ExpectedAppSettings)
|
||||
{
|
||||
var value = configFile.AppSettings.Settings[appSetting.Key];
|
||||
value.Should().NotBeNull($"AppSetting with key '{appSetting.Key}' not found in config file.");
|
||||
value.Value.Should().Be(appSetting.Value, $"For AppSetting '{appSetting.Key}' - Expected Value '{appSetting.Value}', Actual '{ value.Value}'");
|
||||
}
|
||||
}
|
||||
|
||||
[WindowsOnlyFact]
|
||||
public void Build_Generates_Redirects_For_App_Without_Config()
|
||||
{
|
||||
var redirects = GetRedirects(_appWithoutConfigBuildOutput);
|
||||
VerifyRedirects(redirects, ExpectedBindingsAppNoConfig);
|
||||
|
||||
var commandResult = new TestCommand(_appWithoutConfigBuildOutput)
|
||||
.Execute();
|
||||
commandResult.Should().Pass();
|
||||
}
|
||||
|
||||
[WindowsOnlyFact]
|
||||
public void Publish_Generates_Redirects_For_App_Without_Config()
|
||||
{
|
||||
var redirects = GetRedirects(_appWithoutConfigPublishOutput);
|
||||
VerifyRedirects(redirects, ExpectedBindingsAppNoConfig);
|
||||
|
||||
var commandResult = new TestCommand(_appWithoutConfigPublishOutput)
|
||||
.Execute();
|
||||
commandResult.Should().Pass();
|
||||
}
|
||||
|
||||
[WindowsOnlyFact]
|
||||
public void Build_Generates_Redirects_For_Executable_Dependency()
|
||||
{
|
||||
var redirects = GetRedirects(_executableDependencyBuildOutput);
|
||||
VerifyRedirects(redirects, ExpectedBindingsAppNoConfig);
|
||||
|
||||
var commandResult = new TestCommand(_executableDependencyBuildOutput)
|
||||
.Execute();
|
||||
commandResult.Should().Pass();
|
||||
}
|
||||
|
||||
//[WindowsOnlyFact]
|
||||
public void Publish_Generates_Redirects_For_Executable_Dependency()
|
||||
{
|
||||
var redirects = GetRedirects(_executableDependencyPublishOutput);
|
||||
VerifyRedirects(redirects, ExpectedBindingsAppNoConfig);
|
||||
|
||||
var commandResult = new TestCommand(_executableDependencyPublishOutput)
|
||||
.Execute();
|
||||
commandResult.Should().Pass();
|
||||
}
|
||||
|
||||
[WindowsOnlyFact]
|
||||
public void Build_Generates_Redirects_For_App_With_Config()
|
||||
{
|
||||
var redirects = GetRedirects(_appWithConfigBuildOutput);
|
||||
VerifyRedirects(redirects, ExpectedBindingsAppWithConfig);
|
||||
VerifyAppSettings(_appWithConfigBuildOutput);
|
||||
|
||||
var commandResult = new TestCommand(_appWithConfigBuildOutput)
|
||||
.Execute();
|
||||
commandResult.Should().Pass();
|
||||
}
|
||||
|
||||
[WindowsOnlyFact]
|
||||
public void Publish_Generates_Redirects_For_App_With_Config()
|
||||
{
|
||||
var redirects = GetRedirects(_appWithConfigPublishOutput);
|
||||
VerifyRedirects(redirects, ExpectedBindingsAppWithConfig);
|
||||
VerifyAppSettings(_appWithConfigPublishOutput);
|
||||
|
||||
var commandResult = new TestCommand(_appWithConfigPublishOutput)
|
||||
.Execute();
|
||||
commandResult.Should().Pass();
|
||||
}
|
||||
}
|
||||
}
|
21
test/binding-redirects.Tests/binding-redirects.Tests.xproj
Normal file
21
test/binding-redirects.Tests/binding-redirects.Tests.xproj
Normal file
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0.23107" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0.23107</VisualStudioVersion>
|
||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>27dbf851-f2e3-4fd5-bf4d-a73c81933283</ProjectGuid>
|
||||
<RootNamespace>binding-redirects.Tests</RootNamespace>
|
||||
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\..\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
|
||||
<OutputPath Condition="'$(OutputPath)'=='' ">..\..\artifacts\bin</OutputPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Service Include="{9b56c4a1-b027-48c1-8050-e344f0630b98}" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VSToolsPath)\DNX\Microsoft.DNX.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||
</Project>
|
23
test/binding-redirects.Tests/project.json
Normal file
23
test/binding-redirects.Tests/project.json
Normal file
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"version": "1.0.0-*",
|
||||
"dependencies": {
|
||||
"xunit": "2.1.0",
|
||||
"dotnet-test-xunit": "1.0.0-rc2-157751-46",
|
||||
"Microsoft.NETCore.Platforms": "1.0.1-*",
|
||||
"Microsoft.DotNet.Tools.Tests.Utilities": {
|
||||
"target": "project"
|
||||
}
|
||||
},
|
||||
"frameworks": {
|
||||
"net451": {
|
||||
"frameworkAssemblies": {
|
||||
"System.Configuration": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"runtimes": {
|
||||
"win7-x64": {},
|
||||
"win7-x86": {}
|
||||
},
|
||||
"testRunner": "xunit"
|
||||
}
|
Loading…
Reference in a new issue