diff --git a/src/Microsoft.TestPlatform.CrossPlatEngine/Client/Parallel/DiscoveryDataAggregator.cs b/src/Microsoft.TestPlatform.CrossPlatEngine/Client/Parallel/DiscoveryDataAggregator.cs index 581c5b058d..43a42d0d79 100644 --- a/src/Microsoft.TestPlatform.CrossPlatEngine/Client/Parallel/DiscoveryDataAggregator.cs +++ b/src/Microsoft.TestPlatform.CrossPlatEngine/Client/Parallel/DiscoveryDataAggregator.cs @@ -186,39 +186,44 @@ public void MarkSourcesWithStatus(IEnumerable? sources, DiscoveryStatus foreach (var source in sources) { - if (source is null) + MarkSourceWithStatus(source, status); + } + } + + private void MarkSourceWithStatus(string? source, DiscoveryStatus status) + { + if (source is null) + { + return; + } + + _sourcesWithDiscoveryStatus.AddOrUpdate(source, + _ => { - continue; - } + if (status != DiscoveryStatus.NotDiscovered) + { + EqtTrace.Warning($"DiscoveryDataAggregator.MarkSourcesWithStatus: Undiscovered {source} added with status: '{status}'."); + } + else + { + EqtTrace.Verbose($"DiscoveryDataAggregator.MarkSourcesWithStatus: Adding {source} with status: '{status}'."); + } - _sourcesWithDiscoveryStatus.AddOrUpdate(source, - _ => + return status; + }, + (_, previousStatus) => + { + if (previousStatus == DiscoveryStatus.FullyDiscovered && status != DiscoveryStatus.FullyDiscovered + || previousStatus == DiscoveryStatus.PartiallyDiscovered && (status == DiscoveryStatus.NotDiscovered || status == DiscoveryStatus.SkippedDiscovery)) { - if (status != DiscoveryStatus.NotDiscovered) - { - EqtTrace.Warning($"DiscoveryDataAggregator.MarkSourcesWithStatus: Undiscovered {source} added with status: '{status}'."); - } - else - { - EqtTrace.Verbose($"DiscoveryDataAggregator.MarkSourcesWithStatus: Adding {source} with status: '{status}'."); - } - - return status; - }, - (_, previousStatus) => + EqtTrace.Warning($"DiscoveryDataAggregator.MarkSourcesWithStatus: Downgrading source {source} status from '{previousStatus}' to '{status}'."); + } + else if (previousStatus != status) { - if (previousStatus == DiscoveryStatus.FullyDiscovered && status != DiscoveryStatus.FullyDiscovered - || previousStatus == DiscoveryStatus.PartiallyDiscovered && (status == DiscoveryStatus.NotDiscovered || status == DiscoveryStatus.SkippedDiscovery)) - { - EqtTrace.Warning($"DiscoveryDataAggregator.MarkSourcesWithStatus: Downgrading source {source} status from '{previousStatus}' to '{status}'."); - } - else if (previousStatus != status) - { - EqtTrace.Verbose($"DiscoveryDataAggregator.MarkSourcesWithStatus: Upgrading {source} status from '{previousStatus}' to '{status}'."); - } - return status; - }); - } + EqtTrace.Verbose($"DiscoveryDataAggregator.MarkSourcesWithStatus: Upgrading {source} status from '{previousStatus}' to '{status}'."); + } + return status; + }); } /// @@ -247,19 +252,19 @@ public void MarkSourcesWithStatus(IEnumerable? sources, DiscoveryStatus { var currentSource = testCase.Source; - // We rely on the fact that sources are processed in a sequential way, which - // means that when we receive a different source than the previous, we can - // assume that the previous source was fully discovered. - if (previousSource is null || previousSource == currentSource) + // Sources arrive sequentially; when source changes the previous one is fully discovered. + if (previousSource is null) { - MarkSourcesWithStatus(new[] { currentSource }, DiscoveryStatus.PartiallyDiscovered); + // First test case seen: mark this source as partially discovered. + MarkSourceWithStatus(currentSource, DiscoveryStatus.PartiallyDiscovered); } else if (currentSource != previousSource) { EqtTrace.Verbose($"DiscoveryDataAggregator.MarkSourcesBasedOnDiscoveredTestCases: Discovered test source changed from {previousSource} to {currentSource}."); - MarkSourcesWithStatus(new[] { previousSource }, DiscoveryStatus.FullyDiscovered); - MarkSourcesWithStatus(new[] { currentSource }, DiscoveryStatus.PartiallyDiscovered); + MarkSourceWithStatus(previousSource, DiscoveryStatus.FullyDiscovered); + MarkSourceWithStatus(currentSource, DiscoveryStatus.PartiallyDiscovered); } + // When currentSource == previousSource: status already PartiallyDiscovered; skip. previousSource = currentSource; }