Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers) - #9032

Closed
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed
Closed

Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers)#9032
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Jun 11, 2026

Copy link
Copy Markdown
Member

Fixes NU1102 when test assets consume the MSTest meta package.

Root cause

MSTest 4.3.0-ci's packed nuspec hardcodes a preview Microsoft.Testing.Extensions.CodeCoverage dep, and that CodeCoverage nuspec demands Microsoft.Testing.Platform >= 2.3.0-preview.<date>. Two things conspire:

  1. The test asset's generated NuGet.config was missing the dotnet-tools feed where that preview MTP lives, so restore could not find it ⇒ NU1102.
  2. Even with the feed available, the locally-built MTP carries a -ci/-dev suffix that sorts BELOW -preview.<date> per SemVer 2.0 (c < p lexically), so it cannot satisfy the transitive >= 2.3.0-preview.<date> lower bound.

Fix (two layers)

  1. test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.cs — add dotnet-tools to the generated test-asset feed list and matching packageSourceMapping entry. This unblocks restore globally for every MSTest-meta consumer asset (transitive resolution now picks the preview MTP from dotnet-tools).

  2. AcceptanceTestBase.cs + JUnitReportTests.cs — load the preview MTP version pinned in eng/Versions.props (the MicrosoftTestingPlatformVersion darc-tracked property) into a new MicrosoftTestingPlatformPreviewVersion static and reference it explicitly on the two JUnitReportTests fixtures that surface NU1102 in this PR's CI signal. This makes the constraint intentional and visible at the asset level — belt-and-suspenders on top of Initial commit! 🎉 #1.

Tracked in #9030 with the full root-cause analysis and a list of follow-up fixes (B–E) for future hardening.

Test assets that reference the MSTest meta package transitively pull in
Microsoft.Testing.Extensions.CodeCoverage at a preview version (pinned in
eng/Versions.props -> MicrosoftTestingExtensionsCodeCoverageVersion), which
itself transitively depends on a matching Microsoft.Testing.Platform preview
(e.g. CodeCoverage 18.9.0-preview.26309.4 -> MTP >= 2.3.0-preview.26308.7).
These preview-versioned packages only live on the dotnet-tools feed, which
was absent from the test-asset NuGet.config generated by TestAsset.GetNuGetConfig.
That caused intermittent NU1102 failures on test assets such as
MSTestJUnitReportMTPRetry whenever the global NuGet cache didn't already have
the preview MTP staged from the main repo build.
Adds dotnet-tools (mirroring the top-level NuGet.config) so the transitive
preview resolution succeeds end-to-end.
Tracking: #9030
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the test-asset NuGet.config generator used by the test infrastructure so that restores for assets referencing the MSTest meta-package can resolve preview-only transitive dependencies (notably Microsoft.Testing.Extensions.CodeCoverage / Microsoft.Testing.Platform) from the dotnet-tools feed, avoiding intermittent NU1102 failures when those packages aren’t already in the global cache.

Changes:

  • Add the dotnet-tools package source to the generated NuGet.config content.
  • Add a corresponding packageSourceMapping entry for dotnet-tools to keep mapping configuration consistent with sources.
Show a summary per file
FileDescription
test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.csExtends the generated test-asset NuGet.config with the dotnet-tools feed + mapping so preview-only transitive packages can restore reliably.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 0

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9032

No new or modified test methods were identified in the changed regions
of this PR. Nothing to grade.

Re-run with /grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow.{ai_credits_suffix} · [◷]( · )

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Dimension-by-dimension analysis
#DimensionVerdict
1Algorithmic Correctness✅ LGTM — pure string-template change, no logic
2Threading & Concurrency✅ N/A
3Security & IPC Contract Safety✅ LGTM — pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools is the canonical public ADO NuGet feed, already present in the repo-level NuGet.config
4Public API & Binary Compatibility✅ N/A — internal test-infrastructure helper
5Performance & Allocations✅ N/A
6Cross-TFM Compatibility✅ N/A
7Resource & IDisposable Management✅ N/A
8Defensive Coding at Boundaries✅ N/A
9Localization & Resources✅ N/A — no user-facing strings
10Test Isolation✅ N/A
11Assertion Quality✅ N/A
12Flakiness Patterns✅ LGTM — stable public feed URL, already relied on by the repo-level config
13Test Completeness & Coverage✅ LGTM — the acceptance tests that were failing with NU1102 serve as the functional regression guard
14Data-Driven Test Coverage✅ N/A
15Code Structure & Simplification✅ LGTM — follows the existing template pattern exactly
16Naming & Conventions✅ LGTM — dotnet-tools key is consistent with all other feed names
17Documentation Accuracy✅ LGTM — inline comment explains why (the SemVer ordering issue), references tracking issue #9030
18Analyzer & Code Fix Quality✅ N/A
19IPC Wire Compatibility✅ N/A
20Build Infrastructure & Dependencies✅ LGTM — the addition mirrors the repo-level NuGet.config (line 16 there); <package pattern="*" /> is consistent with the pattern used for every other source in this generated config
21Scope & PR Discipline✅ LGTM — single-concern fix; root-cause analysis documented; broader hardening explicitly deferred to #9030
22PowerShell Scripting Hygiene✅ N/A

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review (on PR ready) workflow.{ai_credits_suffix} ·

Expose the preview `Microsoft.Testing.Platform` version pinned in
`eng/Versions.props` to `AcceptanceTestBase` and reference it explicitly
on the two `JUnitReportTests` fixtures that consume the `MSTest` meta
package. This complements the `dotnet-tools` feed addition (already in
this PR) by making the constraint explicit rather than relying purely on
transitive resolution.
Per SemVer 2.0, `2.3.0-ci` < `2.3.0-preview.<date>` (`c` < `p`
lexically), so the locally-built `-ci` MTP cannot satisfy the transitive
`>= 2.3.0-preview.<date>` constraint that the pinned preview
`CodeCoverage` package carries. The explicit `PackageReference` makes
this dependency intentional and visible at the asset level. See #9030.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 11, 2026 13:22
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotJune 11, 2026 13:22

CopilotAI commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved. I merged origin/main into this branch and fixed the conflict in test/IntegrationTests/MSTest.Acceptance.IntegrationTests/JUnitReportTests.cs in commit 9e7591eb7.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers) - #9032

Closed
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed
Closed

Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers)#9032
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Jun 11, 2026

Copy link
Copy Markdown
Member

Fixes NU1102 when test assets consume the MSTest meta package.

Root cause

MSTest 4.3.0-ci's packed nuspec hardcodes a preview Microsoft.Testing.Extensions.CodeCoverage dep, and that CodeCoverage nuspec demands Microsoft.Testing.Platform >= 2.3.0-preview.<date>. Two things conspire:

  1. The test asset's generated NuGet.config was missing the dotnet-tools feed where that preview MTP lives, so restore could not find it ⇒ NU1102.
  2. Even with the feed available, the locally-built MTP carries a -ci/-dev suffix that sorts BELOW -preview.<date> per SemVer 2.0 (c < p lexically), so it cannot satisfy the transitive >= 2.3.0-preview.<date> lower bound.

Fix (two layers)

  1. test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.cs — add dotnet-tools to the generated test-asset feed list and matching packageSourceMapping entry. This unblocks restore globally for every MSTest-meta consumer asset (transitive resolution now picks the preview MTP from dotnet-tools).

  2. AcceptanceTestBase.cs + JUnitReportTests.cs — load the preview MTP version pinned in eng/Versions.props (the MicrosoftTestingPlatformVersion darc-tracked property) into a new MicrosoftTestingPlatformPreviewVersion static and reference it explicitly on the two JUnitReportTests fixtures that surface NU1102 in this PR's CI signal. This makes the constraint intentional and visible at the asset level — belt-and-suspenders on top of Initial commit! 🎉 #1.

Tracked in #9030 with the full root-cause analysis and a list of follow-up fixes (B–E) for future hardening.

Test assets that reference the MSTest meta package transitively pull in
Microsoft.Testing.Extensions.CodeCoverage at a preview version (pinned in
eng/Versions.props -> MicrosoftTestingExtensionsCodeCoverageVersion), which
itself transitively depends on a matching Microsoft.Testing.Platform preview
(e.g. CodeCoverage 18.9.0-preview.26309.4 -> MTP >= 2.3.0-preview.26308.7).
These preview-versioned packages only live on the dotnet-tools feed, which
was absent from the test-asset NuGet.config generated by TestAsset.GetNuGetConfig.
That caused intermittent NU1102 failures on test assets such as
MSTestJUnitReportMTPRetry whenever the global NuGet cache didn't already have
the preview MTP staged from the main repo build.
Adds dotnet-tools (mirroring the top-level NuGet.config) so the transitive
preview resolution succeeds end-to-end.
Tracking: #9030
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the test-asset NuGet.config generator used by the test infrastructure so that restores for assets referencing the MSTest meta-package can resolve preview-only transitive dependencies (notably Microsoft.Testing.Extensions.CodeCoverage / Microsoft.Testing.Platform) from the dotnet-tools feed, avoiding intermittent NU1102 failures when those packages aren’t already in the global cache.

Changes:

  • Add the dotnet-tools package source to the generated NuGet.config content.
  • Add a corresponding packageSourceMapping entry for dotnet-tools to keep mapping configuration consistent with sources.
Show a summary per file
FileDescription
test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.csExtends the generated test-asset NuGet.config with the dotnet-tools feed + mapping so preview-only transitive packages can restore reliably.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 0

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9032

No new or modified test methods were identified in the changed regions
of this PR. Nothing to grade.

Re-run with /grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow.{ai_credits_suffix} · [◷]( · )

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Dimension-by-dimension analysis
#DimensionVerdict
1Algorithmic Correctness✅ LGTM — pure string-template change, no logic
2Threading & Concurrency✅ N/A
3Security & IPC Contract Safety✅ LGTM — pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools is the canonical public ADO NuGet feed, already present in the repo-level NuGet.config
4Public API & Binary Compatibility✅ N/A — internal test-infrastructure helper
5Performance & Allocations✅ N/A
6Cross-TFM Compatibility✅ N/A
7Resource & IDisposable Management✅ N/A
8Defensive Coding at Boundaries✅ N/A
9Localization & Resources✅ N/A — no user-facing strings
10Test Isolation✅ N/A
11Assertion Quality✅ N/A
12Flakiness Patterns✅ LGTM — stable public feed URL, already relied on by the repo-level config
13Test Completeness & Coverage✅ LGTM — the acceptance tests that were failing with NU1102 serve as the functional regression guard
14Data-Driven Test Coverage✅ N/A
15Code Structure & Simplification✅ LGTM — follows the existing template pattern exactly
16Naming & Conventions✅ LGTM — dotnet-tools key is consistent with all other feed names
17Documentation Accuracy✅ LGTM — inline comment explains why (the SemVer ordering issue), references tracking issue #9030
18Analyzer & Code Fix Quality✅ N/A
19IPC Wire Compatibility✅ N/A
20Build Infrastructure & Dependencies✅ LGTM — the addition mirrors the repo-level NuGet.config (line 16 there); <package pattern="*" /> is consistent with the pattern used for every other source in this generated config
21Scope & PR Discipline✅ LGTM — single-concern fix; root-cause analysis documented; broader hardening explicitly deferred to #9030
22PowerShell Scripting Hygiene✅ N/A

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review (on PR ready) workflow.{ai_credits_suffix} ·

Expose the preview `Microsoft.Testing.Platform` version pinned in
`eng/Versions.props` to `AcceptanceTestBase` and reference it explicitly
on the two `JUnitReportTests` fixtures that consume the `MSTest` meta
package. This complements the `dotnet-tools` feed addition (already in
this PR) by making the constraint explicit rather than relying purely on
transitive resolution.
Per SemVer 2.0, `2.3.0-ci` < `2.3.0-preview.<date>` (`c` < `p`
lexically), so the locally-built `-ci` MTP cannot satisfy the transitive
`>= 2.3.0-preview.<date>` constraint that the pinned preview
`CodeCoverage` package carries. The explicit `PackageReference` makes
this dependency intentional and visible at the asset level. See #9030.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 11, 2026 13:22
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotJune 11, 2026 13:22

CopilotAI commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved. I merged origin/main into this branch and fixed the conflict in test/IntegrationTests/MSTest.Acceptance.IntegrationTests/JUnitReportTests.cs in commit 9e7591eb7.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers) - #9032

Closed
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed
Closed

Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers)#9032
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Jun 11, 2026

Copy link
Copy Markdown
Member

Fixes NU1102 when test assets consume the MSTest meta package.

Root cause

MSTest 4.3.0-ci's packed nuspec hardcodes a preview Microsoft.Testing.Extensions.CodeCoverage dep, and that CodeCoverage nuspec demands Microsoft.Testing.Platform >= 2.3.0-preview.<date>. Two things conspire:

  1. The test asset's generated NuGet.config was missing the dotnet-tools feed where that preview MTP lives, so restore could not find it ⇒ NU1102.
  2. Even with the feed available, the locally-built MTP carries a -ci/-dev suffix that sorts BELOW -preview.<date> per SemVer 2.0 (c < p lexically), so it cannot satisfy the transitive >= 2.3.0-preview.<date> lower bound.

Fix (two layers)

  1. test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.cs — add dotnet-tools to the generated test-asset feed list and matching packageSourceMapping entry. This unblocks restore globally for every MSTest-meta consumer asset (transitive resolution now picks the preview MTP from dotnet-tools).

  2. AcceptanceTestBase.cs + JUnitReportTests.cs — load the preview MTP version pinned in eng/Versions.props (the MicrosoftTestingPlatformVersion darc-tracked property) into a new MicrosoftTestingPlatformPreviewVersion static and reference it explicitly on the two JUnitReportTests fixtures that surface NU1102 in this PR's CI signal. This makes the constraint intentional and visible at the asset level — belt-and-suspenders on top of Initial commit! 🎉 #1.

Tracked in #9030 with the full root-cause analysis and a list of follow-up fixes (B–E) for future hardening.

Test assets that reference the MSTest meta package transitively pull in
Microsoft.Testing.Extensions.CodeCoverage at a preview version (pinned in
eng/Versions.props -> MicrosoftTestingExtensionsCodeCoverageVersion), which
itself transitively depends on a matching Microsoft.Testing.Platform preview
(e.g. CodeCoverage 18.9.0-preview.26309.4 -> MTP >= 2.3.0-preview.26308.7).
These preview-versioned packages only live on the dotnet-tools feed, which
was absent from the test-asset NuGet.config generated by TestAsset.GetNuGetConfig.
That caused intermittent NU1102 failures on test assets such as
MSTestJUnitReportMTPRetry whenever the global NuGet cache didn't already have
the preview MTP staged from the main repo build.
Adds dotnet-tools (mirroring the top-level NuGet.config) so the transitive
preview resolution succeeds end-to-end.
Tracking: #9030
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the test-asset NuGet.config generator used by the test infrastructure so that restores for assets referencing the MSTest meta-package can resolve preview-only transitive dependencies (notably Microsoft.Testing.Extensions.CodeCoverage / Microsoft.Testing.Platform) from the dotnet-tools feed, avoiding intermittent NU1102 failures when those packages aren’t already in the global cache.

Changes:

  • Add the dotnet-tools package source to the generated NuGet.config content.
  • Add a corresponding packageSourceMapping entry for dotnet-tools to keep mapping configuration consistent with sources.
Show a summary per file
FileDescription
test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.csExtends the generated test-asset NuGet.config with the dotnet-tools feed + mapping so preview-only transitive packages can restore reliably.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 0

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9032

No new or modified test methods were identified in the changed regions
of this PR. Nothing to grade.

Re-run with /grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow.{ai_credits_suffix} · [◷]( · )

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Dimension-by-dimension analysis
#DimensionVerdict
1Algorithmic Correctness✅ LGTM — pure string-template change, no logic
2Threading & Concurrency✅ N/A
3Security & IPC Contract Safety✅ LGTM — pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools is the canonical public ADO NuGet feed, already present in the repo-level NuGet.config
4Public API & Binary Compatibility✅ N/A — internal test-infrastructure helper
5Performance & Allocations✅ N/A
6Cross-TFM Compatibility✅ N/A
7Resource & IDisposable Management✅ N/A
8Defensive Coding at Boundaries✅ N/A
9Localization & Resources✅ N/A — no user-facing strings
10Test Isolation✅ N/A
11Assertion Quality✅ N/A
12Flakiness Patterns✅ LGTM — stable public feed URL, already relied on by the repo-level config
13Test Completeness & Coverage✅ LGTM — the acceptance tests that were failing with NU1102 serve as the functional regression guard
14Data-Driven Test Coverage✅ N/A
15Code Structure & Simplification✅ LGTM — follows the existing template pattern exactly
16Naming & Conventions✅ LGTM — dotnet-tools key is consistent with all other feed names
17Documentation Accuracy✅ LGTM — inline comment explains why (the SemVer ordering issue), references tracking issue #9030
18Analyzer & Code Fix Quality✅ N/A
19IPC Wire Compatibility✅ N/A
20Build Infrastructure & Dependencies✅ LGTM — the addition mirrors the repo-level NuGet.config (line 16 there); <package pattern="*" /> is consistent with the pattern used for every other source in this generated config
21Scope & PR Discipline✅ LGTM — single-concern fix; root-cause analysis documented; broader hardening explicitly deferred to #9030
22PowerShell Scripting Hygiene✅ N/A

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review (on PR ready) workflow.{ai_credits_suffix} ·

Expose the preview `Microsoft.Testing.Platform` version pinned in
`eng/Versions.props` to `AcceptanceTestBase` and reference it explicitly
on the two `JUnitReportTests` fixtures that consume the `MSTest` meta
package. This complements the `dotnet-tools` feed addition (already in
this PR) by making the constraint explicit rather than relying purely on
transitive resolution.
Per SemVer 2.0, `2.3.0-ci` < `2.3.0-preview.<date>` (`c` < `p`
lexically), so the locally-built `-ci` MTP cannot satisfy the transitive
`>= 2.3.0-preview.<date>` constraint that the pinned preview
`CodeCoverage` package carries. The explicit `PackageReference` makes
this dependency intentional and visible at the asset level. See #9030.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 11, 2026 13:22
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotJune 11, 2026 13:22

CopilotAI commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved. I merged origin/main into this branch and fixed the conflict in test/IntegrationTests/MSTest.Acceptance.IntegrationTests/JUnitReportTests.cs in commit 9e7591eb7.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers) - #9032

Closed
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed
Closed

Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers)#9032
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Jun 11, 2026

Copy link
Copy Markdown
Member

Fixes NU1102 when test assets consume the MSTest meta package.

Root cause

MSTest 4.3.0-ci's packed nuspec hardcodes a preview Microsoft.Testing.Extensions.CodeCoverage dep, and that CodeCoverage nuspec demands Microsoft.Testing.Platform >= 2.3.0-preview.<date>. Two things conspire:

  1. The test asset's generated NuGet.config was missing the dotnet-tools feed where that preview MTP lives, so restore could not find it ⇒ NU1102.
  2. Even with the feed available, the locally-built MTP carries a -ci/-dev suffix that sorts BELOW -preview.<date> per SemVer 2.0 (c < p lexically), so it cannot satisfy the transitive >= 2.3.0-preview.<date> lower bound.

Fix (two layers)

  1. test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.cs — add dotnet-tools to the generated test-asset feed list and matching packageSourceMapping entry. This unblocks restore globally for every MSTest-meta consumer asset (transitive resolution now picks the preview MTP from dotnet-tools).

  2. AcceptanceTestBase.cs + JUnitReportTests.cs — load the preview MTP version pinned in eng/Versions.props (the MicrosoftTestingPlatformVersion darc-tracked property) into a new MicrosoftTestingPlatformPreviewVersion static and reference it explicitly on the two JUnitReportTests fixtures that surface NU1102 in this PR's CI signal. This makes the constraint intentional and visible at the asset level — belt-and-suspenders on top of Initial commit! 🎉 #1.

Tracked in #9030 with the full root-cause analysis and a list of follow-up fixes (B–E) for future hardening.

Test assets that reference the MSTest meta package transitively pull in
Microsoft.Testing.Extensions.CodeCoverage at a preview version (pinned in
eng/Versions.props -> MicrosoftTestingExtensionsCodeCoverageVersion), which
itself transitively depends on a matching Microsoft.Testing.Platform preview
(e.g. CodeCoverage 18.9.0-preview.26309.4 -> MTP >= 2.3.0-preview.26308.7).
These preview-versioned packages only live on the dotnet-tools feed, which
was absent from the test-asset NuGet.config generated by TestAsset.GetNuGetConfig.
That caused intermittent NU1102 failures on test assets such as
MSTestJUnitReportMTPRetry whenever the global NuGet cache didn't already have
the preview MTP staged from the main repo build.
Adds dotnet-tools (mirroring the top-level NuGet.config) so the transitive
preview resolution succeeds end-to-end.
Tracking: #9030
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the test-asset NuGet.config generator used by the test infrastructure so that restores for assets referencing the MSTest meta-package can resolve preview-only transitive dependencies (notably Microsoft.Testing.Extensions.CodeCoverage / Microsoft.Testing.Platform) from the dotnet-tools feed, avoiding intermittent NU1102 failures when those packages aren’t already in the global cache.

Changes:

  • Add the dotnet-tools package source to the generated NuGet.config content.
  • Add a corresponding packageSourceMapping entry for dotnet-tools to keep mapping configuration consistent with sources.
Show a summary per file
FileDescription
test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.csExtends the generated test-asset NuGet.config with the dotnet-tools feed + mapping so preview-only transitive packages can restore reliably.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 0

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9032

No new or modified test methods were identified in the changed regions
of this PR. Nothing to grade.

Re-run with /grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow.{ai_credits_suffix} · [◷]( · )

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Dimension-by-dimension analysis
#DimensionVerdict
1Algorithmic Correctness✅ LGTM — pure string-template change, no logic
2Threading & Concurrency✅ N/A
3Security & IPC Contract Safety✅ LGTM — pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools is the canonical public ADO NuGet feed, already present in the repo-level NuGet.config
4Public API & Binary Compatibility✅ N/A — internal test-infrastructure helper
5Performance & Allocations✅ N/A
6Cross-TFM Compatibility✅ N/A
7Resource & IDisposable Management✅ N/A
8Defensive Coding at Boundaries✅ N/A
9Localization & Resources✅ N/A — no user-facing strings
10Test Isolation✅ N/A
11Assertion Quality✅ N/A
12Flakiness Patterns✅ LGTM — stable public feed URL, already relied on by the repo-level config
13Test Completeness & Coverage✅ LGTM — the acceptance tests that were failing with NU1102 serve as the functional regression guard
14Data-Driven Test Coverage✅ N/A
15Code Structure & Simplification✅ LGTM — follows the existing template pattern exactly
16Naming & Conventions✅ LGTM — dotnet-tools key is consistent with all other feed names
17Documentation Accuracy✅ LGTM — inline comment explains why (the SemVer ordering issue), references tracking issue #9030
18Analyzer & Code Fix Quality✅ N/A
19IPC Wire Compatibility✅ N/A
20Build Infrastructure & Dependencies✅ LGTM — the addition mirrors the repo-level NuGet.config (line 16 there); <package pattern="*" /> is consistent with the pattern used for every other source in this generated config
21Scope & PR Discipline✅ LGTM — single-concern fix; root-cause analysis documented; broader hardening explicitly deferred to #9030
22PowerShell Scripting Hygiene✅ N/A

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review (on PR ready) workflow.{ai_credits_suffix} ·

Expose the preview `Microsoft.Testing.Platform` version pinned in
`eng/Versions.props` to `AcceptanceTestBase` and reference it explicitly
on the two `JUnitReportTests` fixtures that consume the `MSTest` meta
package. This complements the `dotnet-tools` feed addition (already in
this PR) by making the constraint explicit rather than relying purely on
transitive resolution.
Per SemVer 2.0, `2.3.0-ci` < `2.3.0-preview.<date>` (`c` < `p`
lexically), so the locally-built `-ci` MTP cannot satisfy the transitive
`>= 2.3.0-preview.<date>` constraint that the pinned preview
`CodeCoverage` package carries. The explicit `PackageReference` makes
this dependency intentional and visible at the asset level. See #9030.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 11, 2026 13:22
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotJune 11, 2026 13:22

CopilotAI commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved. I merged origin/main into this branch and fixed the conflict in test/IntegrationTests/MSTest.Acceptance.IntegrationTests/JUnitReportTests.cs in commit 9e7591eb7.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers) - #9032

Closed
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed
Closed

Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers)#9032
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Jun 11, 2026

Copy link
Copy Markdown
Member

Fixes NU1102 when test assets consume the MSTest meta package.

Root cause

MSTest 4.3.0-ci's packed nuspec hardcodes a preview Microsoft.Testing.Extensions.CodeCoverage dep, and that CodeCoverage nuspec demands Microsoft.Testing.Platform >= 2.3.0-preview.<date>. Two things conspire:

  1. The test asset's generated NuGet.config was missing the dotnet-tools feed where that preview MTP lives, so restore could not find it ⇒ NU1102.
  2. Even with the feed available, the locally-built MTP carries a -ci/-dev suffix that sorts BELOW -preview.<date> per SemVer 2.0 (c < p lexically), so it cannot satisfy the transitive >= 2.3.0-preview.<date> lower bound.

Fix (two layers)

  1. test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.cs — add dotnet-tools to the generated test-asset feed list and matching packageSourceMapping entry. This unblocks restore globally for every MSTest-meta consumer asset (transitive resolution now picks the preview MTP from dotnet-tools).

  2. AcceptanceTestBase.cs + JUnitReportTests.cs — load the preview MTP version pinned in eng/Versions.props (the MicrosoftTestingPlatformVersion darc-tracked property) into a new MicrosoftTestingPlatformPreviewVersion static and reference it explicitly on the two JUnitReportTests fixtures that surface NU1102 in this PR's CI signal. This makes the constraint intentional and visible at the asset level — belt-and-suspenders on top of Initial commit! 🎉 #1.

Tracked in #9030 with the full root-cause analysis and a list of follow-up fixes (B–E) for future hardening.

Test assets that reference the MSTest meta package transitively pull in
Microsoft.Testing.Extensions.CodeCoverage at a preview version (pinned in
eng/Versions.props -> MicrosoftTestingExtensionsCodeCoverageVersion), which
itself transitively depends on a matching Microsoft.Testing.Platform preview
(e.g. CodeCoverage 18.9.0-preview.26309.4 -> MTP >= 2.3.0-preview.26308.7).
These preview-versioned packages only live on the dotnet-tools feed, which
was absent from the test-asset NuGet.config generated by TestAsset.GetNuGetConfig.
That caused intermittent NU1102 failures on test assets such as
MSTestJUnitReportMTPRetry whenever the global NuGet cache didn't already have
the preview MTP staged from the main repo build.
Adds dotnet-tools (mirroring the top-level NuGet.config) so the transitive
preview resolution succeeds end-to-end.
Tracking: #9030
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the test-asset NuGet.config generator used by the test infrastructure so that restores for assets referencing the MSTest meta-package can resolve preview-only transitive dependencies (notably Microsoft.Testing.Extensions.CodeCoverage / Microsoft.Testing.Platform) from the dotnet-tools feed, avoiding intermittent NU1102 failures when those packages aren’t already in the global cache.

Changes:

  • Add the dotnet-tools package source to the generated NuGet.config content.
  • Add a corresponding packageSourceMapping entry for dotnet-tools to keep mapping configuration consistent with sources.
Show a summary per file
FileDescription
test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.csExtends the generated test-asset NuGet.config with the dotnet-tools feed + mapping so preview-only transitive packages can restore reliably.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 0

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9032

No new or modified test methods were identified in the changed regions
of this PR. Nothing to grade.

Re-run with /grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow.{ai_credits_suffix} · [◷]( · )

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Dimension-by-dimension analysis
#DimensionVerdict
1Algorithmic Correctness✅ LGTM — pure string-template change, no logic
2Threading & Concurrency✅ N/A
3Security & IPC Contract Safety✅ LGTM — pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools is the canonical public ADO NuGet feed, already present in the repo-level NuGet.config
4Public API & Binary Compatibility✅ N/A — internal test-infrastructure helper
5Performance & Allocations✅ N/A
6Cross-TFM Compatibility✅ N/A
7Resource & IDisposable Management✅ N/A
8Defensive Coding at Boundaries✅ N/A
9Localization & Resources✅ N/A — no user-facing strings
10Test Isolation✅ N/A
11Assertion Quality✅ N/A
12Flakiness Patterns✅ LGTM — stable public feed URL, already relied on by the repo-level config
13Test Completeness & Coverage✅ LGTM — the acceptance tests that were failing with NU1102 serve as the functional regression guard
14Data-Driven Test Coverage✅ N/A
15Code Structure & Simplification✅ LGTM — follows the existing template pattern exactly
16Naming & Conventions✅ LGTM — dotnet-tools key is consistent with all other feed names
17Documentation Accuracy✅ LGTM — inline comment explains why (the SemVer ordering issue), references tracking issue #9030
18Analyzer & Code Fix Quality✅ N/A
19IPC Wire Compatibility✅ N/A
20Build Infrastructure & Dependencies✅ LGTM — the addition mirrors the repo-level NuGet.config (line 16 there); <package pattern="*" /> is consistent with the pattern used for every other source in this generated config
21Scope & PR Discipline✅ LGTM — single-concern fix; root-cause analysis documented; broader hardening explicitly deferred to #9030
22PowerShell Scripting Hygiene✅ N/A

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review (on PR ready) workflow.{ai_credits_suffix} ·

Expose the preview `Microsoft.Testing.Platform` version pinned in
`eng/Versions.props` to `AcceptanceTestBase` and reference it explicitly
on the two `JUnitReportTests` fixtures that consume the `MSTest` meta
package. This complements the `dotnet-tools` feed addition (already in
this PR) by making the constraint explicit rather than relying purely on
transitive resolution.
Per SemVer 2.0, `2.3.0-ci` < `2.3.0-preview.<date>` (`c` < `p`
lexically), so the locally-built `-ci` MTP cannot satisfy the transitive
`>= 2.3.0-preview.<date>` constraint that the pinned preview
`CodeCoverage` package carries. The explicit `PackageReference` makes
this dependency intentional and visible at the asset level. See #9030.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 11, 2026 13:22
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotJune 11, 2026 13:22

CopilotAI commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved. I merged origin/main into this branch and fixed the conflict in test/IntegrationTests/MSTest.Acceptance.IntegrationTests/JUnitReportTests.cs in commit 9e7591eb7.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers) - #9032

Closed
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed
Closed

Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers)#9032
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Jun 11, 2026

Copy link
Copy Markdown
Member

Fixes NU1102 when test assets consume the MSTest meta package.

Root cause

MSTest 4.3.0-ci's packed nuspec hardcodes a preview Microsoft.Testing.Extensions.CodeCoverage dep, and that CodeCoverage nuspec demands Microsoft.Testing.Platform >= 2.3.0-preview.<date>. Two things conspire:

  1. The test asset's generated NuGet.config was missing the dotnet-tools feed where that preview MTP lives, so restore could not find it ⇒ NU1102.
  2. Even with the feed available, the locally-built MTP carries a -ci/-dev suffix that sorts BELOW -preview.<date> per SemVer 2.0 (c < p lexically), so it cannot satisfy the transitive >= 2.3.0-preview.<date> lower bound.

Fix (two layers)

  1. test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.cs — add dotnet-tools to the generated test-asset feed list and matching packageSourceMapping entry. This unblocks restore globally for every MSTest-meta consumer asset (transitive resolution now picks the preview MTP from dotnet-tools).

  2. AcceptanceTestBase.cs + JUnitReportTests.cs — load the preview MTP version pinned in eng/Versions.props (the MicrosoftTestingPlatformVersion darc-tracked property) into a new MicrosoftTestingPlatformPreviewVersion static and reference it explicitly on the two JUnitReportTests fixtures that surface NU1102 in this PR's CI signal. This makes the constraint intentional and visible at the asset level — belt-and-suspenders on top of Initial commit! 🎉 #1.

Tracked in #9030 with the full root-cause analysis and a list of follow-up fixes (B–E) for future hardening.

Test assets that reference the MSTest meta package transitively pull in
Microsoft.Testing.Extensions.CodeCoverage at a preview version (pinned in
eng/Versions.props -> MicrosoftTestingExtensionsCodeCoverageVersion), which
itself transitively depends on a matching Microsoft.Testing.Platform preview
(e.g. CodeCoverage 18.9.0-preview.26309.4 -> MTP >= 2.3.0-preview.26308.7).
These preview-versioned packages only live on the dotnet-tools feed, which
was absent from the test-asset NuGet.config generated by TestAsset.GetNuGetConfig.
That caused intermittent NU1102 failures on test assets such as
MSTestJUnitReportMTPRetry whenever the global NuGet cache didn't already have
the preview MTP staged from the main repo build.
Adds dotnet-tools (mirroring the top-level NuGet.config) so the transitive
preview resolution succeeds end-to-end.
Tracking: #9030
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the test-asset NuGet.config generator used by the test infrastructure so that restores for assets referencing the MSTest meta-package can resolve preview-only transitive dependencies (notably Microsoft.Testing.Extensions.CodeCoverage / Microsoft.Testing.Platform) from the dotnet-tools feed, avoiding intermittent NU1102 failures when those packages aren’t already in the global cache.

Changes:

  • Add the dotnet-tools package source to the generated NuGet.config content.
  • Add a corresponding packageSourceMapping entry for dotnet-tools to keep mapping configuration consistent with sources.
Show a summary per file
FileDescription
test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.csExtends the generated test-asset NuGet.config with the dotnet-tools feed + mapping so preview-only transitive packages can restore reliably.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 0

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9032

No new or modified test methods were identified in the changed regions
of this PR. Nothing to grade.

Re-run with /grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow.{ai_credits_suffix} · [◷]( · )

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Dimension-by-dimension analysis
#DimensionVerdict
1Algorithmic Correctness✅ LGTM — pure string-template change, no logic
2Threading & Concurrency✅ N/A
3Security & IPC Contract Safety✅ LGTM — pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools is the canonical public ADO NuGet feed, already present in the repo-level NuGet.config
4Public API & Binary Compatibility✅ N/A — internal test-infrastructure helper
5Performance & Allocations✅ N/A
6Cross-TFM Compatibility✅ N/A
7Resource & IDisposable Management✅ N/A
8Defensive Coding at Boundaries✅ N/A
9Localization & Resources✅ N/A — no user-facing strings
10Test Isolation✅ N/A
11Assertion Quality✅ N/A
12Flakiness Patterns✅ LGTM — stable public feed URL, already relied on by the repo-level config
13Test Completeness & Coverage✅ LGTM — the acceptance tests that were failing with NU1102 serve as the functional regression guard
14Data-Driven Test Coverage✅ N/A
15Code Structure & Simplification✅ LGTM — follows the existing template pattern exactly
16Naming & Conventions✅ LGTM — dotnet-tools key is consistent with all other feed names
17Documentation Accuracy✅ LGTM — inline comment explains why (the SemVer ordering issue), references tracking issue #9030
18Analyzer & Code Fix Quality✅ N/A
19IPC Wire Compatibility✅ N/A
20Build Infrastructure & Dependencies✅ LGTM — the addition mirrors the repo-level NuGet.config (line 16 there); <package pattern="*" /> is consistent with the pattern used for every other source in this generated config
21Scope & PR Discipline✅ LGTM — single-concern fix; root-cause analysis documented; broader hardening explicitly deferred to #9030
22PowerShell Scripting Hygiene✅ N/A

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review (on PR ready) workflow.{ai_credits_suffix} ·

Expose the preview `Microsoft.Testing.Platform` version pinned in
`eng/Versions.props` to `AcceptanceTestBase` and reference it explicitly
on the two `JUnitReportTests` fixtures that consume the `MSTest` meta
package. This complements the `dotnet-tools` feed addition (already in
this PR) by making the constraint explicit rather than relying purely on
transitive resolution.
Per SemVer 2.0, `2.3.0-ci` < `2.3.0-preview.<date>` (`c` < `p`
lexically), so the locally-built `-ci` MTP cannot satisfy the transitive
`>= 2.3.0-preview.<date>` constraint that the pinned preview
`CodeCoverage` package carries. The explicit `PackageReference` makes
this dependency intentional and visible at the asset level. See #9030.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 11, 2026 13:22
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotJune 11, 2026 13:22

CopilotAI commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved. I merged origin/main into this branch and fixed the conflict in test/IntegrationTests/MSTest.Acceptance.IntegrationTests/JUnitReportTests.cs in commit 9e7591eb7.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers) - #9032

Closed
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed
Closed

Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers)#9032
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Jun 11, 2026

Copy link
Copy Markdown
Member

Fixes NU1102 when test assets consume the MSTest meta package.

Root cause

MSTest 4.3.0-ci's packed nuspec hardcodes a preview Microsoft.Testing.Extensions.CodeCoverage dep, and that CodeCoverage nuspec demands Microsoft.Testing.Platform >= 2.3.0-preview.<date>. Two things conspire:

  1. The test asset's generated NuGet.config was missing the dotnet-tools feed where that preview MTP lives, so restore could not find it ⇒ NU1102.
  2. Even with the feed available, the locally-built MTP carries a -ci/-dev suffix that sorts BELOW -preview.<date> per SemVer 2.0 (c < p lexically), so it cannot satisfy the transitive >= 2.3.0-preview.<date> lower bound.

Fix (two layers)

  1. test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.cs — add dotnet-tools to the generated test-asset feed list and matching packageSourceMapping entry. This unblocks restore globally for every MSTest-meta consumer asset (transitive resolution now picks the preview MTP from dotnet-tools).

  2. AcceptanceTestBase.cs + JUnitReportTests.cs — load the preview MTP version pinned in eng/Versions.props (the MicrosoftTestingPlatformVersion darc-tracked property) into a new MicrosoftTestingPlatformPreviewVersion static and reference it explicitly on the two JUnitReportTests fixtures that surface NU1102 in this PR's CI signal. This makes the constraint intentional and visible at the asset level — belt-and-suspenders on top of Initial commit! 🎉 #1.

Tracked in #9030 with the full root-cause analysis and a list of follow-up fixes (B–E) for future hardening.

Test assets that reference the MSTest meta package transitively pull in
Microsoft.Testing.Extensions.CodeCoverage at a preview version (pinned in
eng/Versions.props -> MicrosoftTestingExtensionsCodeCoverageVersion), which
itself transitively depends on a matching Microsoft.Testing.Platform preview
(e.g. CodeCoverage 18.9.0-preview.26309.4 -> MTP >= 2.3.0-preview.26308.7).
These preview-versioned packages only live on the dotnet-tools feed, which
was absent from the test-asset NuGet.config generated by TestAsset.GetNuGetConfig.
That caused intermittent NU1102 failures on test assets such as
MSTestJUnitReportMTPRetry whenever the global NuGet cache didn't already have
the preview MTP staged from the main repo build.
Adds dotnet-tools (mirroring the top-level NuGet.config) so the transitive
preview resolution succeeds end-to-end.
Tracking: #9030
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the test-asset NuGet.config generator used by the test infrastructure so that restores for assets referencing the MSTest meta-package can resolve preview-only transitive dependencies (notably Microsoft.Testing.Extensions.CodeCoverage / Microsoft.Testing.Platform) from the dotnet-tools feed, avoiding intermittent NU1102 failures when those packages aren’t already in the global cache.

Changes:

  • Add the dotnet-tools package source to the generated NuGet.config content.
  • Add a corresponding packageSourceMapping entry for dotnet-tools to keep mapping configuration consistent with sources.
Show a summary per file
FileDescription
test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.csExtends the generated test-asset NuGet.config with the dotnet-tools feed + mapping so preview-only transitive packages can restore reliably.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 0

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9032

No new or modified test methods were identified in the changed regions
of this PR. Nothing to grade.

Re-run with /grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow.{ai_credits_suffix} · [◷]( · )

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Dimension-by-dimension analysis
#DimensionVerdict
1Algorithmic Correctness✅ LGTM — pure string-template change, no logic
2Threading & Concurrency✅ N/A
3Security & IPC Contract Safety✅ LGTM — pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools is the canonical public ADO NuGet feed, already present in the repo-level NuGet.config
4Public API & Binary Compatibility✅ N/A — internal test-infrastructure helper
5Performance & Allocations✅ N/A
6Cross-TFM Compatibility✅ N/A
7Resource & IDisposable Management✅ N/A
8Defensive Coding at Boundaries✅ N/A
9Localization & Resources✅ N/A — no user-facing strings
10Test Isolation✅ N/A
11Assertion Quality✅ N/A
12Flakiness Patterns✅ LGTM — stable public feed URL, already relied on by the repo-level config
13Test Completeness & Coverage✅ LGTM — the acceptance tests that were failing with NU1102 serve as the functional regression guard
14Data-Driven Test Coverage✅ N/A
15Code Structure & Simplification✅ LGTM — follows the existing template pattern exactly
16Naming & Conventions✅ LGTM — dotnet-tools key is consistent with all other feed names
17Documentation Accuracy✅ LGTM — inline comment explains why (the SemVer ordering issue), references tracking issue #9030
18Analyzer & Code Fix Quality✅ N/A
19IPC Wire Compatibility✅ N/A
20Build Infrastructure & Dependencies✅ LGTM — the addition mirrors the repo-level NuGet.config (line 16 there); <package pattern="*" /> is consistent with the pattern used for every other source in this generated config
21Scope & PR Discipline✅ LGTM — single-concern fix; root-cause analysis documented; broader hardening explicitly deferred to #9030
22PowerShell Scripting Hygiene✅ N/A

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review (on PR ready) workflow.{ai_credits_suffix} ·

Expose the preview `Microsoft.Testing.Platform` version pinned in
`eng/Versions.props` to `AcceptanceTestBase` and reference it explicitly
on the two `JUnitReportTests` fixtures that consume the `MSTest` meta
package. This complements the `dotnet-tools` feed addition (already in
this PR) by making the constraint explicit rather than relying purely on
transitive resolution.
Per SemVer 2.0, `2.3.0-ci` < `2.3.0-preview.<date>` (`c` < `p`
lexically), so the locally-built `-ci` MTP cannot satisfy the transitive
`>= 2.3.0-preview.<date>` constraint that the pinned preview
`CodeCoverage` package carries. The explicit `PackageReference` makes
this dependency intentional and visible at the asset level. See #9030.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 11, 2026 13:22
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotJune 11, 2026 13:22

CopilotAI commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved. I merged origin/main into this branch and fixed the conflict in test/IntegrationTests/MSTest.Acceptance.IntegrationTests/JUnitReportTests.cs in commit 9e7591eb7.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers) - #9032

Closed
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed
Closed

Add dotnet-tools feed to test asset NuGet.config (fixes NU1102 for MSTest-meta consumers)#9032
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
fix/test-asset-add-dotnet-tools-feed

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Jun 11, 2026

Copy link
Copy Markdown
Member

Fixes NU1102 when test assets consume the MSTest meta package.

Root cause

MSTest 4.3.0-ci's packed nuspec hardcodes a preview Microsoft.Testing.Extensions.CodeCoverage dep, and that CodeCoverage nuspec demands Microsoft.Testing.Platform >= 2.3.0-preview.<date>. Two things conspire:

  1. The test asset's generated NuGet.config was missing the dotnet-tools feed where that preview MTP lives, so restore could not find it ⇒ NU1102.
  2. Even with the feed available, the locally-built MTP carries a -ci/-dev suffix that sorts BELOW -preview.<date> per SemVer 2.0 (c < p lexically), so it cannot satisfy the transitive >= 2.3.0-preview.<date> lower bound.

Fix (two layers)

  1. test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.cs — add dotnet-tools to the generated test-asset feed list and matching packageSourceMapping entry. This unblocks restore globally for every MSTest-meta consumer asset (transitive resolution now picks the preview MTP from dotnet-tools).

  2. AcceptanceTestBase.cs + JUnitReportTests.cs — load the preview MTP version pinned in eng/Versions.props (the MicrosoftTestingPlatformVersion darc-tracked property) into a new MicrosoftTestingPlatformPreviewVersion static and reference it explicitly on the two JUnitReportTests fixtures that surface NU1102 in this PR's CI signal. This makes the constraint intentional and visible at the asset level — belt-and-suspenders on top of Initial commit! 🎉 #1.

Tracked in #9030 with the full root-cause analysis and a list of follow-up fixes (B–E) for future hardening.

Test assets that reference the MSTest meta package transitively pull in
Microsoft.Testing.Extensions.CodeCoverage at a preview version (pinned in
eng/Versions.props -> MicrosoftTestingExtensionsCodeCoverageVersion), which
itself transitively depends on a matching Microsoft.Testing.Platform preview
(e.g. CodeCoverage 18.9.0-preview.26309.4 -> MTP >= 2.3.0-preview.26308.7).
These preview-versioned packages only live on the dotnet-tools feed, which
was absent from the test-asset NuGet.config generated by TestAsset.GetNuGetConfig.
That caused intermittent NU1102 failures on test assets such as
MSTestJUnitReportMTPRetry whenever the global NuGet cache didn't already have
the preview MTP staged from the main repo build.
Adds dotnet-tools (mirroring the top-level NuGet.config) so the transitive
preview resolution succeeds end-to-end.
Tracking: #9030
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the test-asset NuGet.config generator used by the test infrastructure so that restores for assets referencing the MSTest meta-package can resolve preview-only transitive dependencies (notably Microsoft.Testing.Extensions.CodeCoverage / Microsoft.Testing.Platform) from the dotnet-tools feed, avoiding intermittent NU1102 failures when those packages aren’t already in the global cache.

Changes:

  • Add the dotnet-tools package source to the generated NuGet.config content.
  • Add a corresponding packageSourceMapping entry for dotnet-tools to keep mapping configuration consistent with sources.
Show a summary per file
FileDescription
test/Utilities/Microsoft.Testing.TestInfrastructure/TestAsset.csExtends the generated test-asset NuGet.config with the dotnet-tools feed + mapping so preview-only transitive packages can restore reliably.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 0

@Evangelink

Copy link
Copy Markdown
MemberAuthor

🧪 Test quality grade — PR #9032

No new or modified test methods were identified in the changed regions
of this PR. Nothing to grade.

Re-run with /grade-tests.

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Grade Tests on PR (on open / sync) workflow.{ai_credits_suffix} · [◷]( · )

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

🤖 Automated review by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

✅ 22/22 dimensions clean — no findings.

Dimension-by-dimension analysis
#DimensionVerdict
1Algorithmic Correctness✅ LGTM — pure string-template change, no logic
2Threading & Concurrency✅ N/A
3Security & IPC Contract Safety✅ LGTM — pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools is the canonical public ADO NuGet feed, already present in the repo-level NuGet.config
4Public API & Binary Compatibility✅ N/A — internal test-infrastructure helper
5Performance & Allocations✅ N/A
6Cross-TFM Compatibility✅ N/A
7Resource & IDisposable Management✅ N/A
8Defensive Coding at Boundaries✅ N/A
9Localization & Resources✅ N/A — no user-facing strings
10Test Isolation✅ N/A
11Assertion Quality✅ N/A
12Flakiness Patterns✅ LGTM — stable public feed URL, already relied on by the repo-level config
13Test Completeness & Coverage✅ LGTM — the acceptance tests that were failing with NU1102 serve as the functional regression guard
14Data-Driven Test Coverage✅ N/A
15Code Structure & Simplification✅ LGTM — follows the existing template pattern exactly
16Naming & Conventions✅ LGTM — dotnet-tools key is consistent with all other feed names
17Documentation Accuracy✅ LGTM — inline comment explains why (the SemVer ordering issue), references tracking issue #9030
18Analyzer & Code Fix Quality✅ N/A
19IPC Wire Compatibility✅ N/A
20Build Infrastructure & Dependencies✅ LGTM — the addition mirrors the repo-level NuGet.config (line 16 there); <package pattern="*" /> is consistent with the pattern used for every other source in this generated config
21Scope & PR Discipline✅ LGTM — single-concern fix; root-cause analysis documented; broader hardening explicitly deferred to #9030
22PowerShell Scripting Hygiene✅ N/A

🤖 Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account — the account owner did not write or approve this content personally. Generated by the Expert Code Review (on PR ready) workflow.{ai_credits_suffix} ·

Expose the preview `Microsoft.Testing.Platform` version pinned in
`eng/Versions.props` to `AcceptanceTestBase` and reference it explicitly
on the two `JUnitReportTests` fixtures that consume the `MSTest` meta
package. This complements the `dotnet-tools` feed addition (already in
this PR) by making the constraint explicit rather than relying purely on
transitive resolution.
Per SemVer 2.0, `2.3.0-ci` < `2.3.0-preview.<date>` (`c` < `p`
lexically), so the locally-built `-ci` MTP cannot satisfy the transitive
`>= 2.3.0-preview.<date>` constraint that the pinned preview
`CodeCoverage` package carries. The explicit `PackageReference` makes
this dependency intentional and visible at the asset level. See #9030.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 11, 2026 13:22
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotJune 11, 2026 13:22

CopilotAI commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved. I merged origin/main into this branch and fixed the conflict in test/IntegrationTests/MSTest.Acceptance.IntegrationTests/JUnitReportTests.cs in commit 9e7591eb7.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Evangelink