net/http/internal — validation proof

Go’s own net/http/internal test suite, converted to C# by go2cs, built against the converted standard library, run under the Go-semantics test host, and compared verdict for verdict against a clean go test -json baseline of the same sources. This page is generated by the converter from that comparison — it is the evidence behind the net/http/internal row in Validated Test Packages.

Validated 2026-08-25 · converter be58eb4aa

14 matched · 1 disclosed — Go 1.23.12, windows/amd64, converted package src/core/net/http/internal.

Verdicts

Test go test go2cs
TestChunk pass pass
TestChunkEndReadError pass pass
TestChunkInvalidInputs pass pass
TestChunkInvalidInputs/bare_LF_in_chunk_data pass pass
TestChunkInvalidInputs/bare_LF_in_chunk_extension pass pass
TestChunkInvalidInputs/bare_LF_in_chunk_size pass pass
TestChunkInvalidInputs/extra_LF_in_chunk_size pass pass
TestChunkReadMultiple pass pass
TestChunkReadPartial pass pass
TestChunkReaderAllocs pass fail (disclosed)
TestChunkReaderByteAtATime pass pass
TestChunkReaderTooMuchOverhead pass pass
TestChunkReadingIgnoresExtensions pass pass
TestIncompleteChunk pass pass
TestParseHexUint pass pass

Disclosed divergences

A disclosed divergence is a specific Go assertion the managed CLR provably cannot satisfy — not a skipped test and not a tolerance. Each one is pinned by exact failure signature in the package’s hand-owned go2cs_test_disclosures.json; a disclosed test that fails any other way is still a hard mismatch.

Test Class Pinned reason
TestChunkReaderAllocs alloc-profile exact-count AllocsPerRun assert (fails above 1.5, i.e. wants 1): the measured loop constructs a fresh reader every iteration, and the converted NewChunkedReader emits TWO managed objects where Go allocates one - the box Ꮡ(new chunkedReader(r: br)), which is the direct analogue of Go’s &chunkedReader{}, plus a chunkedReaderжReader interface shell, because C# has no two-word interface value and the shell IS the itab+data fused into an object (docs/phase4/DESIGN-iface-shell-caching.md section 2). Measured 2 objects/run against Go’s 1, deterministically. Not amortizable for this shape: P3’s per-referent shell cache is keyed on the ж-box and this loop mints a new reader each iteration, so a fresh shell is required regardless - the same doc rules that nothing removes the shell allocation short of IDynamicInterfaceCastable. Distinct from alloc-count-semantics: go2cs’s counter is a true object count here (a lower bound on the real total), not an incomparable byte-derived shim, so the divergence is a genuine profile difference and is disclosed as one