dotnet / dotnet/runtime

[browser][coreCLR] Track disabled OOP runtime tests pending browser support

Open
#131,321 2 comments 0 reactions 1 assignee Claimed by @radekdoulik View on GitHub
arch-wasm area-Interop-coreclr os-browser tracking
Dominant language
C#
Stars
18.3k
Forks
5.6k
PR merge metrics
PR metrics pending

Description

## Summary

The CoreCLR browser-WASM out-of-process runtime-test work in
[#131110](https://github.com/dotnet/runtime/pull/131110) exposes tests that were
not previously run. After separating tests that need managed multithreading and
per-test native relinking, 46 suppression points still represent useful
coverage but need browser runtime functionality, host-side orchestration, test
adaptation, or practical execution performance.

This issue tracks those 46 suppression points. The count is for projects or
named test entries, not the number of underlying xUnit cases.

The following tests are intentionally left out:

- managed-multithreading tests, which are capability-gated by
`FeatureMultithreading`;
- per-test native relinking and UCO thunk relinking
([#123946](https://github.com/dotnet/runtime/issues/123946),
[#124219](https://github.com/dotnet/runtime/issues/124219)), including the
newly exposed `JIT/Directed/Convert/out_of_range_fp_to_int_conversions`.

## Re-enable checklist

### Background and server GC

PR [#127178](https://github.com/dotnet/runtime/pull/127178) intentionally
compiles background and server GC out of CoreCLR WebAssembly. These tests can
return only if that product decision changes and the corresponding mode works
with WebAssembly threads.

- [ ] `GC/Features/BackgroundGC/foregroundgc`
- [ ] `JIT/Methodical/Boxing/misc/concurgc_d`
- [ ] `JIT/Methodical/Boxing/misc/concurgc_r`
- [ ] `GC/API/NoGCRegion/Callback_Svr`

### Host-scheduled nested runs

These tests should not gain browser `Process.Start` support. Extend the
out-of-process host plan so the host launches each nested configuration or
crashing child, then imports its output and exit status. `ParallelCrashTester`
also requires managed multithreading.

- [ ] `baseservices/RuntimeConfiguration/TestConfigTester`
- [ ] `baseservices/exceptions/stackoverflow/stackoverflowtester`
- [ ] `baseservices/exceptions/unhandled/unhandledTester`
- [ ] `baseservices/exceptions/simple/ParallelCrashTester`
\n### WASM ReadyToRun host tooling

This work belongs with the WebAssembly R2R tracker
[#130524](https://github.com/dotnet/runtime/issues/130524). The checks must
operate on emitted WASM components from the host rather than asking browser
managed code to launch `dotnet` or `corerun`.

- [ ] `readytorun/coreroot_determinism`
- [ ] `readytorun/r2rdump/FrameworkTests/R2RDumpTests`

### WASM ReadyToRun execution

The expanded OOP coverage exposed two remaining runtime/toolchain disagreements.
Other browser R2R tests remain enabled after fixing composite-image layout and
eager-fixup lock ordering. This work belongs with
[#130524](https://github.com/dotnet/runtime/issues/130524).

- [ ] `readytorun/crossgen2/crossgen2smoke` - generic `ldtoken` reaches a
WebAssembly function-signature mismatch
- [ ] `readytorun/fieldlayout/fieldlayout` - Crossgen2 and browser CoreCLR
disagree on `Int128` aggregate size and alignment; the shipping correctness
fix is [#131421](https://github.com/dotnet/runtime/pull/131421)

### Browser runtime services and diagnostics

Re-enable these after browser CoreCLR supplies the registered-wait,
process-launch, diagnostic IPC/socket, or runtime-event behavior each test
validates. Self-process EventPipe tests must instead be adapted to browser's
JS/WebSocket diagnostic clients; the Process/PID-based managed
`DiagnosticsClient` path is unsupported.

- [ ] `JIT/Directed/debugging/debuginfo/tester` - JIT/interpreter IL and native
debug maps
- [ ] `tracing/eventlistener/EventListenerThreadPool` - ThreadPool registered
waits
- [ ] `tracing/eventpipe/applystartuphook/applystartuphook` - nested process
launch
- [ ] `tracing/eventpipe/diagnosticport/diagnosticport` - diagnostic IPC and
Unix-domain sockets
- [ ] `tracing/eventpipe/pauseonstart/pauseonstart` - diagnostic IPC and
Unix-domain sockets
- [ ] `tracing/eventpipe/processenvironment/processenvironment` - nested
process launch
- [ ] `tracing/eventpipe/eventsvalidation/ExceptionThrown_V1` - self-process
EventPipe collection
- [ ] `tracing/eventpipe/eventsvalidation/GCEvents` - self-process EventPipe
collection
- [ ] `tracing/eventpipe/eventsvalidation/GCFinalizers` - self-process EventPipe
collection
- [ ] `tracing/eventpipe/eventsvalidation/SampleProfilerSampleType` -
self-process EventPipe collection
- [ ] `tracing/eventpipe/randomizedallocationsampling/allocationsampling` -
randomized allocation-sampling EventPipe events
- [ ] `tracing/eventpipe/reverse/reverse` - nested process launch and diagnostic
IPC
- [ ] `tracing/eventpipe/reverseouter/reverseouter` - nested process launch
- [ ] `tracing/eventpipe/rundownvalidation/rundownvalidation` - self-process
EventPipe collection
- [ ] `tracing/eventpipe/simpleruntimeeventvalidation/simpleruntimeeventvalidation`
- self-process EventPipe collection
- [ ] `tracing/runtimeeventsource/runtimeeventsource` - expected runtime
configuration events

### WebAssembly managed-call ABI

The ABI stress harness currently rejects the browser's `PlatformID.Other` and
has no WebAssembly ABI model. Extend it with the WebAssembly ABI before
re-enabling these projects.

- [ ] `JIT/Stress/ABI/stubs_do`
- [ ] `JIT/Stress/ABI/pinvokes_d`
- [ ] `JIT/Stress/ABI/pinvokes_do`
- [ ] `JIT/Stress/ABI/tailcalls_d`
- [ ] `JIT/Stress/ABI/tailcalls_do`

### WebAssembly runtime invocation

Re-enable the binder tracing resolution-flow project after browser CoreCLR can
invoke its `AssemblyLoadContext.Resolving` path without a WebAssembly
function-signature mismatch.

- [ ] `Loader/binding/tracing/BinderTracingTest.ResolutionFlow`

### Optimizing JIT or equivalent performance

These tests assert optimizing-JIT behavior, count JIT-compiled methods, or run
workloads that are impractical on the interpreter. Re-enable them when a
WebAssembly JIT provides the intended behavior, or adapt their scale without
losing the regression coverage. WebAssembly JIT work is tracked by
[#121141](https://github.com/dotnet/runtime/issues/121141).

- [ ] `JIT/opt/Inline/tests/LotsOfInlines`
- [ ] `JIT/opt/Loops/TripCountOverflow`
- [ ] `JIT/jit64/regress/ddb/113574`
- [ ] `JIT/opt/ObjectStackAllocation/ObjectStackAllocationTests`
- [ ] `JIT/opt/Regressions/Regression2_Regressions`
- [ ] `readytorun/JittedMethodsCountingTest/JittedMethodsCountingTest`

### WebAssembly JIT and GCStress support

Both variants validate GC-pointer reporting for multi-register struct returns.
The `32Bit` and `64Bit` names describe managed field widths, not the target
architecture. Re-enable them when browser CoreCLR JIT supports
GCStress-on-direct-calls and after replacing the incidental
`ProcessStartInfo.Environment` struct-return trigger with a browser-safe
equivalent.

- [ ] `JIT/Regression/JitBlue/GitHub_23199/GitHub_23199_Target_32Bit`
- [ ] `JIT/Regression/JitBlue/GitHub_23199/GitHub_23199_Target_64Bit`

### Dynamic native-library loading

Static per-test relinking is insufficient for these tests. Define and
implement CoreCLR browser contracts for dynamic handles, ALC unmanaged-library
resolution, `CORE_LIBRARIES`, and path-based loading. Issue
[#123570](https://github.com/dotnet/runtime/issues/123570) tracks the related
Mono side-module gap.

- [ ] `Interop/NativeLibrary/API/NativeLibraryTests`
- [ ] `Interop/NativeLibrary/AssemblyLoadContext/ResolveUnmanagedDllTests`
- [ ] `Interop/NativeLibrary/MainProgramHandle/MainProgramHandleTests`
- [ ] `Loader/NativeLibs/FromNativePaths`

## Completion criteria

For each entry:

- remove or narrow the CoreCLR browser suppression;
- exercise the intended scenario rather than converting it to an unconditional
skip;
- pass under the relevant CoreCLR browser-WASM capability;
- preserve existing desktop, Mono, and WASI behavior.

If a prerequisite is explicitly rejected as a browser feature, document that
contract and move the corresponding entry to the permanent-exclusion list
instead of leaving it indefinitely ambiguous.

## Permanent exclusions not tracked here

The following 17 suppression points exercise contracts that do not apply to
the current browser runtime:

- Android/Java GC bridge: `Interop/GCBridge/BridgeTest`
- CoreCLR browser Server GC (disabled by design):
`GC/API/GC/GetTotalAllocatedBytesServerGC`
- Mono embedding API:
`Interop/MonoAPI/MonoMono/{InstallEHCallback,PInvokeDetach,Thunks}`
- Windows-only behavior: `FullPdbThrower`, threading regression `115178`, and
`TypeEquivalence/{istypeequivalent,simple}`
- PE native-image version resources:
`readytorun/tests/fileversionpreservation`
- RyuJIT SuperPMI collection: `JIT/superpmi/superpmicollect`
- browser-unsupported `ComWrappers`: `ComWrappersTests`,
`ComWrappersTestsBuiltInComDisabled`, and `WeakReferenceTest`
- browser-unsupported `AssemblyDependencyResolver`/hostpolicy probing:
`AssemblyDependencyResolverTests` and `MissingHostPolicyTests`
- physical CoreLib path: `SystemCoreLibDirectory.HostProvidedPath`; empty
`Assembly.Location` is expected on browser-WASM
([#52062](https://github.com/dotnet/runtime/issues/52062))

> [!NOTE]
> This issue was drafted with GitHub Copilot.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.