From 3c06abb113d416812d8d36d62fbc3ad602ac347d Mon Sep 17 00:00:00 2001 From: Charlie Poole Date: Sun, 9 Feb 2025 20:26:23 -0800 Subject: [PATCH] Fix error in use of --extensionDirectory --- package-tests.cake | 4 +- .../nunit3-console/ConsoleRunner.cs | 4 +- .../Services/DriverService.cs | 40 ++++++++------ .../nunit.engine/Services/ProjectService.cs | 52 ++++++++++--------- 4 files changed, 56 insertions(+), 44 deletions(-) diff --git a/package-tests.cake b/package-tests.cake index 0f371e852..c39888913 100644 --- a/package-tests.cake +++ b/package-tests.cake @@ -198,7 +198,7 @@ AddToBothLists(new PackageTest( new ExpectedResult("Passed") { Assemblies = new[] { new ExpectedAssemblyResult("WpfTest.dll", "netcore-8.0") } })); ////////////////////////////////////////////////////////////////////// -// RUN TESTS USING EACH OF OUR EXTENSIONS +// TESTS USING EACH OF OUR EXTENSIONS ////////////////////////////////////////////////////////////////////// // NUnit Project Loader Tests @@ -287,7 +287,7 @@ StandardRunnerTests.Add(new PackageTest( StandardRunnerTests.Add(new PackageTest( 1, "V2FrameworkDriverTest", "Run mock-assembly-v2 using the V2 Driver out of process", - "v2-tests/net462/mock-assembly-v2.dll --list-extensions", + "v2-tests/net462/mock-assembly-v2.dll", new ExpectedResult("Failed") { Total = 28, diff --git a/src/NUnitConsole/nunit3-console/ConsoleRunner.cs b/src/NUnitConsole/nunit3-console/ConsoleRunner.cs index 606fec6d0..366409715 100644 --- a/src/NUnitConsole/nunit3-console/ConsoleRunner.cs +++ b/src/NUnitConsole/nunit3-console/ConsoleRunner.cs @@ -52,7 +52,7 @@ public class ConsoleRunner public ConsoleRunner(ITestEngine engine, ConsoleOptions options, ExtendedTextWriter writer) { - Guard.ArgumentNotNull(_engine = engine, nameof(engine)); + Guard.ArgumentNotNull(_engine = engine, nameof(engine)); Guard.ArgumentNotNull(_options = options, nameof(options)); Guard.ArgumentNotNull(_outWriter = writer, nameof(writer)); @@ -71,7 +71,7 @@ public ConsoleRunner(ITestEngine engine, ConsoleOptions options, ExtendedTextWri foreach (string extensionDirectory in extensionPath.Split(new[] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries)) _extensionService.FindExtensionAssemblies(extensionDirectory); - foreach (string extensionDirectory in _options.ExtensionDirectories) + foreach (string extensionDirectory in _options.ExtensionDirectories) _extensionService.FindExtensionAssemblies(extensionDirectory); _workDirectory = options.WorkDirectory; diff --git a/src/NUnitEngine/nunit.engine.core/Services/DriverService.cs b/src/NUnitEngine/nunit.engine.core/Services/DriverService.cs index ad9a7b5fc..8220831b0 100644 --- a/src/NUnitEngine/nunit.engine.core/Services/DriverService.cs +++ b/src/NUnitEngine/nunit.engine.core/Services/DriverService.cs @@ -20,7 +20,8 @@ public class DriverService : Service, IDriverService { static ILogger log = InternalTrace.GetLogger("DriverService"); - readonly IList _factories = new List(); + private ExtensionService _extensionService; + private IList _factories; /// /// Get a driver suitable for use with a particular test assembly. @@ -55,6 +56,9 @@ public IFrameworkDriver GetDriver(AppDomain domain, string assemblyPath, string " test assemblies are not supported by this version of the engine"); } + if (_factories == null) + InitializeDriverFactories(); + try { using (var assemblyDef = AssemblyDefinition.ReadAssembly(assemblyPath)) @@ -104,20 +108,7 @@ public override void StartService() try { - var extensionService = ServiceContext.GetService(); - if (extensionService != null) - { - foreach (IDriverFactory factory in extensionService.GetExtensions()) - _factories.Add(factory); - -#if NETFRAMEWORK - var node = extensionService.GetExtensionNode("/NUnit/Engine/NUnitV2Driver"); - if (node != null) - _factories.Add(new NUnit2DriverFactory(node)); -#endif - } - - _factories.Add(new NUnit3DriverFactory()); + _extensionService = ServiceContext.GetService(); Status = ServiceStatus.Started; } @@ -127,5 +118,24 @@ public override void StartService() throw; } } + + private void InitializeDriverFactories() + { + _factories = new List(); + + if (_extensionService != null) + { + foreach (IDriverFactory factory in _extensionService.GetExtensions()) + _factories.Add(factory); + +#if NETFRAMEWORK + var node = _extensionService.GetExtensionNode("/NUnit/Engine/NUnitV2Driver"); + if (node != null) + _factories.Add(new NUnit2DriverFactory(node)); +#endif + } + + _factories.Add(new NUnit3DriverFactory()); + } } } diff --git a/src/NUnitEngine/nunit.engine/Services/ProjectService.cs b/src/NUnitEngine/nunit.engine/Services/ProjectService.cs index 10d0628f5..df65635a6 100644 --- a/src/NUnitEngine/nunit.engine/Services/ProjectService.cs +++ b/src/NUnitEngine/nunit.engine/Services/ProjectService.cs @@ -12,10 +12,14 @@ namespace NUnit.Engine.Services /// public class ProjectService : Service, IProjectService { - Dictionary _extensionIndex = new Dictionary(); + Dictionary _extensionIndex; + ExtensionService _extensionService; public bool CanLoadFrom(string path) { + if (_extensionIndex == null) + InitializeExtensionIndex(); + ExtensionNode node = GetNodeForPath(path); if (node != null) { @@ -84,40 +88,38 @@ public override void StartService() { try { - var extensionService = ServiceContext.GetService(); + _extensionService = ServiceContext.GetService(); - if (extensionService == null) - Status = ServiceStatus.Started; - else if (extensionService.Status != ServiceStatus.Started) - Status = ServiceStatus.Error; - else - { - Status = ServiceStatus.Started; - - foreach (var node in extensionService.GetExtensionNodes()) - { - foreach (string ext in node.GetValues("FileExtension")) - { - if (ext != null) - { - if (_extensionIndex.ContainsKey(ext)) - throw new NUnitEngineException(string.Format("ProjectLoader extension {0} is already handled by another extension.", ext)); - - _extensionIndex.Add(ext, node); - } - } - } - } + Status = _extensionService == null || _extensionService.Status == ServiceStatus.Started + ? ServiceStatus.Started : ServiceStatus.Error; } catch { - // TODO: Should we just ignore any addin that doesn't load? Status = ServiceStatus.Error; throw; } } } + private void InitializeExtensionIndex() + { + _extensionIndex = new Dictionary(); + + foreach (var node in _extensionService.GetExtensionNodes()) + { + foreach (string ext in node.GetValues("FileExtension")) + { + if (ext != null) + { + if (_extensionIndex.ContainsKey(ext)) + throw new NUnitEngineException(string.Format("ProjectLoader extension {0} is already handled by another extension.", ext)); + + _extensionIndex.Add(ext, node); + } + } + } + } + private IProject LoadFrom(string path) { if (File.Exists(path))