Merged
Conversation
…gator - GetAggregatedRunStats() now reads _testRunStatsList under lock to prevent InvalidOperationException from concurrent List<T> modification during enumeration - AggregateRunDataMetrics()/AggregateMetrics() now uses ConcurrentDictionary.AddOrUpdate instead of TryGetValue+set to prevent lost-update race conditions - Same fix applied to DiscoveryDataAggregator.AggregateMetrics() - Added concurrency tests that exercise parallel Aggregate + read
- Replace List<Task> with ConcurrentBag<Task> for _attachmentTasks to prevent corruption when concurrent file transfers call Add() - Replace ContainsKey+TryAdd TOCTOU pattern with GetOrAdd for both AttachmentSets and _attachmentTasks dictionaries - Existing ParallelAccessShouldNotBreak test covers this scenario
- Add lock around _testSequence and _testObjectDictionary mutations in EventsTestCaseStart and EventsTestCaseEnd to prevent corruption under parallel test execution - Use Interlocked.Increment for _testStartCount and _testEndCount - Take snapshot under lock in SessionEndedHandler before passing to WriteTestSequence - Added concurrency test with 10 threads x 50 test events each
- TrxLogger: use Interlocked.Increment for TotalTestCount, PassedTestCount, and FailedTestCount to prevent lost updates when test results arrive concurrently from parallel test runs - HtmlLogger: same fix for TotalTests, PassedTests, FailedTests, SkippedTests counters - Added thread safety test exercising 10 threads x 100 results each verifying exact counter values
- Set DtdProcessing = DtdProcessing.Prohibit on XmlTextReader in both MigrateRunSettings and ReadTestSettingsNodes to prevent XML External Entity attacks via crafted .runsettings/.testsettings files - Set XmlResolver = null on XmlDocument instances - Added tests verifying DTD content in both runsettings and testsettings files is rejected with XmlException
nohwnd
reviewed
Mar 19, 2026
src/Microsoft.TestPlatform.Common/DataCollection/DataCollectionAttachmentManager.cs
Show resolved
Hide resolved
src/Microsoft.TestPlatform.CrossPlatEngine/Client/Parallel/DiscoveryDataAggregator.cs
Show resolved
Hide resolved
src/Microsoft.TestPlatform.CrossPlatEngine/Client/Parallel/ParallelRunDataAggregator.cs
Outdated
Show resolved
Hide resolved
src/Microsoft.TestPlatform.Extensions.BlameDataCollector/BlameCollector.cs
Outdated
Show resolved
Hide resolved
src/Microsoft.TestPlatform.Extensions.BlameDataCollector/BlameCollector.cs
Outdated
Show resolved
Hide resolved
src/Microsoft.TestPlatform.Extensions.BlameDataCollector/BlameCollector.cs
Outdated
Show resolved
Hide resolved
...oft.TestPlatform.CrossPlatEngine.UnitTests/Client/Parallel/ParallelRunDataAggregatorTests.cs
Outdated
Show resolved
Hide resolved
Member
|
@copilot some parts were reverted, update description. |
Contributor
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
nohwnd
approved these changes
Mar 19, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Several data structures shared across concurrent test execution threads were not thread-safe, risking corrupted results and lost updates.
Changes
TryGetValue+ set pattern withConcurrentDictionary.AddOrUpdatein metrics aggregation to eliminate lost-update racesList<Task>withConcurrentBag<Task>for_attachmentTasks; replaceContainsKey+TryAddTOCTOU pattern withGetOrAddfor bothAttachmentSetsand_attachmentTasksList<Guid>/Dictionary<Guid, BlameTestObject>withConcurrentQueue/ConcurrentDictionary; useInterlocked.Incrementfor_testEndCount; snapshot collections before passing toWriteTestSequenceInterlocked.Incrementfor all test counters (TotalTestCount,PassedTestCount,FailedTestCount,SkippedTests) to prevent lost updates under concurrent result arrival