From 215b527b0141ade5e967a8510eba02b346bf9ce2 Mon Sep 17 00:00:00 2001 From: Vagisha Nidhi Date: Wed, 17 Apr 2019 13:30:48 +0530 Subject: [PATCH 1/2] Data collector extensibility --- .../TestPlatform.cs | 7 ++- .../Client/ProxyExecutionManager.cs | 1 + .../InProcDataCollectionExtensionManager.cs | 40 ++++++++++++-- .../Hosting/DotnetTestHostManager.cs | 11 +++- .../Client/ProxyExecutionManagerTests.cs | 32 +++++++++++- ...ProcDataCollectionExtensionManagerTests.cs | 52 ++++++++++++++++--- .../Hosting/DotnetTestHostManagerTests.cs | 10 ++++ 7 files changed, 139 insertions(+), 14 deletions(-) diff --git a/src/Microsoft.TestPlatform.Client/TestPlatform.cs b/src/Microsoft.TestPlatform.Client/TestPlatform.cs index 47747ae81b..34f5b85a17 100644 --- a/src/Microsoft.TestPlatform.Client/TestPlatform.cs +++ b/src/Microsoft.TestPlatform.Client/TestPlatform.cs @@ -225,7 +225,12 @@ private void AddExtensionAssemblies(string runSettings) continue; } - var extensionAssemblies = new List(this.fileHelper.EnumerateFiles(adapterPath, SearchOption.AllDirectories, TestPlatformConstants.TestAdapterEndsWithPattern, TestPlatformConstants.TestLoggerEndsWithPattern, TestPlatformConstants.RunTimeEndsWithPattern)); + var extensionAssemblies = new List(this.fileHelper.EnumerateFiles(adapterPath, SearchOption.AllDirectories, + TestPlatformConstants.TestAdapterEndsWithPattern, + TestPlatformConstants.TestLoggerEndsWithPattern, + TestPlatformConstants.DataCollectorEndsWithPattern, + TestPlatformConstants.RunTimeEndsWithPattern)); + if (extensionAssemblies.Count > 0) { this.UpdateExtensions(extensionAssemblies, skipExtensionFilters: false); diff --git a/src/Microsoft.TestPlatform.CrossPlatEngine/Client/ProxyExecutionManager.cs b/src/Microsoft.TestPlatform.CrossPlatEngine/Client/ProxyExecutionManager.cs index bff3240c48..8ef7f8c375 100644 --- a/src/Microsoft.TestPlatform.CrossPlatEngine/Client/ProxyExecutionManager.cs +++ b/src/Microsoft.TestPlatform.CrossPlatEngine/Client/ProxyExecutionManager.cs @@ -259,6 +259,7 @@ private void LogMessage(TestMessageLevel testMessageLevel, string message) private void InitializeExtensions(IEnumerable sources) { var extensions = TestPluginCache.Instance.GetExtensionPaths(TestPlatformConstants.TestAdapterEndsWithPattern, this.skipDefaultAdapters); + extensions = extensions.Concat(TestPluginCache.Instance.GetExtensionPaths(TestPlatformConstants.DataCollectorEndsWithPattern, true)).ToList(); // Filter out non existing extensions var nonExistingExtensions = extensions.Where(extension => !this.fileHelper.Exists(extension)); diff --git a/src/Microsoft.TestPlatform.CrossPlatEngine/DataCollection/InProcDataCollectionExtensionManager.cs b/src/Microsoft.TestPlatform.CrossPlatEngine/DataCollection/InProcDataCollectionExtensionManager.cs index 5c16f9eb3f..a86df5bb5a 100644 --- a/src/Microsoft.TestPlatform.CrossPlatEngine/DataCollection/InProcDataCollectionExtensionManager.cs +++ b/src/Microsoft.TestPlatform.CrossPlatEngine/DataCollection/InProcDataCollectionExtensionManager.cs @@ -9,12 +9,15 @@ namespace Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.DataCollection using System.Linq; using System.Reflection; using System.Xml; + using Microsoft.VisualStudio.TestPlatform.Common.ExtensionFramework; using Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.DataCollection.Interfaces; using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.DataCollection; using Microsoft.VisualStudio.TestPlatform.ObjectModel.DataCollector.InProcDataCollector; using Microsoft.VisualStudio.TestPlatform.ObjectModel.InProcDataCollector; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Utilities; + using Microsoft.VisualStudio.TestPlatform.Utilities.Helpers; + using Microsoft.VisualStudio.TestPlatform.Utilities.Helpers.Interfaces; /// /// The in process data collection extension manager. @@ -25,8 +28,14 @@ internal class InProcDataCollectionExtensionManager private IDataCollectionSink inProcDataCollectionSink; + private const string DataCollectorEndsWithPattern = @"Collector.dll"; + private string defaultCodeBase; + private List codeBasePaths; + + private IFileHelper fileHelper; + /// /// Loaded in-proc datacollectors collection /// @@ -45,10 +54,23 @@ internal class InProcDataCollectionExtensionManager /// The default codebase to be used by inproc data collector /// public InProcDataCollectionExtensionManager(string runSettings, ITestEventsPublisher testEventsPublisher, string defaultCodeBase) + : this(runSettings, testEventsPublisher, defaultCodeBase, new FileHelper()) + {} + + protected InProcDataCollectionExtensionManager(string runSettings, ITestEventsPublisher testEventsPublisher, string defaultCodeBase, IFileHelper fileHelper) { this.InProcDataCollectors = new Dictionary(); this.inProcDataCollectionSink = new InProcDataCollectionSink(); this.defaultCodeBase = defaultCodeBase; + this.fileHelper = fileHelper; + this.codeBasePaths = new List { this.defaultCodeBase }; + + // Get Datacollector codebase paths from test plugin cache + var extensionPaths = TestPluginCache.Instance.GetExtensionPaths(DataCollectorEndsWithPattern); + foreach (var extensionPath in extensionPaths) + { + this.codeBasePaths.Add(Path.GetDirectoryName(extensionPath)); + } // Initialize InProcDataCollectors this.InitializeInProcDataCollectors(runSettings); @@ -215,13 +237,25 @@ private void InitializeInProcDataCollectors(string runSettings) /// /// Gets codebase for inproc datacollector - /// Uses default codebase if given path is not absolute path of inproc datacollector + /// Uses all codebasePaths to check where the datacollector exists /// - /// The run Settings. + /// The codebase. /// Codebase private string GetCodebase(string codeBase) { - return Path.IsPathRooted(codeBase) ? codeBase : Path.Combine(this.defaultCodeBase, codeBase); + if (!Path.IsPathRooted(codeBase)) + { + foreach (var extensionPath in this.codeBasePaths) + { + var path = Path.Combine(extensionPath, codeBase); + if (this.fileHelper.Exists(path)) + { + return path; + } + } + } + + return codeBase; } private IDictionary GetSessionStartProperties(SessionStartEventArgs sessionStartEventArgs) diff --git a/src/Microsoft.TestPlatform.TestHostProvider/Hosting/DotnetTestHostManager.cs b/src/Microsoft.TestPlatform.TestHostProvider/Hosting/DotnetTestHostManager.cs index 2d100f6c76..3391e9ea97 100644 --- a/src/Microsoft.TestPlatform.TestHostProvider/Hosting/DotnetTestHostManager.cs +++ b/src/Microsoft.TestPlatform.TestHostProvider/Hosting/DotnetTestHostManager.cs @@ -45,6 +45,7 @@ public class DotnetTestHostManager : ITestRuntimeProvider private const string DotnetTestHostUri = "HostProvider://DotnetTestHost"; private const string DotnetTestHostFriendlyName = "DotnetTestHost"; private const string TestAdapterRegexPattern = @"TestAdapter.dll"; + private const string DataCollectorRegexPattern = @"Collector.dll"; private IDotnetHostHelper dotnetHostHelper; @@ -238,14 +239,20 @@ public async Task LaunchTestHostAsync(TestProcessStartInfo testHostStartIn /// public IEnumerable GetTestPlatformExtensions(IEnumerable sources, IEnumerable extensions) { + List extensionPaths = new List(); var sourceDirectory = Path.GetDirectoryName(sources.Single()); if (!string.IsNullOrEmpty(sourceDirectory) && this.fileHelper.DirectoryExists(sourceDirectory)) { - return this.fileHelper.EnumerateFiles(sourceDirectory, SearchOption.TopDirectoryOnly, TestAdapterRegexPattern); + extensionPaths.AddRange(this.fileHelper.EnumerateFiles(sourceDirectory, SearchOption.TopDirectoryOnly, TestAdapterRegexPattern)); } - return Enumerable.Empty(); + if (extensions != null && extensions.Any()) + { + extensionPaths.AddRange(extensions.Where(x => x.EndsWith(DataCollectorRegexPattern, StringComparison.OrdinalIgnoreCase))); + } + + return extensionPaths; } /// diff --git a/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/Client/ProxyExecutionManagerTests.cs b/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/Client/ProxyExecutionManagerTests.cs index d96232555c..b142581f72 100644 --- a/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/Client/ProxyExecutionManagerTests.cs +++ b/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/Client/ProxyExecutionManagerTests.cs @@ -275,6 +275,7 @@ public void StartTestRunShouldInitializeExtensionsIfTestHostIsNotShared() [TestMethod] public void StartTestRunShouldInitializeExtensionsWithExistingExtensionsOnly() { + TestPluginCache.Instance = null; TestPluginCache.Instance.UpdateExtensions(new List { "abc.TestAdapter.dll", "def.TestAdapter.dll", "xyz.TestAdapter.dll" }, false); var expectedOutputPaths = new[] { "abc.TestAdapter.dll", "xyz.TestAdapter.dll" }; @@ -299,7 +300,36 @@ public void StartTestRunShouldInitializeExtensionsWithExistingExtensionsOnly() this.mockRequestSender.Verify(s => s.InitializeExecution(expectedOutputPaths), Times.Once); } - [TestMethod] + [TestMethod] + public void StartTestRunShouldInitializeExtensionsWithExistingDataCOllectorExtensions() + { + TestPluginCache.Instance = null; + TestPluginCache.Instance.UpdateExtensions(new List { "abc.TestAdapter.dll", "def.TestAdapter.dll", "xyz.TestAdapter.dll", "abc.DataCollector.dll" }, false); + var expectedOutputPaths = new[] { "abc.TestAdapter.dll", "xyz.TestAdapter.dll", "abc.DataCollector.dll" }; + + this.mockTestHostManager.SetupGet(th => th.Shared).Returns(false); + this.mockRequestSender.Setup(s => s.WaitForRequestHandlerConnection(It.IsAny(), It.IsAny())).Returns(true); + this.mockTestHostManager.Setup(th => th.GetTestPlatformExtensions(It.IsAny>(), It.IsAny>())).Returns((IEnumerable sources, IEnumerable extensions) => + { + return extensions.Select(extension => { return Path.GetFileName(extension); }); + }); + + this.mockFileHelper.Setup(fh => fh.Exists(It.IsAny())).Returns((string extensionPath) => + { + return !extensionPath.Contains("def.TestAdapter.dll"); + }); + + this.mockFileHelper.Setup(fh => fh.Exists("abc.TestAdapter.dll")).Returns(true); + this.mockFileHelper.Setup(fh => fh.Exists("xyz.TestAdapter.dll")).Returns(true); + this.mockFileHelper.Setup(fh => fh.Exists("abc.DataCollector.dll")).Returns(true); + + var mockTestRunEventsHandler = new Mock(); + this.testExecutionManager.StartTestRun(this.mockTestRunCriteria.Object, mockTestRunEventsHandler.Object); + + this.mockRequestSender.Verify(s => s.InitializeExecution(expectedOutputPaths), Times.Once); + } + + [TestMethod] public void SetupChannelShouldThrowExceptionIfClientConnectionTimeout() { this.mockRequestSender.Setup(s => s.WaitForRequestHandlerConnection(It.IsAny(), It.IsAny())).Returns(false); diff --git a/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/DataCollection/InProcDataCollectionExtensionManagerTests.cs b/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/DataCollection/InProcDataCollectionExtensionManagerTests.cs index 88d7aa95a5..de983142b3 100644 --- a/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/DataCollection/InProcDataCollectionExtensionManagerTests.cs +++ b/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/DataCollection/InProcDataCollectionExtensionManagerTests.cs @@ -8,11 +8,13 @@ namespace TestPlatform.CrossPlatEngine.UnitTests.DataCollection using System.Linq; using System.Reflection; using System.Xml; + using Microsoft.VisualStudio.TestPlatform.Common.ExtensionFramework; using Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.DataCollection; using Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.DataCollection.Interfaces; using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.DataCollection; using Microsoft.VisualStudio.TestPlatform.ObjectModel.DataCollector.InProcDataCollector; + using Microsoft.VisualStudio.TestPlatform.Utilities.Helpers.Interfaces; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; @@ -37,11 +39,20 @@ public class InProcDataCollectionExtensionManagerTests private Mock mockTestEventsPublisher; private TestableInProcDataCollectionExtensionManager inProcDataCollectionManager; private string defaultCodebase = "E:\\repos\\MSTest\\src\\managed\\TestPlatform\\TestImpactListener.Tests\\bin\\Debug"; + private Mock mockFileHelper; - public InProcDataCollectionExtensionManagerTests() + [TestInitialize] + public void TestInit() { this.mockTestEventsPublisher = new Mock(); - this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(this.settingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase); + this.mockFileHelper = new Mock(); + this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(this.settingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.mockFileHelper.Object); + } + + [TestCleanup] + public void TestCleanup() + { + TestPluginCache.Instance = null; } [TestMethod] @@ -58,7 +69,7 @@ public void InProcDataCollectionExtensionManagerShouldLoadsDataCollectorsFromRun } [TestMethod] - public void InProcDataCollectionExtensionManagerLoadsDataCollectorFromDefaultCodebaseIfCodebaseIsRelative() + public void InProcDataCollectionExtensionManagerLoadsDataCollectorFromDefaultCodebaseIfExistsAndCodebaseIsRelative() { string settingsXml = @" @@ -71,12 +82,38 @@ public void InProcDataCollectionExtensionManagerLoadsDataCollectorFromDefaultCod "; - this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(settingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase); + + this.mockFileHelper.Setup(fh => fh.Exists(@"E:\repos\MSTest\src\managed\TestPlatform\TestImpactListener.Tests\bin\Debug\TestImpactListener.Tests.dll")).Returns(true); + this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(settingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.mockFileHelper.Object); var codebase = (inProcDataCollectionManager.InProcDataCollectors.Values.First() as MockDataCollector).CodeBase; Assert.AreEqual(codebase, @"E:\repos\MSTest\src\managed\TestPlatform\TestImpactListener.Tests\bin\Debug\TestImpactListener.Tests.dll"); } + [TestMethod] + public void InProcDataCollectionExtensionManagerLoadsDataCollectorFromTestPluginCacheIfExistsAndCodebaseIsRelative() + { + string settingsXml = @" + + + + + 4312 + + + + + "; + + TestPluginCache.Instance.UpdateExtensions(new List { @"E:\source\.nuget\TestImpactListenerDataCollector.dll" }, true); + this.mockFileHelper.Setup(fh => fh.Exists(@"E:\source\.nuget\TestImpactListenerDataCollector.dll")).Returns(true); + + this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(settingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.mockFileHelper.Object); + + var codebase = (inProcDataCollectionManager.InProcDataCollectors.Values.First() as MockDataCollector).CodeBase; + Assert.AreEqual(codebase, @"E:\source\.nuget\TestImpactListenerDataCollector.dll"); + } + [TestMethod] public void InProcDataCollectionExtensionManagerLoadsDataCollectorFromGivenCodebaseIfCodebaseIsAbsolute() { @@ -91,7 +128,7 @@ public void InProcDataCollectionExtensionManagerLoadsDataCollectorFromGivenCodeb "; - this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(settingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase); + this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(settingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.mockFileHelper.Object); var codebase = (inProcDataCollectionManager.InProcDataCollectors.Values.First() as MockDataCollector).CodeBase; Assert.AreEqual(codebase, "\\\\DummyPath\\TestImpactListener.Tests.dll"); @@ -117,7 +154,7 @@ public void InProcDataCollectorIsReadingMultipleDataCollector() "; - this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(multiSettingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase); + this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(multiSettingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.mockFileHelper.Object); bool secondOne = false; MockDataCollector dataCollector1 = null; MockDataCollector dataCollector2 = null; @@ -234,7 +271,8 @@ public void TriggerTestCaseEndShouldtBeCalledMultipleTimesInDataDrivenScenario() internal class TestableInProcDataCollectionExtensionManager : InProcDataCollectionExtensionManager { - public TestableInProcDataCollectionExtensionManager(string runSettings, ITestEventsPublisher mockTestEventsPublisher, string defaultCodebase) : base(runSettings, mockTestEventsPublisher, defaultCodebase) + public TestableInProcDataCollectionExtensionManager(string runSettings, ITestEventsPublisher mockTestEventsPublisher, string defaultCodebase, IFileHelper fileHelper) + : base(runSettings, mockTestEventsPublisher, defaultCodebase, fileHelper) { } diff --git a/test/Microsoft.TestPlatform.TestHostProvider.UnitTests/Hosting/DotnetTestHostManagerTests.cs b/test/Microsoft.TestPlatform.TestHostProvider.UnitTests/Hosting/DotnetTestHostManagerTests.cs index ba4511c77b..b0476e0893 100644 --- a/test/Microsoft.TestPlatform.TestHostProvider.UnitTests/Hosting/DotnetTestHostManagerTests.cs +++ b/test/Microsoft.TestPlatform.TestHostProvider.UnitTests/Hosting/DotnetTestHostManagerTests.cs @@ -387,6 +387,16 @@ public void GetTestPlatformExtensionsShouldReturnEmptySetIfSourceDirectoryIsEmpt Assert.AreEqual(0, extensions.Count()); } + [TestMethod] + public void GetTestPlatformExtensionsShouldAddDataCollectorsExtensionsIfPresent() + { + this.mockFileHelper.Setup(fh => fh.DirectoryExists(It.IsAny())).Returns(true); + this.mockFileHelper.Setup(fh => fh.EnumerateFiles(It.IsAny(), SearchOption.TopDirectoryOnly, It.IsAny())).Returns(new[] { "foo.dll" }); + var extensions = this.dotnetHostManager.GetTestPlatformExtensions(this.testSource, new List { "abc.datacollector.dll" }); + + Assert.AreEqual(1, extensions.Count()); + } + [TestMethod] public async Task LaunchTestHostShouldLaunchProcessWithConnectionInfo() { From 692a3efe91964583bf44c686f1d28a96c4ee740c Mon Sep 17 00:00:00 2001 From: Vagisha Nidhi Date: Thu, 18 Apr 2019 11:07:42 +0530 Subject: [PATCH 2/2] Review comments addressed --- .../InProcDataCollectionExtensionManager.cs | 14 +++++----- .../Execution/ExecutionManager.cs | 2 +- ...ProcDataCollectionExtensionManagerTests.cs | 26 ++++++++----------- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/Microsoft.TestPlatform.CrossPlatEngine/DataCollection/InProcDataCollectionExtensionManager.cs b/src/Microsoft.TestPlatform.CrossPlatEngine/DataCollection/InProcDataCollectionExtensionManager.cs index a86df5bb5a..c9abb9b217 100644 --- a/src/Microsoft.TestPlatform.CrossPlatEngine/DataCollection/InProcDataCollectionExtensionManager.cs +++ b/src/Microsoft.TestPlatform.CrossPlatEngine/DataCollection/InProcDataCollectionExtensionManager.cs @@ -53,11 +53,11 @@ internal class InProcDataCollectionExtensionManager /// /// The default codebase to be used by inproc data collector /// - public InProcDataCollectionExtensionManager(string runSettings, ITestEventsPublisher testEventsPublisher, string defaultCodeBase) - : this(runSettings, testEventsPublisher, defaultCodeBase, new FileHelper()) + public InProcDataCollectionExtensionManager(string runSettings, ITestEventsPublisher testEventsPublisher, string defaultCodeBase, TestPluginCache testPluginCache) + : this(runSettings, testEventsPublisher, defaultCodeBase, testPluginCache, new FileHelper()) {} - protected InProcDataCollectionExtensionManager(string runSettings, ITestEventsPublisher testEventsPublisher, string defaultCodeBase, IFileHelper fileHelper) + protected InProcDataCollectionExtensionManager(string runSettings, ITestEventsPublisher testEventsPublisher, string defaultCodeBase, TestPluginCache testPluginCache, IFileHelper fileHelper) { this.InProcDataCollectors = new Dictionary(); this.inProcDataCollectionSink = new InProcDataCollectionSink(); @@ -66,7 +66,7 @@ protected InProcDataCollectionExtensionManager(string runSettings, ITestEventsPu this.codeBasePaths = new List { this.defaultCodeBase }; // Get Datacollector codebase paths from test plugin cache - var extensionPaths = TestPluginCache.Instance.GetExtensionPaths(DataCollectorEndsWithPattern); + var extensionPaths = testPluginCache.GetExtensionPaths(DataCollectorEndsWithPattern); foreach (var extensionPath in extensionPaths) { this.codeBasePaths.Add(Path.GetDirectoryName(extensionPath)); @@ -247,10 +247,10 @@ private string GetCodebase(string codeBase) { foreach (var extensionPath in this.codeBasePaths) { - var path = Path.Combine(extensionPath, codeBase); - if (this.fileHelper.Exists(path)) + var assemblyPath = Path.Combine(extensionPath, codeBase); + if (this.fileHelper.Exists(assemblyPath)) { - return path; + return assemblyPath; } } } diff --git a/src/Microsoft.TestPlatform.CrossPlatEngine/Execution/ExecutionManager.cs b/src/Microsoft.TestPlatform.CrossPlatEngine/Execution/ExecutionManager.cs index 1a526ba435..9a94039b62 100644 --- a/src/Microsoft.TestPlatform.CrossPlatEngine/Execution/ExecutionManager.cs +++ b/src/Microsoft.TestPlatform.CrossPlatEngine/Execution/ExecutionManager.cs @@ -219,7 +219,7 @@ private void InitializeDataCollectors(string runSettings, ITestEventsPublisher t // Initialize inproc data collectors if declared in run settings. if (XmlRunSettingsUtilities.IsInProcDataCollectionEnabled(runSettings)) { - var inProcDataCollectionExtensionManager = new InProcDataCollectionExtensionManager(runSettings, testEventsPublisher, defaultCodeBase); + var inProcDataCollectionExtensionManager = new InProcDataCollectionExtensionManager(runSettings, testEventsPublisher, defaultCodeBase, TestPluginCache.Instance); } } diff --git a/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/DataCollection/InProcDataCollectionExtensionManagerTests.cs b/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/DataCollection/InProcDataCollectionExtensionManagerTests.cs index de983142b3..967bda7be6 100644 --- a/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/DataCollection/InProcDataCollectionExtensionManagerTests.cs +++ b/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/DataCollection/InProcDataCollectionExtensionManagerTests.cs @@ -40,19 +40,15 @@ public class InProcDataCollectionExtensionManagerTests private TestableInProcDataCollectionExtensionManager inProcDataCollectionManager; private string defaultCodebase = "E:\\repos\\MSTest\\src\\managed\\TestPlatform\\TestImpactListener.Tests\\bin\\Debug"; private Mock mockFileHelper; + private TestPluginCache testPluginCache; [TestInitialize] public void TestInit() { this.mockTestEventsPublisher = new Mock(); this.mockFileHelper = new Mock(); - this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(this.settingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.mockFileHelper.Object); - } - - [TestCleanup] - public void TestCleanup() - { - TestPluginCache.Instance = null; + this.testPluginCache = TestPluginCache.Instance; + this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(this.settingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.testPluginCache, this.mockFileHelper.Object); } [TestMethod] @@ -84,7 +80,7 @@ public void InProcDataCollectionExtensionManagerLoadsDataCollectorFromDefaultCod "; this.mockFileHelper.Setup(fh => fh.Exists(@"E:\repos\MSTest\src\managed\TestPlatform\TestImpactListener.Tests\bin\Debug\TestImpactListener.Tests.dll")).Returns(true); - this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(settingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.mockFileHelper.Object); + this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(settingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.testPluginCache, this.mockFileHelper.Object); var codebase = (inProcDataCollectionManager.InProcDataCollectors.Values.First() as MockDataCollector).CodeBase; Assert.AreEqual(codebase, @"E:\repos\MSTest\src\managed\TestPlatform\TestImpactListener.Tests\bin\Debug\TestImpactListener.Tests.dll"); @@ -105,10 +101,10 @@ public void InProcDataCollectionExtensionManagerLoadsDataCollectorFromTestPlugin "; - TestPluginCache.Instance.UpdateExtensions(new List { @"E:\source\.nuget\TestImpactListenerDataCollector.dll" }, true); + this.testPluginCache.UpdateExtensions(new List { @"E:\source\.nuget\TestImpactListenerDataCollector.dll" }, true); this.mockFileHelper.Setup(fh => fh.Exists(@"E:\source\.nuget\TestImpactListenerDataCollector.dll")).Returns(true); - this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(settingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.mockFileHelper.Object); + this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(settingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.testPluginCache, this.mockFileHelper.Object); var codebase = (inProcDataCollectionManager.InProcDataCollectors.Values.First() as MockDataCollector).CodeBase; Assert.AreEqual(codebase, @"E:\source\.nuget\TestImpactListenerDataCollector.dll"); @@ -128,7 +124,7 @@ public void InProcDataCollectionExtensionManagerLoadsDataCollectorFromGivenCodeb "; - this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(settingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.mockFileHelper.Object); + this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(settingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.testPluginCache, this.mockFileHelper.Object); var codebase = (inProcDataCollectionManager.InProcDataCollectors.Values.First() as MockDataCollector).CodeBase; Assert.AreEqual(codebase, "\\\\DummyPath\\TestImpactListener.Tests.dll"); @@ -154,7 +150,7 @@ public void InProcDataCollectorIsReadingMultipleDataCollector() "; - this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(multiSettingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.mockFileHelper.Object); + this.inProcDataCollectionManager = new TestableInProcDataCollectionExtensionManager(multiSettingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.testPluginCache, this.mockFileHelper.Object); bool secondOne = false; MockDataCollector dataCollector1 = null; MockDataCollector dataCollector2 = null; @@ -196,7 +192,7 @@ public void InProcDataCollectionExtensionManagerWillNotEnableDataCollectionForIn "; - var manager = new InProcDataCollectionExtensionManager(invalidSettingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase); + var manager = new InProcDataCollectionExtensionManager(invalidSettingsXml, this.mockTestEventsPublisher.Object, this.defaultCodebase, this.testPluginCache); Assert.IsFalse(manager.IsInProcDataCollectionEnabled, "InProcDataCollection must be disabled on invalid settings."); } [TestMethod] @@ -271,8 +267,8 @@ public void TriggerTestCaseEndShouldtBeCalledMultipleTimesInDataDrivenScenario() internal class TestableInProcDataCollectionExtensionManager : InProcDataCollectionExtensionManager { - public TestableInProcDataCollectionExtensionManager(string runSettings, ITestEventsPublisher mockTestEventsPublisher, string defaultCodebase, IFileHelper fileHelper) - : base(runSettings, mockTestEventsPublisher, defaultCodebase, fileHelper) + public TestableInProcDataCollectionExtensionManager(string runSettings, ITestEventsPublisher mockTestEventsPublisher, string defaultCodebase, TestPluginCache testPluginCache, IFileHelper fileHelper) + : base(runSettings, mockTestEventsPublisher, defaultCodebase, testPluginCache, fileHelper) { }