Skip to content

Commit 8e6f70f

Browse files
cltshivashsinghsarab
authored andcommitted
Implemented cancellation of individual source files discovery (#2134)
* Implemented the cancellation of discovery request * Added an end to end tests to cover the discovery cancellation scenario * Fixed the E2E test to check only for the discovered tests * Increased the timeout for one of the tests * Modified the code to perform cancellation between test assemblies * Fixed failing tests
1 parent be51dd7 commit 8e6f70f

File tree

2 files changed

+47
-26
lines changed

2 files changed

+47
-26
lines changed

src/Microsoft.TestPlatform.CrossPlatEngine/Discovery/DiscovererEnumerator.cs

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,9 @@ private void LoadTestsFromAnExtension(string extensionAssembly, IEnumerable<stri
161161
return;
162162
}
163163

164-
this.DiscoverTestsFromSingleDiscoverer(discoverer, discovererToSourcesMap, context, discoverySink, logger, ref totalAdaptersUsed, ref totalTimeTakenByAdapters);
164+
var result = this.DiscoverTestsFromSingleDiscoverer(discoverer, discovererToSourcesMap[discoverer], context, discoverySink, logger, cancellationToken);
165+
totalAdaptersUsed += result.TotalAdaptersUsed;
166+
totalTimeTakenByAdapters += result.TotalTimeSpentInAdapaters;
165167
}
166168

167169
if (this.discoveryResultCache.TotalDiscoveredTests == 0)
@@ -191,19 +193,19 @@ private void CollectTelemetryAtEnd(double totalTimeTakenByAdapters, double total
191193
totalAdaptersUsed);
192194
}
193195

194-
private void DiscoverTestsFromSingleDiscoverer(
196+
private DiscoveryResult DiscoverTestsFromSingleDiscoverer(
195197
LazyExtension<ITestDiscoverer, ITestDiscovererCapabilities> discoverer,
196-
Dictionary<LazyExtension<ITestDiscoverer, ITestDiscovererCapabilities>, IEnumerable<string>> discovererToSourcesMap,
198+
IEnumerable<string> sources,
197199
DiscoveryContext context,
198200
TestCaseDiscoverySink discoverySink,
199201
IMessageLogger logger,
200-
ref double totalAdaptersUsed,
201-
ref double totalTimeTakenByAdapters)
202+
CancellationToken cancellationToken)
202203
{
204+
var result = new DiscoveryResult();
203205
if (DiscovererEnumerator.TryToLoadDiscoverer(discoverer, logger, out var discovererType) == false)
204206
{
205207
// Fail to instantiate the discoverer type.
206-
return;
208+
return result;
207209
}
208210

209211
// on instantiated successfully, get tests
@@ -217,21 +219,27 @@ private void DiscoverTestsFromSingleDiscoverer(
217219
var newTimeStart = DateTime.UtcNow;
218220

219221
this.testPlatformEventSource.AdapterDiscoveryStart(discoverer.Metadata.DefaultExecutorUri.AbsoluteUri);
220-
discoverer.Value.DiscoverTests(discovererToSourcesMap[discoverer], context, logger, discoverySink);
222+
foreach (var testSource in sources)
223+
{
224+
if (cancellationToken.IsCancellationRequested)
225+
{
226+
EqtTrace.Info("DiscovererEnumerator.DiscoverTestsFromSingleDiscoverer: Cancellation Requested. Aborting the discovery");
227+
break;
228+
}
221229

222-
var totalAdapterRunTime = DateTime.UtcNow - newTimeStart;
230+
discoverer.Value.DiscoverTests(new[] { testSource }, context, logger, discoverySink);
231+
}
223232

224-
this.testPlatformEventSource.AdapterDiscoveryStop(this.discoveryResultCache.TotalDiscoveredTests -
225-
currentTotalTests);
233+
var totalAdapterRunTime = DateTime.UtcNow - newTimeStart;
234+
this.testPlatformEventSource.AdapterDiscoveryStop(this.discoveryResultCache.TotalDiscoveredTests - currentTotalTests);
226235

227236
// Record Total Tests Discovered By each Discoverer.
228237
var totalTestsDiscoveredByCurrentDiscoverer = this.discoveryResultCache.TotalDiscoveredTests - currentTotalTests;
229238
this.requestData.MetricsCollection.Add(
230239
string.Format("{0}.{1}", TelemetryDataConstants.TotalTestsByAdapter,
231240
discoverer.Metadata.DefaultExecutorUri), totalTestsDiscoveredByCurrentDiscoverer);
232241

233-
totalAdaptersUsed++;
234-
242+
result.TotalAdaptersUsed++;
235243

236244
EqtTrace.Verbose("DiscovererEnumerator.DiscoverTestsFromSingleDiscoverer: Done loading tests for {0}",
237245
discoverer.Value.GetType().FullName);
@@ -244,22 +252,18 @@ private void DiscoverTestsFromSingleDiscoverer(
244252
}
245253

246254
// Collecting Data Point for Time Taken to Discover Tests by each Adapter
247-
this.requestData.MetricsCollection.Add(
248-
string.Format("{0}.{1}", TelemetryDataConstants.TimeTakenToDiscoverTestsByAnAdapter,
249-
discoverer.Metadata.DefaultExecutorUri), totalAdapterRunTime.TotalSeconds);
250-
totalTimeTakenByAdapters += totalAdapterRunTime.TotalSeconds;
255+
this.requestData.MetricsCollection.Add($"{TelemetryDataConstants.TimeTakenToDiscoverTestsByAnAdapter}.{discoverer.Metadata.DefaultExecutorUri}", totalAdapterRunTime.TotalSeconds);
256+
result.TotalTimeSpentInAdapaters += totalAdapterRunTime.TotalSeconds;
251257
}
252258
catch (Exception e)
253259
{
254-
var message = string.Format(
255-
CultureInfo.CurrentUICulture,
256-
CrossPlatEngineResources.ExceptionFromLoadTests,
257-
discovererType.Name,
258-
e.Message);
260+
var message = string.Format(CultureInfo.CurrentUICulture, CrossPlatEngineResources.ExceptionFromLoadTests, discovererType.Name, e.Message);
259261

260262
logger.SendMessage(TestMessageLevel.Error, message);
261263
EqtTrace.Error("DiscovererEnumerator.DiscoverTestsFromSingleDiscoverer: {0} ", e);
262264
}
265+
266+
return result;
263267
}
264268

265269
private static bool TryToLoadDiscoverer(LazyExtension<ITestDiscoverer, ITestDiscovererCapabilities> discoverer, IMessageLogger logger, out Type discovererType)
@@ -495,5 +499,11 @@ private static IEnumerable<LazyExtension<ITestDiscoverer, ITestDiscovererCapabil
495499
}
496500
}
497501

502+
private class DiscoveryResult
503+
{
504+
public double TotalTimeSpentInAdapaters { get; set; }
505+
public int TotalAdaptersUsed { get; set; }
506+
}
507+
498508
}
499509
}

test/Microsoft.TestPlatform.CrossPlatEngine.UnitTests/Discovery/DiscovererEnumeratorTests.cs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -637,21 +637,26 @@ public static void Reset()
637637
[Category("managed")]
638638
private class ManagedDllTestDiscoverer : DllTestDiscoverer
639639
{
640+
static ManagedDllTestDiscoverer()
641+
{
642+
Sources = new List<string>();
643+
}
644+
640645
public static bool IsManagedDiscoverTestCalled { get; private set; }
641646

642-
public static IEnumerable<string> Sources { get; set; }
647+
public static List<string> Sources { get; private set; }
643648

644649
public override void DiscoverTests(IEnumerable<string> sources, IDiscoveryContext discoveryContext, IMessageLogger logger, ITestCaseDiscoverySink discoverySink)
645650
{
646-
Sources = sources;
651+
Sources.AddRange(sources);
647652
IsManagedDiscoverTestCalled = true;
648653
base.DiscoverTests(sources, discoveryContext, logger, discoverySink);
649654
}
650655

651656
public static void Reset()
652657
{
653658
IsManagedDiscoverTestCalled = false;
654-
Sources = null;
659+
Sources = new List<string>();
655660
}
656661
}
657662

@@ -721,9 +726,14 @@ private static bool ShouldTestDiscovered(IEnumerable<string> sources)
721726
[DefaultExecutorUri("discoverer://jsondiscoverer")]
722727
private class JsonTestDiscoverer : ITestDiscoverer
723728
{
729+
static JsonTestDiscoverer()
730+
{
731+
Sources = new List<string>();
732+
}
733+
724734
public static bool IsDiscoverTestCalled { get; private set; }
725735

726-
public static IEnumerable<string> Sources { get; private set; }
736+
public static List<string> Sources { get; private set; }
727737

728738
public static IDiscoveryContext DiscoveryContext { get; private set; }
729739

@@ -734,7 +744,7 @@ private class JsonTestDiscoverer : ITestDiscoverer
734744
public void DiscoverTests(IEnumerable<string> sources, IDiscoveryContext discoveryContext, IMessageLogger logger, ITestCaseDiscoverySink discoverySink)
735745
{
736746
IsDiscoverTestCalled = true;
737-
Sources = sources;
747+
Sources.AddRange(sources);
738748
DiscoveryContext = discoveryContext;
739749
MessageLogger = logger;
740750
DiscoverySink = discoverySink;
@@ -743,6 +753,7 @@ public void DiscoverTests(IEnumerable<string> sources, IDiscoveryContext discove
743753
public static void Reset()
744754
{
745755
IsDiscoverTestCalled = false;
756+
Sources = new List<string>();
746757
}
747758
}
748759

0 commit comments

Comments
 (0)