[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile - #127056

Closed
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming
Closed

[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile#127056
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Apr 17, 2026

Copy link
Copy Markdown
Member

Description

Part of splitting #125439 into smaller, self-contained PRs. Two related changes:

  • Moq test guards. Replace [ActiveIssue(#124344, IsAppleMobile && IsCoreCLR)] band-aids with IsNotBuiltWithAggressiveTrimming on the existing ConditionalFact. Castle DynamicProxy (used by Moq) needs runtime metadata that aggressive trimming strips, so the correct guard is aggressive-trimming, not runtime flavor. Matches the established repo-wide pattern for Moq-based tests.
  • DI test project exclusions.Microsoft.Extensions.DependencyInjection.Tests and its ExternalContainers (Stashbox-based) sibling are already excluded on Mono AOT iOS/tvOS/MacCatalyst ([wasm][tests][eat] Multiple test failures with EnableAggressiveTrimming #50724), NativeAOT (>2/3 failing due to Ref.Emit), tvOS ([iOS/tvOS] Small set of test suites time out on devices #60713), and Android (crashes). Classify both as "Not supported on Apple mobile" in the Apple-mobile CoreCLR ItemGroup, consistent with those precedents.

Changes

Source (remove stale ActiveIssue, add IsNotBuiltWithAggressiveTrimming to existing ConditionalFact):

  • Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.cs
  • Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.cs
  • Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.cs
  • System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.cs
  • System.Text.Encoding/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.cs

Project:

  • src/libraries/tests.proj — add Microsoft.Extensions.DependencyInjection.Tests.csproj and Microsoft.Extensions.DependencyInjection.ExternalContainers.Tests.csproj under the Not supported on Apple mobile group.

Note

This PR description was drafted with assistance from GitHub Copilot.

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 reduces Apple mobile CoreCLR test failures by skipping Moq-based tests when the test host is effectively “aggressively trimmed” (where Moq/Castle.DynamicProxy can lose required reflection metadata), and by excluding DI test projects that expect types removed by trimming.

Changes:

  • Add PlatformDetection.IsNotBuiltWithAggressiveTrimming to Moq-using tests alongside IsReflectionEmitSupported.
  • Remove now-stale Apple mobile ActiveIssue annotations on affected tests.
  • Update src/libraries/tests.proj to exclude DI.Tests and DI.External.Tests on Apple mobile CoreCLR configurations.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/tests.projExcludes DI test projects for Apple mobile CoreCLR where trimming breaks assumptions.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.csAdds aggressive-trimming guard to the Moq-based test.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.csAdds aggressive-trimming guard to Moq-based tests.
src/libraries/Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.csAdds aggressive-trimming guard to Moq-based host lifecycle tests.
src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.csAdds aggressive-trimming guard and removes Apple mobile ActiveIssue for the Moq-based test.
src/libraries/System.Runtime/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.csAdds aggressive-trimming guard to multiple Moq-based tests and removes Apple mobile ActiveIssue usage.

Comment on lines 42 to 44
// Moq heavily utilizes RefEmit, which does not work on most aot workloads
[ActiveIssue("https://github.com/dotnet/runtime/issues/124344", typeof(PlatformDetection), nameof(PlatformDetection.IsAppleMobile), nameof(PlatformDetection.IsCoreCLR))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
public void AsyncMethods_ReturnCanceledTaskIfCancellationTokenTripped()

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Even with these new Moq/trim guards, this file still contains an unguarded [Fact] ReadTimeout_WriteTimeout_NotSupported that instantiates new Mock<Stream>() (currently unused) and will still execute Moq/Castle code paths. On Apple mobile / aggressive trimming this can still fail during mock creation; either remove the Moq usage from that test (since the mock isn’t used) or add the same IsNotBuiltWithAggressiveTrimming/IsReflectionEmitSupported guard to it.

Copilot uses AI. Check for mistakes.
}

[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Write_WithPartialData doesn’t appear to use Moq, so adding IsNotBuiltWithAggressiveTrimming here further reduces coverage in trimmed builds without addressing a Moq/Castle failure mode. If the intent is only to skip tests that actually create mocks, consider dropping the aggressive-trimming condition (or the entire Reflection.Emit condition) for this particular test.

Suggested change
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported),nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported))]

Copilot uses AI. Check for mistakes.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

…bile
Moq relies on Castle DynamicProxy, which uses Reflection.Emit and reads
runtime metadata that aggressive trimming strips. Replace the temporary
[ActiveIssue(dotnet#124344, IsAppleMobile && IsCoreCLR)] band-aids with the
proper IsNotBuiltWithAggressiveTrimming guard on the existing
ConditionalFact, matching the established pattern for Moq-based tests.
Microsoft.Extensions.DependencyInjection.Tests and the corresponding
ExternalContainers (Stashbox-based) tests are already excluded on
Mono AOT iOS/tvOS/MacCatalyst (dotnet#50724), NativeAOT (Ref.Emit heavy,
>2/3 failing), tvOS (dotnet#60713 timeouts), and Android (crashes). Apple
mobile CoreCLR shares the same fundamental Ref.Emit + aggressive-trim
constraint; classify both as "Not supported on Apple mobile" alongside
the existing entries.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilosforce-pushed the ios-clr/pr-e-moq-trimming branch from bb4f1fc to e2a9915CompareApril 17, 2026 11:04
@kotlarmiloskotlarmilos changed the title [ios-clr] Skip Moq-based tests when built with aggressive trimming[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobileApr 17, 2026
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

This needs to be revisited, looks like the only platform running aggressive trimming with these tests, closing for now.

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

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@kotlarmilos
, '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

[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile - #127056

Closed
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming
Closed

[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile#127056
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Apr 17, 2026

Copy link
Copy Markdown
Member

Description

Part of splitting #125439 into smaller, self-contained PRs. Two related changes:

  • Moq test guards. Replace [ActiveIssue(#124344, IsAppleMobile && IsCoreCLR)] band-aids with IsNotBuiltWithAggressiveTrimming on the existing ConditionalFact. Castle DynamicProxy (used by Moq) needs runtime metadata that aggressive trimming strips, so the correct guard is aggressive-trimming, not runtime flavor. Matches the established repo-wide pattern for Moq-based tests.
  • DI test project exclusions.Microsoft.Extensions.DependencyInjection.Tests and its ExternalContainers (Stashbox-based) sibling are already excluded on Mono AOT iOS/tvOS/MacCatalyst ([wasm][tests][eat] Multiple test failures with EnableAggressiveTrimming #50724), NativeAOT (>2/3 failing due to Ref.Emit), tvOS ([iOS/tvOS] Small set of test suites time out on devices #60713), and Android (crashes). Classify both as "Not supported on Apple mobile" in the Apple-mobile CoreCLR ItemGroup, consistent with those precedents.

Changes

Source (remove stale ActiveIssue, add IsNotBuiltWithAggressiveTrimming to existing ConditionalFact):

  • Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.cs
  • Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.cs
  • Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.cs
  • System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.cs
  • System.Text.Encoding/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.cs

Project:

  • src/libraries/tests.proj — add Microsoft.Extensions.DependencyInjection.Tests.csproj and Microsoft.Extensions.DependencyInjection.ExternalContainers.Tests.csproj under the Not supported on Apple mobile group.

Note

This PR description was drafted with assistance from GitHub Copilot.

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 reduces Apple mobile CoreCLR test failures by skipping Moq-based tests when the test host is effectively “aggressively trimmed” (where Moq/Castle.DynamicProxy can lose required reflection metadata), and by excluding DI test projects that expect types removed by trimming.

Changes:

  • Add PlatformDetection.IsNotBuiltWithAggressiveTrimming to Moq-using tests alongside IsReflectionEmitSupported.
  • Remove now-stale Apple mobile ActiveIssue annotations on affected tests.
  • Update src/libraries/tests.proj to exclude DI.Tests and DI.External.Tests on Apple mobile CoreCLR configurations.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/tests.projExcludes DI test projects for Apple mobile CoreCLR where trimming breaks assumptions.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.csAdds aggressive-trimming guard to the Moq-based test.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.csAdds aggressive-trimming guard to Moq-based tests.
src/libraries/Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.csAdds aggressive-trimming guard to Moq-based host lifecycle tests.
src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.csAdds aggressive-trimming guard and removes Apple mobile ActiveIssue for the Moq-based test.
src/libraries/System.Runtime/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.csAdds aggressive-trimming guard to multiple Moq-based tests and removes Apple mobile ActiveIssue usage.

Comment on lines 42 to 44
// Moq heavily utilizes RefEmit, which does not work on most aot workloads
[ActiveIssue("https://github.com/dotnet/runtime/issues/124344", typeof(PlatformDetection), nameof(PlatformDetection.IsAppleMobile), nameof(PlatformDetection.IsCoreCLR))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
public void AsyncMethods_ReturnCanceledTaskIfCancellationTokenTripped()

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Even with these new Moq/trim guards, this file still contains an unguarded [Fact] ReadTimeout_WriteTimeout_NotSupported that instantiates new Mock<Stream>() (currently unused) and will still execute Moq/Castle code paths. On Apple mobile / aggressive trimming this can still fail during mock creation; either remove the Moq usage from that test (since the mock isn’t used) or add the same IsNotBuiltWithAggressiveTrimming/IsReflectionEmitSupported guard to it.

Copilot uses AI. Check for mistakes.
}

[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Write_WithPartialData doesn’t appear to use Moq, so adding IsNotBuiltWithAggressiveTrimming here further reduces coverage in trimmed builds without addressing a Moq/Castle failure mode. If the intent is only to skip tests that actually create mocks, consider dropping the aggressive-trimming condition (or the entire Reflection.Emit condition) for this particular test.

Suggested change
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported),nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported))]

Copilot uses AI. Check for mistakes.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

…bile
Moq relies on Castle DynamicProxy, which uses Reflection.Emit and reads
runtime metadata that aggressive trimming strips. Replace the temporary
[ActiveIssue(dotnet#124344, IsAppleMobile && IsCoreCLR)] band-aids with the
proper IsNotBuiltWithAggressiveTrimming guard on the existing
ConditionalFact, matching the established pattern for Moq-based tests.
Microsoft.Extensions.DependencyInjection.Tests and the corresponding
ExternalContainers (Stashbox-based) tests are already excluded on
Mono AOT iOS/tvOS/MacCatalyst (dotnet#50724), NativeAOT (Ref.Emit heavy,
>2/3 failing), tvOS (dotnet#60713 timeouts), and Android (crashes). Apple
mobile CoreCLR shares the same fundamental Ref.Emit + aggressive-trim
constraint; classify both as "Not supported on Apple mobile" alongside
the existing entries.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilosforce-pushed the ios-clr/pr-e-moq-trimming branch from bb4f1fc to e2a9915CompareApril 17, 2026 11:04
@kotlarmiloskotlarmilos changed the title [ios-clr] Skip Moq-based tests when built with aggressive trimming[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobileApr 17, 2026
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

This needs to be revisited, looks like the only platform running aggressive trimming with these tests, closing for now.

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

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@kotlarmilos
, '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

[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile - #127056

Closed
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming
Closed

[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile#127056
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Apr 17, 2026

Copy link
Copy Markdown
Member

Description

Part of splitting #125439 into smaller, self-contained PRs. Two related changes:

  • Moq test guards. Replace [ActiveIssue(#124344, IsAppleMobile && IsCoreCLR)] band-aids with IsNotBuiltWithAggressiveTrimming on the existing ConditionalFact. Castle DynamicProxy (used by Moq) needs runtime metadata that aggressive trimming strips, so the correct guard is aggressive-trimming, not runtime flavor. Matches the established repo-wide pattern for Moq-based tests.
  • DI test project exclusions.Microsoft.Extensions.DependencyInjection.Tests and its ExternalContainers (Stashbox-based) sibling are already excluded on Mono AOT iOS/tvOS/MacCatalyst ([wasm][tests][eat] Multiple test failures with EnableAggressiveTrimming #50724), NativeAOT (>2/3 failing due to Ref.Emit), tvOS ([iOS/tvOS] Small set of test suites time out on devices #60713), and Android (crashes). Classify both as "Not supported on Apple mobile" in the Apple-mobile CoreCLR ItemGroup, consistent with those precedents.

Changes

Source (remove stale ActiveIssue, add IsNotBuiltWithAggressiveTrimming to existing ConditionalFact):

  • Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.cs
  • Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.cs
  • Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.cs
  • System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.cs
  • System.Text.Encoding/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.cs

Project:

  • src/libraries/tests.proj — add Microsoft.Extensions.DependencyInjection.Tests.csproj and Microsoft.Extensions.DependencyInjection.ExternalContainers.Tests.csproj under the Not supported on Apple mobile group.

Note

This PR description was drafted with assistance from GitHub Copilot.

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 reduces Apple mobile CoreCLR test failures by skipping Moq-based tests when the test host is effectively “aggressively trimmed” (where Moq/Castle.DynamicProxy can lose required reflection metadata), and by excluding DI test projects that expect types removed by trimming.

Changes:

  • Add PlatformDetection.IsNotBuiltWithAggressiveTrimming to Moq-using tests alongside IsReflectionEmitSupported.
  • Remove now-stale Apple mobile ActiveIssue annotations on affected tests.
  • Update src/libraries/tests.proj to exclude DI.Tests and DI.External.Tests on Apple mobile CoreCLR configurations.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/tests.projExcludes DI test projects for Apple mobile CoreCLR where trimming breaks assumptions.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.csAdds aggressive-trimming guard to the Moq-based test.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.csAdds aggressive-trimming guard to Moq-based tests.
src/libraries/Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.csAdds aggressive-trimming guard to Moq-based host lifecycle tests.
src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.csAdds aggressive-trimming guard and removes Apple mobile ActiveIssue for the Moq-based test.
src/libraries/System.Runtime/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.csAdds aggressive-trimming guard to multiple Moq-based tests and removes Apple mobile ActiveIssue usage.

Comment on lines 42 to 44
// Moq heavily utilizes RefEmit, which does not work on most aot workloads
[ActiveIssue("https://github.com/dotnet/runtime/issues/124344", typeof(PlatformDetection), nameof(PlatformDetection.IsAppleMobile), nameof(PlatformDetection.IsCoreCLR))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
public void AsyncMethods_ReturnCanceledTaskIfCancellationTokenTripped()

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Even with these new Moq/trim guards, this file still contains an unguarded [Fact] ReadTimeout_WriteTimeout_NotSupported that instantiates new Mock<Stream>() (currently unused) and will still execute Moq/Castle code paths. On Apple mobile / aggressive trimming this can still fail during mock creation; either remove the Moq usage from that test (since the mock isn’t used) or add the same IsNotBuiltWithAggressiveTrimming/IsReflectionEmitSupported guard to it.

Copilot uses AI. Check for mistakes.
}

[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Write_WithPartialData doesn’t appear to use Moq, so adding IsNotBuiltWithAggressiveTrimming here further reduces coverage in trimmed builds without addressing a Moq/Castle failure mode. If the intent is only to skip tests that actually create mocks, consider dropping the aggressive-trimming condition (or the entire Reflection.Emit condition) for this particular test.

Suggested change
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported),nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported))]

Copilot uses AI. Check for mistakes.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

…bile
Moq relies on Castle DynamicProxy, which uses Reflection.Emit and reads
runtime metadata that aggressive trimming strips. Replace the temporary
[ActiveIssue(dotnet#124344, IsAppleMobile && IsCoreCLR)] band-aids with the
proper IsNotBuiltWithAggressiveTrimming guard on the existing
ConditionalFact, matching the established pattern for Moq-based tests.
Microsoft.Extensions.DependencyInjection.Tests and the corresponding
ExternalContainers (Stashbox-based) tests are already excluded on
Mono AOT iOS/tvOS/MacCatalyst (dotnet#50724), NativeAOT (Ref.Emit heavy,
>2/3 failing), tvOS (dotnet#60713 timeouts), and Android (crashes). Apple
mobile CoreCLR shares the same fundamental Ref.Emit + aggressive-trim
constraint; classify both as "Not supported on Apple mobile" alongside
the existing entries.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilosforce-pushed the ios-clr/pr-e-moq-trimming branch from bb4f1fc to e2a9915CompareApril 17, 2026 11:04
@kotlarmiloskotlarmilos changed the title [ios-clr] Skip Moq-based tests when built with aggressive trimming[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobileApr 17, 2026
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

This needs to be revisited, looks like the only platform running aggressive trimming with these tests, closing for now.

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

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@kotlarmilos
, '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

[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile - #127056

Closed
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming
Closed

[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile#127056
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Apr 17, 2026

Copy link
Copy Markdown
Member

Description

Part of splitting #125439 into smaller, self-contained PRs. Two related changes:

  • Moq test guards. Replace [ActiveIssue(#124344, IsAppleMobile && IsCoreCLR)] band-aids with IsNotBuiltWithAggressiveTrimming on the existing ConditionalFact. Castle DynamicProxy (used by Moq) needs runtime metadata that aggressive trimming strips, so the correct guard is aggressive-trimming, not runtime flavor. Matches the established repo-wide pattern for Moq-based tests.
  • DI test project exclusions.Microsoft.Extensions.DependencyInjection.Tests and its ExternalContainers (Stashbox-based) sibling are already excluded on Mono AOT iOS/tvOS/MacCatalyst ([wasm][tests][eat] Multiple test failures with EnableAggressiveTrimming #50724), NativeAOT (>2/3 failing due to Ref.Emit), tvOS ([iOS/tvOS] Small set of test suites time out on devices #60713), and Android (crashes). Classify both as "Not supported on Apple mobile" in the Apple-mobile CoreCLR ItemGroup, consistent with those precedents.

Changes

Source (remove stale ActiveIssue, add IsNotBuiltWithAggressiveTrimming to existing ConditionalFact):

  • Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.cs
  • Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.cs
  • Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.cs
  • System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.cs
  • System.Text.Encoding/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.cs

Project:

  • src/libraries/tests.proj — add Microsoft.Extensions.DependencyInjection.Tests.csproj and Microsoft.Extensions.DependencyInjection.ExternalContainers.Tests.csproj under the Not supported on Apple mobile group.

Note

This PR description was drafted with assistance from GitHub Copilot.

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 reduces Apple mobile CoreCLR test failures by skipping Moq-based tests when the test host is effectively “aggressively trimmed” (where Moq/Castle.DynamicProxy can lose required reflection metadata), and by excluding DI test projects that expect types removed by trimming.

Changes:

  • Add PlatformDetection.IsNotBuiltWithAggressiveTrimming to Moq-using tests alongside IsReflectionEmitSupported.
  • Remove now-stale Apple mobile ActiveIssue annotations on affected tests.
  • Update src/libraries/tests.proj to exclude DI.Tests and DI.External.Tests on Apple mobile CoreCLR configurations.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/tests.projExcludes DI test projects for Apple mobile CoreCLR where trimming breaks assumptions.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.csAdds aggressive-trimming guard to the Moq-based test.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.csAdds aggressive-trimming guard to Moq-based tests.
src/libraries/Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.csAdds aggressive-trimming guard to Moq-based host lifecycle tests.
src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.csAdds aggressive-trimming guard and removes Apple mobile ActiveIssue for the Moq-based test.
src/libraries/System.Runtime/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.csAdds aggressive-trimming guard to multiple Moq-based tests and removes Apple mobile ActiveIssue usage.

Comment on lines 42 to 44
// Moq heavily utilizes RefEmit, which does not work on most aot workloads
[ActiveIssue("https://github.com/dotnet/runtime/issues/124344", typeof(PlatformDetection), nameof(PlatformDetection.IsAppleMobile), nameof(PlatformDetection.IsCoreCLR))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
public void AsyncMethods_ReturnCanceledTaskIfCancellationTokenTripped()

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Even with these new Moq/trim guards, this file still contains an unguarded [Fact] ReadTimeout_WriteTimeout_NotSupported that instantiates new Mock<Stream>() (currently unused) and will still execute Moq/Castle code paths. On Apple mobile / aggressive trimming this can still fail during mock creation; either remove the Moq usage from that test (since the mock isn’t used) or add the same IsNotBuiltWithAggressiveTrimming/IsReflectionEmitSupported guard to it.

Copilot uses AI. Check for mistakes.
}

[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Write_WithPartialData doesn’t appear to use Moq, so adding IsNotBuiltWithAggressiveTrimming here further reduces coverage in trimmed builds without addressing a Moq/Castle failure mode. If the intent is only to skip tests that actually create mocks, consider dropping the aggressive-trimming condition (or the entire Reflection.Emit condition) for this particular test.

Suggested change
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported),nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported))]

Copilot uses AI. Check for mistakes.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

…bile
Moq relies on Castle DynamicProxy, which uses Reflection.Emit and reads
runtime metadata that aggressive trimming strips. Replace the temporary
[ActiveIssue(dotnet#124344, IsAppleMobile && IsCoreCLR)] band-aids with the
proper IsNotBuiltWithAggressiveTrimming guard on the existing
ConditionalFact, matching the established pattern for Moq-based tests.
Microsoft.Extensions.DependencyInjection.Tests and the corresponding
ExternalContainers (Stashbox-based) tests are already excluded on
Mono AOT iOS/tvOS/MacCatalyst (dotnet#50724), NativeAOT (Ref.Emit heavy,
>2/3 failing), tvOS (dotnet#60713 timeouts), and Android (crashes). Apple
mobile CoreCLR shares the same fundamental Ref.Emit + aggressive-trim
constraint; classify both as "Not supported on Apple mobile" alongside
the existing entries.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilosforce-pushed the ios-clr/pr-e-moq-trimming branch from bb4f1fc to e2a9915CompareApril 17, 2026 11:04
@kotlarmiloskotlarmilos changed the title [ios-clr] Skip Moq-based tests when built with aggressive trimming[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobileApr 17, 2026
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

This needs to be revisited, looks like the only platform running aggressive trimming with these tests, closing for now.

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

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@kotlarmilos
, '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

[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile - #127056

Closed
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming
Closed

[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile#127056
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Apr 17, 2026

Copy link
Copy Markdown
Member

Description

Part of splitting #125439 into smaller, self-contained PRs. Two related changes:

  • Moq test guards. Replace [ActiveIssue(#124344, IsAppleMobile && IsCoreCLR)] band-aids with IsNotBuiltWithAggressiveTrimming on the existing ConditionalFact. Castle DynamicProxy (used by Moq) needs runtime metadata that aggressive trimming strips, so the correct guard is aggressive-trimming, not runtime flavor. Matches the established repo-wide pattern for Moq-based tests.
  • DI test project exclusions.Microsoft.Extensions.DependencyInjection.Tests and its ExternalContainers (Stashbox-based) sibling are already excluded on Mono AOT iOS/tvOS/MacCatalyst ([wasm][tests][eat] Multiple test failures with EnableAggressiveTrimming #50724), NativeAOT (>2/3 failing due to Ref.Emit), tvOS ([iOS/tvOS] Small set of test suites time out on devices #60713), and Android (crashes). Classify both as "Not supported on Apple mobile" in the Apple-mobile CoreCLR ItemGroup, consistent with those precedents.

Changes

Source (remove stale ActiveIssue, add IsNotBuiltWithAggressiveTrimming to existing ConditionalFact):

  • Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.cs
  • Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.cs
  • Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.cs
  • System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.cs
  • System.Text.Encoding/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.cs

Project:

  • src/libraries/tests.proj — add Microsoft.Extensions.DependencyInjection.Tests.csproj and Microsoft.Extensions.DependencyInjection.ExternalContainers.Tests.csproj under the Not supported on Apple mobile group.

Note

This PR description was drafted with assistance from GitHub Copilot.

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 reduces Apple mobile CoreCLR test failures by skipping Moq-based tests when the test host is effectively “aggressively trimmed” (where Moq/Castle.DynamicProxy can lose required reflection metadata), and by excluding DI test projects that expect types removed by trimming.

Changes:

  • Add PlatformDetection.IsNotBuiltWithAggressiveTrimming to Moq-using tests alongside IsReflectionEmitSupported.
  • Remove now-stale Apple mobile ActiveIssue annotations on affected tests.
  • Update src/libraries/tests.proj to exclude DI.Tests and DI.External.Tests on Apple mobile CoreCLR configurations.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/tests.projExcludes DI test projects for Apple mobile CoreCLR where trimming breaks assumptions.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.csAdds aggressive-trimming guard to the Moq-based test.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.csAdds aggressive-trimming guard to Moq-based tests.
src/libraries/Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.csAdds aggressive-trimming guard to Moq-based host lifecycle tests.
src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.csAdds aggressive-trimming guard and removes Apple mobile ActiveIssue for the Moq-based test.
src/libraries/System.Runtime/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.csAdds aggressive-trimming guard to multiple Moq-based tests and removes Apple mobile ActiveIssue usage.

Comment on lines 42 to 44
// Moq heavily utilizes RefEmit, which does not work on most aot workloads
[ActiveIssue("https://github.com/dotnet/runtime/issues/124344", typeof(PlatformDetection), nameof(PlatformDetection.IsAppleMobile), nameof(PlatformDetection.IsCoreCLR))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
public void AsyncMethods_ReturnCanceledTaskIfCancellationTokenTripped()

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Even with these new Moq/trim guards, this file still contains an unguarded [Fact] ReadTimeout_WriteTimeout_NotSupported that instantiates new Mock<Stream>() (currently unused) and will still execute Moq/Castle code paths. On Apple mobile / aggressive trimming this can still fail during mock creation; either remove the Moq usage from that test (since the mock isn’t used) or add the same IsNotBuiltWithAggressiveTrimming/IsReflectionEmitSupported guard to it.

Copilot uses AI. Check for mistakes.
}

[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Write_WithPartialData doesn’t appear to use Moq, so adding IsNotBuiltWithAggressiveTrimming here further reduces coverage in trimmed builds without addressing a Moq/Castle failure mode. If the intent is only to skip tests that actually create mocks, consider dropping the aggressive-trimming condition (or the entire Reflection.Emit condition) for this particular test.

Suggested change
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported),nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported))]

Copilot uses AI. Check for mistakes.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

…bile
Moq relies on Castle DynamicProxy, which uses Reflection.Emit and reads
runtime metadata that aggressive trimming strips. Replace the temporary
[ActiveIssue(dotnet#124344, IsAppleMobile && IsCoreCLR)] band-aids with the
proper IsNotBuiltWithAggressiveTrimming guard on the existing
ConditionalFact, matching the established pattern for Moq-based tests.
Microsoft.Extensions.DependencyInjection.Tests and the corresponding
ExternalContainers (Stashbox-based) tests are already excluded on
Mono AOT iOS/tvOS/MacCatalyst (dotnet#50724), NativeAOT (Ref.Emit heavy,
>2/3 failing), tvOS (dotnet#60713 timeouts), and Android (crashes). Apple
mobile CoreCLR shares the same fundamental Ref.Emit + aggressive-trim
constraint; classify both as "Not supported on Apple mobile" alongside
the existing entries.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilosforce-pushed the ios-clr/pr-e-moq-trimming branch from bb4f1fc to e2a9915CompareApril 17, 2026 11:04
@kotlarmiloskotlarmilos changed the title [ios-clr] Skip Moq-based tests when built with aggressive trimming[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobileApr 17, 2026
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

This needs to be revisited, looks like the only platform running aggressive trimming with these tests, closing for now.

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

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@kotlarmilos
, '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

[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile - #127056

Closed
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming
Closed

[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile#127056
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Apr 17, 2026

Copy link
Copy Markdown
Member

Description

Part of splitting #125439 into smaller, self-contained PRs. Two related changes:

  • Moq test guards. Replace [ActiveIssue(#124344, IsAppleMobile && IsCoreCLR)] band-aids with IsNotBuiltWithAggressiveTrimming on the existing ConditionalFact. Castle DynamicProxy (used by Moq) needs runtime metadata that aggressive trimming strips, so the correct guard is aggressive-trimming, not runtime flavor. Matches the established repo-wide pattern for Moq-based tests.
  • DI test project exclusions.Microsoft.Extensions.DependencyInjection.Tests and its ExternalContainers (Stashbox-based) sibling are already excluded on Mono AOT iOS/tvOS/MacCatalyst ([wasm][tests][eat] Multiple test failures with EnableAggressiveTrimming #50724), NativeAOT (>2/3 failing due to Ref.Emit), tvOS ([iOS/tvOS] Small set of test suites time out on devices #60713), and Android (crashes). Classify both as "Not supported on Apple mobile" in the Apple-mobile CoreCLR ItemGroup, consistent with those precedents.

Changes

Source (remove stale ActiveIssue, add IsNotBuiltWithAggressiveTrimming to existing ConditionalFact):

  • Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.cs
  • Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.cs
  • Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.cs
  • System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.cs
  • System.Text.Encoding/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.cs

Project:

  • src/libraries/tests.proj — add Microsoft.Extensions.DependencyInjection.Tests.csproj and Microsoft.Extensions.DependencyInjection.ExternalContainers.Tests.csproj under the Not supported on Apple mobile group.

Note

This PR description was drafted with assistance from GitHub Copilot.

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 reduces Apple mobile CoreCLR test failures by skipping Moq-based tests when the test host is effectively “aggressively trimmed” (where Moq/Castle.DynamicProxy can lose required reflection metadata), and by excluding DI test projects that expect types removed by trimming.

Changes:

  • Add PlatformDetection.IsNotBuiltWithAggressiveTrimming to Moq-using tests alongside IsReflectionEmitSupported.
  • Remove now-stale Apple mobile ActiveIssue annotations on affected tests.
  • Update src/libraries/tests.proj to exclude DI.Tests and DI.External.Tests on Apple mobile CoreCLR configurations.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/tests.projExcludes DI test projects for Apple mobile CoreCLR where trimming breaks assumptions.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.csAdds aggressive-trimming guard to the Moq-based test.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.csAdds aggressive-trimming guard to Moq-based tests.
src/libraries/Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.csAdds aggressive-trimming guard to Moq-based host lifecycle tests.
src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.csAdds aggressive-trimming guard and removes Apple mobile ActiveIssue for the Moq-based test.
src/libraries/System.Runtime/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.csAdds aggressive-trimming guard to multiple Moq-based tests and removes Apple mobile ActiveIssue usage.

Comment on lines 42 to 44
// Moq heavily utilizes RefEmit, which does not work on most aot workloads
[ActiveIssue("https://github.com/dotnet/runtime/issues/124344", typeof(PlatformDetection), nameof(PlatformDetection.IsAppleMobile), nameof(PlatformDetection.IsCoreCLR))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
public void AsyncMethods_ReturnCanceledTaskIfCancellationTokenTripped()

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Even with these new Moq/trim guards, this file still contains an unguarded [Fact] ReadTimeout_WriteTimeout_NotSupported that instantiates new Mock<Stream>() (currently unused) and will still execute Moq/Castle code paths. On Apple mobile / aggressive trimming this can still fail during mock creation; either remove the Moq usage from that test (since the mock isn’t used) or add the same IsNotBuiltWithAggressiveTrimming/IsReflectionEmitSupported guard to it.

Copilot uses AI. Check for mistakes.
}

[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Write_WithPartialData doesn’t appear to use Moq, so adding IsNotBuiltWithAggressiveTrimming here further reduces coverage in trimmed builds without addressing a Moq/Castle failure mode. If the intent is only to skip tests that actually create mocks, consider dropping the aggressive-trimming condition (or the entire Reflection.Emit condition) for this particular test.

Suggested change
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported),nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported))]

Copilot uses AI. Check for mistakes.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

…bile
Moq relies on Castle DynamicProxy, which uses Reflection.Emit and reads
runtime metadata that aggressive trimming strips. Replace the temporary
[ActiveIssue(dotnet#124344, IsAppleMobile && IsCoreCLR)] band-aids with the
proper IsNotBuiltWithAggressiveTrimming guard on the existing
ConditionalFact, matching the established pattern for Moq-based tests.
Microsoft.Extensions.DependencyInjection.Tests and the corresponding
ExternalContainers (Stashbox-based) tests are already excluded on
Mono AOT iOS/tvOS/MacCatalyst (dotnet#50724), NativeAOT (Ref.Emit heavy,
>2/3 failing), tvOS (dotnet#60713 timeouts), and Android (crashes). Apple
mobile CoreCLR shares the same fundamental Ref.Emit + aggressive-trim
constraint; classify both as "Not supported on Apple mobile" alongside
the existing entries.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilosforce-pushed the ios-clr/pr-e-moq-trimming branch from bb4f1fc to e2a9915CompareApril 17, 2026 11:04
@kotlarmiloskotlarmilos changed the title [ios-clr] Skip Moq-based tests when built with aggressive trimming[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobileApr 17, 2026
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

This needs to be revisited, looks like the only platform running aggressive trimming with these tests, closing for now.

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

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@kotlarmilos
, '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

[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile - #127056

Closed
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming
Closed

[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile#127056
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Apr 17, 2026

Copy link
Copy Markdown
Member

Description

Part of splitting #125439 into smaller, self-contained PRs. Two related changes:

  • Moq test guards. Replace [ActiveIssue(#124344, IsAppleMobile && IsCoreCLR)] band-aids with IsNotBuiltWithAggressiveTrimming on the existing ConditionalFact. Castle DynamicProxy (used by Moq) needs runtime metadata that aggressive trimming strips, so the correct guard is aggressive-trimming, not runtime flavor. Matches the established repo-wide pattern for Moq-based tests.
  • DI test project exclusions.Microsoft.Extensions.DependencyInjection.Tests and its ExternalContainers (Stashbox-based) sibling are already excluded on Mono AOT iOS/tvOS/MacCatalyst ([wasm][tests][eat] Multiple test failures with EnableAggressiveTrimming #50724), NativeAOT (>2/3 failing due to Ref.Emit), tvOS ([iOS/tvOS] Small set of test suites time out on devices #60713), and Android (crashes). Classify both as "Not supported on Apple mobile" in the Apple-mobile CoreCLR ItemGroup, consistent with those precedents.

Changes

Source (remove stale ActiveIssue, add IsNotBuiltWithAggressiveTrimming to existing ConditionalFact):

  • Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.cs
  • Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.cs
  • Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.cs
  • System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.cs
  • System.Text.Encoding/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.cs

Project:

  • src/libraries/tests.proj — add Microsoft.Extensions.DependencyInjection.Tests.csproj and Microsoft.Extensions.DependencyInjection.ExternalContainers.Tests.csproj under the Not supported on Apple mobile group.

Note

This PR description was drafted with assistance from GitHub Copilot.

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 reduces Apple mobile CoreCLR test failures by skipping Moq-based tests when the test host is effectively “aggressively trimmed” (where Moq/Castle.DynamicProxy can lose required reflection metadata), and by excluding DI test projects that expect types removed by trimming.

Changes:

  • Add PlatformDetection.IsNotBuiltWithAggressiveTrimming to Moq-using tests alongside IsReflectionEmitSupported.
  • Remove now-stale Apple mobile ActiveIssue annotations on affected tests.
  • Update src/libraries/tests.proj to exclude DI.Tests and DI.External.Tests on Apple mobile CoreCLR configurations.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/tests.projExcludes DI test projects for Apple mobile CoreCLR where trimming breaks assumptions.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.csAdds aggressive-trimming guard to the Moq-based test.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.csAdds aggressive-trimming guard to Moq-based tests.
src/libraries/Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.csAdds aggressive-trimming guard to Moq-based host lifecycle tests.
src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.csAdds aggressive-trimming guard and removes Apple mobile ActiveIssue for the Moq-based test.
src/libraries/System.Runtime/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.csAdds aggressive-trimming guard to multiple Moq-based tests and removes Apple mobile ActiveIssue usage.

Comment on lines 42 to 44
// Moq heavily utilizes RefEmit, which does not work on most aot workloads
[ActiveIssue("https://github.com/dotnet/runtime/issues/124344", typeof(PlatformDetection), nameof(PlatformDetection.IsAppleMobile), nameof(PlatformDetection.IsCoreCLR))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
public void AsyncMethods_ReturnCanceledTaskIfCancellationTokenTripped()

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Even with these new Moq/trim guards, this file still contains an unguarded [Fact] ReadTimeout_WriteTimeout_NotSupported that instantiates new Mock<Stream>() (currently unused) and will still execute Moq/Castle code paths. On Apple mobile / aggressive trimming this can still fail during mock creation; either remove the Moq usage from that test (since the mock isn’t used) or add the same IsNotBuiltWithAggressiveTrimming/IsReflectionEmitSupported guard to it.

Copilot uses AI. Check for mistakes.
}

[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Write_WithPartialData doesn’t appear to use Moq, so adding IsNotBuiltWithAggressiveTrimming here further reduces coverage in trimmed builds without addressing a Moq/Castle failure mode. If the intent is only to skip tests that actually create mocks, consider dropping the aggressive-trimming condition (or the entire Reflection.Emit condition) for this particular test.

Suggested change
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported),nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported))]

Copilot uses AI. Check for mistakes.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

…bile
Moq relies on Castle DynamicProxy, which uses Reflection.Emit and reads
runtime metadata that aggressive trimming strips. Replace the temporary
[ActiveIssue(dotnet#124344, IsAppleMobile && IsCoreCLR)] band-aids with the
proper IsNotBuiltWithAggressiveTrimming guard on the existing
ConditionalFact, matching the established pattern for Moq-based tests.
Microsoft.Extensions.DependencyInjection.Tests and the corresponding
ExternalContainers (Stashbox-based) tests are already excluded on
Mono AOT iOS/tvOS/MacCatalyst (dotnet#50724), NativeAOT (Ref.Emit heavy,
>2/3 failing), tvOS (dotnet#60713 timeouts), and Android (crashes). Apple
mobile CoreCLR shares the same fundamental Ref.Emit + aggressive-trim
constraint; classify both as "Not supported on Apple mobile" alongside
the existing entries.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilosforce-pushed the ios-clr/pr-e-moq-trimming branch from bb4f1fc to e2a9915CompareApril 17, 2026 11:04
@kotlarmiloskotlarmilos changed the title [ios-clr] Skip Moq-based tests when built with aggressive trimming[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobileApr 17, 2026
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

This needs to be revisited, looks like the only platform running aggressive trimming with these tests, closing for now.

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

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@kotlarmilos
, '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

[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile - #127056

Closed
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming
Closed

[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobile#127056
kotlarmilos wants to merge 1 commit into
dotnet:mainfrom
kotlarmilos:ios-clr/pr-e-moq-trimming

Conversation

@kotlarmilos

@kotlarmiloskotlarmilos commented Apr 17, 2026

Copy link
Copy Markdown
Member

Description

Part of splitting #125439 into smaller, self-contained PRs. Two related changes:

  • Moq test guards. Replace [ActiveIssue(#124344, IsAppleMobile && IsCoreCLR)] band-aids with IsNotBuiltWithAggressiveTrimming on the existing ConditionalFact. Castle DynamicProxy (used by Moq) needs runtime metadata that aggressive trimming strips, so the correct guard is aggressive-trimming, not runtime flavor. Matches the established repo-wide pattern for Moq-based tests.
  • DI test project exclusions.Microsoft.Extensions.DependencyInjection.Tests and its ExternalContainers (Stashbox-based) sibling are already excluded on Mono AOT iOS/tvOS/MacCatalyst ([wasm][tests][eat] Multiple test failures with EnableAggressiveTrimming #50724), NativeAOT (>2/3 failing due to Ref.Emit), tvOS ([iOS/tvOS] Small set of test suites time out on devices #60713), and Android (crashes). Classify both as "Not supported on Apple mobile" in the Apple-mobile CoreCLR ItemGroup, consistent with those precedents.

Changes

Source (remove stale ActiveIssue, add IsNotBuiltWithAggressiveTrimming to existing ConditionalFact):

  • Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.cs
  • Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.cs
  • Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.cs
  • System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.cs
  • System.Text.Encoding/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.cs

Project:

  • src/libraries/tests.proj — add Microsoft.Extensions.DependencyInjection.Tests.csproj and Microsoft.Extensions.DependencyInjection.ExternalContainers.Tests.csproj under the Not supported on Apple mobile group.

Note

This PR description was drafted with assistance from GitHub Copilot.

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 reduces Apple mobile CoreCLR test failures by skipping Moq-based tests when the test host is effectively “aggressively trimmed” (where Moq/Castle.DynamicProxy can lose required reflection metadata), and by excluding DI test projects that expect types removed by trimming.

Changes:

  • Add PlatformDetection.IsNotBuiltWithAggressiveTrimming to Moq-using tests alongside IsReflectionEmitSupported.
  • Remove now-stale Apple mobile ActiveIssue annotations on affected tests.
  • Update src/libraries/tests.proj to exclude DI.Tests and DI.External.Tests on Apple mobile CoreCLR configurations.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/libraries/tests.projExcludes DI test projects for Apple mobile CoreCLR where trimming breaks assumptions.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompilationLibraryTests.csAdds aggressive-trimming guard to the Moq-based test.
src/libraries/Microsoft.Extensions.DependencyModel/tests/CompositeResolverTests.csAdds aggressive-trimming guard to Moq-based tests.
src/libraries/Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.csAdds aggressive-trimming guard to Moq-based host lifecycle tests.
src/libraries/System.Runtime/tests/System.Runtime.Tests/System/Reflection/InvokeWithRefLikeArgs.csAdds aggressive-trimming guard and removes Apple mobile ActiveIssue for the Moq-based test.
src/libraries/System.Runtime/tests/System.Text.Encoding.Tests/Encoding/TranscodingStreamTests.csAdds aggressive-trimming guard to multiple Moq-based tests and removes Apple mobile ActiveIssue usage.

Comment on lines 42 to 44
// Moq heavily utilizes RefEmit, which does not work on most aot workloads
[ActiveIssue("https://github.com/dotnet/runtime/issues/124344", typeof(PlatformDetection), nameof(PlatformDetection.IsAppleMobile), nameof(PlatformDetection.IsCoreCLR))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
public void AsyncMethods_ReturnCanceledTaskIfCancellationTokenTripped()

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Even with these new Moq/trim guards, this file still contains an unguarded [Fact] ReadTimeout_WriteTimeout_NotSupported that instantiates new Mock<Stream>() (currently unused) and will still execute Moq/Castle code paths. On Apple mobile / aggressive trimming this can still fail during mock creation; either remove the Moq usage from that test (since the mock isn’t used) or add the same IsNotBuiltWithAggressiveTrimming/IsReflectionEmitSupported guard to it.

Copilot uses AI. Check for mistakes.
}

[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported))]
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsReflectionEmitSupported), nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]

CopilotAIApr 17, 2026

Copy link

Choose a reason for hiding this comment

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

Write_WithPartialData doesn’t appear to use Moq, so adding IsNotBuiltWithAggressiveTrimming here further reduces coverage in trimmed builds without addressing a Moq/Castle failure mode. If the intent is only to skip tests that actually create mocks, consider dropping the aggressive-trimming condition (or the entire Reflection.Emit condition) for this particular test.

Suggested change
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported),nameof(PlatformDetection.IsNotBuiltWithAggressiveTrimming))]
[ConditionalFact(typeof(PlatformDetection),nameof(PlatformDetection.IsReflectionEmitSupported))]

Copilot uses AI. Check for mistakes.
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

…bile
Moq relies on Castle DynamicProxy, which uses Reflection.Emit and reads
runtime metadata that aggressive trimming strips. Replace the temporary
[ActiveIssue(dotnet#124344, IsAppleMobile && IsCoreCLR)] band-aids with the
proper IsNotBuiltWithAggressiveTrimming guard on the existing
ConditionalFact, matching the established pattern for Moq-based tests.
Microsoft.Extensions.DependencyInjection.Tests and the corresponding
ExternalContainers (Stashbox-based) tests are already excluded on
Mono AOT iOS/tvOS/MacCatalyst (dotnet#50724), NativeAOT (Ref.Emit heavy,
>2/3 failing), tvOS (dotnet#60713 timeouts), and Android (crashes). Apple
mobile CoreCLR shares the same fundamental Ref.Emit + aggressive-trim
constraint; classify both as "Not supported on Apple mobile" alongside
the existing entries.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos
kotlarmilosforce-pushed the ios-clr/pr-e-moq-trimming branch from bb4f1fc to e2a9915CompareApril 17, 2026 11:04
@kotlarmiloskotlarmilos changed the title [ios-clr] Skip Moq-based tests when built with aggressive trimming[ios-clr] Generalize Moq test guards and exclude DI tests on Apple mobileApr 17, 2026
@kotlarmilos

Copy link
Copy Markdown
MemberAuthor

This needs to be revisited, looks like the only platform running aggressive trimming with these tests, closing for now.

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

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@kotlarmilos