[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes - #130655

Closed
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test
Closed

[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes#130655
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test

Conversation

@lewing

Copy link
Copy Markdown
Member

Summary

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest has been failing on the browser-wasm AOT leg (Known Build Error #130540, "Expected changed file: driver-gen.c"). This hardens the test so it no longer depends on the app's incidental dependency closure.

Root cause

The test replaces the app's entry point with one that references a "new" assembly, then asserts that driver-gen.c — the AOT modules table, one mono_aot_register_module line per AOT'd assembly — changes because a new module was added.

It relied on System.Security.Cryptography being absent from WasmBasicTestApp's AOT closure (the swapped entry point used SHA256). That assumption broke when #122093 ("Add Zip Archives password support") added an unconditional System.Security.CryptographyProjectReference to System.IO.Compression. The app always compiles ZipArchiveInteropTest.cs (uses System.IO.Compression), so crypto is now always in the closure and always AOT'd. The swapped entry point therefore adds no new module, driver-gen.c is byte-identical between build and rebuild, MonoAOTCompiler's CopyIfDifferent skips the write, the timestamp is unchanged, and CompareStat fails.

This is the second time the test rotted this way — #109069 previously switched it from Json to System.Security.Cryptography for the same reason ("Json lib was already referenced before the change in the test").

Fix

Stop guessing which BCL assembly happens to be absent. Instead reference the existing dedicated first-party Library test project (an empty library not referenced by the default app), following the same pattern already used by PInvokeTableGeneratorTests:

  • Inject <ProjectReference Include="..\Library\Library.csproj" /> via CopyTestAsset(extraItems: ...).
  • Populate Library.cs with a small type via ReplaceFile.
  • Point the swapped entry point (NativeRebuildNewAssembly.cs) at that type instead of SHA256.

Library is unused in the first build → trimmed away → absent from the AOT module set. The swapped entry point uses it → rooted → new module in the rebuild → driver-gen.c changes. Because Library is first-party and the test fully controls whether it is referenced, the new-assembly signal is deterministic and immune to future changes in the app's dependency closure.

Fixes#130540.

Related

The underlying dependency regression (crypto rooted into every trimmed app that uses ZipArchive, a browser-wasm size concern) is tracked separately in #130650.

Testing

Not built/run locally — WBT requires a browser-wasm runtime baseline + emscripten and executes in a browser via the Helix/xharness harness. Relying on CI (the failing AOT leg exercises exactly this test) to validate.

Note

This PR was authored with the assistance of GitHub Copilot.

The test relied on System.Security.Cryptography being absent from the
WasmBasicTestApp's AOT closure: swapping the entry point to one that used
SHA256 was expected to introduce a new AOT module and thus change
driver-gen.c (the AOT modules table).
That assumption broke when System.IO.Compression started referencing
System.Security.Cryptography (#122093), which roots crypto
into the base app via ZipArchiveInteropTest. Crypto is now always AOT'd,
so the swapped entry point adds nothing, driver-gen.c is unchanged, and
the test fails (#130540). This is the second time the test
rotted this way (Json -> crypto in #109069).
Instead of chasing another BCL assembly that happens to be absent, use a
dedicated first-party library (the existing empty "Library" test project)
that the default app does not reference. It is trimmed away on the first
build and only enters the AOT module set once the swapped entry point
uses it, so the test fully controls the new-assembly signal and is immune
to future changes in the app's dependency closure.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f05b19b1-9e98-4565-9efb-bee27f2a85c2
CopilotAI review requested due to automatic review settings July 14, 2026 00:01
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:04 — with GitHub Actions Inactive

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

Hardens the Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest to make the “new AOT module added” signal deterministic by referencing a dedicated first-party test library, instead of relying on an incidental BCL dependency being absent/present in the app’s dependency closure.

Changes:

  • Injects a ProjectReference to WasmBasicTestApp/Library into the copied test asset and populates Library.cs with a controlled type.
  • Updates the “swapped entry point” (NativeRebuildNewAssembly.cs) to reference the new library type instead of System.Security.Cryptography.
  • Adds a new entrypoint source file (NativeRebuildReferencedLibrary.cs) used to overwrite the library’s source during the test setup.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.csInjects a ProjectReference to the test Library project and replaces Library.cs so the rebuild deterministically pulls in a new rooted assembly.
src/mono/wasm/testassets/EntryPoints/NativeRebuildReferencedLibrary.csNew testasset snippet defining NewlyReferencedType, used as the “new assembly” signal.
src/mono/wasm/testassets/EntryPoints/NativeRebuildNewAssembly.csSwitches the rebuilt entry point to call into NewlyReferencedType rather than crypto APIs.

@lewinglewing added the arch-wasm WebAssembly architecture label Jul 14, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@lewinglewing closed this Jul 14, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
@jkotas
jkotas deleted the lewing-harden-wasm-native-rebuild-test branch August 24, 2026 05:13
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Build-mono

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest.ReferenceNewAssembly failure: Expected changed file: driver-gen.c

2 participants

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

[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes - #130655

Closed
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test
Closed

[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes#130655
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test

Conversation

@lewing

Copy link
Copy Markdown
Member

Summary

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest has been failing on the browser-wasm AOT leg (Known Build Error #130540, "Expected changed file: driver-gen.c"). This hardens the test so it no longer depends on the app's incidental dependency closure.

Root cause

The test replaces the app's entry point with one that references a "new" assembly, then asserts that driver-gen.c — the AOT modules table, one mono_aot_register_module line per AOT'd assembly — changes because a new module was added.

It relied on System.Security.Cryptography being absent from WasmBasicTestApp's AOT closure (the swapped entry point used SHA256). That assumption broke when #122093 ("Add Zip Archives password support") added an unconditional System.Security.CryptographyProjectReference to System.IO.Compression. The app always compiles ZipArchiveInteropTest.cs (uses System.IO.Compression), so crypto is now always in the closure and always AOT'd. The swapped entry point therefore adds no new module, driver-gen.c is byte-identical between build and rebuild, MonoAOTCompiler's CopyIfDifferent skips the write, the timestamp is unchanged, and CompareStat fails.

This is the second time the test rotted this way — #109069 previously switched it from Json to System.Security.Cryptography for the same reason ("Json lib was already referenced before the change in the test").

Fix

Stop guessing which BCL assembly happens to be absent. Instead reference the existing dedicated first-party Library test project (an empty library not referenced by the default app), following the same pattern already used by PInvokeTableGeneratorTests:

  • Inject <ProjectReference Include="..\Library\Library.csproj" /> via CopyTestAsset(extraItems: ...).
  • Populate Library.cs with a small type via ReplaceFile.
  • Point the swapped entry point (NativeRebuildNewAssembly.cs) at that type instead of SHA256.

Library is unused in the first build → trimmed away → absent from the AOT module set. The swapped entry point uses it → rooted → new module in the rebuild → driver-gen.c changes. Because Library is first-party and the test fully controls whether it is referenced, the new-assembly signal is deterministic and immune to future changes in the app's dependency closure.

Fixes#130540.

Related

The underlying dependency regression (crypto rooted into every trimmed app that uses ZipArchive, a browser-wasm size concern) is tracked separately in #130650.

Testing

Not built/run locally — WBT requires a browser-wasm runtime baseline + emscripten and executes in a browser via the Helix/xharness harness. Relying on CI (the failing AOT leg exercises exactly this test) to validate.

Note

This PR was authored with the assistance of GitHub Copilot.

The test relied on System.Security.Cryptography being absent from the
WasmBasicTestApp's AOT closure: swapping the entry point to one that used
SHA256 was expected to introduce a new AOT module and thus change
driver-gen.c (the AOT modules table).
That assumption broke when System.IO.Compression started referencing
System.Security.Cryptography (#122093), which roots crypto
into the base app via ZipArchiveInteropTest. Crypto is now always AOT'd,
so the swapped entry point adds nothing, driver-gen.c is unchanged, and
the test fails (#130540). This is the second time the test
rotted this way (Json -> crypto in #109069).
Instead of chasing another BCL assembly that happens to be absent, use a
dedicated first-party library (the existing empty "Library" test project)
that the default app does not reference. It is trimmed away on the first
build and only enters the AOT module set once the swapped entry point
uses it, so the test fully controls the new-assembly signal and is immune
to future changes in the app's dependency closure.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f05b19b1-9e98-4565-9efb-bee27f2a85c2
CopilotAI review requested due to automatic review settings July 14, 2026 00:01
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:04 — with GitHub Actions Inactive

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

Hardens the Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest to make the “new AOT module added” signal deterministic by referencing a dedicated first-party test library, instead of relying on an incidental BCL dependency being absent/present in the app’s dependency closure.

Changes:

  • Injects a ProjectReference to WasmBasicTestApp/Library into the copied test asset and populates Library.cs with a controlled type.
  • Updates the “swapped entry point” (NativeRebuildNewAssembly.cs) to reference the new library type instead of System.Security.Cryptography.
  • Adds a new entrypoint source file (NativeRebuildReferencedLibrary.cs) used to overwrite the library’s source during the test setup.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.csInjects a ProjectReference to the test Library project and replaces Library.cs so the rebuild deterministically pulls in a new rooted assembly.
src/mono/wasm/testassets/EntryPoints/NativeRebuildReferencedLibrary.csNew testasset snippet defining NewlyReferencedType, used as the “new assembly” signal.
src/mono/wasm/testassets/EntryPoints/NativeRebuildNewAssembly.csSwitches the rebuilt entry point to call into NewlyReferencedType rather than crypto APIs.

@lewinglewing added the arch-wasm WebAssembly architecture label Jul 14, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@lewinglewing closed this Jul 14, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
@jkotas
jkotas deleted the lewing-harden-wasm-native-rebuild-test branch August 24, 2026 05:13
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Build-mono

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest.ReferenceNewAssembly failure: Expected changed file: driver-gen.c

2 participants

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

[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes - #130655

Closed
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test
Closed

[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes#130655
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test

Conversation

@lewing

Copy link
Copy Markdown
Member

Summary

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest has been failing on the browser-wasm AOT leg (Known Build Error #130540, "Expected changed file: driver-gen.c"). This hardens the test so it no longer depends on the app's incidental dependency closure.

Root cause

The test replaces the app's entry point with one that references a "new" assembly, then asserts that driver-gen.c — the AOT modules table, one mono_aot_register_module line per AOT'd assembly — changes because a new module was added.

It relied on System.Security.Cryptography being absent from WasmBasicTestApp's AOT closure (the swapped entry point used SHA256). That assumption broke when #122093 ("Add Zip Archives password support") added an unconditional System.Security.CryptographyProjectReference to System.IO.Compression. The app always compiles ZipArchiveInteropTest.cs (uses System.IO.Compression), so crypto is now always in the closure and always AOT'd. The swapped entry point therefore adds no new module, driver-gen.c is byte-identical between build and rebuild, MonoAOTCompiler's CopyIfDifferent skips the write, the timestamp is unchanged, and CompareStat fails.

This is the second time the test rotted this way — #109069 previously switched it from Json to System.Security.Cryptography for the same reason ("Json lib was already referenced before the change in the test").

Fix

Stop guessing which BCL assembly happens to be absent. Instead reference the existing dedicated first-party Library test project (an empty library not referenced by the default app), following the same pattern already used by PInvokeTableGeneratorTests:

  • Inject <ProjectReference Include="..\Library\Library.csproj" /> via CopyTestAsset(extraItems: ...).
  • Populate Library.cs with a small type via ReplaceFile.
  • Point the swapped entry point (NativeRebuildNewAssembly.cs) at that type instead of SHA256.

Library is unused in the first build → trimmed away → absent from the AOT module set. The swapped entry point uses it → rooted → new module in the rebuild → driver-gen.c changes. Because Library is first-party and the test fully controls whether it is referenced, the new-assembly signal is deterministic and immune to future changes in the app's dependency closure.

Fixes#130540.

Related

The underlying dependency regression (crypto rooted into every trimmed app that uses ZipArchive, a browser-wasm size concern) is tracked separately in #130650.

Testing

Not built/run locally — WBT requires a browser-wasm runtime baseline + emscripten and executes in a browser via the Helix/xharness harness. Relying on CI (the failing AOT leg exercises exactly this test) to validate.

Note

This PR was authored with the assistance of GitHub Copilot.

The test relied on System.Security.Cryptography being absent from the
WasmBasicTestApp's AOT closure: swapping the entry point to one that used
SHA256 was expected to introduce a new AOT module and thus change
driver-gen.c (the AOT modules table).
That assumption broke when System.IO.Compression started referencing
System.Security.Cryptography (#122093), which roots crypto
into the base app via ZipArchiveInteropTest. Crypto is now always AOT'd,
so the swapped entry point adds nothing, driver-gen.c is unchanged, and
the test fails (#130540). This is the second time the test
rotted this way (Json -> crypto in #109069).
Instead of chasing another BCL assembly that happens to be absent, use a
dedicated first-party library (the existing empty "Library" test project)
that the default app does not reference. It is trimmed away on the first
build and only enters the AOT module set once the swapped entry point
uses it, so the test fully controls the new-assembly signal and is immune
to future changes in the app's dependency closure.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f05b19b1-9e98-4565-9efb-bee27f2a85c2
CopilotAI review requested due to automatic review settings July 14, 2026 00:01
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:04 — with GitHub Actions Inactive

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

Hardens the Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest to make the “new AOT module added” signal deterministic by referencing a dedicated first-party test library, instead of relying on an incidental BCL dependency being absent/present in the app’s dependency closure.

Changes:

  • Injects a ProjectReference to WasmBasicTestApp/Library into the copied test asset and populates Library.cs with a controlled type.
  • Updates the “swapped entry point” (NativeRebuildNewAssembly.cs) to reference the new library type instead of System.Security.Cryptography.
  • Adds a new entrypoint source file (NativeRebuildReferencedLibrary.cs) used to overwrite the library’s source during the test setup.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.csInjects a ProjectReference to the test Library project and replaces Library.cs so the rebuild deterministically pulls in a new rooted assembly.
src/mono/wasm/testassets/EntryPoints/NativeRebuildReferencedLibrary.csNew testasset snippet defining NewlyReferencedType, used as the “new assembly” signal.
src/mono/wasm/testassets/EntryPoints/NativeRebuildNewAssembly.csSwitches the rebuilt entry point to call into NewlyReferencedType rather than crypto APIs.

@lewinglewing added the arch-wasm WebAssembly architecture label Jul 14, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@lewinglewing closed this Jul 14, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
@jkotas
jkotas deleted the lewing-harden-wasm-native-rebuild-test branch August 24, 2026 05:13
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Build-mono

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest.ReferenceNewAssembly failure: Expected changed file: driver-gen.c

2 participants

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

[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes - #130655

Closed
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test
Closed

[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes#130655
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test

Conversation

@lewing

Copy link
Copy Markdown
Member

Summary

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest has been failing on the browser-wasm AOT leg (Known Build Error #130540, "Expected changed file: driver-gen.c"). This hardens the test so it no longer depends on the app's incidental dependency closure.

Root cause

The test replaces the app's entry point with one that references a "new" assembly, then asserts that driver-gen.c — the AOT modules table, one mono_aot_register_module line per AOT'd assembly — changes because a new module was added.

It relied on System.Security.Cryptography being absent from WasmBasicTestApp's AOT closure (the swapped entry point used SHA256). That assumption broke when #122093 ("Add Zip Archives password support") added an unconditional System.Security.CryptographyProjectReference to System.IO.Compression. The app always compiles ZipArchiveInteropTest.cs (uses System.IO.Compression), so crypto is now always in the closure and always AOT'd. The swapped entry point therefore adds no new module, driver-gen.c is byte-identical between build and rebuild, MonoAOTCompiler's CopyIfDifferent skips the write, the timestamp is unchanged, and CompareStat fails.

This is the second time the test rotted this way — #109069 previously switched it from Json to System.Security.Cryptography for the same reason ("Json lib was already referenced before the change in the test").

Fix

Stop guessing which BCL assembly happens to be absent. Instead reference the existing dedicated first-party Library test project (an empty library not referenced by the default app), following the same pattern already used by PInvokeTableGeneratorTests:

  • Inject <ProjectReference Include="..\Library\Library.csproj" /> via CopyTestAsset(extraItems: ...).
  • Populate Library.cs with a small type via ReplaceFile.
  • Point the swapped entry point (NativeRebuildNewAssembly.cs) at that type instead of SHA256.

Library is unused in the first build → trimmed away → absent from the AOT module set. The swapped entry point uses it → rooted → new module in the rebuild → driver-gen.c changes. Because Library is first-party and the test fully controls whether it is referenced, the new-assembly signal is deterministic and immune to future changes in the app's dependency closure.

Fixes#130540.

Related

The underlying dependency regression (crypto rooted into every trimmed app that uses ZipArchive, a browser-wasm size concern) is tracked separately in #130650.

Testing

Not built/run locally — WBT requires a browser-wasm runtime baseline + emscripten and executes in a browser via the Helix/xharness harness. Relying on CI (the failing AOT leg exercises exactly this test) to validate.

Note

This PR was authored with the assistance of GitHub Copilot.

The test relied on System.Security.Cryptography being absent from the
WasmBasicTestApp's AOT closure: swapping the entry point to one that used
SHA256 was expected to introduce a new AOT module and thus change
driver-gen.c (the AOT modules table).
That assumption broke when System.IO.Compression started referencing
System.Security.Cryptography (#122093), which roots crypto
into the base app via ZipArchiveInteropTest. Crypto is now always AOT'd,
so the swapped entry point adds nothing, driver-gen.c is unchanged, and
the test fails (#130540). This is the second time the test
rotted this way (Json -> crypto in #109069).
Instead of chasing another BCL assembly that happens to be absent, use a
dedicated first-party library (the existing empty "Library" test project)
that the default app does not reference. It is trimmed away on the first
build and only enters the AOT module set once the swapped entry point
uses it, so the test fully controls the new-assembly signal and is immune
to future changes in the app's dependency closure.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f05b19b1-9e98-4565-9efb-bee27f2a85c2
CopilotAI review requested due to automatic review settings July 14, 2026 00:01
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:04 — with GitHub Actions Inactive

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

Hardens the Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest to make the “new AOT module added” signal deterministic by referencing a dedicated first-party test library, instead of relying on an incidental BCL dependency being absent/present in the app’s dependency closure.

Changes:

  • Injects a ProjectReference to WasmBasicTestApp/Library into the copied test asset and populates Library.cs with a controlled type.
  • Updates the “swapped entry point” (NativeRebuildNewAssembly.cs) to reference the new library type instead of System.Security.Cryptography.
  • Adds a new entrypoint source file (NativeRebuildReferencedLibrary.cs) used to overwrite the library’s source during the test setup.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.csInjects a ProjectReference to the test Library project and replaces Library.cs so the rebuild deterministically pulls in a new rooted assembly.
src/mono/wasm/testassets/EntryPoints/NativeRebuildReferencedLibrary.csNew testasset snippet defining NewlyReferencedType, used as the “new assembly” signal.
src/mono/wasm/testassets/EntryPoints/NativeRebuildNewAssembly.csSwitches the rebuilt entry point to call into NewlyReferencedType rather than crypto APIs.

@lewinglewing added the arch-wasm WebAssembly architecture label Jul 14, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@lewinglewing closed this Jul 14, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
@jkotas
jkotas deleted the lewing-harden-wasm-native-rebuild-test branch August 24, 2026 05:13
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Build-mono

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest.ReferenceNewAssembly failure: Expected changed file: driver-gen.c

2 participants

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

[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes - #130655

Closed
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test
Closed

[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes#130655
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test

Conversation

@lewing

Copy link
Copy Markdown
Member

Summary

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest has been failing on the browser-wasm AOT leg (Known Build Error #130540, "Expected changed file: driver-gen.c"). This hardens the test so it no longer depends on the app's incidental dependency closure.

Root cause

The test replaces the app's entry point with one that references a "new" assembly, then asserts that driver-gen.c — the AOT modules table, one mono_aot_register_module line per AOT'd assembly — changes because a new module was added.

It relied on System.Security.Cryptography being absent from WasmBasicTestApp's AOT closure (the swapped entry point used SHA256). That assumption broke when #122093 ("Add Zip Archives password support") added an unconditional System.Security.CryptographyProjectReference to System.IO.Compression. The app always compiles ZipArchiveInteropTest.cs (uses System.IO.Compression), so crypto is now always in the closure and always AOT'd. The swapped entry point therefore adds no new module, driver-gen.c is byte-identical between build and rebuild, MonoAOTCompiler's CopyIfDifferent skips the write, the timestamp is unchanged, and CompareStat fails.

This is the second time the test rotted this way — #109069 previously switched it from Json to System.Security.Cryptography for the same reason ("Json lib was already referenced before the change in the test").

Fix

Stop guessing which BCL assembly happens to be absent. Instead reference the existing dedicated first-party Library test project (an empty library not referenced by the default app), following the same pattern already used by PInvokeTableGeneratorTests:

  • Inject <ProjectReference Include="..\Library\Library.csproj" /> via CopyTestAsset(extraItems: ...).
  • Populate Library.cs with a small type via ReplaceFile.
  • Point the swapped entry point (NativeRebuildNewAssembly.cs) at that type instead of SHA256.

Library is unused in the first build → trimmed away → absent from the AOT module set. The swapped entry point uses it → rooted → new module in the rebuild → driver-gen.c changes. Because Library is first-party and the test fully controls whether it is referenced, the new-assembly signal is deterministic and immune to future changes in the app's dependency closure.

Fixes#130540.

Related

The underlying dependency regression (crypto rooted into every trimmed app that uses ZipArchive, a browser-wasm size concern) is tracked separately in #130650.

Testing

Not built/run locally — WBT requires a browser-wasm runtime baseline + emscripten and executes in a browser via the Helix/xharness harness. Relying on CI (the failing AOT leg exercises exactly this test) to validate.

Note

This PR was authored with the assistance of GitHub Copilot.

The test relied on System.Security.Cryptography being absent from the
WasmBasicTestApp's AOT closure: swapping the entry point to one that used
SHA256 was expected to introduce a new AOT module and thus change
driver-gen.c (the AOT modules table).
That assumption broke when System.IO.Compression started referencing
System.Security.Cryptography (#122093), which roots crypto
into the base app via ZipArchiveInteropTest. Crypto is now always AOT'd,
so the swapped entry point adds nothing, driver-gen.c is unchanged, and
the test fails (#130540). This is the second time the test
rotted this way (Json -> crypto in #109069).
Instead of chasing another BCL assembly that happens to be absent, use a
dedicated first-party library (the existing empty "Library" test project)
that the default app does not reference. It is trimmed away on the first
build and only enters the AOT module set once the swapped entry point
uses it, so the test fully controls the new-assembly signal and is immune
to future changes in the app's dependency closure.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f05b19b1-9e98-4565-9efb-bee27f2a85c2
CopilotAI review requested due to automatic review settings July 14, 2026 00:01
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:04 — with GitHub Actions Inactive

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

Hardens the Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest to make the “new AOT module added” signal deterministic by referencing a dedicated first-party test library, instead of relying on an incidental BCL dependency being absent/present in the app’s dependency closure.

Changes:

  • Injects a ProjectReference to WasmBasicTestApp/Library into the copied test asset and populates Library.cs with a controlled type.
  • Updates the “swapped entry point” (NativeRebuildNewAssembly.cs) to reference the new library type instead of System.Security.Cryptography.
  • Adds a new entrypoint source file (NativeRebuildReferencedLibrary.cs) used to overwrite the library’s source during the test setup.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.csInjects a ProjectReference to the test Library project and replaces Library.cs so the rebuild deterministically pulls in a new rooted assembly.
src/mono/wasm/testassets/EntryPoints/NativeRebuildReferencedLibrary.csNew testasset snippet defining NewlyReferencedType, used as the “new assembly” signal.
src/mono/wasm/testassets/EntryPoints/NativeRebuildNewAssembly.csSwitches the rebuilt entry point to call into NewlyReferencedType rather than crypto APIs.

@lewinglewing added the arch-wasm WebAssembly architecture label Jul 14, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@lewinglewing closed this Jul 14, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
@jkotas
jkotas deleted the lewing-harden-wasm-native-rebuild-test branch August 24, 2026 05:13
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Build-mono

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest.ReferenceNewAssembly failure: Expected changed file: driver-gen.c

2 participants

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

[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes - #130655

Closed
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test
Closed

[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes#130655
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test

Conversation

@lewing

Copy link
Copy Markdown
Member

Summary

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest has been failing on the browser-wasm AOT leg (Known Build Error #130540, "Expected changed file: driver-gen.c"). This hardens the test so it no longer depends on the app's incidental dependency closure.

Root cause

The test replaces the app's entry point with one that references a "new" assembly, then asserts that driver-gen.c — the AOT modules table, one mono_aot_register_module line per AOT'd assembly — changes because a new module was added.

It relied on System.Security.Cryptography being absent from WasmBasicTestApp's AOT closure (the swapped entry point used SHA256). That assumption broke when #122093 ("Add Zip Archives password support") added an unconditional System.Security.CryptographyProjectReference to System.IO.Compression. The app always compiles ZipArchiveInteropTest.cs (uses System.IO.Compression), so crypto is now always in the closure and always AOT'd. The swapped entry point therefore adds no new module, driver-gen.c is byte-identical between build and rebuild, MonoAOTCompiler's CopyIfDifferent skips the write, the timestamp is unchanged, and CompareStat fails.

This is the second time the test rotted this way — #109069 previously switched it from Json to System.Security.Cryptography for the same reason ("Json lib was already referenced before the change in the test").

Fix

Stop guessing which BCL assembly happens to be absent. Instead reference the existing dedicated first-party Library test project (an empty library not referenced by the default app), following the same pattern already used by PInvokeTableGeneratorTests:

  • Inject <ProjectReference Include="..\Library\Library.csproj" /> via CopyTestAsset(extraItems: ...).
  • Populate Library.cs with a small type via ReplaceFile.
  • Point the swapped entry point (NativeRebuildNewAssembly.cs) at that type instead of SHA256.

Library is unused in the first build → trimmed away → absent from the AOT module set. The swapped entry point uses it → rooted → new module in the rebuild → driver-gen.c changes. Because Library is first-party and the test fully controls whether it is referenced, the new-assembly signal is deterministic and immune to future changes in the app's dependency closure.

Fixes#130540.

Related

The underlying dependency regression (crypto rooted into every trimmed app that uses ZipArchive, a browser-wasm size concern) is tracked separately in #130650.

Testing

Not built/run locally — WBT requires a browser-wasm runtime baseline + emscripten and executes in a browser via the Helix/xharness harness. Relying on CI (the failing AOT leg exercises exactly this test) to validate.

Note

This PR was authored with the assistance of GitHub Copilot.

The test relied on System.Security.Cryptography being absent from the
WasmBasicTestApp's AOT closure: swapping the entry point to one that used
SHA256 was expected to introduce a new AOT module and thus change
driver-gen.c (the AOT modules table).
That assumption broke when System.IO.Compression started referencing
System.Security.Cryptography (#122093), which roots crypto
into the base app via ZipArchiveInteropTest. Crypto is now always AOT'd,
so the swapped entry point adds nothing, driver-gen.c is unchanged, and
the test fails (#130540). This is the second time the test
rotted this way (Json -> crypto in #109069).
Instead of chasing another BCL assembly that happens to be absent, use a
dedicated first-party library (the existing empty "Library" test project)
that the default app does not reference. It is trimmed away on the first
build and only enters the AOT module set once the swapped entry point
uses it, so the test fully controls the new-assembly signal and is immune
to future changes in the app's dependency closure.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f05b19b1-9e98-4565-9efb-bee27f2a85c2
CopilotAI review requested due to automatic review settings July 14, 2026 00:01
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:04 — with GitHub Actions Inactive

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

Hardens the Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest to make the “new AOT module added” signal deterministic by referencing a dedicated first-party test library, instead of relying on an incidental BCL dependency being absent/present in the app’s dependency closure.

Changes:

  • Injects a ProjectReference to WasmBasicTestApp/Library into the copied test asset and populates Library.cs with a controlled type.
  • Updates the “swapped entry point” (NativeRebuildNewAssembly.cs) to reference the new library type instead of System.Security.Cryptography.
  • Adds a new entrypoint source file (NativeRebuildReferencedLibrary.cs) used to overwrite the library’s source during the test setup.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.csInjects a ProjectReference to the test Library project and replaces Library.cs so the rebuild deterministically pulls in a new rooted assembly.
src/mono/wasm/testassets/EntryPoints/NativeRebuildReferencedLibrary.csNew testasset snippet defining NewlyReferencedType, used as the “new assembly” signal.
src/mono/wasm/testassets/EntryPoints/NativeRebuildNewAssembly.csSwitches the rebuilt entry point to call into NewlyReferencedType rather than crypto APIs.

@lewinglewing added the arch-wasm WebAssembly architecture label Jul 14, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@lewinglewing closed this Jul 14, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
@jkotas
jkotas deleted the lewing-harden-wasm-native-rebuild-test branch August 24, 2026 05:13
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Build-mono

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest.ReferenceNewAssembly failure: Expected changed file: driver-gen.c

2 participants

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

[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes - #130655

Closed
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test
Closed

[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes#130655
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test

Conversation

@lewing

Copy link
Copy Markdown
Member

Summary

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest has been failing on the browser-wasm AOT leg (Known Build Error #130540, "Expected changed file: driver-gen.c"). This hardens the test so it no longer depends on the app's incidental dependency closure.

Root cause

The test replaces the app's entry point with one that references a "new" assembly, then asserts that driver-gen.c — the AOT modules table, one mono_aot_register_module line per AOT'd assembly — changes because a new module was added.

It relied on System.Security.Cryptography being absent from WasmBasicTestApp's AOT closure (the swapped entry point used SHA256). That assumption broke when #122093 ("Add Zip Archives password support") added an unconditional System.Security.CryptographyProjectReference to System.IO.Compression. The app always compiles ZipArchiveInteropTest.cs (uses System.IO.Compression), so crypto is now always in the closure and always AOT'd. The swapped entry point therefore adds no new module, driver-gen.c is byte-identical between build and rebuild, MonoAOTCompiler's CopyIfDifferent skips the write, the timestamp is unchanged, and CompareStat fails.

This is the second time the test rotted this way — #109069 previously switched it from Json to System.Security.Cryptography for the same reason ("Json lib was already referenced before the change in the test").

Fix

Stop guessing which BCL assembly happens to be absent. Instead reference the existing dedicated first-party Library test project (an empty library not referenced by the default app), following the same pattern already used by PInvokeTableGeneratorTests:

  • Inject <ProjectReference Include="..\Library\Library.csproj" /> via CopyTestAsset(extraItems: ...).
  • Populate Library.cs with a small type via ReplaceFile.
  • Point the swapped entry point (NativeRebuildNewAssembly.cs) at that type instead of SHA256.

Library is unused in the first build → trimmed away → absent from the AOT module set. The swapped entry point uses it → rooted → new module in the rebuild → driver-gen.c changes. Because Library is first-party and the test fully controls whether it is referenced, the new-assembly signal is deterministic and immune to future changes in the app's dependency closure.

Fixes#130540.

Related

The underlying dependency regression (crypto rooted into every trimmed app that uses ZipArchive, a browser-wasm size concern) is tracked separately in #130650.

Testing

Not built/run locally — WBT requires a browser-wasm runtime baseline + emscripten and executes in a browser via the Helix/xharness harness. Relying on CI (the failing AOT leg exercises exactly this test) to validate.

Note

This PR was authored with the assistance of GitHub Copilot.

The test relied on System.Security.Cryptography being absent from the
WasmBasicTestApp's AOT closure: swapping the entry point to one that used
SHA256 was expected to introduce a new AOT module and thus change
driver-gen.c (the AOT modules table).
That assumption broke when System.IO.Compression started referencing
System.Security.Cryptography (#122093), which roots crypto
into the base app via ZipArchiveInteropTest. Crypto is now always AOT'd,
so the swapped entry point adds nothing, driver-gen.c is unchanged, and
the test fails (#130540). This is the second time the test
rotted this way (Json -> crypto in #109069).
Instead of chasing another BCL assembly that happens to be absent, use a
dedicated first-party library (the existing empty "Library" test project)
that the default app does not reference. It is trimmed away on the first
build and only enters the AOT module set once the swapped entry point
uses it, so the test fully controls the new-assembly signal and is immune
to future changes in the app's dependency closure.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f05b19b1-9e98-4565-9efb-bee27f2a85c2
CopilotAI review requested due to automatic review settings July 14, 2026 00:01
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:04 — with GitHub Actions Inactive

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

Hardens the Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest to make the “new AOT module added” signal deterministic by referencing a dedicated first-party test library, instead of relying on an incidental BCL dependency being absent/present in the app’s dependency closure.

Changes:

  • Injects a ProjectReference to WasmBasicTestApp/Library into the copied test asset and populates Library.cs with a controlled type.
  • Updates the “swapped entry point” (NativeRebuildNewAssembly.cs) to reference the new library type instead of System.Security.Cryptography.
  • Adds a new entrypoint source file (NativeRebuildReferencedLibrary.cs) used to overwrite the library’s source during the test setup.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.csInjects a ProjectReference to the test Library project and replaces Library.cs so the rebuild deterministically pulls in a new rooted assembly.
src/mono/wasm/testassets/EntryPoints/NativeRebuildReferencedLibrary.csNew testasset snippet defining NewlyReferencedType, used as the “new assembly” signal.
src/mono/wasm/testassets/EntryPoints/NativeRebuildNewAssembly.csSwitches the rebuilt entry point to call into NewlyReferencedType rather than crypto APIs.

@lewinglewing added the arch-wasm WebAssembly architecture label Jul 14, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@lewinglewing closed this Jul 14, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
@jkotas
jkotas deleted the lewing-harden-wasm-native-rebuild-test branch August 24, 2026 05:13
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Build-mono

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest.ReferenceNewAssembly failure: Expected changed file: driver-gen.c

2 participants

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

[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes - #130655

Closed
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test
Closed

[wasm] Harden ReferenceNewAssemblyRebuildTest against dependency-closure changes#130655
lewing wants to merge 1 commit into
mainfrom
lewing-harden-wasm-native-rebuild-test

Conversation

@lewing

Copy link
Copy Markdown
Member

Summary

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest has been failing on the browser-wasm AOT leg (Known Build Error #130540, "Expected changed file: driver-gen.c"). This hardens the test so it no longer depends on the app's incidental dependency closure.

Root cause

The test replaces the app's entry point with one that references a "new" assembly, then asserts that driver-gen.c — the AOT modules table, one mono_aot_register_module line per AOT'd assembly — changes because a new module was added.

It relied on System.Security.Cryptography being absent from WasmBasicTestApp's AOT closure (the swapped entry point used SHA256). That assumption broke when #122093 ("Add Zip Archives password support") added an unconditional System.Security.CryptographyProjectReference to System.IO.Compression. The app always compiles ZipArchiveInteropTest.cs (uses System.IO.Compression), so crypto is now always in the closure and always AOT'd. The swapped entry point therefore adds no new module, driver-gen.c is byte-identical between build and rebuild, MonoAOTCompiler's CopyIfDifferent skips the write, the timestamp is unchanged, and CompareStat fails.

This is the second time the test rotted this way — #109069 previously switched it from Json to System.Security.Cryptography for the same reason ("Json lib was already referenced before the change in the test").

Fix

Stop guessing which BCL assembly happens to be absent. Instead reference the existing dedicated first-party Library test project (an empty library not referenced by the default app), following the same pattern already used by PInvokeTableGeneratorTests:

  • Inject <ProjectReference Include="..\Library\Library.csproj" /> via CopyTestAsset(extraItems: ...).
  • Populate Library.cs with a small type via ReplaceFile.
  • Point the swapped entry point (NativeRebuildNewAssembly.cs) at that type instead of SHA256.

Library is unused in the first build → trimmed away → absent from the AOT module set. The swapped entry point uses it → rooted → new module in the rebuild → driver-gen.c changes. Because Library is first-party and the test fully controls whether it is referenced, the new-assembly signal is deterministic and immune to future changes in the app's dependency closure.

Fixes#130540.

Related

The underlying dependency regression (crypto rooted into every trimmed app that uses ZipArchive, a browser-wasm size concern) is tracked separately in #130650.

Testing

Not built/run locally — WBT requires a browser-wasm runtime baseline + emscripten and executes in a browser via the Helix/xharness harness. Relying on CI (the failing AOT leg exercises exactly this test) to validate.

Note

This PR was authored with the assistance of GitHub Copilot.

The test relied on System.Security.Cryptography being absent from the
WasmBasicTestApp's AOT closure: swapping the entry point to one that used
SHA256 was expected to introduce a new AOT module and thus change
driver-gen.c (the AOT modules table).
That assumption broke when System.IO.Compression started referencing
System.Security.Cryptography (#122093), which roots crypto
into the base app via ZipArchiveInteropTest. Crypto is now always AOT'd,
so the swapped entry point adds nothing, driver-gen.c is unchanged, and
the test fails (#130540). This is the second time the test
rotted this way (Json -> crypto in #109069).
Instead of chasing another BCL assembly that happens to be absent, use a
dedicated first-party library (the existing empty "Library" test project)
that the default app does not reference. It is trimmed away on the first
build and only enters the AOT module set once the swapped entry point
uses it, so the test fully controls the new-assembly signal and is immune
to future changes in the app's dependency closure.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f05b19b1-9e98-4565-9efb-bee27f2a85c2
CopilotAI review requested due to automatic review settings July 14, 2026 00:01
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:01 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:03 — with GitHub Actions Inactive
@lewing
lewingtemporarily deployed to copilot-pat-pool July 14, 2026 00:04 — with GitHub Actions Inactive

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

Hardens the Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest to make the “new AOT module added” signal deterministic by referencing a dedicated first-party test library, instead of relying on an incidental BCL dependency being absent/present in the app’s dependency closure.

Changes:

  • Injects a ProjectReference to WasmBasicTestApp/Library into the copied test asset and populates Library.cs with a controlled type.
  • Updates the “swapped entry point” (NativeRebuildNewAssembly.cs) to reference the new library type instead of System.Security.Cryptography.
  • Adds a new entrypoint source file (NativeRebuildReferencedLibrary.cs) used to overwrite the library’s source during the test setup.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

FileDescription
src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.csInjects a ProjectReference to the test Library project and replaces Library.cs so the rebuild deterministically pulls in a new rooted assembly.
src/mono/wasm/testassets/EntryPoints/NativeRebuildReferencedLibrary.csNew testasset snippet defining NewlyReferencedType, used as the “new assembly” signal.
src/mono/wasm/testassets/EntryPoints/NativeRebuildNewAssembly.csSwitches the rebuilt entry point to call into NewlyReferencedType rather than crypto APIs.

@lewinglewing added the arch-wasm WebAssembly architecture label Jul 14, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

@lewinglewing closed this Jul 14, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 13, 2026
@jkotas
jkotas deleted the lewing-harden-wasm-native-rebuild-test branch August 24, 2026 05:13
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Build-mono

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest.ReferenceNewAssembly failure: Expected changed file: driver-gen.c

2 participants

@lewing