From fd47fcf4e74514e71916cc831bc965e4400b7e11 Mon Sep 17 00:00:00 2001 From: Charlie Poole Date: Sat, 31 Dec 2022 23:26:25 -0800 Subject: [PATCH 1/2] Resolve WindowsDesktop and AspNetCore tests correctly --- NUnitConsole.sln | 1 - build.cake | 1 - cake/build-settings.cake | 3 + cake/package-tests.cake | 1 - .../nunit3-netcore-console.csproj | 4 - .../nunit-agent/nunit-agent.csproj | 5 -- .../Internal/TestAssemblyResolver.cs | 83 ++++++++++++++++++- 7 files changed, 84 insertions(+), 14 deletions(-) delete mode 100644 cake/package-tests.cake diff --git a/NUnitConsole.sln b/NUnitConsole.sln index c74e1c0ca..f02ae64de 100644 --- a/NUnitConsole.sln +++ b/NUnitConsole.sln @@ -120,7 +120,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cake", "cake", "{9BCA00E2-D cake\header-check.cake = cake\header-check.cake cake\package-checks.cake = cake\package-checks.cake cake\package-definitions.cake = cake\package-definitions.cake - cake\package-tests.cake = cake\package-tests.cake cake\packages.cake = cake\packages.cake cake\test-results.cake = cake\test-results.cake cake\utilities.cake = cake\utilities.cake diff --git a/build.cake b/build.cake index e1992c37e..63f54e66d 100644 --- a/build.cake +++ b/build.cake @@ -5,7 +5,6 @@ static string Target; Target = Argument("target", Argument("t", "Default")); #load cake/header-check.cake #load cake/package-checks.cake #load cake/test-results.cake -#load cake/package-tests.cake #load cake/versioning.cake #load cake/utilities.cake #load cake/package-definitions.cake diff --git a/cake/build-settings.cake b/cake/build-settings.cake index db58bb3d3..7320b7fe7 100644 --- a/cake/build-settings.cake +++ b/cake/build-settings.cake @@ -128,6 +128,9 @@ public class BuildSettings Net50PlusNet60Test, Net60AspNetCoreTest }; + if (IsRunningOnWindows) + NetCoreRunnerTests.Add(Net60WindowsFormsTest); + AllPackages = new PackageDefinition[] { ConsoleNuGetPackage = new NUnitConsoleNuGetPackage(this), ConsoleRunnerNuGetPackage = new NUnitConsoleRunnerNuGetPackage(this), diff --git a/cake/package-tests.cake b/cake/package-tests.cake deleted file mode 100644 index 8b1378917..000000000 --- a/cake/package-tests.cake +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/NUnitConsole/nunit3-netcore-console/nunit3-netcore-console.csproj b/src/NUnitConsole/nunit3-netcore-console/nunit3-netcore-console.csproj index 06805e77f..07456df04 100644 --- a/src/NUnitConsole/nunit3-netcore-console/nunit3-netcore-console.csproj +++ b/src/NUnitConsole/nunit3-netcore-console/nunit3-netcore-console.csproj @@ -11,10 +11,6 @@ ..\..\..\nunit.ico - - - - NUnit Console NUnit Console Runner ($(TargetFramework)) diff --git a/src/NUnitEngine/nunit-agent/nunit-agent.csproj b/src/NUnitEngine/nunit-agent/nunit-agent.csproj index bb25a5f42..3a08d9f3f 100644 --- a/src/NUnitEngine/nunit-agent/nunit-agent.csproj +++ b/src/NUnitEngine/nunit-agent/nunit-agent.csproj @@ -14,11 +14,6 @@ Always - - - - - NUnit Engine NUnit Agent ($(TargetFramework)) diff --git a/src/NUnitEngine/nunit.engine.core/Internal/TestAssemblyResolver.cs b/src/NUnitEngine/nunit.engine.core/Internal/TestAssemblyResolver.cs index 3e0edaf78..25d5d2de0 100644 --- a/src/NUnitEngine/nunit.engine.core/Internal/TestAssemblyResolver.cs +++ b/src/NUnitEngine/nunit.engine.core/Internal/TestAssemblyResolver.cs @@ -10,6 +10,7 @@ using System.Runtime.Loader; using Microsoft.Extensions.DependencyModel; using Microsoft.Extensions.DependencyModel.Resolution; +using Microsoft.Win32; namespace NUnit.Engine.Internal { @@ -18,13 +19,25 @@ internal sealed class TestAssemblyResolver : IDisposable private readonly ICompilationAssemblyResolver _assemblyResolver; private readonly DependencyContext _dependencyContext; private readonly AssemblyLoadContext _loadContext; - private readonly string _basePath; + + private static readonly string INSTALL_DIR = GetDotNetInstallDirectory(); + private static readonly string WINDOWS_DESKTOP_DIR = Path.Combine(INSTALL_DIR, "shared", "Microsoft.WindowsDesktop.App"); + private static readonly string ASP_NET_CORE_DIR = Path.Combine(INSTALL_DIR, "shared", "Microsoft.AspNetCore.App"); + private static readonly List AdditionalFrameworkDirectories; + + static TestAssemblyResolver() + { + AdditionalFrameworkDirectories = new List(); + if (Directory.Exists(WINDOWS_DESKTOP_DIR)) + AdditionalFrameworkDirectories.Add(WINDOWS_DESKTOP_DIR); + if (Directory.Exists(ASP_NET_CORE_DIR)) + AdditionalFrameworkDirectories.Add(ASP_NET_CORE_DIR); + } public TestAssemblyResolver(AssemblyLoadContext loadContext, string assemblyPath) { _loadContext = loadContext; _dependencyContext = DependencyContext.Load(loadContext.LoadFromAssemblyPath(assemblyPath)); - _basePath = Path.GetDirectoryName(assemblyPath); _assemblyResolver = new CompositeCompilationAssemblyResolver(new ICompilationAssemblyResolver[] { @@ -64,8 +77,74 @@ private Assembly OnResolving(AssemblyLoadContext context, AssemblyName name) } } + foreach(string frameworkDirectory in AdditionalFrameworkDirectories) + { + var versionDir = FindBestVersionDir(frameworkDirectory, name.Version); + if (versionDir != null) + { + string candidate = Path.Combine(frameworkDirectory, versionDir, name.Name + ".dll"); + if (File.Exists(candidate)) + return _loadContext.LoadFromAssemblyPath(candidate); + } + } + return null; } + + private static string GetDotNetInstallDirectory() + { + if (Path.DirectorySeparatorChar == '\\') + { + // Running on Windows so use registry + RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\dotnet\SetUp\InstalledVersions\x64\sharedHost\"); + return (string)key?.GetValue("Path"); + } + else + return "/usr/shared/dotnet/"; + } + + private static string FindBestVersionDir(string libraryDir, Version targetVersion) + { + string target = targetVersion.ToString(); + Version bestVersion = new Version(0,0); + foreach (var subdir in Directory.GetDirectories(libraryDir)) + { + Version version; + if (TryGetVersionFromString(Path.GetFileName(subdir), out version)) + if (version >= targetVersion) + if (bestVersion.Major == 0 || bestVersion > version) + bestVersion = version; + } + + return bestVersion.Major > 0 + ? bestVersion.ToString() + : null; + } + + private static bool TryGetVersionFromString(string text, out Version newVersion) + { + const string VERSION_CHARS = ".0123456789"; + + int len = 0; + foreach (char c in text) + { + if (VERSION_CHARS.IndexOf(c) >= 0) + len++; + else + break; + } + + try + { + newVersion = new Version(text.Substring(0, len)); + return true; + } + catch + { + newVersion = new Version(); + return false; + } + } } } #endif From 9c4249557db2a4d6bf999775ee111c273b8c0a2e Mon Sep 17 00:00:00 2001 From: Charlie Poole Date: Tue, 3 Jan 2023 15:54:05 -0800 Subject: [PATCH 2/2] Changes from review --- .../nunit.engine.core/Internal/TestAssemblyResolver.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/NUnitEngine/nunit.engine.core/Internal/TestAssemblyResolver.cs b/src/NUnitEngine/nunit.engine.core/Internal/TestAssemblyResolver.cs index 25d5d2de0..5d8357a85 100644 --- a/src/NUnitEngine/nunit.engine.core/Internal/TestAssemblyResolver.cs +++ b/src/NUnitEngine/nunit.engine.core/Internal/TestAssemblyResolver.cs @@ -7,6 +7,7 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.InteropServices; using System.Runtime.Loader; using Microsoft.Extensions.DependencyModel; using Microsoft.Extensions.DependencyModel.Resolution; @@ -93,7 +94,7 @@ private Assembly OnResolving(AssemblyLoadContext context, AssemblyName name) private static string GetDotNetInstallDirectory() { - if (Path.DirectorySeparatorChar == '\\') + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { // Running on Windows so use registry RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\dotnet\SetUp\InstalledVersions\x64\sharedHost\");