Add artifact merge engines and Kind metadata flow (RFC 018 phase 1)#9805
Add artifact merge engines and Kind metadata flow (RFC 018 phase 1)#9805Evangelink wants to merge 5 commits into
Conversation
Implements the first testfx-side pieces of RFC 018 (artifact post-processing for dotnet test / MTP): - Report merge engines (pure, invocation-agnostic, no I/O in the core): - TrxReportEngine.Merge / MergeToFileAsync (XML-level TRX merge). - JUnitReportMerger (unions <testsuite>, counters derived per-suite). - CtrfReportMerger (JSON merge; summary derived from merged tests[]). - Kind metadata flow so the dotnet/sdk orchestrator can group artifacts by format: SessionFileArtifact gains an optional kind (experimental), the FileArtifactMessage IPC record + serializer carry Kind (field id 7), the dotnet-test consumer propagates it, and report producers tag their kind (trx/junit/ctrf/html). Unit tests cover all three merge engines and the IPC round-trip. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Adds report-merging foundations and propagates artifact format metadata through MTP’s artifact and IPC layers.
Changes:
- Adds TRX, JUnit, and CTRF merge engines with unit tests.
- Adds experimental
SessionFileArtifact.Kindmetadata and IPC serialization. - Tags TRX, JUnit, CTRF, and HTML report artifacts by format.
Show a summary per file
| File | Description |
|---|---|
test/UnitTests/Microsoft.Testing.Platform.UnitTests/IPC/ProtocolTests.cs |
Covers IPC kind serialization. |
test/UnitTests/Microsoft.Testing.Platform.UnitTests/IPC/ProtocolEdgeCaseTests.cs |
Tests nullable kind round trips. |
test/UnitTests/Microsoft.Testing.Platform.DotnetTestProtocolContract.UnitTests/DotnetTestProtocolSerializerTests.cs |
Verifies protocol-contract serialization. |
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/TrxReportEngineMergeTests.cs |
Tests TRX merging. |
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/JUnitReportMergerTests.cs |
Tests JUnit merging. |
test/UnitTests/Microsoft.Testing.Extensions.UnitTests/CtrfReportMergerTests.cs |
Tests CTRF merging. |
src/Platform/SharedExtensionHelpers/ReportGeneratorBase.cs |
Publishes report artifact kinds. |
src/Platform/Microsoft.Testing.Platform/ServerMode/DotnetTest/IPC/Serializers/FileArtifactMessagesSerializer.cs |
Serializes the new kind field. |
src/Platform/Microsoft.Testing.Platform/ServerMode/DotnetTest/IPC/ObjectFieldIds.cs |
Assigns IPC field ID 7. |
src/Platform/Microsoft.Testing.Platform/ServerMode/DotnetTest/IPC/Models/FileArtifactMessages.cs |
Adds kind to the wire model. |
src/Platform/Microsoft.Testing.Platform/ServerMode/DotnetTest/IPC/DotnetTestDataConsumer.cs |
Propagates session artifact kinds. |
src/Platform/Microsoft.Testing.Platform/PublicAPI/PublicAPI.Unshipped.txt |
Tracks the experimental public API. |
src/Platform/Microsoft.Testing.Platform/Messages/FileArtifacts.cs |
Adds the kind-aware constructor and property. |
src/Platform/Microsoft.Testing.Platform/InternalAPI/InternalAPI.Unshipped.txt |
Tracks IPC internal API changes. |
src/Platform/Microsoft.Testing.Extensions.TrxReport/TrxReportEngine.Merge.cs |
Implements TRX merging. |
src/Platform/Microsoft.Testing.Extensions.TrxReport/TrxDataConsumer.cs |
Tags in-process TRX artifacts. |
src/Platform/Microsoft.Testing.Extensions.TrxReport/InternalAPI/InternalAPI.Unshipped.txt |
Tracks TRX internal APIs. |
src/Platform/Microsoft.Testing.Extensions.Retry/InternalAPI/InternalAPI.Unshipped.txt |
Tracks linked IPC field API. |
src/Platform/Microsoft.Testing.Extensions.MSBuild/InternalAPI.Unshipped.txt |
Tracks linked IPC field API. |
src/Platform/Microsoft.Testing.Extensions.JUnitReport/JUnitReportMerger.cs |
Implements JUnit merging. |
src/Platform/Microsoft.Testing.Extensions.JUnitReport/JUnitReportGenerator.cs |
Tags JUnit artifacts. |
src/Platform/Microsoft.Testing.Extensions.JUnitReport/InternalAPI/InternalAPI.Unshipped.txt |
Tracks JUnit internal APIs. |
src/Platform/Microsoft.Testing.Extensions.HtmlReport/InternalAPI/InternalAPI.Unshipped.txt |
Tracks shared generator API. |
src/Platform/Microsoft.Testing.Extensions.HtmlReport/HtmlReportGenerator.cs |
Tags HTML artifacts. |
src/Platform/Microsoft.Testing.Extensions.HangDump/InternalAPI/InternalAPI.Unshipped.txt |
Tracks linked IPC field API. |
src/Platform/Microsoft.Testing.Extensions.CtrfReport/InternalAPI/InternalAPI.Unshipped.txt |
Tracks CTRF internal APIs. |
src/Platform/Microsoft.Testing.Extensions.CtrfReport/CtrfReportMerger.cs |
Implements CTRF merging. |
src/Platform/Microsoft.Testing.Extensions.CtrfReport/CtrfReportGenerator.cs |
Tags CTRF artifacts. |
Review details
- Files reviewed: 28/28 changed files
- Comments generated: 4
- Review effort level: Medium
…ure-broccoli # Conflicts: # src/Platform/Microsoft.Testing.Extensions.CtrfReport/InternalAPI/InternalAPI.Unshipped.txt # src/Platform/Microsoft.Testing.Extensions.HangDump/InternalAPI/InternalAPI.Unshipped.txt # src/Platform/Microsoft.Testing.Extensions.HtmlReport/InternalAPI/InternalAPI.Unshipped.txt # src/Platform/Microsoft.Testing.Extensions.JUnitReport/InternalAPI/InternalAPI.Unshipped.txt # src/Platform/Microsoft.Testing.Extensions.TrxReport/InternalAPI/InternalAPI.Unshipped.txt # src/Platform/Microsoft.Testing.Platform/InternalAPI/InternalAPI.Unshipped.txt
- Carry microsoft.testing.trx through the out-of-process TRX path by adding an (experimental) Kind to FileArtifact and propagating it in DotnetTestDataConsumer and TrxProcessLifetimeHandler; centralize the kind in TrxReportEngine.TrxArtifactKind. - Deduplicate <UnitTest> definitions by id when merging TRX (ids are deterministic from the test UID and the schema forbids duplicates). - Preserve <RunInfos> (crash/exit diagnostics) and <CollectorDataEntries> from every input's <ResultSummary> instead of discarding them; omit them when empty. - Correct the inaccurate 'attachment paths are absolute' remark and relocate each input's attachment deployment tree into the merged deployment root in MergeToFileAsync (best-effort, never fails the merge). - Add unit tests for dedup and diagnostics preservation. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
This comment has been minimized.
This comment has been minimized.
…ure-broccoli # Conflicts: # src/Platform/Microsoft.Testing.Extensions.CtrfReport/InternalAPI/InternalAPI.Unshipped.txt # src/Platform/Microsoft.Testing.Extensions.HangDump/InternalAPI/InternalAPI.Unshipped.txt # src/Platform/Microsoft.Testing.Extensions.HtmlReport/InternalAPI/InternalAPI.Unshipped.txt # src/Platform/Microsoft.Testing.Extensions.JUnitReport/InternalAPI/InternalAPI.Unshipped.txt # src/Platform/Microsoft.Testing.Extensions.MSBuild/InternalAPI.Unshipped.txt # src/Platform/Microsoft.Testing.Extensions.Retry/InternalAPI/InternalAPI.Unshipped.txt # src/Platform/Microsoft.Testing.Extensions.TrxReport/InternalAPI/InternalAPI.Unshipped.txt # src/Platform/Microsoft.Testing.Platform/InternalAPI/InternalAPI.Unshipped.txt
- Skip relocation when the merged 'In' root overlaps the source 'In' root (output written beside the input with a matching runName), preventing the copy from recursing into its own destination; the original hrefs already resolve there. - Skip file reparse points (symlinks) before File.Copy so a link inside the confined tree can't pull in content from outside it. - Overwrite copied attachment files so a reused output directory can't leave stale bytes behind while the merged XML references the fresh per-input destination. - Add a unit test for the overlapping-root skip case. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
| // Overwrite so a reused output directory can't leave stale bytes behind while the merged | ||
| // XML is rewritten to reference the (per-input isolated) destination, mirroring the | ||
| // File.Create overwrite used for the merged TRX itself. | ||
| File.Copy(file, Path.Combine(destinationDirectory, Path.GetFileName(file)), overwrite: true); |
🧪 Test quality grade — PR #980542 tests graded across 6 files (39 new, 3 modified). 37 A's and 5 B's. The B-grade tests each verify only a single assertion where the test setup is rich enough to warrant checking a second property; the one modified test (
This advisory comment was generated automatically. Grades are heuristic Warning Firewall blocked 1 domainThe following domain was blocked by the firewall during workflow execution:
network:
allowed:
- defaults
- "awmgmcpg"See Network Configuration for more information.
|
Summary
Implements the first testfx-side pieces of RFC 018 — Artifact post-processing for
dotnet test(MTP). Two independent, self-contained foundations that every later phase (dispatcher tool, SDK election) reuses. No SDK dependency; the SDK orchestration lands separately once this merges.1. Report merge engines (pure, invocation-agnostic — no I/O in the core)
Validated the RFC's "collect same-kind inputs → re-aggregate → emit one" shape across both data models:
TrxReportEngine.Merge/MergeToFileAsyncResults/TestDefinitions/TestEntriesTimesearliest/latest,TestListsdeduped by id, outcomeFailedif any input failedJUnitReportMerger<testsuite><testsuite>rootsCtrfReportMergerJsonNode)results.tests[]summaryderived from the mergedtests[]sosummary.testsalways matches the array;start/stopmin/maxHTML is intentionally not file-merged (it's a rendered template with an embedded JSON blob) — this validates the design's opt-in / return-null semantics rather than breaking it.
2.
Kindmetadata flow (producer → IPC wire)So the
dotnet testorchestrator can group artifacts by format without inspecting file contents:SessionFileArtifactgains an optionalkind(experimental-gated,[TPEXP]); the shipped 4-arg constructor is preserved for binary compatibility.FileArtifactMessage.Kind+FileArtifactMessageFieldsId.Kind = 7+ serializer read/write/field-count (forward/backward compatible — old readers skip the unknown field).DotnetTestDataConsumerpropagatesKindonto the wire message.microsoft.testing.trx, JUnitmicrosoft.testing.junit, CTRFmicrosoft.testing.ctrf, HTMLmicrosoft.testing.html.Tests
Kindsurvives the pipe.WasiPlaygroundsample fails on a missing workload); Platform IPC/protocol, contract-package, and Extensions unit tests all green.Not in this PR (future phases, per the RFC)
IArtifactPostProcessortyped contract wrapping the engines.ITool+ tool-host-over-pipe composition.merge-trx, …) and the dotnet/sdk orchestration.cc @Evangelink
Co-authored-by: Copilot App 223556219+Copilot@users.noreply.github.com