diff --git a/src/Microsoft.TestPlatform.CrossPlatEngine/Discovery/DiscovererEnumerator.cs b/src/Microsoft.TestPlatform.CrossPlatEngine/Discovery/DiscovererEnumerator.cs index 48666d0c3d..5e1948a3ae 100644 --- a/src/Microsoft.TestPlatform.CrossPlatEngine/Discovery/DiscovererEnumerator.cs +++ b/src/Microsoft.TestPlatform.CrossPlatEngine/Discovery/DiscovererEnumerator.cs @@ -161,7 +161,9 @@ private void LoadTestsFromAnExtension(string extensionAssembly, IEnumerable discoverer, - Dictionary, IEnumerable> discovererToSourcesMap, + IEnumerable sources, DiscoveryContext context, TestCaseDiscoverySink discoverySink, IMessageLogger logger, - ref double totalAdaptersUsed, - ref double totalTimeTakenByAdapters) + CancellationToken cancellationToken) { + var result = new DiscoveryResult(); if (DiscovererEnumerator.TryToLoadDiscoverer(discoverer, logger, out var discovererType) == false) { // Fail to instantiate the discoverer type. - return; + return result; } // on instantiated successfully, get tests @@ -217,12 +219,19 @@ private void CollectTelemetryAtEnd(double totalTimeTakenByAdapters, double total var newTimeStart = DateTime.UtcNow; this.testPlatformEventSource.AdapterDiscoveryStart(discoverer.Metadata.DefaultExecutorUri.AbsoluteUri); - discoverer.Value.DiscoverTests(discovererToSourcesMap[discoverer], context, logger, discoverySink); + foreach (var testSource in sources) + { + if (cancellationToken.IsCancellationRequested) + { + EqtTrace.Info("DiscovererEnumerator.DiscoverTestsFromSingleDiscoverer: Cancellation Requested. Aborting the discovery"); + break; + } - var totalAdapterRunTime = DateTime.UtcNow - newTimeStart; + discoverer.Value.DiscoverTests(new[] { testSource }, context, logger, discoverySink); + } - this.testPlatformEventSource.AdapterDiscoveryStop(this.discoveryResultCache.TotalDiscoveredTests - - currentTotalTests); + var totalAdapterRunTime = DateTime.UtcNow - newTimeStart; + this.testPlatformEventSource.AdapterDiscoveryStop(this.discoveryResultCache.TotalDiscoveredTests - currentTotalTests); // Record Total Tests Discovered By each Discoverer. var totalTestsDiscoveredByCurrentDiscoverer = this.discoveryResultCache.TotalDiscoveredTests - currentTotalTests; @@ -230,8 +239,7 @@ private void CollectTelemetryAtEnd(double totalTimeTakenByAdapters, double total string.Format("{0}.{1}", TelemetryDataConstants.TotalTestsByAdapter, discoverer.Metadata.DefaultExecutorUri), totalTestsDiscoveredByCurrentDiscoverer); - totalAdaptersUsed++; - + result.TotalAdaptersUsed++; EqtTrace.Verbose("DiscovererEnumerator.DiscoverTestsFromSingleDiscoverer: Done loading tests for {0}", discoverer.Value.GetType().FullName); @@ -244,22 +252,18 @@ private void CollectTelemetryAtEnd(double totalTimeTakenByAdapters, double total } // Collecting Data Point for Time Taken to Discover Tests by each Adapter - this.requestData.MetricsCollection.Add( - string.Format("{0}.{1}", TelemetryDataConstants.TimeTakenToDiscoverTestsByAnAdapter, - discoverer.Metadata.DefaultExecutorUri), totalAdapterRunTime.TotalSeconds); - totalTimeTakenByAdapters += totalAdapterRunTime.TotalSeconds; + this.requestData.MetricsCollection.Add($"{TelemetryDataConstants.TimeTakenToDiscoverTestsByAnAdapter}.{discoverer.Metadata.DefaultExecutorUri}", totalAdapterRunTime.TotalSeconds); + result.TotalTimeSpentInAdapaters += totalAdapterRunTime.TotalSeconds; } catch (Exception e) { - var message = string.Format( - CultureInfo.CurrentUICulture, - CrossPlatEngineResources.ExceptionFromLoadTests, - discovererType.Name, - e.Message); + var message = string.Format(CultureInfo.CurrentUICulture, CrossPlatEngineResources.ExceptionFromLoadTests, discovererType.Name, e.Message); logger.SendMessage(TestMessageLevel.Error, message); EqtTrace.Error("DiscovererEnumerator.DiscoverTestsFromSingleDiscoverer: {0} ", e); } + + return result; } private static bool TryToLoadDiscoverer(LazyExtension discoverer, IMessageLogger logger, out Type discovererType) @@ -495,5 +499,11 @@ private static bool IsAssembly(string filePath) } } + private class DiscoveryResult + { + public double TotalTimeSpentInAdapaters { get; set; } + public int TotalAdaptersUsed { get; set; } + } + } } diff --git a/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/Discovery/DiscovererEnumeratorTests.cs b/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/Discovery/DiscovererEnumeratorTests.cs index cb56326c87..d5dbab08f5 100644 --- a/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/Discovery/DiscovererEnumeratorTests.cs +++ b/test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/Discovery/DiscovererEnumeratorTests.cs @@ -637,13 +637,18 @@ public static void Reset() [Category("managed")] private class ManagedDllTestDiscoverer : DllTestDiscoverer { + static ManagedDllTestDiscoverer() + { + Sources = new List(); + } + public static bool IsManagedDiscoverTestCalled { get; private set; } - public static IEnumerable Sources { get; set; } + public static List Sources { get; private set; } public override void DiscoverTests(IEnumerable sources, IDiscoveryContext discoveryContext, IMessageLogger logger, ITestCaseDiscoverySink discoverySink) { - Sources = sources; + Sources.AddRange(sources); IsManagedDiscoverTestCalled = true; base.DiscoverTests(sources, discoveryContext, logger, discoverySink); } @@ -651,7 +656,7 @@ public override void DiscoverTests(IEnumerable sources, IDiscoveryContex public static void Reset() { IsManagedDiscoverTestCalled = false; - Sources = null; + Sources = new List(); } } @@ -721,9 +726,14 @@ private static bool ShouldTestDiscovered(IEnumerable sources) [DefaultExecutorUri("discoverer://jsondiscoverer")] private class JsonTestDiscoverer : ITestDiscoverer { + static JsonTestDiscoverer() + { + Sources = new List(); + } + public static bool IsDiscoverTestCalled { get; private set; } - public static IEnumerable Sources { get; private set; } + public static List Sources { get; private set; } public static IDiscoveryContext DiscoveryContext { get; private set; } @@ -734,7 +744,7 @@ private class JsonTestDiscoverer : ITestDiscoverer public void DiscoverTests(IEnumerable sources, IDiscoveryContext discoveryContext, IMessageLogger logger, ITestCaseDiscoverySink discoverySink) { IsDiscoverTestCalled = true; - Sources = sources; + Sources.AddRange(sources); DiscoveryContext = discoveryContext; MessageLogger = logger; DiscoverySink = discoverySink; @@ -743,6 +753,7 @@ public void DiscoverTests(IEnumerable sources, IDiscoveryContext discove public static void Reset() { IsDiscoverTestCalled = false; + Sources = new List(); } }