From 758f724832e3fd46f60c3716a86a22b8587517cb Mon Sep 17 00:00:00 2001 From: Nikolay Pianikov Date: Mon, 5 Sep 2016 19:09:05 +0300 Subject: [PATCH] 30 Error message "File type is not supported" when uses .nunit configuration file - move all logic related to .nunit config files into MasterTestRunner --- .../Runners/AbstractTestRunner.cs | 41 +------ .../Runners/AggregatingTestRunner.cs | 12 +- .../nunit.engine/Runners/DirectTestRunner.cs | 9 -- .../nunit.engine/Runners/MasterTestRunner.cs | 103 ++++++++++++++---- .../nunit.engine/Services/DriverService.cs | 2 +- 5 files changed, 89 insertions(+), 78 deletions(-) diff --git a/src/NUnitEngine/nunit.engine/Runners/AbstractTestRunner.cs b/src/NUnitEngine/nunit.engine/Runners/AbstractTestRunner.cs index 686b2bcee..e6fc72b33 100644 --- a/src/NUnitEngine/nunit.engine/Runners/AbstractTestRunner.cs +++ b/src/NUnitEngine/nunit.engine/Runners/AbstractTestRunner.cs @@ -23,7 +23,6 @@ using System; using System.ComponentModel; -using System.IO; using NUnit.Engine.Services; namespace NUnit.Engine.Runners @@ -59,29 +58,7 @@ public AbstractTestRunner(IServiceLocator services, TestPackage package) /// /// The TestPackage for which this is the runner /// - protected TestPackage TestPackage - { - get - { - return _testPackage; - } - - set - { - _testPackage = value; - - if (IsProjectPackage(_testPackage) && _testPackage.SubPackages.Count == 0) - { - // Some files in the top level package may be projects. - // Expand them so that they contain subprojects for - // each contained assembly. - if (File.Exists(TestPackage.FullName) && ProjectService.CanLoadFrom(TestPackage.FullName)) - { - ProjectService.ExpandProjectPackage(_testPackage); - } - } - } - } + protected TestPackage TestPackage { get; set; } /// /// The result of the last call to LoadPackage @@ -237,7 +214,7 @@ public AsyncTestEngineResult RunAsync(ITestEventListener listener, TestFilter fi { return RunTestsAsync(listener, filter); } - + #endregion #region IDisposable Members @@ -250,8 +227,6 @@ public void Dispose() protected bool _disposed = false; - private TestPackage _testPackage; - protected virtual void Dispose(bool disposing) { if (!_disposed) @@ -264,17 +239,5 @@ protected virtual void Dispose(bool disposing) } #endregion - - #region Helper Methods - - protected bool IsProjectPackage(TestPackage package) - { - return package != null - && ProjectService != null - && !string.IsNullOrEmpty(package.FullName) - && ProjectService.CanLoadFrom(package.FullName); - } - - #endregion } } diff --git a/src/NUnitEngine/nunit.engine/Runners/AggregatingTestRunner.cs b/src/NUnitEngine/nunit.engine/Runners/AggregatingTestRunner.cs index 920719754..2431804c6 100644 --- a/src/NUnitEngine/nunit.engine/Runners/AggregatingTestRunner.cs +++ b/src/NUnitEngine/nunit.engine/Runners/AggregatingTestRunner.cs @@ -66,11 +66,7 @@ public override TestEngineResult Explore(TestFilter filter) foreach (ITestEngineRunner runner in _runners) results.Add(runner.Explore(filter)); - TestEngineResult result = ResultHelper.Merge(results); - - return IsProjectPackage(TestPackage) - ? result.MakePackageResult(TestPackage.Name, TestPackage.FullName) - : result; + return ResultHelper.Merge(results); } /// @@ -159,11 +155,7 @@ protected override TestEngineResult RunTests(ITestEventListener listener, TestFi if (disposeRunners) _runners.Clear(); - TestEngineResult result = ResultHelper.Merge(results); - - return IsProjectPackage(TestPackage) - ? result.MakePackageResult(TestPackage.Name, TestPackage.FullName) - : result; + return ResultHelper.Merge(results); } /// diff --git a/src/NUnitEngine/nunit.engine/Runners/DirectTestRunner.cs b/src/NUnitEngine/nunit.engine/Runners/DirectTestRunner.cs index 914c3d0a6..c3e1a4f29 100644 --- a/src/NUnitEngine/nunit.engine/Runners/DirectTestRunner.cs +++ b/src/NUnitEngine/nunit.engine/Runners/DirectTestRunner.cs @@ -73,9 +73,6 @@ public override TestEngineResult Explore(TestFilter filter) foreach (IFrameworkDriver driver in _drivers) result.Add(driver.Explore(filter.Text)); - if (IsProjectPackage(TestPackage)) - result = result.MakePackageResult(TestPackage.Name, TestPackage.FullName); - return result; } @@ -115,9 +112,6 @@ protected override TestEngineResult LoadPackage() _drivers.Add(driver); } - if (IsProjectPackage(TestPackage)) - result = result.MakePackageResult(TestPackage.Name, TestPackage.FullName); - return result; } @@ -159,9 +153,6 @@ protected override TestEngineResult RunTests(ITestEventListener listener, TestFi result.Add(driver.Run(listener, filter.Text)); } - if (IsProjectPackage(TestPackage)) - result = result.MakePackageResult(TestPackage.Name, TestPackage.FullName); - if (_assemblyResolver != null) { var packages = TestPackage.SubPackages; diff --git a/src/NUnitEngine/nunit.engine/Runners/MasterTestRunner.cs b/src/NUnitEngine/nunit.engine/Runners/MasterTestRunner.cs index 63d0d5076..407340e0a 100644 --- a/src/NUnitEngine/nunit.engine/Runners/MasterTestRunner.cs +++ b/src/NUnitEngine/nunit.engine/Runners/MasterTestRunner.cs @@ -22,7 +22,6 @@ // *********************************************************************** using System; -using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; @@ -36,25 +35,25 @@ namespace NUnit.Engine.Runners public class MasterTestRunner : ITestRunner { private const string TEST_RUN_ELEMENT = "test-run"; - - private ITestEngineRunner _engineRunner; - - private IServiceLocator _services; - private IRuntimeFrameworkService _runtimeService; - private ExtensionService _extensionService; - private IProjectService _projectService; - private ITestRunnerFactory _testRunnerFactory; + private readonly ITestEngineRunner _engineRunner; + private readonly IServiceLocator _services; + private readonly IRuntimeFrameworkService _runtimeService; + private readonly ExtensionService _extensionService; + private readonly IProjectService _projectService; + private bool _disposed; public MasterTestRunner(IServiceLocator services, TestPackage package) { + if (services == null) throw new ArgumentNullException("services"); + if (package == null) throw new ArgumentNullException("package"); + _services = services; TestPackage = package; - _testRunnerFactory = _services.GetService(); _projectService = _services.GetService(); _runtimeService = _services.GetService(); _extensionService = _services.GetService(); - _engineRunner = _testRunnerFactory.MakeTestRunner(package); + _engineRunner = _services.GetService().MakeTestRunner(package); } #region Properties @@ -139,7 +138,8 @@ public int CountTestCases(TestFilter filter) /// An XmlNode giving the result of the test execution public XmlNode Run(ITestEventListener listener, TestFilter filter) { - return RunTests(listener, filter).Xml; + LoadPackage(); + return PrepareResult(RunTests(listener, filter)).Xml; } /// @@ -151,6 +151,7 @@ public XmlNode Run(ITestEventListener listener, TestFilter filter) /// public ITestRun RunAsync(ITestEventListener listener, TestFilter filter) { + LoadPackage(); return _engineRunner.RunAsync(listener, filter); } @@ -171,7 +172,8 @@ public void StopRun(bool force) /// An XmlNode representing the tests found. public XmlNode Explore(TestFilter filter) { - return _engineRunner.Explore(filter) + LoadPackage(); + return PrepareResult(_engineRunner.Explore(filter)) .Aggregate(TEST_RUN_ELEMENT, TestPackage.Name, TestPackage.FullName).Xml; } @@ -185,8 +187,6 @@ public void Dispose() GC.SuppressFinalize(this); } - private bool _disposed = false; - /// /// Dispose of this object. /// @@ -215,6 +215,11 @@ private void LoadPackage() // in case the client runner missed them. ValidatePackageSettings(); + // Some files in the top level package may be projects. + // Expand them so that they contain subprojects for + // each contained assembly. + EnsurePackagesAreExpanded(TestPackage); + // Use SelectRuntimeFramework for its side effects. // Info will be left behind in the package about // each contained assembly, which will subsequently @@ -231,6 +236,54 @@ private void LoadPackage() LoadResult = _engineRunner.Load().Aggregate(TEST_RUN_ELEMENT, TestPackage.Name, TestPackage.FullName); } + private TestEngineResult PrepareResult(TestEngineResult result) + { + if (result == null) throw new ArgumentNullException("result"); + + if (!IsProjectPackage(TestPackage)) + { + return result; + } + + return result.MakePackageResult(TestPackage.Name, TestPackage.FullName); + } + + private void EnsurePackagesAreExpanded(TestPackage package) + { + if (package == null) throw new ArgumentNullException("package"); + + foreach (var subPackage in package.SubPackages) + { + EnsurePackagesAreExpanded(subPackage); + } + + if (package.SubPackages.Count == 0 && IsProjectPackage(package)) + { + ExpandProjects(package); + } + } + + private bool IsProjectPackage(TestPackage package) + { + if (package == null) throw new ArgumentNullException("package"); + + return + _projectService != null + && !string.IsNullOrEmpty(package.FullName) + && _projectService.CanLoadFrom(package.FullName); + } + + private void ExpandProjects(TestPackage package) + { + if (package == null) throw new ArgumentNullException("package"); + + string packageName = package.FullName; + if (File.Exists(packageName) && _projectService.CanLoadFrom(packageName)) + { + _projectService.ExpandProjectPackage(package); + } + } + // Any Errors thrown from this method indicate that the client // runner is putting invalid values into the package. private void ValidatePackageSettings() @@ -327,6 +380,11 @@ private static void InsertCommandLineElement(XmlNode resultNode) { var doc = resultNode.OwnerDocument; + if (doc == null) + { + return; + } + XmlNode cmd = doc.CreateElement("command-line"); resultNode.InsertAfter(cmd, null); @@ -340,12 +398,19 @@ private static void InsertFilterElement(XmlNode resultNode, TestFilter filter) var tempNode = XmlHelper.CreateXmlNode(filter.Text); // Don't include it if it's an empty filter - if (tempNode.ChildNodes.Count > 0) + if (tempNode.ChildNodes.Count <= 0) { - var doc = resultNode.OwnerDocument; - var filterElement = doc.ImportNode(tempNode, true); - resultNode.InsertAfter(filterElement, null); + return; } + + var doc = resultNode.OwnerDocument; + if (doc == null) + { + return; + } + + var filterElement = doc.ImportNode(tempNode, true); + resultNode.InsertAfter(filterElement, null); } #endregion diff --git a/src/NUnitEngine/nunit.engine/Services/DriverService.cs b/src/NUnitEngine/nunit.engine/Services/DriverService.cs index 8fbb24642..cc75ce2d2 100644 --- a/src/NUnitEngine/nunit.engine/Services/DriverService.cs +++ b/src/NUnitEngine/nunit.engine/Services/DriverService.cs @@ -38,7 +38,7 @@ namespace NUnit.Engine.Services /// public class DriverService : Service, IDriverService { - IList _factories = new List(); + readonly IList _factories = new List(); #region IDriverService Members