diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index efd9972d..86a44f46 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,8 +18,83 @@ concurrency: cancel-in-progress: true jobs: + # The make test suite: every top-level test of every package runs in + # exactly one shard, packed by recorded duration (scripts/test_shards.py). + # macOS: four shards plus checks fit GitHub's five concurrent macOS jobs. test: - name: test (${{ matrix.platform }}) + name: test (${{ matrix.platform }}, ${{ matrix.shard }}/${{ matrix.shards }}) + strategy: + fail-fast: false + matrix: + include: + - {os: ubuntu-24.04, platform: linux-amd64, shards: 6, shard: 1} + - {os: ubuntu-24.04, platform: linux-amd64, shards: 6, shard: 2} + - {os: ubuntu-24.04, platform: linux-amd64, shards: 6, shard: 3} + - {os: ubuntu-24.04, platform: linux-amd64, shards: 6, shard: 4} + - {os: ubuntu-24.04, platform: linux-amd64, shards: 6, shard: 5} + - {os: ubuntu-24.04, platform: linux-amd64, shards: 6, shard: 6} + - {os: macos-14, platform: darwin-arm64, shards: 4, shard: 1} + - {os: macos-14, platform: darwin-arm64, shards: 4, shard: 2} + - {os: macos-14, platform: darwin-arm64, shards: 4, shard: 3} + - {os: macos-14, platform: darwin-arm64, shards: 4, shard: 4} + runs-on: ${{ matrix.os }} + timeout-minutes: 60 + steps: + - uses: actions/checkout@v4 + + - name: Cache locations + run: | + echo "GOSVM_CACHE=$RUNNER_TEMP/gosvm-cache" >> "$GITHUB_ENV" + echo "GOCACHE=$RUNNER_TEMP/go-build" >> "$GITHUB_ENV" + echo "GOMODCACHE=$RUNNER_TEMP/go-mod" >> "$GITHUB_ENV" + + - uses: actions/setup-go@v5 + with: + go-version: '1.22.0' + cache: false + + # Module and build caches under one key per commit's Go sources, so a + # run restores the latest earlier build of the same platform. + - name: Go caches + uses: actions/cache@v4 + with: + path: | + ${{ runner.temp }}/go-build + ${{ runner.temp }}/go-mod + key: go-${{ matrix.platform }}-${{ hashFiles('go.mod', '**/go.sum', '**/*.go') }} + restore-keys: go-${{ matrix.platform }}- + + # The official archive is 430-530 MB; only the extracted Clang/LLD are + # cached, keyed by the files that pin them. + - name: Cache platform-tools backend + uses: actions/cache@v4 + with: + path: ${{ runner.temp }}/gosvm-cache/toolchains + key: platform-tools-v1.57-${{ matrix.platform }}-${{ hashFiles('internal/toolchain/archives.go', 'internal/targets/profile.go') }} + + - name: Build CLI and install backend and runners + run: | + bash scripts/build-cli.sh build/gosvm + build/gosvm toolchain install -runners=false + # Runner releases exist only after the maintainer publishes them; + # until then the SBF executions in the tests skip, saying so. + if ! build/gosvm runner install; then + echo "::warning::SVM runners not installed for ${{ matrix.platform }}; SBF executions will be skipped" + fi + + # -count=1: with the build cache restored, `go test` would otherwise + # report cached results instead of running the tests. + - name: Root tests + env: + GOFLAGS: -count=1 + run: | + # The real-libraries tests read these modules from the module cache. + (cd examples/real-libraries && go mod download) + python3 scripts/test_shards.py --shard ${{ matrix.shard }}/${{ matrix.shards }} + + # Everything else, alongside the test shards. + checks: + name: checks (${{ matrix.platform }}) strategy: fail-fast: false matrix: @@ -29,23 +104,31 @@ jobs: - os: macos-14 platform: darwin-arm64 runs-on: ${{ matrix.os }} - timeout-minutes: 90 + timeout-minutes: 60 steps: - uses: actions/checkout@v4 + - name: Cache locations + run: | + echo "GOSVM_CACHE=$RUNNER_TEMP/gosvm-cache" >> "$GITHUB_ENV" + echo "GOCACHE=$RUNNER_TEMP/go-build" >> "$GITHUB_ENV" + echo "GOMODCACHE=$RUNNER_TEMP/go-mod" >> "$GITHUB_ENV" + - uses: actions/setup-go@v5 with: go-version: '1.22.0' - cache: true - - - name: Isolated gosvm cache - run: echo "GOSVM_CACHE=$RUNNER_TEMP/gosvm-cache" >> "$GITHUB_ENV" - - - name: Build CLI - run: bash scripts/build-cli.sh build/gosvm + cache: false - - name: Vet - run: go vet ./... + # Module and build caches under one key per commit's Go sources, so a + # run restores the latest earlier build of the same platform. + - name: Go caches + uses: actions/cache@v4 + with: + path: | + ${{ runner.temp }}/go-build + ${{ runner.temp }}/go-mod + key: go-${{ matrix.platform }}-${{ hashFiles('go.mod', '**/go.sum', '**/*.go') }} + restore-keys: go-${{ matrix.platform }}- # The official archive is 430-530 MB; only the extracted Clang/LLD are # cached, keyed by the files that pin them. @@ -55,28 +138,25 @@ jobs: path: ${{ runner.temp }}/gosvm-cache/toolchains key: platform-tools-v1.57-${{ matrix.platform }}-${{ hashFiles('internal/toolchain/archives.go', 'internal/targets/profile.go') }} - - name: Install backend - run: build/gosvm toolchain install -runners=false - - # Runner releases exist only after the maintainer publishes them (and - # Linux pins only after the first runner release); until then the SBF - # executions in the tests skip, saying so. - - name: Install SVM runners + - name: Build CLI and install backend and runners run: | + bash scripts/build-cli.sh build/gosvm + build/gosvm toolchain install -runners=false + # Runner releases exist only after the maintainer publishes them; + # until then the SBF executions in the tests skip, saying so. if ! build/gosvm runner install; then echo "::warning::SVM runners not installed for ${{ matrix.platform }}; SBF executions will be skipped" fi + - name: Vet + run: go vet ./... + - name: Doctor run: build/gosvm doctor - - name: Root tests - run: | - # The real-libraries tests read these modules from the module cache. - (cd examples/real-libraries && go mod download) - make test - - name: Example and benchmark module tests + env: + GOFLAGS: -count=1 run: | flags="" if [ "$(uname -s)" = Darwin ]; then flags="-ldflags=-linkmode=external"; fi @@ -143,6 +223,18 @@ jobs: bash -n scripts/install.sh scripts/build-cli.sh scripts/build_runner_linux.sh sh -n scripts/install-release.sh - name: Python syntax - run: python3 -m py_compile scripts/package_runner_release.py scripts/update_runner_pins.py scripts/package_cli_release.py scripts/check_rebuild_reference.py + run: python3 -m py_compile scripts/package_runner_release.py scripts/update_runner_pins.py scripts/package_cli_release.py scripts/check_rebuild_reference.py scripts/test_shards.py - name: Committed release pins are well formed run: python3 -c "import json,glob; [json.load(open(p)) for p in glob.glob('internal/runner/pins/**/*.json', recursive=True)]" + + # The single required check for branch protection. + ci-ok: + name: ci-ok + if: always() + needs: [test, checks, scripts] + runs-on: ubuntu-24.04 + steps: + - name: All jobs passed + run: | + echo '${{ toJSON(needs) }}' + [ "${{ needs.test.result }}" = success ] && [ "${{ needs.checks.result }}" = success ] && [ "${{ needs.scripts.result }}" = success ] diff --git a/internal/compiler/accounts64_sbf_test.go b/internal/compiler/accounts64_sbf_test.go index e932a34c..97c2f192 100644 --- a/internal/compiler/accounts64_sbf_test.go +++ b/internal/compiler/accounts64_sbf_test.go @@ -221,6 +221,7 @@ func TestAccounts64SBF(t *testing.T) { // 3,584-byte table overflows 4 KiB in the tutorial (4,224 bytes) and escrow // (4,672); with -max-accounts 64 both build for both targets. func TestAccounts64Frames(t *testing.T) { + t.Parallel() llvm := compiler.ModernLLVMForTest() if llvm == "" { t.Skip("pinned platform-tools v1.57 backend required") diff --git a/internal/compiler/accounts_test.go b/internal/compiler/accounts_test.go index fdf7da6e..7fe1dc31 100644 --- a/internal/compiler/accounts_test.go +++ b/internal/compiler/accounts_test.go @@ -14,6 +14,7 @@ import ( // directly. Duplicate descriptors must retain data/flags/key aliasing across // both the old boundary and the new final slot. func TestSDKAccountDecoderCapacityAndAliases(t *testing.T) { + t.Parallel() source := `package app;import "gosvm/solana" func Process(c solana.Context)uint64 { d:=solana.Instruction(c) @@ -144,6 +145,7 @@ while(scanf("%llu %u %u %u",&n,&pattern,&bad,&strict)==4){ // Only programs that opt in to 64 accounts get the wide table and Process's // own frame; SDK 1 and other limits are rejected. func TestMaxAccountsOptIn(t *testing.T) { + t.Parallel() source := `package app;import "gosvm/solana";func Process(c solana.Context)uint64{return solana.Count(c)}` for _, tc := range []struct { sdk, max int diff --git a/internal/compiler/alloc_growth_test.go b/internal/compiler/alloc_growth_test.go index f8c25ff6..486571e3 100644 --- a/internal/compiler/alloc_growth_test.go +++ b/internal/compiler/alloc_growth_test.go @@ -90,6 +90,7 @@ func hasPointers(t reflect.Type) bool { // growthTypes and append sequences of 1, 2, 3, 7 and 100 elements, until the // backing array exceeds 300 KiB. func TestGrowthModelMatchesGoRuntime(t *testing.T) { + t.Parallel() if v := strings.TrimPrefix(runtime.Version(), "go"); !strings.HasPrefix(v, "1.22") { t.Skipf("the oracle is Go 1.22's runtime; running %s", v) } @@ -127,6 +128,7 @@ func TestGrowthModelMatchesGoRuntime(t *testing.T) { // the host over a grid of lengths, capacities, counts, sizes and both // pointer modes, and compares every resulting capacity with the model. func TestGrowthRuntimeMatchesModel(t *testing.T) { + t.Parallel() cc, err := exec.LookPath("clang") if err != nil { t.Skip("host Clang is needed") @@ -202,6 +204,7 @@ while(scanf("%llu %llu %llu %llu %llu",&l,&c,&n,&s,&scan)==5){ // TestGrowthModelMatchesCompiledAppend checks the model against append on // concrete compiled types (no reflect), which is what native fixtures run. func TestGrowthModelMatchesCompiledAppend(t *testing.T) { + t.Parallel() type big struct { P *uint64 A [64]uint64 diff --git a/internal/compiler/alloc_moves_test.go b/internal/compiler/alloc_moves_test.go index 2208540c..ac4e4c66 100644 --- a/internal/compiler/alloc_moves_test.go +++ b/internal/compiler/alloc_moves_test.go @@ -10,6 +10,7 @@ import ( // lifetime tables): each now compiles, moves the escaping local to the heap // and returns the value native Go would. func TestFormerEscapesMoveToHeap(t *testing.T) { + t.Parallel() for name, c := range map[string]struct { source string want string diff --git a/internal/compiler/alloc_sbf_test.go b/internal/compiler/alloc_sbf_test.go index ae91a607..86b31fea 100644 --- a/internal/compiler/alloc_sbf_test.go +++ b/internal/compiler/alloc_sbf_test.go @@ -160,6 +160,7 @@ func allocLargeHeapCases() []allocCase { // runners. Skips without the v1.57 backend or a runner (make test). // GOSVM_ALLOC_RESULTS= keeps fixtures, ELFs, reports and a summary. func TestAllocationSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/alloc_test.go b/internal/compiler/alloc_test.go index 006e364c..d3764d2a 100644 --- a/internal/compiler/alloc_test.go +++ b/internal/compiler/alloc_test.go @@ -71,6 +71,7 @@ func Process(s, i []byte) uint64 { ` func TestAllocationAcceptedForms(t *testing.T) { + t.Parallel() for name, body := range map[string]string{ "new scalar": `p := new(uint64); *p = 1; s[0] = byte(*p)`, "new struct": `v := new(V); v.N = 2; s[0] = byte(v.N)`, @@ -123,6 +124,7 @@ func TestAllocationAcceptedForms(t *testing.T) { } func TestAllocationRejections(t *testing.T) { + t.Parallel() for name, c := range map[string]struct{ body, want string }{ "make channel": {`ch := make(chan uint64); _ = ch`, "make supports only slices and maps"}, "new int": {`p := new(int); _ = p`, ""}, @@ -179,6 +181,7 @@ func TestAllocationRejections(t *testing.T) { // Heap moves and parameter escapes are part of the checked program, so a // backend allocates exactly the same storage. func TestHeapMovesExported(t *testing.T) { + t.Parallel() checked, err := Check(&Program{Entry: "program", Packages: []PackageSources{{"program", []Source{{Name: "alloc.go", Data: []byte(`package p type N struct{ Next *N; V uint64 } func keep(h *N, n *N) { h.Next = n } @@ -229,6 +232,7 @@ func Process(s, i []byte) uint64 { // Programs that do not allocate keep their exact C; the runtime and the // configured budget appear only when used. func TestAllocationRuntimeOnlyWhenUsed(t *testing.T) { + t.Parallel() without, err := Compile("a.go", []byte("package p\ntype B struct{ K [4]byte }\nfunc Process(s, i []byte) uint64 { var b B; v := b.K[:]; return uint64(len(v)) }\n")) if err != nil { t.Fatal(err) @@ -339,6 +343,7 @@ func AllocVectorsForTest() [][]byte { return allocVectors(20261015, 3, 3000, 150 // for 18 element kinds, make/new zero values and make traps, copy overlap, // slicing bounds, linked structures, escaping locals, literals and aliasing. func TestAllocationDifferential(t *testing.T) { + t.Parallel() source, err := os.ReadFile("../../examples/alloc-values/program.go") if err != nil { t.Fatal(err) @@ -411,6 +416,7 @@ func runOOM(t *testing.T, bin string, n uint64) string { // first allocation that does not fit aborts. Native Go never runs out of // memory at these sizes, so the expectations are computed, not observed. func TestOutOfMemoryBoundaries(t *testing.T) { + t.Parallel() build := func(heap int, body string) string { source := "package p\nfunc load(i []byte) uint64 { n := uint64(0); for j := uint64(0); j < 8; j++ { n = n | uint64(i[j])<<(8*j) }; return n }\nfunc save(s []byte, v uint64) { for j := uint64(0); j < 8; j++ { s[j] = byte(v >> (8 * j)) } }\nfunc Process(s, i []byte) uint64 {\nn := load(i)\n" + body + "\n}\n" c, err := CompileProgram(&Program{Entry: "program", HeapBytes: heap, Packages: []PackageSources{{"program", []Source{{Name: "oom.go", Data: []byte(source)}}}}}) diff --git a/internal/compiler/arrays_test.go b/internal/compiler/arrays_test.go index b407e5fc..cc78f68c 100644 --- a/internal/compiler/arrays_test.go +++ b/internal/compiler/arrays_test.go @@ -43,6 +43,7 @@ while(scanf("%32s %48s",ih,sh)==2){ }return 0;}` func TestScalarArraysDifferential(t *testing.T) { + t.Parallel() source, err := os.ReadFile("../../examples/array-values/program.go") if err != nil { t.Fatal(err) @@ -96,6 +97,7 @@ func TestScalarArraysDifferential(t *testing.T) { } func TestArrayDeclarationOrder(t *testing.T) { + t.Parallel() sources := []Source{ {"a.go", []byte(`package p; type Box struct { K Key };func Process(s,i []byte)uint64 {b:=Box{K:Key{1}};return uint64(b.K[0])}`)}, {"b.go", []byte(`package p;type Key [32]byte;func echo(k [32]byte)[32]byte{return k}`)}, @@ -115,6 +117,7 @@ func TestArrayDeclarationOrder(t *testing.T) { } func TestArrayRejections(t *testing.T) { + t.Parallel() for name, source := range map[string]string{ "oversize byte": `type K [1025]byte;func Process(s,i []byte)uint64{return 0}`, "oversize word": `type K [129]uint64;func Process(s,i []byte)uint64{return 0}`, @@ -139,6 +142,7 @@ func TestArrayRejections(t *testing.T) { } func TestArrayStorageLimit(t *testing.T) { + t.Parallel() for _, typ := range []string{"[1024]byte", "[128]uint64", "[256]uint32", "[1024]bool", "[0]byte"} { _, err := Compile("limit.go", []byte("package p;type K "+typ+`;func Process(s,i []byte)uint64{var a K;return uint64(len(a))}`)) if err != nil { @@ -148,6 +152,7 @@ func TestArrayStorageLimit(t *testing.T) { } func TestArrayCapacityMemory(t *testing.T) { + t.Parallel() source, err := os.ReadFile("../../examples/array-capacity/program.go") if err != nil { t.Fatal(err) diff --git a/internal/compiler/bits_diff_test.go b/internal/compiler/bits_diff_test.go index c1890793..4402612c 100644 --- a/internal/compiler/bits_diff_test.go +++ b/internal/compiler/bits_diff_test.go @@ -238,6 +238,7 @@ func bitsEdges(width int) []uint64 { } func TestBitsDifferentialAgainstGo(t *testing.T) { + t.Parallel() ops := bitsOps() program := bitsDifferentialProgram(ops) bin := hostProgram(t, program, bitsHostDriver) diff --git a/internal/compiler/bits_sbf_test.go b/internal/compiler/bits_sbf_test.go index 92882a3b..84dee4e2 100644 --- a/internal/compiler/bits_sbf_test.go +++ b/internal/compiler/bits_sbf_test.go @@ -298,6 +298,7 @@ func bitsProbeCases() (probe, cu []probeCase) { // backend or a runner. GOSVM_BITS_RESULTS= keeps the fixtures, ELFs, // runner reports and a summary per target. func TestBitsSBF(t *testing.T) { + t.Parallel() llvm := modernLLVM() if llvm == "" { t.Skip("pinned platform-tools v1.57 backend required") diff --git a/internal/compiler/bits_test.go b/internal/compiler/bits_test.go index 35b6ca88..a6ace81b 100644 --- a/internal/compiler/bits_test.go +++ b/internal/compiler/bits_test.go @@ -18,6 +18,7 @@ import ( // exported API: the same names, the same signatures (including parameter and // result names) and the same constant values. func TestBitsDeclarationsMatchStandardLibrary(t *testing.T) { + t.Parallel() std, err := importer.ForCompiler(token.NewFileSet(), "source", nil).Import(bitsPath) if err != nil { t.Skipf("standard library source unavailable: %v", err) @@ -117,6 +118,7 @@ func Process(s, i []byte) uint64 { ` func TestBitsCheckAcceptsSupportedFunctions(t *testing.T) { + t.Parallel() checked := checkSource(t, bitsAllSource) if len(checked.Functions) != 3 || len(checked.Functions[2].Callees) != 2 { t.Fatalf("math/bits calls must not be program callees: %+v", checked.Functions) @@ -136,6 +138,7 @@ func TestBitsCheckAcceptsSupportedFunctions(t *testing.T) { } func TestBitsCheckRejections(t *testing.T) { + t.Parallel() for name, tc := range map[string]struct{ body, want string }{ "function value": {`f := bits.Len64; return uint64(f(1))`, "math/bits functions cannot be used as values; call them in a function literal"}, "method value": {`f := bits.RotateLeft; return uint64(f(1, 2))`, "math/bits functions cannot be used as values; call them in a function literal"}, @@ -165,6 +168,7 @@ func TestBitsCheckRejections(t *testing.T) { // RotateLeft counts that are not constants are ordinary Check-accepted code. // Their results are compared with Go in TestBitsDifferentialAgainstGo. func TestBitsCheckAcceptsUintAndIntValues(t *testing.T) { + t.Parallel() for name, body := range map[string]string{ "uint Add": `sum, carry := bits.Add(1, 2, 0); return uint64(sum + carry)`, "uint Mul": `h, l := bits.Mul(1, 2); return uint64(h ^ l)`, @@ -196,6 +200,7 @@ func TestBitsCheckAcceptsUintAndIntValues(t *testing.T) { // A single file needs no module for math/bits, and module programs may use it // from shared user packages. func TestBitsImportForms(t *testing.T) { + t.Parallel() dir := t.TempDir() writePackageFile(t, dir, "single/program.go", "package main\nimport \"math/bits\"\nfunc Process(s, i []byte) uint64 { h, _ := bits.Mul64(uint64(len(i)), 1<<63); return h }\n") p, err := ReadProgram(filepath.Join(dir, "single", "program.go")) @@ -230,6 +235,7 @@ func TestBitsImportForms(t *testing.T) { // Programs that do not call math/bits emit exactly the C they always have // (the frozen corpus checks hashes); the runtime appears only when used. func TestBitsRuntimeOnlyWhenUsed(t *testing.T) { + t.Parallel() plain := "package main\nfunc Process(s, i []byte) uint64 { return uint64(len(s)) }\n" c, err := CompileSources([]Source{{"p.go", []byte(plain)}}) if err != nil { diff --git a/internal/compiler/builtins_test.go b/internal/compiler/builtins_test.go index e817dcfe..1eddb6e5 100644 --- a/internal/compiler/builtins_test.go +++ b/internal/compiler/builtins_test.go @@ -12,6 +12,7 @@ import ( ) func TestMultiplyBuiltinNativeDifferential(t *testing.T) { + t.Parallel() cc, err := exec.LookPath("clang") if err != nil { t.Skip("host Clang required") @@ -72,6 +73,7 @@ while(scanf("%llu %llu %llu %llu",&al,&ah,&bl,&bh)==4){ } func TestSBFUnresolvedSymbolGuard(t *testing.T) { + t.Parallel() llvm := filepath.Join(os.Getenv("HOME"), ".cache/solana/v1.51/platform-tools/llvm/bin") if _, err := os.Stat(filepath.Join(llvm, "clang")); err != nil { t.Skip("pinned SBF LLVM required") diff --git a/internal/compiler/byval_test.go b/internal/compiler/byval_test.go index 53e89667..ac831688 100644 --- a/internal/compiler/byval_test.go +++ b/internal/compiler/byval_test.go @@ -46,6 +46,7 @@ func nativeByval(in []byte) []byte { } func TestByvalDifferential(t *testing.T) { + t.Parallel() c, err := CompileProgram(&Program{Entry: "program", Packages: []PackageSources{{"program", []Source{{Name: "program.go", Data: byvalSource(t)}}}}}) if err != nil { t.Fatal(err) @@ -78,6 +79,7 @@ func TestByvalDifferential(t *testing.T) { // case must leave native Go's output. GOSVM_INT_RESULTS= keeps the // fixtures, ELFs and reports under byval/. func TestByvalSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } @@ -112,6 +114,7 @@ func TestByvalSBF(t *testing.T) { // after a write that may change the caller's variable opaquely, and no // others, so programs without such parameters keep their C. func TestByvalCopies(t *testing.T) { + t.Parallel() const prefix = `package p type P struct{ a, b uint64 } type K struct{ key [4]byte; n uint64 } diff --git a/internal/compiler/cache_test.go b/internal/compiler/cache_test.go index 709ad8ee..95cc49a7 100644 --- a/internal/compiler/cache_test.go +++ b/internal/compiler/cache_test.go @@ -8,6 +8,7 @@ import ( ) func TestBuildReceiptInvalidation(t *testing.T) { + t.Parallel() dir := t.TempDir() llvm := filepath.Join(dir, "llvm") mustWrite := func(p, s string) { diff --git a/internal/compiler/check_corpus_test.go b/internal/compiler/check_corpus_test.go index 1aee69de..6afbcf04 100644 --- a/internal/compiler/check_corpus_test.go +++ b/internal/compiler/check_corpus_test.go @@ -371,6 +371,7 @@ const ( // failure after a successful Check would surface here as a mismatch. Entries // in corpusChanges are verified against their new expected outcome instead. func TestCorpusMatchesPreCheckCompiler(t *testing.T) { + t.Parallel() rejected, changed := 0, 0 for i, e := range loadCorpus(t) { e := e diff --git a/internal/compiler/check_test.go b/internal/compiler/check_test.go index bab073fd..ec520101 100644 --- a/internal/compiler/check_test.go +++ b/internal/compiler/check_test.go @@ -16,6 +16,7 @@ func checkSource(t *testing.T, source string) *CheckedProgram { } func TestCheckedProgramDescribesContextProgram(t *testing.T) { + t.Parallel() checked := checkSource(t, `package main import "gosvm/solana" type S struct{ x uint64 } @@ -73,6 +74,7 @@ func Process(c solana.Context) uint64 { } func TestCheckLegacyEntryAndRejection(t *testing.T) { + t.Parallel() checked := checkSource(t, "package main\nfunc Process(input []byte, output []byte) uint64 { return 0 }\n") if checked.EntryKind != EntryBytes || checked.SDKPackage != nil || len(checked.CallOrder) != 1 { t.Fatalf("legacy entry %+v", checked) diff --git a/internal/compiler/clock_test.go b/internal/compiler/clock_test.go index 041e1a1b..a554c15e 100644 --- a/internal/compiler/clock_test.go +++ b/internal/compiler/clock_test.go @@ -14,6 +14,7 @@ import ( ) func TestSDK2ClockNativeCDifferential(t *testing.T) { + t.Parallel() source := `package app;import "gosvm/solana" func Process(c solana.Context)uint64{return solana.Clock(c,solana.Data(c,0)[1:uint64(solana.Instruction(c)[0])+1])}` p := &Program{SDK: 2, Entry: "app", Packages: []PackageSources{unit("app", source)}} diff --git a/internal/compiler/compiler_test.go b/internal/compiler/compiler_test.go index 78f92279..05daea52 100644 --- a/internal/compiler/compiler_test.go +++ b/internal/compiler/compiler_test.go @@ -47,6 +47,7 @@ func hostGenerated(t *testing.T, c []byte, driver string) string { } func TestWideQuoteDifferential(t *testing.T) { + t.Parallel() source, err := os.ReadFile("../../examples/tokenswap/swap.go") if err != nil { t.Fatal(err) @@ -79,6 +80,7 @@ int main(void){u64 x,y,a;while(scanf("%llu %llu %llu",&x,&y,&a)==3){u8 s[16],i[8 } func TestRejectUnsupported(t *testing.T) { + t.Parallel() for name, source := range map[string]string{ "imports": `import "fmt";func Process(s,i []byte) uint64 {fmt.Println("x");return 0}`, "float": `func Process(s,i []byte) uint64 {x:=1.5;return uint64(x)}`, @@ -108,6 +110,7 @@ func TestRejectUnsupported(t *testing.T) { } func TestSDKContext(t *testing.T) { + t.Parallel() // Host execution exercises the emitted account decoder, alias import, opaque // context copies, mutable account views, and boundary getters. CPI/PDA calls // are covered in the actual validator suite rather than mocked here. @@ -131,6 +134,7 @@ u64 r=entrypoint(raw);return r?r:(raw[96]==42?0:3);}`) } func TestSDKHashBounds(t *testing.T) { + t.Parallel() source := `package p import "gosvm/solana" func Process(c solana.Context)uint64 { @@ -148,6 +152,7 @@ int main(void){Context c={0};u8 b[64]={0};c.count=1;c.accounts[0].data=b;c.accou } func TestGoSemantics(t *testing.T) { + t.Parallel() source := `package p func bump(s []byte) uint64 { s[0] = s[0]+1; return uint64(s[0]) } func Process(s,i []byte) uint64 { @@ -175,6 +180,7 @@ func Process(s,i []byte) uint64 { } func TestRuntimeGuards(t *testing.T) { + t.Parallel() for name, expr := range map[string]string{"bounds": "uint64(s[uint64(i[0])])", "division": "uint64(s[0])/uint64(i[0])"} { t.Run(name, func(t *testing.T) { index := 0 @@ -192,6 +198,7 @@ func TestRuntimeGuards(t *testing.T) { } func TestAMMDifferential(t *testing.T) { + t.Parallel() source, err := os.ReadFile("../../examples/amm/amm.go") if err != nil { t.Fatal(err) diff --git a/internal/compiler/compound_diff_test.go b/internal/compiler/compound_diff_test.go index 4d279c18..0d0c2dcc 100644 --- a/internal/compiler/compound_diff_test.go +++ b/internal/compiler/compound_diff_test.go @@ -88,6 +88,7 @@ func compileCompound(t *testing.T) []byte { } func TestCompoundDifferential(t *testing.T) { + t.Parallel() bin := hostCompile(t, compileCompound(t), DefaultHeapBytes, allocDriver, false) vectors := compoundVectors(20261014, 2400) var want []string diff --git a/internal/compiler/compound_sbf_test.go b/internal/compiler/compound_sbf_test.go index da83e7df..7551eb89 100644 --- a/internal/compiler/compound_sbf_test.go +++ b/internal/compiler/compound_sbf_test.go @@ -85,6 +85,7 @@ func compoundSBFSource(t *testing.T) []byte { // the v1.57 backend or a runner (make test). GOSVM_INT_RESULTS= keeps // fixtures, ELFs, reports and a summary under compound/. func TestCompoundSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/compound_test.go b/internal/compiler/compound_test.go index f677150f..5f5989c5 100644 --- a/internal/compiler/compound_test.go +++ b/internal/compiler/compound_test.go @@ -33,6 +33,7 @@ func compoundMessage(t *testing.T, body string) string { } func TestCompoundAcceptedForms(t *testing.T) { + t.Parallel() ops := []string{"+=", "-=", "*=", "/=", "%=", "&=", "|=", "^=", "&^=", "<<=", ">>="} types := []string{"uint8", "uint16", "uint32", "uint64", "uint", "int8", "int16", "int32", "int64", "int", "Amount", "byte"} for _, typ := range types { @@ -92,6 +93,7 @@ func TestCompoundAcceptedForms(t *testing.T) { } func TestCompoundRejections(t *testing.T) { + t.Parallel() for name, c := range map[string]struct{ body, want string }{ "bool": {`b := i[0] > 1; b += true; return 0`, "f.go:13:16: invalid operation: operator + not defined on b (variable of type bool)"}, "string minus": {`t := "a"; t -= "b"; return 0`, "f.go:13:11: invalid operation: operator - not defined on t (variable of type string)"}, @@ -116,6 +118,7 @@ func TestCompoundRejections(t *testing.T) { // reassigns the slice, map or index variable of its own target updates the // new target. Elements changed by the right operand are seen. func TestCompoundOperandOrder(t *testing.T) { + t.Parallel() source := `package p func Process(s, i []byte) uint64 { b := []uint64{1, 2, 3} @@ -161,6 +164,7 @@ func Process(s, i []byte) uint64 { // Programs without compound assignment take none of its paths; a program // with one gets the signed-division runtime only for a signed /= or %=. func TestCompoundEmission(t *testing.T) { + t.Parallel() compile := func(body string) []byte { t.Helper() c, err := Compile("f.go", []byte("package p\nfunc Process(s, i []byte) uint64 {\n"+body+"\n}\n")) diff --git a/internal/compiler/control_test.go b/internal/compiler/control_test.go index fd355613..d5bd3b4e 100644 --- a/internal/compiler/control_test.go +++ b/internal/compiler/control_test.go @@ -12,6 +12,7 @@ import ( ) func TestControlValuesDifferential(t *testing.T) { + t.Parallel() source, err := os.ReadFile("../../examples/control-values/program.go") if err != nil { t.Fatal(err) @@ -50,6 +51,7 @@ func TestControlValuesDifferential(t *testing.T) { } } func TestControlRejections(t *testing.T) { + t.Parallel() for name, source := range map[string]string{ "fallthrough": `func Process(s,i []byte)uint64{switch i[0]{case 1:fallthrough;default:return 0}}`, "labeled continue": `func Process(s,i []byte)uint64{L:for{continue L};return 0}`, @@ -63,6 +65,7 @@ func TestControlRejections(t *testing.T) { } } func TestImportedMultipleResults(t *testing.T) { + t.Parallel() p := &Program{Entry: "app", Packages: []PackageSources{ unit("app", `package app;import "dep";func forward()(dep.Value,uint64){return dep.Pair()};func Process(s,i []byte)uint64{v,code:=forward();v.N,code=code,v.N;return dep.Add(dep.Pair())+v.N+code}`), unit("dep", `package dep;type Value struct{N uint64};func Pair()(Value,uint64){return Value{N:7},3};func Add(v Value,n uint64)uint64{return v.N+n}`), diff --git a/internal/compiler/cpi_test.go b/internal/compiler/cpi_test.go index 41027dca..702177e4 100644 --- a/internal/compiler/cpi_test.go +++ b/internal/compiler/cpi_test.go @@ -13,6 +13,7 @@ import ( ) func TestSDK2InvokeBoundaryDifferential(t *testing.T) { + t.Parallel() source := `package p;import "gosvm/solana";func Process(c solana.Context)uint64{return solana.Invoke(c,uint64(solana.Instruction(c)[0]),solana.Data(c,1),solana.Data(c,2),solana.Data(c,3))}` driver := ` #include @@ -113,6 +114,7 @@ int main(void){unsigned p,exec;char m[1400],d[20500],s[5600];while(scanf("%u %u } func TestSDKVersionsAndNativeOnlyTypes(t *testing.T) { + t.Parallel() if _, err := CompileProgram(&Program{SDK: 3}); err == nil || !strings.Contains(err.Error(), "unsupported SDK") { t.Fatal(err) } diff --git a/internal/compiler/cpilimits_sbf_test.go b/internal/compiler/cpilimits_sbf_test.go index e8d24f3e..9f72e31f 100644 --- a/internal/compiler/cpilimits_sbf_test.go +++ b/internal/compiler/cpilimits_sbf_test.go @@ -145,6 +145,7 @@ func buildCPICallee(t *testing.T, llvm, profile, dir string) string { // signers. Skips without the v1.57 backend or a runner (make test). // GOSVM_CPI_RESULTS= keeps the ELFs, fixtures, reports and per-case CU. func TestCPILimitsSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/evalorder_diff_test.go b/internal/compiler/evalorder_diff_test.go index e18043ec..66591cf6 100644 --- a/internal/compiler/evalorder_diff_test.go +++ b/internal/compiler/evalorder_diff_test.go @@ -90,6 +90,7 @@ func compileEvalOrder(t *testing.T) []byte { } func TestEvalOrderDifferential(t *testing.T) { + t.Parallel() bin := hostCompile(t, compileEvalOrder(t), DefaultHeapBytes, valueTypesDriver, false) vectors := evalOrderVectors(20261015, 6) var want []string diff --git a/internal/compiler/evalorder_sbf_test.go b/internal/compiler/evalorder_sbf_test.go index 83fc1d99..b7e0fbad 100644 --- a/internal/compiler/evalorder_sbf_test.go +++ b/internal/compiler/evalorder_sbf_test.go @@ -19,6 +19,7 @@ import ( // without the v1.57 backend or a runner (make test). GOSVM_INT_RESULTS= // keeps fixtures, ELFs, reports and a summary under eval-order/. func TestEvalOrderSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/evalorder_test.go b/internal/compiler/evalorder_test.go index 24345f03..faf9a5b7 100644 --- a/internal/compiler/evalorder_test.go +++ b/internal/compiler/evalorder_test.go @@ -47,6 +47,7 @@ func hoistedText(p *CheckedProgram) []string { // Check records where gc's order differs observably from left to right: // a package variable read before a call that writes it, and nowhere else. func TestEvalOrderHoisted(t *testing.T) { + t.Parallel() p := checkEvalOrder(t, `package p var x uint64 func f() uint64 { x = 10; return 1 } @@ -77,6 +78,7 @@ func Process(o, in []byte) uint64 { // Captured and address-taken locals are writable by calls; a call that // may panic makes an earlier trap observable (its log line). func TestEvalOrderLocalsAndTraps(t *testing.T) { + t.Parallel() p := checkEvalOrder(t, `package p func set(q *uint64) uint64 { *q = 3; return 0 } func boom(v byte) uint64 { @@ -106,6 +108,7 @@ func Process(o, in []byte) uint64 { // Map literals insert static entries first; m[k] = append(m[k], f()) reuses // the target's early copies; slow-path interface keys convert early. func TestEvalOrderMaps(t *testing.T) { + t.Parallel() p := checkEvalOrder(t, `package p type PM struct{ m map[uint64][]uint64 } var pm *PM @@ -154,6 +157,7 @@ func Process(o, in []byte) uint64 { // write, calls that write nothing), Check records nothing, so the C is // unchanged. func TestEvalOrderNothingToHoist(t *testing.T) { + t.Parallel() p := checkEvalOrder(t, `package p type T struct{ a uint64 } func (t T) Get() uint64 { return t.a } @@ -175,6 +179,7 @@ func Process(o, in []byte) uint64 { // Variadic calls (rewritten by Check to pass a slice literal) and writes // through pointers to pointers are analyzed like any other operands. func TestEvalOrderVariadicAndPointerToPointer(t *testing.T) { + t.Parallel() p := checkEvalOrder(t, `package p var x uint64 var q *uint64 diff --git a/internal/compiler/funccombos_sbf_test.go b/internal/compiler/funccombos_sbf_test.go index d0ce77fa..923ea1be 100644 --- a/internal/compiler/funccombos_sbf_test.go +++ b/internal/compiler/funccombos_sbf_test.go @@ -82,6 +82,7 @@ func funcStringLimit(kind byte) int { // without the v1.57 backend or a runner (make test). GOSVM_COMBO_RESULTS= // keeps fixtures, ELFs, reports and a summary. func TestFuncCombinationsSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/funcmaps_diff_test.go b/internal/compiler/funcmaps_diff_test.go index f481b487..54d4da05 100644 --- a/internal/compiler/funcmaps_diff_test.go +++ b/internal/compiler/funcmaps_diff_test.go @@ -88,6 +88,7 @@ func compileFuncMaps(t *testing.T) []byte { } func TestFuncMapsDifferential(t *testing.T) { + t.Parallel() bin := hostCompile(t, compileFuncMaps(t), DefaultHeapBytes, allocDriver, false) vectors := funcMapVectors(20261014, 1500) var want []string @@ -192,6 +193,7 @@ func funcMapCounted(n int, done bool, kind byte) string { // value that does not fit aborts after exactly the predicted number; native // Go never runs out, so the expectation is computed. func TestClosureMapHeap(t *testing.T) { + t.Parallel() if DefaultHeapBytes-8 != 32760 { t.Fatalf("default heap %d", DefaultHeapBytes) } diff --git a/internal/compiler/funcmaps_test.go b/internal/compiler/funcmaps_test.go index c257c248..3c86f33f 100644 --- a/internal/compiler/funcmaps_test.go +++ b/internal/compiler/funcmaps_test.go @@ -22,6 +22,7 @@ func Process(s, i []byte) uint64 { ` func TestFuncMapAcceptedForms(t *testing.T) { + t.Parallel() for name, body := range map[string]string{ "closure capturing a map": `m := map[uint8]uint8{}; f := func(k uint8) { m[k]++ }; f(1); f(1); return uint64(m[1])`, "closure replacing a map": `m := map[uint8]uint8{1: 1}; f := func() { m = nil }; f(); return uint64(len(m))`, @@ -60,6 +61,7 @@ func TestFuncMapAcceptedForms(t *testing.T) { // signature, and signatures over different map types (or a named map type // and its underlying type) are different classes. func TestFuncMapRecursion(t *testing.T) { + t.Parallel() for name, c := range map[string]struct{ source, want string }{ "map closure calling itself": {funcMapPrefix + "var f func(map[string]int) int\nf = func(m map[string]int) int { return f(m) }\nreturn uint64(f(nil))\n}\n", "f.go:12:5: recursion is not supported"}, @@ -86,6 +88,7 @@ func TestFuncMapRecursion(t *testing.T) { // values are captured like any variable, and loop defer records save a map // as its 8-byte reference. func TestCheckedProgramFuncMaps(t *testing.T) { + t.Parallel() source := funcMapPrefix + `m := map[uint8]uint64{} f := func(k uint8) uint64 { m[k]++; return m[k] } g := func(mm map[uint8]uint64) uint64 { return mm[1] } diff --git a/internal/compiler/funcs_diff_test.go b/internal/compiler/funcs_diff_test.go index fb945700..9d21aa1b 100644 --- a/internal/compiler/funcs_diff_test.go +++ b/internal/compiler/funcs_diff_test.go @@ -85,6 +85,7 @@ func compileFuncValues(t *testing.T) []byte { } func TestFuncValuesDifferential(t *testing.T) { + t.Parallel() bin := hostCompile(t, compileFuncValues(t), DefaultHeapBytes, allocDriver, false) vectors := append(funcVectors(20261014, 1500), FuncVectorsForTest()...) var want []string @@ -177,6 +178,7 @@ func envLimit(kind byte) int { // exactly: the value that does not fit aborts, after exactly the predicted // number; native Go never runs out, so the expectation is computed. func TestClosureEnvironmentHeap(t *testing.T) { + t.Parallel() bin := hostCompile(t, compileFuncValues(t), DefaultHeapBytes, allocDriver, false) counted := func(n int, done bool, kind byte) string { out := make([]byte, 1024) diff --git a/internal/compiler/funcs_sbf_test.go b/internal/compiler/funcs_sbf_test.go index 37d39108..5547cc48 100644 --- a/internal/compiler/funcs_sbf_test.go +++ b/internal/compiler/funcs_sbf_test.go @@ -137,6 +137,7 @@ func closureCallCase(mode, n byte) allocCase { // the v1.57 backend or a runner (make test). GOSVM_FUNC_RESULTS= keeps // fixtures, ELFs, reports and a summary. func TestFuncValuesSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/funcs_test.go b/internal/compiler/funcs_test.go index e1431e6a..bdd643b4 100644 --- a/internal/compiler/funcs_test.go +++ b/internal/compiler/funcs_test.go @@ -44,6 +44,7 @@ func funcMessage(t *testing.T, source string) string { } func TestFuncAcceptedForms(t *testing.T) { + t.Parallel() for name, body := range map[string]string{ "function value": `f := add; return f(1, 2)`, "named function type": `var o Op = add; return o(3, 4)`, @@ -96,6 +97,7 @@ func (UF) Do(f Op) uint64 { return f(1, 2) } } func TestFuncRejections(t *testing.T) { + t.Parallel() for name, c := range map[string]struct{ source, want string }{ // Recursion through function values: a call through a value may run // every target of its signature (the address-taken set). @@ -164,6 +166,7 @@ func TestFuncRejections(t *testing.T) { // The backend view: targets, classes, closures with their environments, // defer sites, and captured variables moved to the heap. func TestCheckedProgramFunctions(t *testing.T) { + t.Parallel() source := funcPrefix + `x := uint64(s[0]) f := func() uint64 { return x } g := add @@ -256,6 +259,7 @@ func TestCheckedProgramFunctions(t *testing.T) { // A closure can capture the Context; a deferred one writes account data. func TestFuncContextCapture(t *testing.T) { + t.Parallel() source := "package p\nimport \"gosvm/solana\"\nfunc Process(c solana.Context) uint64 {\n" + "defer func() { solana.Data(c, 0)[0] = 1 }()\nn := func() uint64 { return solana.Count(c) }\nreturn n()\n}\n" c, err := CompileProgram(&Program{Entry: "program", Packages: []PackageSources{{"program", []Source{{Name: "f.go", Data: []byte(source)}}}}}) @@ -268,6 +272,7 @@ func TestFuncContextCapture(t *testing.T) { // Programs without function values or defer emit no function-value // runtime; named results alone need none either. func TestFuncRuntimeOnlyWhenUsed(t *testing.T) { + t.Parallel() for _, tc := range []struct { body string used bool diff --git a/internal/compiler/funcstrings_diff_test.go b/internal/compiler/funcstrings_diff_test.go index 61834a80..65d1bff1 100644 --- a/internal/compiler/funcstrings_diff_test.go +++ b/internal/compiler/funcstrings_diff_test.go @@ -85,6 +85,7 @@ func compileFuncStrings(t *testing.T) []byte { } func TestFuncStringsDifferential(t *testing.T) { + t.Parallel() bin := hostCompile(t, compileFuncStrings(t), DefaultHeapBytes, allocDriver, false) vectors := funcStringVectors(20261014, 1500) var want []string @@ -167,6 +168,7 @@ func funcStringInput(kind byte, n int) []byte { // not fit aborts after exactly the predicted number; native Go never runs // out, so the expectation is computed. func TestClosureStringHeap(t *testing.T) { + t.Parallel() bin := hostCompile(t, compileFuncStrings(t), DefaultHeapBytes, allocDriver, false) counted := func(n int, done bool, kind byte) string { out := make([]byte, 1024) diff --git a/internal/compiler/generic_arrays_test.go b/internal/compiler/generic_arrays_test.go index 55e7e984..14e60239 100644 --- a/internal/compiler/generic_arrays_test.go +++ b/internal/compiler/generic_arrays_test.go @@ -192,6 +192,7 @@ func genericArrayInputs(count int) [][]byte { } func TestGenericArrayTypeArgsDifferential(t *testing.T) { + t.Parallel() inputs := genericArrayInputs(256) for name, src := range genericArrayPrograms { t.Run(name, func(t *testing.T) { @@ -224,6 +225,7 @@ func TestGenericArrayTypeArgsDifferential(t *testing.T) { // (each was "array type was not declared before use"), and the storage // rules inside them still apply. func TestGenericArrayTypeArgsForms(t *testing.T) { + t.Parallel() const decls = `type Pair[K any, V any] struct { Key K; Value V } type Box[T any] struct { V [][3]T } type PB[T any] struct { P *[4]T } @@ -279,6 +281,7 @@ func Id[T any](x T) T { return x } } func TestGenericArrayTypeArgsSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/generics_sbf_test.go b/internal/compiler/generics_sbf_test.go index 28e49f93..af66e486 100644 --- a/internal/compiler/generics_sbf_test.go +++ b/internal/compiler/generics_sbf_test.go @@ -21,6 +21,7 @@ import ( // platform-tools v1.57 is absent, and skips the runs (after building) when the // managed runners are not installed. func TestGenericSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } @@ -121,6 +122,7 @@ func Process(s, i []byte) uint64 { // compile to the same SBF machine code as hand-written per-type copies, so // size and compute units are identical. func TestGenericMatchesHandwrittenSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF builds are skipped in -short mode") } diff --git a/internal/compiler/generics_test.go b/internal/compiler/generics_test.go index 94d37069..73fd1d50 100644 --- a/internal/compiler/generics_test.go +++ b/internal/compiler/generics_test.go @@ -40,6 +40,7 @@ func genericCheck(t *testing.T, source string) string { const unsigned = "type Unsigned interface{ ~uint8 | ~uint16 | ~uint32 | ~uint64 }\n" func TestGenericAcceptedForms(t *testing.T) { + t.Parallel() for name, source := range map[string]string{ "inferred and explicit": unsigned + `func Min[T Unsigned](a, b T) T { if a < b { return a }; return b } func Process(s, i []byte) uint64 { return Min(uint64(s[0]), 2) + uint64(Min[uint8](s[0], s[1])) + uint64(Min[uint16](3, 4)) }`, @@ -101,6 +102,7 @@ func Process(s, i []byte) uint64 { a, b := Split(s[0]); h := Head(s, uint32(2)); } func TestGenericRejections(t *testing.T) { + t.Parallel() limit := func(format string) string { var b strings.Builder b.WriteString("func Process(s, i []byte) uint64 {\n") @@ -165,6 +167,7 @@ func TestGenericRejections(t *testing.T) { // A library package's generic types and functions are instantiated with the // importing package's types; the instance belongs to the generic's package. func TestGenericCrossPackage(t *testing.T) { + t.Parallel() lib := `package lib type Unsigned interface{ ~uint32 | ~uint64 } type Stack[T any] struct { top, prev T; n uint64 } @@ -211,6 +214,7 @@ func Process(s, i []byte) uint64 { // CheckedProgram lists each instantiation as an ordinary function, in place // of its generic declaration, with its own callees and borrow summary. func TestCheckedProgramInstances(t *testing.T) { + t.Parallel() checked, err := Check(genericSource(`type Box[T any] struct{ V T } func (b *Box[T]) Ref() *T { return &b.V } func Pick[T any](a T, s []byte) T { return a } @@ -285,6 +289,7 @@ func Process(s, i []byte) uint64 { // Box[uint8] as distinct, identical instances, which share one key, one C // struct, one field layout and one instance per method. func TestGenericAliasSpellingsShareInstances(t *testing.T) { + t.Parallel() source := `type Box[T any] struct{ V T; N uint64 } func (b *Box[T]) Set(v T) { b.V = v; b.N++ } func Id[T any](x T) T { return x } @@ -343,6 +348,7 @@ func symbols(c []byte) []string { // every instance and type-instance symbol (local temporaries are numbered in // emission order, for generic and ordinary code alike). func TestGenericNamesAreDeterministic(t *testing.T) { + t.Parallel() source, err := os.ReadFile("../../examples/generic-values/program.go") if err != nil { t.Fatal(err) @@ -384,6 +390,7 @@ func TestGenericNamesAreDeterministic(t *testing.T) { } func TestMangleIsInjective(t *testing.T) { + t.Parallel() keys := []string{"a.F[uint8]", "a.F[uint8]_", "a.F_5buint8]", "a_DF", "a.DF", "a._DF", "a/b.F[x, y]", "a/b.F[x,y]", "a.S[*a.T].M", "a.S[a.T].M", "a.F[[2]uint8]", "é.F", "_xc3_xa9.F"} seen := map[string]string{} for _, k := range keys { @@ -401,6 +408,7 @@ func TestMangleIsInjective(t *testing.T) { // Programs without generics lower to their own files: no instance or type // instance, and the lowered view is the original syntax. func TestNoGenericsLowersToItself(t *testing.T) { + t.Parallel() checked, err := Check(genericSource("type P struct{ a uint64 }\nfunc (p P) A() uint64 { return p.a }\nfunc Process(s, i []byte) uint64 { return P{1}.A() }")) if err != nil { t.Fatal(err) @@ -448,6 +456,7 @@ func genericVectors() []oracleVector { // instance (four unsigned widths, structs, arrays, pointers, nested calls) // must match Go's results, panics and state. func TestGenericDifferential(t *testing.T) { + t.Parallel() differential(t, "../../examples/generic-values/program.go", genericvalues.Process, genericVectors()) } diff --git a/internal/compiler/globals_diff_test.go b/internal/compiler/globals_diff_test.go index a1f9c9d8..f7581d60 100644 --- a/internal/compiler/globals_diff_test.go +++ b/internal/compiler/globals_diff_test.go @@ -198,6 +198,7 @@ func compareGlobalVectors(t *testing.T, bin string, vectors [][]byte, want []str } func TestGlobalsDifferential(t *testing.T) { + t.Parallel() oracle := globalOracle(t) bin := hostCompile(t, compileGlobals(t, nil), DefaultHeapBytes, allocDriver, false) vectors := append(globalVectors(20261014, 300), GlobalVectorsForTest()...) diff --git a/internal/compiler/globals_sbf_test.go b/internal/compiler/globals_sbf_test.go index ecb6fe9c..69be9fc1 100644 --- a/internal/compiler/globals_sbf_test.go +++ b/internal/compiler/globals_sbf_test.go @@ -130,6 +130,7 @@ func runGlobalProgram(t *testing.T, llvm, runner, profile, name string, program // Skips without the v1.57 backend or a runner (make test). // GOSVM_GLOBAL_RESULTS= keeps fixtures, ELFs, reports and a summary. func TestGlobalsSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/globals_test.go b/internal/compiler/globals_test.go index ef13b4b9..5c3280a5 100644 --- a/internal/compiler/globals_test.go +++ b/internal/compiler/globals_test.go @@ -50,6 +50,7 @@ func resultOf(t *testing.T, out string) string { // Each program's Process returns the value native Go returns (worked out by // hand and noted beside each case); each run starts from fresh variables. func TestGlobalAcceptedForms(t *testing.T) { + t.Parallel() for name, tc := range map[string]struct { src string want string @@ -133,6 +134,7 @@ func Process(o, in []byte) uint64 { a := [2]uint64{1, 2}; keep = a[:]; a[1] = 9; // path) and files within a package by name; qualified variables are read, // written, addressed and called across packages. func TestGlobalPackages(t *testing.T) { + t.Parallel() logPkg := unitFiles("ex/log", `package log var Trace []byte func Mark(b byte) byte { Trace = append(Trace, b); return b }`) @@ -190,6 +192,7 @@ var C = log.Mark('c') - 'c'`), // Read-only placement is decided by every use; anything that could write the // variable keeps it in the globals block. func TestGlobalReadOnly(t *testing.T) { + t.Parallel() src := `package p type S struct{ a uint64; b [2]uint8 } func (s *S) Ptr() uint64 { return s.a } @@ -310,6 +313,7 @@ func Process(o, in []byte) uint64 { } func TestGlobalRejections(t *testing.T) { + t.Parallel() for name, tc := range map[string]struct{ src, want string }{ "context variable": {`import "gosvm/solana" var d solana.Context @@ -352,6 +356,7 @@ func Process(s, i []byte) uint64 { x1.a[0]++; x2.a[0]++; x3.a[0]++; x4.a[0]++; x // The globals block is the invocation heap's first allocation: with a block // of B bytes, 32,760 - B bytes remain for everything else. func TestGlobalHeapAccounting(t *testing.T) { + t.Parallel() src := `package p var counters [5]uint64 // 40 bytes var flag bool // 1 byte: the block is 48 bytes @@ -381,6 +386,7 @@ func Process(o, in []byte) uint64 { // A trap during initialization aborts before Process runs: nothing is // written (Go panics before main). func TestGlobalInitTrap(t *testing.T) { + t.Parallel() for name, src := range map[string]string{ "initializer": `var zero uint64 var bad = 10 / zero @@ -405,6 +411,7 @@ func Process(o, in []byte) uint64 { o[0] = 1; return 0 }`, // same expression, as gc does: a call that changes it is seen // (docs/ERROR_CONTRACT.md#evaluation-order). func TestGlobalOperandOrder(t *testing.T) { + t.Parallel() src := `package p var x uint64 = 1 func f() uint64 { x = 10; return 0 } @@ -417,6 +424,7 @@ func Process(o, in []byte) uint64 { return x + f() }` // Programs without package variables or init functions get none of the // runtime; programs whose variables are all read-only get no initialization. func TestGlobalRuntimeOnlyWhenUsed(t *testing.T) { + t.Parallel() for name, tc := range map[string]struct { src string block, inits bool @@ -444,6 +452,7 @@ func TestGlobalRuntimeOnlyWhenUsed(t *testing.T) { // package's synthetic Vars initializer assigns its non-read-only // initializers in go/types order; init functions follow in source order. func TestCheckedProgramGlobals(t *testing.T) { + t.Parallel() src := `package p var a = b + 1 var b uint64 = 2 diff --git a/internal/compiler/globaltables_test.go b/internal/compiler/globaltables_test.go index f2727496..e9209274 100644 --- a/internal/compiler/globaltables_test.go +++ b/internal/compiler/globaltables_test.go @@ -17,6 +17,7 @@ type Pair struct{ K uint32; V uint64 } ` func TestLargeTablesAccepted(t *testing.T) { + t.Parallel() for name, tc := range map[string]struct{ src, want string }{ // Read-only data: a constant [60]Int and a [300]Pair table (4,800 // bytes, above the 4 KiB SBF stack frame). @@ -73,6 +74,7 @@ func Process(o, in []byte) uint64 { } func TestLargeTablesRejected(t *testing.T) { + t.Parallel() const limit = "array storage exceeds experimental 1024-byte per-value limit" for name, src := range map[string]string{ "local": `var pows [60]Int; func Process(o, in []byte) uint64 { var l [60]Int; return l[0][0] + pows[0][0] }`, diff --git a/internal/compiler/globalvaluetypes_diff_test.go b/internal/compiler/globalvaluetypes_diff_test.go index be34d2ec..eea53b19 100644 --- a/internal/compiler/globalvaluetypes_diff_test.go +++ b/internal/compiler/globalvaluetypes_diff_test.go @@ -152,6 +152,7 @@ func compareLines(t *testing.T, bin string, vectors [][]byte, want []string) { } func TestGlobalValueTypesDifferential(t *testing.T) { + t.Parallel() oracle := goBinary(t, "../..", "./examples/global-value-types/oracle") c, err := CompileProgram(globalValueTypesProgram(t, nil)) if err != nil { @@ -192,6 +193,7 @@ func TestGlobalValueTypesDifferential(t *testing.T) { // constant initializers (including the two above the per-value limit) are // read-only data; written ones are in the globals block. func TestGlobalValueTypesPlacement(t *testing.T) { + t.Parallel() checked, err := Check(globalValueTypesProgram(t, nil)) if err != nil { t.Fatal(err) @@ -298,6 +300,7 @@ func initPanicProgram(src, lib string, sbf bool) *Program { // host-compiled C: the C must log the same line (none for a runtime error) // and abort with Process's output untouched. func TestGlobalInitPanics(t *testing.T) { + t.Parallel() for _, probe := range globalInitPanicProbes { t.Run(probe.name, func(t *testing.T) { dir := t.TempDir() diff --git a/internal/compiler/globalvaluetypes_sbf_test.go b/internal/compiler/globalvaluetypes_sbf_test.go index c3f8a263..a2376cb6 100644 --- a/internal/compiler/globalvaluetypes_sbf_test.go +++ b/internal/compiler/globalvaluetypes_sbf_test.go @@ -67,6 +67,7 @@ func oracleCase(t *testing.T, name string, in []byte, line string) allocCase { // line. Skips without the v1.57 backend or a runner (make test). // GOSVM_GLOBAL_RESULTS= keeps fixtures, ELFs, reports and a summary. func TestGlobalValueTypesSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/iface_diff_test.go b/internal/compiler/iface_diff_test.go index bd75c0f1..d5c2b4b3 100644 --- a/internal/compiler/iface_diff_test.go +++ b/internal/compiler/iface_diff_test.go @@ -81,6 +81,7 @@ func ifaceVectors(seed int64, perMode int) [][]byte { func IfaceVectorsForTest() [][]byte { return ifaceVectors(20261017, 24) } func TestInterfaceDifferential(t *testing.T) { + t.Parallel() c, err := CompileProgram(&Program{Entry: "program", Packages: []PackageSources{{"program", []Source{{Name: "program.go", Data: ifaceSource(t)}}}}}) if err != nil { t.Fatal(err) @@ -158,6 +159,7 @@ var boxLimits = map[byte]int{0: 4095, 1: 1365, 2: -1, 3: -1, 4: 4095, 5: 4095} // conversion that does not fit aborts, after exactly the predicted number of // conversions; native Go never runs out, so the expectation is computed. func TestInterfaceBoxingHeap(t *testing.T) { + t.Parallel() c, err := CompileProgram(&Program{Entry: "program", Packages: []PackageSources{{"program", []Source{{Name: "program.go", Data: ifaceSource(t)}}}}}) if err != nil { t.Fatal(err) diff --git a/internal/compiler/iface_sbf_test.go b/internal/compiler/iface_sbf_test.go index dda987d0..e49524b3 100644 --- a/internal/compiler/iface_sbf_test.go +++ b/internal/compiler/iface_sbf_test.go @@ -149,6 +149,7 @@ func dispatchCase(mode, n byte, u bool) allocCase { // the v1.57 backend or a runner (make test). GOSVM_IFACE_RESULTS= keeps // fixtures, ELFs, reports and a summary. func TestInterfaceSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/iface_test.go b/internal/compiler/iface_test.go index 5001f34f..ba7d920a 100644 --- a/internal/compiler/iface_test.go +++ b/internal/compiler/iface_test.go @@ -41,6 +41,7 @@ func Process(s, i []byte) uint64 { ` func TestInterfaceAcceptedForms(t *testing.T) { + t.Parallel() for name, body := range map[string]string{ "any variable": `var a any; _ = a`, "nil interface": `var a any = nil; if a == nil { s[0] = 1 }`, @@ -93,6 +94,7 @@ func TestInterfaceAcceptedForms(t *testing.T) { } func TestInterfaceRejections(t *testing.T) { + t.Parallel() for name, c := range map[string]struct{ body, want string }{ "float boxing": {`var a any = 1.5; _ = a`, "unsupported type float64"}, "zero-size part": {`type Z struct{ a [0]byte; b uint64 }; _ = Z{}`, "unsupported local declaration"}, @@ -141,6 +143,7 @@ func TestInterfaceRejections(t *testing.T) { // The checked program lists conversions, dynamic types (IDs in key order), // method slots, method tables, dynamic calls, assertions and type switches. func TestCheckedProgramInterfaces(t *testing.T) { + t.Parallel() source := ifacePrefix + `var x Solid = &R{1, 1} x.Scale(2) var g Getter[int8] = Box[int8]{-1} @@ -213,6 +216,7 @@ func TestCheckedProgramInterfaces(t *testing.T) { // Converting a reference to an interface is an escape: the referenced local // moves to the heap; an interface value holding only heap data moves nothing. func TestInterfaceHeapMoves(t *testing.T) { + t.Parallel() source := `package p type I interface{ M(p *uint64) *uint64 } type T struct{} @@ -268,6 +272,7 @@ func Process(s, i []byte) uint64 { // Programs without interface values emit no interface runtime; the C of an // interface program is deterministic. func TestInterfaceRuntimeOnlyWhenUsed(t *testing.T) { + t.Parallel() plain := "package p\ntype C interface{ ~uint8 }\nfunc Id[T C](x T) T { return x }\nfunc Process(s, i []byte) uint64 { return uint64(Id(s[0])) }\n" out, err := Compile("a.go", []byte(plain)) if err != nil { @@ -292,6 +297,7 @@ func TestInterfaceRuntimeOnlyWhenUsed(t *testing.T) { // Unexported interface methods are package-qualified: a type in another // package with a method of the same name does not implement the interface. func TestInterfaceCrossPackage(t *testing.T) { + t.Parallel() lib := `package lib type Counter interface { inc() uint64 diff --git a/internal/compiler/initeval_diff_test.go b/internal/compiler/initeval_diff_test.go index a4587f1e..b9d2a4e8 100644 --- a/internal/compiler/initeval_diff_test.go +++ b/internal/compiler/initeval_diff_test.go @@ -88,6 +88,7 @@ func constInitVectors(seed int64, n int) [][]byte { func ConstInitVectorsForTest() [][]byte { return constInitVectors(20261016, 120) } func TestConstInitDifferential(t *testing.T) { + t.Parallel() oracle := buildOracle(t, "./examples/const-init/oracle") vectors := append(constInitVectors(20261017, 900), ConstInitVectorsForTest()...) want := nativeGlobals(t, oracle, vectors) @@ -165,6 +166,7 @@ func initHeap(t *testing.T, program *Program) (string, string) { // the allocator's in-use word after initialization is the same, so every // out-of-memory boundary is; and the heap's live contents are the same. func TestInitImageHeapAccounting(t *testing.T) { + t.Parallel() programs := map[string]func() *Program{ "const-init": func() *Program { return constInitProgram(t) }, "global-values": func() *Program { return globalProgramSources(t, nil) }, diff --git a/internal/compiler/initeval_sbf_test.go b/internal/compiler/initeval_sbf_test.go index 36c76549..51bc4a81 100644 --- a/internal/compiler/initeval_sbf_test.go +++ b/internal/compiler/initeval_sbf_test.go @@ -92,6 +92,7 @@ func keepDir(t *testing.T, keep, profile string) string { // measures initialization (the idle vector) both ways. // GOSVM_CONSTINIT_RESULTS= keeps fixtures, ELFs, reports and a summary. func TestConstInitSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } @@ -151,6 +152,7 @@ func TestConstInitSBF(t *testing.T) { // line, and that an image under a heap budget above 32 KiB faults at entry // without a large enough heap frame, as the first allocation does. func TestInitEvalEdgesSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } @@ -237,6 +239,7 @@ var realLibsInitMeasured = []string{"none", "uint256", "int256", "uint128", "con // CU includes initialization. Outputs must match the libraries run // natively both ways. GOSVM_CONSTINIT_RESULTS= keeps the reports. func TestRealLibrariesInitSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/initeval_test.go b/internal/compiler/initeval_test.go index a74bf53b..06d2e622 100644 --- a/internal/compiler/initeval_test.go +++ b/internal/compiler/initeval_test.go @@ -92,6 +92,7 @@ func initEvalProgram(c initEvalCase) *Program { } func TestInitEvalStops(t *testing.T) { + t.Parallel() for name, c := range initEvalCases { t.Run(name, func(t *testing.T) { checked, err := Check(initEvalProgram(c)) @@ -145,6 +146,7 @@ func TestInitEvalStops(t *testing.T) { // the variable, strings built at initialization are heap bytes, and each // PackageInit records the steps the image covers. func TestInitImageCheckedProgram(t *testing.T) { + t.Parallel() src := `package p type T struct{ a, b uint64 } var arr [4]uint16 @@ -227,6 +229,7 @@ func Process(o, in []byte) uint64 { return x.a + y.b + uint64(view[1]) + uint64( // RuntimeInit disables compile-time evaluation: no image, and the C runs // every initializer as before it existed. func TestInitEvalRuntimeInit(t *testing.T) { + t.Parallel() p := globalsProgram(unitFiles("program", `package p var a = f() func f() uint64 { return 4 } @@ -252,6 +255,7 @@ func Process(s, i []byte) uint64 { return a }`)) // of its synthetic initializer at run time, from the first one not // evaluated. func TestInitEvalPartialPackage(t *testing.T) { + t.Parallel() src := `package p type T struct{ n uint64 } var a = &T{1} diff --git a/internal/compiler/intvalues_sbf_test.go b/internal/compiler/intvalues_sbf_test.go index 7f8a6d2a..36a5a045 100644 --- a/internal/compiler/intvalues_sbf_test.go +++ b/internal/compiler/intvalues_sbf_test.go @@ -69,6 +69,7 @@ func intProbeCases() []probeCase { // without the v1.57 backend or a runner. GOSVM_INT_RESULTS= keeps the // fixtures, ELFs and runner reports. func TestIntValuesSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/intvalues_test.go b/internal/compiler/intvalues_test.go index bf3fa6e3..7ba69f4f 100644 --- a/internal/compiler/intvalues_test.go +++ b/internal/compiler/intvalues_test.go @@ -295,6 +295,7 @@ int main(void) { // and remainder by zero and negative shift counts abort exactly where Go // panics, and MinInt / -1 and MinInt % -1 do not. func TestIntValuesDifferential(t *testing.T) { + t.Parallel() bin := hostSources(t, intValuesSources(t), intHostDriver) vectors := intVectors(300) var input strings.Builder diff --git a/internal/compiler/keccak_sbf_test.go b/internal/compiler/keccak_sbf_test.go index bcc4ad58..b9b17e5f 100644 --- a/internal/compiler/keccak_sbf_test.go +++ b/internal/compiler/keccak_sbf_test.go @@ -25,6 +25,7 @@ import ( // the v1.57 backend or a runner. GOSVM_KECCAK_RESULTS= keeps the // fixtures, ELFs and reports. func TestKeccak256SBF(t *testing.T) { + t.Parallel() llvm := modernLLVM() if llvm == "" { t.Skip("pinned platform-tools v1.57 backend required") diff --git a/internal/compiler/keccak_test.go b/internal/compiler/keccak_test.go index f8fa01b4..79e5cf8e 100644 --- a/internal/compiler/keccak_test.go +++ b/internal/compiler/keccak_test.go @@ -64,6 +64,7 @@ func keccak256(data []byte) []byte { } func TestKeccakReference(t *testing.T) { + t.Parallel() for input, want := range map[string]string{ "": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", "abc": "4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45", @@ -76,6 +77,7 @@ func TestKeccakReference(t *testing.T) { } func TestSDK2Keccak256NativeCDifferential(t *testing.T) { + t.Parallel() source := strings.Replace(string(mustRead(t, filepath.Join("testdata", "keccak", "program.go"))), "package program", "package app", 1) p := &Program{SDK: 2, Entry: "app", Packages: []PackageSources{unit("app", source)}} c, err := CompileProgram(p) diff --git a/internal/compiler/lamports_test.go b/internal/compiler/lamports_test.go index eefd9688..a7d3f8ff 100644 --- a/internal/compiler/lamports_test.go +++ b/internal/compiler/lamports_test.go @@ -16,6 +16,7 @@ import ( // MoveLamports' runtime is emitted only for programs that call it, so the C // of every other program is unchanged; SDK 1 does not have it. func TestSDK2MoveLamportsEmittedOnlyWhenCalled(t *testing.T) { + t.Parallel() plain := `package app;import "gosvm/solana";func Process(c solana.Context)uint64{return solana.CloseAccount(c,0,1)}` moving := `package app;import "gosvm/solana";func Process(c solana.Context)uint64{return solana.MoveLamports(c,0,1,2)}` for _, tc := range []struct { @@ -39,6 +40,7 @@ func TestSDK2MoveLamportsEmittedOnlyWhenCalled(t *testing.T) { // through duplicate descriptors, under undefined-behaviour sanitization. // Accounts 2 and 3 duplicate 0 and 1, so moves between them alias. func TestSDK2MoveLamportsNativeCDifferential(t *testing.T) { + t.Parallel() source := `package app import "gosvm/solana" func Process(c solana.Context)uint64{ diff --git a/internal/compiler/lifecycle_test.go b/internal/compiler/lifecycle_test.go index e816692b..c0231f77 100644 --- a/internal/compiler/lifecycle_test.go +++ b/internal/compiler/lifecycle_test.go @@ -16,6 +16,7 @@ import ( ) func TestSDK2LifecycleLoaderSelection(t *testing.T) { + t.Parallel() plain := `package app;import "gosvm/solana";func Process(c solana.Context)uint64{return solana.Count(c)}` for _, sdk := range []int{0, 1, 2} { p := &Program{SDK: sdk, Entry: "app", Packages: []PackageSources{unit("app", plain)}} @@ -39,6 +40,7 @@ func TestSDK2LifecycleLoaderSelection(t *testing.T) { } func TestSDK2OwnedLifecycleDifferential(t *testing.T) { + t.Parallel() source := `package app import "gosvm/solana" func Process(c solana.Context)uint64{ @@ -159,6 +161,7 @@ int main(void){u64 mode,n,original,w,x,owned,dw,dx,left,right,rc; } func TestSDK2RentCalculationC(t *testing.T) { + t.Parallel() p, err := ReadProgram("../../examples/lifecycle2") if err != nil { t.Fatal(err) diff --git a/internal/compiler/log_test.go b/internal/compiler/log_test.go index 4aa1a1af..6aa60eeb 100644 --- a/internal/compiler/log_test.go +++ b/internal/compiler/log_test.go @@ -14,6 +14,7 @@ import ( // The logging runtime is emitted only for programs that call Log, Log64 or // LogPubkey; SDK 1 does not have them. func TestSDK2LogRuntimeEmittedOnlyWhenCalled(t *testing.T) { + t.Parallel() for _, tc := range []struct { source string want bool @@ -42,6 +43,7 @@ func TestSDK2LogRuntimeEmittedOnlyWhenCalled(t *testing.T) { // same bytes for Log, the same words for Log64 and key for LogPubkey, and // the same statuses. func TestSDK2LogNativeCDifferential(t *testing.T) { + t.Parallel() source := `package app import "gosvm/solana" func word(b []byte,o uint64)uint64{n:=uint64(0);for j:=uint64(0);j<8;j++{n=n|uint64(b[o+j])<<(j*8)};return n} diff --git a/internal/compiler/maps_diff_test.go b/internal/compiler/maps_diff_test.go index d80b56d4..a426eebf 100644 --- a/internal/compiler/maps_diff_test.go +++ b/internal/compiler/maps_diff_test.go @@ -121,6 +121,7 @@ func runMapVectors(t *testing.T, bin string, vectors [][]byte) (map[byte]int, ma } func TestMapDifferential(t *testing.T) { + t.Parallel() bin := hostCompile(t, compileMaps(t, 0), DefaultHeapBytes, allocDriver, false) vectors := append(mapVectors(20261014, 600, 380), MapVectorsForTest()...) panics, runs := runMapVectors(t, bin, vectors) diff --git a/internal/compiler/maps_sbf_test.go b/internal/compiler/maps_sbf_test.go index 86d782cb..49069318 100644 --- a/internal/compiler/maps_sbf_test.go +++ b/internal/compiler/maps_sbf_test.go @@ -108,6 +108,7 @@ func mapSBFCases() ([]allocCase, int) { // the v1.57 backend or a runner (make test). GOSVM_MAP_RESULTS= keeps // fixtures, ELFs, reports and a summary. func TestMapSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/maps_test.go b/internal/compiler/maps_test.go index 8a844f05..f6ef218f 100644 --- a/internal/compiler/maps_test.go +++ b/internal/compiler/maps_test.go @@ -47,6 +47,7 @@ func Process(s, i []byte) uint64 { func mapMessage(t *testing.T, source string) string { return allocMessage(t, source) } func TestMapAcceptedForms(t *testing.T) { + t.Parallel() for name, body := range map[string]string{ "make and index": `m := make(map[uint64]uint64); m[1] = 2; s[0] = byte(m[1] + m[3])`, "make hint": `m := make(map[int8]uint8, i[0]); neg := -1; n := make(map[uint32]bool, neg); m[-1] = 1; n[1] = true; s[0] = byte(len(m) + len(n))`, @@ -111,6 +112,7 @@ func TestMapAcceptedForms(t *testing.T) { } func TestMapRejections(t *testing.T) { + t.Parallel() const noRange = rangeMapRule cases := map[string][2]string{ "range key value": {`m := map[int]int{}; for k, v := range m { _, _ = k, v }`, noRange}, @@ -322,6 +324,7 @@ var mapHeapKinds = [][2]int{{0, 0}, {1, 1}, {1, 7}, {1, 384}, {1, 385}, {1, 768} // TestMapHeap checks the exact out-of-memory point of map growth with the // default 32 KiB heap against the documented accounting. func TestMapHeap(t *testing.T) { + t.Parallel() bin := hostCompile(t, compileMaps(t, 0), DefaultHeapBytes, allocDriver, false) oom := fmt.Sprintf("P:%x\n", make([]byte, 1024)) checked := 0 @@ -368,6 +371,7 @@ func TestMapHeap(t *testing.T) { // TestCheckedProgramMaps: the backend view lists every map type with its // sizes, slot size and whether hashing a key can abort. func TestCheckedProgramMaps(t *testing.T) { + t.Parallel() source := `package p type K struct { A uint8 @@ -420,6 +424,7 @@ func Process(s, i []byte) uint64 { // TestMapRuntimeOnlyWhenUsed: programs without maps carry no map runtime; // the C of a map program is deterministic. func TestMapRuntimeOnlyWhenUsed(t *testing.T) { + t.Parallel() without, err := Compile("a.go", []byte("package p\nfunc Process(s, i []byte) uint64 { b := make([]byte, 2); return uint64(len(b)) }\n")) if err != nil { t.Fatal(err) @@ -447,6 +452,7 @@ func TestMapRuntimeOnlyWhenUsed(t *testing.T) { // TestMapDocumentationExample compiles and runs the example in // docs/GO_MAPS.md. func TestMapDocumentationExample(t *testing.T) { + t.Parallel() doc := string(mustRead(t, "../../docs/GO_MAPS.md")) start := strings.Index(doc, "```go\n") if start < 0 { @@ -465,6 +471,7 @@ func TestMapDocumentationExample(t *testing.T) { // by assignment or in a literal) moves its local to the heap; lookups and // deletes do not; elements read from a map are heap storage. func TestMapHeapMoves(t *testing.T) { + t.Parallel() source := `package p type P struct{ X uint64 } func get(m map[int]*uint64) *uint64 { v, _ := m[1]; return v } diff --git a/internal/compiler/memmove_sbf_test.go b/internal/compiler/memmove_sbf_test.go index bc6605cf..4c2aa6e8 100644 --- a/internal/compiler/memmove_sbf_test.go +++ b/internal/compiler/memmove_sbf_test.go @@ -23,6 +23,7 @@ import ( // without defining it, so every library-free program that LLVM lowered to a // memmove call failed to build. func TestMemmoveHelperCompiles(t *testing.T) { + t.Parallel() cc, err := exec.LookPath("clang") if err != nil { t.Skip("host Clang required") @@ -41,6 +42,7 @@ func TestMemmoveHelperCompiles(t *testing.T) { // copies LLVM lowers to memmove, for fogo-v0 and solana-v3 and checks the // copied account bytes, including a self-assignment, through the runners. func TestMemmoveSBF(t *testing.T) { + t.Parallel() llvm := modernLLVM() if llvm == "" { t.Skip("pinned platform-tools v1.57 backend required") diff --git a/internal/compiler/memops_diff_test.go b/internal/compiler/memops_diff_test.go index 6e59b50d..2e799bc3 100644 --- a/internal/compiler/memops_diff_test.go +++ b/internal/compiler/memops_diff_test.go @@ -219,6 +219,7 @@ func MemoryVectorsForTest() [][]byte { return memoryVectors(20261019, 300) } // (SDK 2's word routines and the legacy byte routines) on the SBF vectors // and more random ones. func TestMemoryDifferential(t *testing.T) { + t.Parallel() for _, sdk := range []int{0, 2} { t.Run(fmt.Sprintf("sdk%d", sdk), func(t *testing.T) { c, err := CompileProgram(&Program{SDK: sdk, Entry: "program", Packages: []PackageSources{{"program", []Source{{Name: "program.go", Data: memoryValuesSource(t)}}}}}) @@ -289,6 +290,7 @@ func runHostAll(t *testing.T, bin string, vectors [][]byte) string { // set compiled for SBF with the modern define, and the standalone memmove // helper, under -Werror. func TestMemorySyscallRoutinesCompileForSBF(t *testing.T) { + t.Parallel() llvm := modernLLVM() if llvm == "" { t.Skip("pinned platform-tools v1.57 backend required") @@ -320,6 +322,7 @@ func TestMemorySyscallRoutinesCompileForSBF(t *testing.T) { // TestZeroLoopForms checks which loops become a memset on SBF // (memclear.go): the two zeroing forms do; near misses compile as written. func TestZeroLoopForms(t *testing.T) { + t.Parallel() for body, want := range map[string]bool{ `for i := range s { s[i] = 0 }`: true, `for i := range w { w[i] = 0 }`: true, diff --git a/internal/compiler/memops_sbf_test.go b/internal/compiler/memops_sbf_test.go index 9f5411ce..f47a42da 100644 --- a/internal/compiler/memops_sbf_test.go +++ b/internal/compiler/memops_sbf_test.go @@ -44,7 +44,9 @@ var memoryVariants = []struct { {"loops", 1 << 62}, } -// buildMemoryVariant builds source with the given thresholds. +// buildMemoryVariant builds source with the given thresholds. It sets the +// package-level memorySyscallMin, which every build reads, so its callers +// must not call t.Parallel. func buildMemoryVariant(t *testing.T, dir, llvm, profile string, source []byte, threshold uint64) string { t.Helper() saved := memorySyscallMin diff --git a/internal/compiler/memory_test.go b/internal/compiler/memory_test.go index 93073272..5e70add3 100644 --- a/internal/compiler/memory_test.go +++ b/internal/compiler/memory_test.go @@ -14,6 +14,7 @@ import ( ) func TestSDK2AggregateMemory(t *testing.T) { + t.Parallel() cc, err := exec.LookPath("clang") if err != nil { t.Skip("host Clang is needed for aggregate memory validation") @@ -62,6 +63,7 @@ int main(void) { } func TestSDK2ArrayValueSemantics(t *testing.T) { + t.Parallel() source, err := os.ReadFile("../../examples/array-values/program.go") if err != nil { t.Fatal(err) diff --git a/internal/compiler/mixed_test.go b/internal/compiler/mixed_test.go index 10e413aa..e523f605 100644 --- a/internal/compiler/mixed_test.go +++ b/internal/compiler/mixed_test.go @@ -38,6 +38,7 @@ func Process(s, i []byte) uint64 { ` func TestMixedAcceptedForms(t *testing.T) { + t.Parallel() for name, body := range map[string]string{ "generic make": `w := Map([]int8{-1, 2}, -3); s[0] = byte(w[0])`, "generic append field": `var v Vec[int32]; v.Add(-1); v.Add(2); s[0] = byte(len(v.items))`, @@ -77,6 +78,7 @@ func TestMixedAcceptedForms(t *testing.T) { } func TestMixedRejections(t *testing.T) { + t.Parallel() for name, c := range map[string]struct{ body, want string }{ "generic zero-size elements": {`_ = Lit[[0]byte]([0]byte{}, [0]byte{})`, "instantiation Lit[[0]uint8]: alloc.go:15:1: slice elements must not contain zero-length arrays or empty structs"}, @@ -97,6 +99,7 @@ func TestMixedRejections(t *testing.T) { // moved parameters and locals are the instance's own objects, and an // instance whose values do not escape moves nothing. func TestMixedInstanceHeapMoves(t *testing.T) { + t.Parallel() source := mixedPrefix + "p, q := Box(int16(-2)), Box(uint8(3)); h := Push[int64](nil, 1); _ = Id(int8(1)); ps := Ptrs([]int{1}); s[0] = byte(*p) + *q + byte(h.Val) + byte(*ps[0])\nreturn 0 }\n" checked, err := Check(&Program{Entry: "program", Packages: []PackageSources{{"program", []Source{{Name: "alloc.go", Data: []byte(source)}}}}}) if err != nil { @@ -145,6 +148,7 @@ func TestMixedInstanceHeapMoves(t *testing.T) { // uninstantiated generic function that would allocate adds nothing, and an // instance over byte slices that only reads them needs no runtime. func TestMixedHeapRuntimeOnlyForInstances(t *testing.T) { + t.Parallel() plain := "package p\nfunc Process(s, i []byte) uint64 { return uint64(len(s)) }\n" unused := "package p\nfunc Mk[T any](n int) []T { return make([]T, n) }\nfunc Sum[T ~[]E, E ~uint8](s T) uint64 { t := uint64(0); for _, v := range s { t = t + uint64(v) }; return t }\nfunc Process(s, i []byte) uint64 { return Sum(s) }\n" used := "package p\nfunc Mk[T any](n int) []T { return make([]T, n) }\nfunc Process(s, i []byte) uint64 { return uint64(len(Mk[int8](3))) }\n" @@ -221,6 +225,7 @@ func mixedSource(t *testing.T) []byte { return mustRead(t, "../../examples/mixed // C on the host (32 KiB heap, as on chain by default) and compares output // bytes, results and panics for every vector. func TestMixedDifferential(t *testing.T) { + t.Parallel() c, err := CompileProgram(&Program{Entry: "program", Packages: []PackageSources{{"program", []Source{{Name: "program.go", Data: mixedSource(t)}}}}}) if err != nil { t.Fatal(err) @@ -291,6 +296,7 @@ func mixedSBFSource(t *testing.T) []byte { // completions must leave native Go's output bytes; panics must abort and roll // back. Skips without the v1.57 backend or a runner (make test). func TestMixedSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/packages_test.go b/internal/compiler/packages_test.go index 31a93f0e..3ed6d0cc 100644 --- a/internal/compiler/packages_test.go +++ b/internal/compiler/packages_test.go @@ -19,6 +19,7 @@ func unit(path, source string) PackageSources { return PackageSources{path, []Source{{path + "/program.go", []byte(source)}}} } func TestImportedValuesAndCalls(t *testing.T) { + t.Parallel() p := &Program{Entry: "app", Packages: []PackageSources{ unit("app", `package app import first "shared/a" @@ -57,6 +58,7 @@ func Process(b Box)uint64{return uint64(b.Key[0])+uint64(b.Key[1])+uint64(b.Key[ } } func TestImportedSDKAndEntryIdentity(t *testing.T) { + t.Parallel() p := &Program{Entry: "app", Packages: []PackageSources{ unit("app", `package app;import "gosvm/solana";import "app/helper";func Process(c solana.Context)uint64{return helper.Process(c)}`), unit("app/helper", `package helper;import chain "gosvm/solana";func Process(c chain.Context)uint64{return chain.Count(c)}`), @@ -74,6 +76,7 @@ func TestImportedSDKAndEntryIdentity(t *testing.T) { } } func TestImportedPackageRejections(t *testing.T) { + t.Parallel() for name, source := range map[string]string{ "float global": `var N float64=1;func F()uint64{return 1}`, "unsupported init": `func init(){go g()};func g(){};func F()uint64{return 1}`, @@ -207,6 +210,7 @@ func TestModuleImportsAndCache(t *testing.T) { } } func TestModuleImportFailures(t *testing.T) { + t.Parallel() for name, dep := range map[string][3]string{ "cycle": {`import "example.com/app/program";func F()uint64{return program.Process(nil,nil)}`, "example.com/app/lib", "import cycle"}, "standard library": {`func F()uint64{return 0}`, "fmt", `unsupported import "fmt"; standard-library packages on chain`}, @@ -232,6 +236,7 @@ func TestModuleImportFailures(t *testing.T) { } func TestSharedExampleDifferential(t *testing.T) { + t.Parallel() root, err := filepath.Abs("../../examples/shared-packages") if err != nil { t.Fatal(err) @@ -332,6 +337,7 @@ func TestSharedExampleDifferential(t *testing.T) { } func TestImportedMainPackage(t *testing.T) { + t.Parallel() p := &Program{Entry: "app", Packages: []PackageSources{ unit("app", `package app;import "dep";func Process(s,i []byte)uint64{return dep.F()}`), unit("dep", `package main;func F()uint64{return 1}`), @@ -341,6 +347,7 @@ func TestImportedMainPackage(t *testing.T) { } } func TestResolverFlagLikeImport(t *testing.T) { + t.Parallel() dir := t.TempDir() writePackageFile(t, dir, "go.mod", "module example.com/app\n\ngo 1.22\n") writePackageFile(t, dir, "program.go", `package p;import "-export";func Process(s,i []byte)uint64{return 0}`) diff --git a/internal/compiler/packed_test.go b/internal/compiler/packed_test.go index 642e79cd..287f1f04 100644 --- a/internal/compiler/packed_test.go +++ b/internal/compiler/packed_test.go @@ -37,6 +37,7 @@ func compilePackedStore(t *testing.T, sdk int, source string) []byte { } func TestPackedStoreRecognition(t *testing.T) { + t.Parallel() for _, sdk := range []int{0, 1, 2} { c := compilePackedStore(t, sdk, packedStoreSource) want := 0 @@ -90,6 +91,7 @@ printf("%c:",driver_panic?'P':'W');for(int j=0;j<80;j++)printf("%02x",driver_dat return 0;}` func TestPackedStoreNativeCDifferential(t *testing.T) { + t.Parallel() cc, err := exec.LookPath("clang") if err != nil { t.Skip("host Clang needed for packed stores") diff --git a/internal/compiler/pointers_test.go b/internal/compiler/pointers_test.go index 6d42052b..ca09b4c5 100644 --- a/internal/compiler/pointers_test.go +++ b/internal/compiler/pointers_test.go @@ -11,6 +11,7 @@ import ( ) func TestPointerValuesDifferential(t *testing.T) { + t.Parallel() p, err := ReadProgram("../../examples/pointer-values") if err != nil { t.Fatal(err) @@ -56,6 +57,7 @@ func TestPointerValuesDifferential(t *testing.T) { } func TestPointerLifetimeRejections(t *testing.T) { + t.Parallel() for name, source := range map[string]string{ "named pointer": `type P *uint64;func Process(s,i []byte)uint64{var p P;return *p}`, "pointer slice": `func Process(s,i []byte)uint64{p:=&s;return uint64(len(*p))}`, @@ -72,6 +74,7 @@ func TestPointerLifetimeRejections(t *testing.T) { } func TestImportedMethodsAndBorrowedResults(t *testing.T) { + t.Parallel() p := &Program{Entry: "app", Packages: []PackageSources{ unit("app", `package app;import "dep";func relay(v *dep.Value)(uint64,*uint64){return dep.Forward(v)};func Process(s,i []byte)uint64{v:=dep.Value{N:7};code,p:=relay(&v);*p=*p+5;old:=v.Read(2);v.Add(3);return code+old+v.N+(*dep.Value).Read(&v,1)}`), unit("dep", `package dep;type Value struct{N uint64};func(v Value)Read(n uint64)uint64{v.N=v.N+n;return v.N};func(v *Value)Add(n uint64){v.N=v.N+n};func(v *Value)Field()*uint64{return &v.N};func Forward(v *Value)(uint64,*uint64){return 0,v.Field()}`), @@ -101,6 +104,7 @@ func TestImportedMethodsAndBorrowedResults(t *testing.T) { } func TestPointerArrayLengthAndReceiverEffects(t *testing.T) { + t.Parallel() source := `package p type K [4]byte type N uint64 diff --git a/internal/compiler/range_sbf_test.go b/internal/compiler/range_sbf_test.go index eb8cd20e..52d1aa4f 100644 --- a/internal/compiler/range_sbf_test.go +++ b/internal/compiler/range_sbf_test.go @@ -58,6 +58,7 @@ func sbfCases(prefix string, process func([]byte, []byte) uint64, vectors [][2][ // platform-tools v1.57 is absent, and skips the runs (after building) when the // managed runners are not installed. func TestRangeUint16SBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/range_test.go b/internal/compiler/range_test.go index 130e17f6..70d1d984 100644 --- a/internal/compiler/range_test.go +++ b/internal/compiler/range_test.go @@ -30,6 +30,7 @@ func checkMessage(t *testing.T, source string) string { } func TestRangeAcceptedForms(t *testing.T) { + t.Parallel() for name, body := range map[string]string{ "slice key value": `for i, v := range s { s[i] = v }`, "slice key": `for i := range s { s[i] = 0 }`, @@ -87,6 +88,7 @@ func TestRangeAcceptedForms(t *testing.T) { } func TestRangeRejections(t *testing.T) { + t.Parallel() for name, c := range map[string]struct{ body, want string }{ "map": {`for range map[uint64]uint64{} {}`, rangeMapRule}, "channel": {`for range make(chan uint64) {}`, "range over channels unsupported"}, @@ -115,6 +117,7 @@ func TestRangeRejections(t *testing.T) { } func TestUint16Checks(t *testing.T) { + t.Parallel() for name, c := range map[string]struct{ source, want string }{ "scalars": {`type U uint16;type S struct{ A uint16; B U; C [2]uint16 };func f(a uint16, p *uint16) (uint16, U) { *p = a; return a << 3, U(a) };func Process(s, i []byte) uint64 { var x S; x.C[1]++; a, b := f(x.A, &x.A); return uint64(a) + uint64(b) }`, ""}, "constant": {`const C uint16 = 65535;func Process(s, i []byte) uint64 { return uint64(C) }`, ""}, @@ -135,6 +138,7 @@ func TestUint16Checks(t *testing.T) { // The uint16 typedef is emitted only for programs that use uint16, so the // C of every other program stays byte-identical. func TestUint16TypedefOnlyWhenUsed(t *testing.T) { + t.Parallel() without, err := Compile("a.go", []byte("package p\nfunc Process(s, i []byte) uint64 { return uint64(s[0]) }\n")) if err != nil { t.Fatal(err) @@ -273,10 +277,12 @@ func uint16Vectors() []oracleVector { } func TestRangeDifferential(t *testing.T) { + t.Parallel() differential(t, "../../examples/range-values/program.go", rangevalues.Process, rangeVectors()) } func TestUint16Differential(t *testing.T) { + t.Parallel() differential(t, "../../examples/uint16-values/program.go", uint16values.Process, uint16Vectors()) } diff --git a/internal/compiler/reallibs_diff_test.go b/internal/compiler/reallibs_diff_test.go index 9d32b578..8a77fb5f 100644 --- a/internal/compiler/reallibs_diff_test.go +++ b/internal/compiler/reallibs_diff_test.go @@ -542,6 +542,7 @@ func nativeRealLibs(t *testing.T, oracle string, vectors [][]byte) []string { // trimmed module copies, and compares every vector's output, result and // panic with the unmodified modules run natively. func TestRealLibrariesDifferential(t *testing.T) { + t.Parallel() env := realLibs(t) vectors := append(realLibsVectors(20261016, 80), realLibsTickSweep()...) vectors = append(vectors, realLibsSBFVectors()...) @@ -636,6 +637,7 @@ var realLibsWhole = []struct{ path, use, at, want string }{ } func TestRealLibrariesWholePackages(t *testing.T) { + t.Parallel() env := realLibs(t) example, err := filepath.Abs(realLibsExample) if err != nil { diff --git a/internal/compiler/reallibs_forms_test.go b/internal/compiler/reallibs_forms_test.go index c0bdd8f8..036e2417 100644 --- a/internal/compiler/reallibs_forms_test.go +++ b/internal/compiler/reallibs_forms_test.go @@ -306,6 +306,7 @@ func formInputs() [][]byte { } func TestRealLibraryFormsDifferential(t *testing.T) { + t.Parallel() inputs := formInputs() for name, src := range formPrograms { t.Run(name, func(t *testing.T) { @@ -333,6 +334,7 @@ func TestRealLibraryFormsDifferential(t *testing.T) { // The checked program's view: the large table stays read-only, the written // table does not, and the converted local escapes to the heap. func TestRealLibraryFormsCheck(t *testing.T) { + t.Parallel() checked, err := Check(globalsProgram(unitFiles("program", formHostSource(formPrograms["read-only-pointer-params"])))) if err != nil { t.Fatal(err) @@ -359,6 +361,7 @@ func TestRealLibraryFormsCheck(t *testing.T) { } func TestRealLibraryFormsSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/reallibs_sbf_test.go b/internal/compiler/reallibs_sbf_test.go index f092dda1..67d7fcbe 100644 --- a/internal/compiler/reallibs_sbf_test.go +++ b/internal/compiler/reallibs_sbf_test.go @@ -298,6 +298,7 @@ func Process(c solana.Context) uint64 { // GOSVM_REALLIBS_RESULTS= keeps fixtures, ELFs, reports and a summary // per target and form. func TestRealLibrariesSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/rebuild_test.go b/internal/compiler/rebuild_test.go index c0f37f72..4c3a3e7b 100644 --- a/internal/compiler/rebuild_test.go +++ b/internal/compiler/rebuild_test.go @@ -27,6 +27,7 @@ func modernLLVM() string { // Uncached builds of the same source from different absolute paths must be // byte-identical (no embedded build paths or temporary names). func TestModernRebuildIsByteIdentical(t *testing.T) { + t.Parallel() llvm := modernLLVM() if llvm == "" { t.Skip("pinned platform-tools v1.57 backend required") diff --git a/internal/compiler/return_data_sbf_test.go b/internal/compiler/return_data_sbf_test.go index 6b76b970..81f9c0ce 100644 --- a/internal/compiler/return_data_sbf_test.go +++ b/internal/compiler/return_data_sbf_test.go @@ -81,6 +81,7 @@ func itoa(n int) string { // without the v1.57 backend or a runner. GOSVM_RETURN_DATA_RESULTS= // keeps the fixtures, ELFs and reports. func TestGetReturnDataSBF(t *testing.T) { + t.Parallel() llvm := modernLLVM() if llvm == "" { t.Skip("pinned platform-tools v1.57 backend required") diff --git a/internal/compiler/return_data_test.go b/internal/compiler/return_data_test.go index f1003878..5a88d3a9 100644 --- a/internal/compiler/return_data_test.go +++ b/internal/compiler/return_data_test.go @@ -12,6 +12,7 @@ import ( ) func TestSDK2ReturnDataNativeCDifferential(t *testing.T) { + t.Parallel() source := `package app;import "gosvm/solana";func Process(c solana.Context)uint64{return solana.SetReturnData(c,solana.Instruction(c))}` p := &Program{SDK: 2, Entry: "app", Packages: []PackageSources{unit("app", source)}} c, err := CompileProgram(p) @@ -76,6 +77,7 @@ int main(void){u64 n;while(scanf("%llu",&n)==1){ } func TestSDK2GetReturnDataNativeCDifferential(t *testing.T) { + t.Parallel() source := `package app;import "gosvm/solana" func Process(c solana.Context)uint64{ ix:=solana.Instruction(c);result:=solana.Data(c,0) diff --git a/internal/compiler/sdkata_sbf_test.go b/internal/compiler/sdkata_sbf_test.go index ae52a511..59ca344c 100644 --- a/internal/compiler/sdkata_sbf_test.go +++ b/internal/compiler/sdkata_sbf_test.go @@ -122,5 +122,6 @@ func ataCreateFixture() ([]byte, error) { // TestSDKATACreateSBF runs examples/ata-create against real ATA and token programs. func TestSDKATACreateSBF(t *testing.T) { + t.Parallel() runSDKProbe(t, "ata-create", ataCreateFixture) } diff --git a/internal/compiler/sdksystem_sbf_test.go b/internal/compiler/sdksystem_sbf_test.go index 984f6a6b..a19f28ed 100644 --- a/internal/compiler/sdksystem_sbf_test.go +++ b/internal/compiler/sdksystem_sbf_test.go @@ -87,5 +87,6 @@ func systemPDAFixture() ([]byte, error) { // TestSDKSystemPDASBF runs examples/system-pda against the real System program. func TestSDKSystemPDASBF(t *testing.T) { + t.Parallel() runSDKProbe(t, "system-pda", systemPDAFixture) } diff --git a/internal/compiler/sdktoken_sbf_test.go b/internal/compiler/sdktoken_sbf_test.go index 60e1e30a..4c0c987b 100644 --- a/internal/compiler/sdktoken_sbf_test.go +++ b/internal/compiler/sdktoken_sbf_test.go @@ -141,5 +141,6 @@ func tokenCPIFixture() ([]byte, error) { // TestSDKTokenCPISBF runs examples/token-cpi against real Token-2022 and Token. func TestSDKTokenCPISBF(t *testing.T) { + t.Parallel() runSDKProbe(t, "token-cpi", tokenCPIFixture) } diff --git a/internal/compiler/sdktokenext_sbf_test.go b/internal/compiler/sdktokenext_sbf_test.go index f106b29b..6c4d5897 100644 --- a/internal/compiler/sdktokenext_sbf_test.go +++ b/internal/compiler/sdktokenext_sbf_test.go @@ -173,5 +173,6 @@ func tokenExtensionsFixture() ([]byte, error) { // TestSDKTokenExtensionsSBF runs examples/token-extensions against real Token-2022. func TestSDKTokenExtensionsSBF(t *testing.T) { + t.Parallel() runSDKProbe(t, "token-extensions", tokenExtensionsFixture) } diff --git a/internal/compiler/secp256k1_sbf_test.go b/internal/compiler/secp256k1_sbf_test.go index f862b890..4f837d8d 100644 --- a/internal/compiler/secp256k1_sbf_test.go +++ b/internal/compiler/secp256k1_sbf_test.go @@ -188,6 +188,7 @@ func secpIx(c secpCase, lengths [3]byte) []byte { // syscall. It skips without the v1.57 backend or a runner. // GOSVM_SECP256K1_RESULTS= keeps the fixtures, ELFs and reports. func TestSecp256k1RecoverSBF(t *testing.T) { + t.Parallel() llvm := modernLLVM() if llvm == "" { t.Skip("pinned platform-tools v1.57 backend required") diff --git a/internal/compiler/secp256k1_test.go b/internal/compiler/secp256k1_test.go index 66d45745..0dbda9da 100644 --- a/internal/compiler/secp256k1_test.go +++ b/internal/compiler/secp256k1_test.go @@ -12,6 +12,7 @@ import ( ) func TestSDK2Secp256k1RecoverNativeCDifferential(t *testing.T) { + t.Parallel() source := strings.Replace(string(mustRead(t, filepath.Join("testdata", "secp256k1", "program.go"))), "package program", "package app", 1) p := &Program{SDK: 2, Entry: "app", Packages: []PackageSources{unit("app", source)}} c, err := CompileProgram(p) diff --git a/internal/compiler/signed_test.go b/internal/compiler/signed_test.go index b77e762f..d7f7fa59 100644 --- a/internal/compiler/signed_test.go +++ b/internal/compiler/signed_test.go @@ -10,6 +10,7 @@ import ( // admits an unsigned scalar admits them, and len/cap results, range keys and // math/bits counts are ordinary int values. func TestIntegerChecksAccept(t *testing.T) { + t.Parallel() for name, source := range map[string]string{ "locals": `func Process(s, i []byte) uint64 { var a int8 = -128; b := int16(a) * 3; var c int32; d := int64(-1); e := 5; var f uint = 7; c = int32(b) - 1; return uint64(a) + uint64(b) + uint64(c) + uint64(d) + uint64(e) + uint64(f) }`, "params": `func f(a int8, b int, c uint) (int64, int) { return int64(a) * int64(b), b - int(c) };func Process(s, i []byte) uint64 { x, y := f(-1, 2, 3); return uint64(x) ^ uint64(y) }`, @@ -38,6 +39,7 @@ func TestIntegerChecksAccept(t *testing.T) { } func TestIntegerChecksReject(t *testing.T) { + t.Parallel() for name, c := range map[string]struct{ source, want string }{ "float": {`func Process(s, i []byte) uint64 { var f float64; _ = f; return 0 }`, "unsupported type float64"}, "uintptr": {`func Process(s, i []byte) uint64 { var p uintptr; _ = p; return 0 }`, "unsupported type uintptr"}, @@ -68,6 +70,7 @@ func TestIntegerChecksReject(t *testing.T) { // programs without a signed / or % emit no division helpers, so their C is // unchanged (the frozen corpus checks every recorded program's hash). func TestSignedRuntimeOnlyWhenUsed(t *testing.T) { + t.Parallel() for _, tc := range []struct { source string typedefs, divide bool diff --git a/internal/compiler/slicearray_test.go b/internal/compiler/slicearray_test.go index 811409a6..f3c266a3 100644 --- a/internal/compiler/slicearray_test.go +++ b/internal/compiler/slicearray_test.go @@ -316,6 +316,7 @@ func sliceArrayInputs(count int) [][]byte { } func TestSliceArrayDifferential(t *testing.T) { + t.Parallel() inputs := sliceArrayInputs(256) for name, src := range sliceArrayPrograms { t.Run(name, func(t *testing.T) { @@ -350,6 +351,7 @@ func TestSliceArrayDifferential(t *testing.T) { // moves the local to the heap; the slice of a package-level variable makes // it writable; and the initializers converting slices run at run time. func TestSliceArrayCheck(t *testing.T) { + t.Parallel() checked, err := Check(globalsProgram(unitFiles("program", formHostSource(sliceArrayPrograms["slice-array-pointers"])))) if err != nil { t.Fatal(err) @@ -373,6 +375,7 @@ func TestSliceArrayCheck(t *testing.T) { } func TestSliceArrayRejections(t *testing.T) { + t.Parallel() for _, tc := range []struct{ body, want string }{ // Go evaluates nothing for an index-only range over a converted // pointer without calls; the existing rule keeps rejecting it. @@ -386,6 +389,7 @@ func TestSliceArrayRejections(t *testing.T) { } func TestSliceArraySBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/stackframe_test.go b/internal/compiler/stackframe_test.go index bd3117c6..c938d8ef 100644 --- a/internal/compiler/stackframe_test.go +++ b/internal/compiler/stackframe_test.go @@ -10,6 +10,7 @@ import ( ) func TestFrameDiagnosticsParse(t *testing.T) { + t.Parallel() names := map[string]string{"v12": "program.big"} for _, line := range []string{ "Error: Function v12 overflows the maximum allowed frame space by accessing an offset 960 bytes greater than the maximum of 4096. Please, minimize large stack variables.", @@ -29,6 +30,7 @@ func TestFrameDiagnosticsParse(t *testing.T) { // A function whose frame exceeds 4 KiB fails the fogo-v0 build (fixed // frames) naming the Go function; Clang alone exits successfully. func TestFrameOverflowFailsBuild(t *testing.T) { + t.Parallel() llvm := modernLLVM() if llvm == "" { t.Skip("pinned platform-tools v1.57 backend required") diff --git a/internal/compiler/stdlib_diff_test.go b/internal/compiler/stdlib_diff_test.go index 0836edb4..f75ec99f 100644 --- a/internal/compiler/stdlib_diff_test.go +++ b/internal/compiler/stdlib_diff_test.go @@ -237,6 +237,7 @@ func compareHostVectors(t *testing.T, bin string, vectors [][]byte, want []strin } func TestStdlibDifferential(t *testing.T) { + t.Parallel() bin := hostCompile(t, compileStdlib(t), DefaultHeapBytes, valueTypesDriver, false) vectors := append(stdlibVectors(20261014, 600), StdlibVectorsForTest()...) want := make([]string, len(vectors)) diff --git a/internal/compiler/stdlib_sbf_test.go b/internal/compiler/stdlib_sbf_test.go index dade6f76..f20d98ff 100644 --- a/internal/compiler/stdlib_sbf_test.go +++ b/internal/compiler/stdlib_sbf_test.go @@ -167,6 +167,7 @@ func stdlibProbeCase(name string, flag byte, want uint64) allocCase { // runner (make test). GOSVM_STDLIB_RESULTS= keeps fixtures, ELFs, // reports and a summary. func TestStdlibSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/stdlib_test.go b/internal/compiler/stdlib_test.go index 51e0c15c..7518ae85 100644 --- a/internal/compiler/stdlib_test.go +++ b/internal/compiler/stdlib_test.go @@ -29,6 +29,7 @@ func stdlibCheck(t *testing.T, source string) string { // packages that are not available on chain: by name, at the use, with the // reason. func TestStdlibRejections(t *testing.T) { + t.Parallel() importable := "bytes, encoding/binary, errors, io, math, strconv, strings, unicode, unicode/utf8" for name, c := range map[string]struct{ source, want string }{ "fmt": {"package p\nimport \"fmt\"\nfunc Process(s, i []byte) uint64 { fmt.Println(); return 0 }\n", @@ -79,6 +80,7 @@ func TestStdlibRejections(t *testing.T) { // TestStdlibImportForms: plain and renamed imports in a single file (no // go.mod), in a module program and in its shared packages. func TestStdlibImportForms(t *testing.T) { + t.Parallel() for name, source := range map[string]string{ "plain": "package p\nimport \"strings\"\nfunc Process(s, i []byte) uint64 { return uint64(strings.Count(string(s), \"a\")) }\n", "renamed": "package p\nimport str \"strings\"\nimport bin \"encoding/binary\"\nfunc Process(s, i []byte) uint64 { return uint64(str.Count(string(s), \"a\")) + bin.LittleEndian.Uint64(i) }\n", @@ -131,6 +133,7 @@ func writeFile(t *testing.T, path, data string) { // TestStdlibConstantsOnly: math has only constants on chain, so a program // using them emits the same C as one that writes the values out. func TestStdlibConstantsOnly(t *testing.T) { + t.Parallel() compile := func(source string) []byte { out, err := CompileSources([]Source{{Name: "p.go", Data: []byte(source)}}) if err != nil { @@ -148,6 +151,7 @@ func TestStdlibConstantsOnly(t *testing.T) { // TestStdlibIntrinsics checks the intrinsic and dispatch-except marks in // the checked program and the C they produce. func TestStdlibIntrinsics(t *testing.T) { + t.Parallel() p := &Program{Entry: "program", Packages: []PackageSources{{"program", []Source{{Name: "p.go", Data: []byte(`package p import ( "errors" @@ -217,6 +221,7 @@ func Process(s, i []byte) uint64 { // TestStdlibIdentity: the identity covers every overlay file of the listed // packages and the cache key includes it only for programs that reach them. func TestStdlibIdentity(t *testing.T) { + t.Parallel() if StdlibIdentity(nil) != "" { t.Fatal("identity of no packages") } @@ -384,6 +389,7 @@ func TestStdlibProvenance(t *testing.T) { // TestStdlibPackagesList pins the overlay packages and keeps their sources // gofmt-formatted, like Go's. func TestStdlibPackagesList(t *testing.T) { + t.Parallel() want := "bytes encoding/binary errors internal/bytealg internal/errtext io math strconv strings unicode unicode/utf8" if got := strings.Join(StdlibPackages, " "); got != want { t.Fatalf("StdlibPackages %q", got) diff --git a/internal/compiler/strings_diff_test.go b/internal/compiler/strings_diff_test.go index c0908d54..71f79316 100644 --- a/internal/compiler/strings_diff_test.go +++ b/internal/compiler/strings_diff_test.go @@ -118,6 +118,7 @@ func compileStrings(t *testing.T) []byte { } func TestStringDifferential(t *testing.T) { + t.Parallel() bin := hostCompile(t, compileStrings(t), DefaultHeapBytes, allocDriver, false) vectors := append(stringVectors(20261014, 1500), StringVectorsForTest()...) var want []string diff --git a/internal/compiler/strings_sbf_test.go b/internal/compiler/strings_sbf_test.go index d34c4970..8d9f3f95 100644 --- a/internal/compiler/strings_sbf_test.go +++ b/internal/compiler/strings_sbf_test.go @@ -79,6 +79,7 @@ func stringSBFCases() ([]allocCase, int) { // backend or a runner (make test). GOSVM_STRING_RESULTS= keeps // fixtures, ELFs, reports and a summary. func TestStringSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/strings_test.go b/internal/compiler/strings_test.go index b066460e..bc496733 100644 --- a/internal/compiler/strings_test.go +++ b/internal/compiler/strings_test.go @@ -37,6 +37,7 @@ func Process(s, i []byte) uint64 { ` func TestStringAcceptedForms(t *testing.T) { + t.Parallel() for name, body := range map[string]string{ "literals": "a, b := \"x\\n\\x00é\", `raw\\n`; s[0] = a[0] + b[0]", "empty": `var e string; if e == "" { s[0] = byte(len(e)) }`, @@ -85,6 +86,7 @@ func TestStringAcceptedForms(t *testing.T) { } func TestStringRejections(t *testing.T) { + t.Parallel() for name, c := range map[string]struct{ body, want string }{ "compound bool": {`x := true; x += false; _ = x`, "invalid operation: operator + not defined on x (variable of type bool)"}, "float conversion": {`var f float64 = 1; _ = f`, "unsupported type float64"}, @@ -121,6 +123,7 @@ func TestStringRejections(t *testing.T) { // string runtime (string constants used only in constant expressions are // folded); programs that never allocate strings carry no heap runtime. func TestStringRuntimeOnlyWhenUsed(t *testing.T) { + t.Parallel() constant := "package p\nconst k = \"abc\"\nfunc Process(s, i []byte) uint64 { s[0] = byte(len(k + \"d\")); return uint64(len(k)) }\n" out, err := Compile("a.go", []byte(constant)) if err != nil { @@ -198,6 +201,7 @@ func intStringNative(in []byte) string { // values, surrogates, values above U+10FFFF, including values that only // truncate into range) is U+FFFD. func TestStringIntegerConversions(t *testing.T) { + t.Parallel() c, err := Compile("a.go", []byte(intStringSource())) if err != nil { t.Fatal(err) @@ -268,6 +272,7 @@ func stringHeapLimit(kind byte, la, lb int) int { // exactly: the iteration that does not fit aborts after the predicted number // of iterations; native Go never runs out, so the expectation is computed. func TestStringHeap(t *testing.T) { + t.Parallel() bin := hostCompile(t, compileStrings(t), DefaultHeapBytes, allocDriver, false) oom := func(n int) string { out := make([]byte, 1024) @@ -306,6 +311,7 @@ func TestStringHeap(t *testing.T) { // TestStringDocumentationExample compiles the example in docs/GO_STRINGS.md. func TestStringDocumentationExample(t *testing.T) { + t.Parallel() doc := string(mustRead(t, "../../docs/GO_STRINGS.md")) start := strings.Index(doc, "```go\n") if start < 0 { diff --git a/internal/compiler/trim_test.go b/internal/compiler/trim_test.go index 76c620d8..c192ad61 100644 --- a/internal/compiler/trim_test.go +++ b/internal/compiler/trim_test.go @@ -88,6 +88,7 @@ func trimProgram(dep, app string, trim ...string) *Program { } func TestTrimDropsUnreachable(t *testing.T) { + t.Parallel() // By default the whole package is checked, and the rejection names the // opt-in. _, err := Check(trimProgram(trimDep, trimApp)) @@ -163,6 +164,7 @@ func TestTrimDropsUnreachable(t *testing.T) { // TestTrimRejections: what Process reaches is checked exactly as before, // with the same messages (only the opt-in hint is gone). func TestTrimRejections(t *testing.T) { + t.Parallel() for name, c := range map[string]struct{ dep, app, want string }{ "reached float": {"package dep\nfunc F() uint64 { var f float64 = 1; return uint64(f) }\n", "package app\nimport \"example.com/dep\"\nfunc Process(s, i []byte) uint64 { return dep.F() }\n", ""}, @@ -201,6 +203,7 @@ func TestTrimRejections(t *testing.T) { // TestTrimEntryPackage: the entry package is trimmed only when a pattern // names it exactly. func TestTrimEntryPackage(t *testing.T) { + t.Parallel() app := trimApp + "\nfunc unused() float64 { return 1 }\n" dep := "package dep\nconst K = 7\nvar Count uint64\nfunc F(x uint64) (uint64, error) { return x, nil }\n" if _, err := Check(trimProgram(dep, app, "example.com/...")); err == nil || !strings.Contains(err.Error(), "float") { @@ -216,6 +219,7 @@ func TestTrimEntryPackage(t *testing.T) { } func TestValidateTrim(t *testing.T) { + t.Parallel() for _, ok := range []string{"example.com/lib", "example.com/lib/...", "lib"} { if err := ValidateTrim([]string{ok}); err != nil { t.Errorf("%s: %v", ok, err) @@ -237,6 +241,7 @@ func TestValidateTrim(t *testing.T) { // information, compiled (promoted) only when a reached declaration uses // them; then they follow the ordinary rules. func TestTrimModules(t *testing.T) { + t.Parallel() dir := t.TempDir() write := func(name, content string) { t.Helper() @@ -319,6 +324,7 @@ func TestTrimModules(t *testing.T) { // TestTrimWarnings: builds write the report beside the output and warn // from it. func TestTrimWarnings(t *testing.T) { + t.Parallel() checked, err := Check(trimProgram(trimDep, trimApp, "example.com/dep")) if err != nil { t.Fatal(err) diff --git a/internal/compiler/types_test.go b/internal/compiler/types_test.go index 1ecaf6aa..7050f225 100644 --- a/internal/compiler/types_test.go +++ b/internal/compiler/types_test.go @@ -7,6 +7,7 @@ import ( ) func TestTypeCheckBeforeEntryGeneration(t *testing.T) { + t.Parallel() p := &Program{Entry: "app", Packages: []PackageSources{ unit("app", `package app;import "gosvm/solana";import "app/model";type Accounts struct{Pool model.Pool};func Swap(c solana.Context,a Accounts,n model.Amount)(model.Pool,uint64){a.Pool.N=a.Pool.N+n;return a.Pool,0}`), unit("app/model", `package model;type Key [32]byte;type Amount uint64;type Pool struct{Authority Key;N Amount}`), @@ -29,6 +30,7 @@ func TestTypeCheckBeforeEntryGeneration(t *testing.T) { } } func TestTypeInspectionIsNotSubsetCertification(t *testing.T) { + t.Parallel() p := &Program{Entry: "app", Packages: []PackageSources{unit("app", `package app;func Process(s,i []byte)uint64{n:=float64(i[0]);return uint64(n)}`)}} if _, err := TypeCheckProgram(p); err != nil { t.Fatal(err) diff --git a/internal/compiler/values_test.go b/internal/compiler/values_test.go index 0cae3489..dc8ee5eb 100644 --- a/internal/compiler/values_test.go +++ b/internal/compiler/values_test.go @@ -10,6 +10,7 @@ import ( ) func TestMultiFileValueSemantics(t *testing.T) { + t.Parallel() sources := []Source{ {"types.go", []byte(`package p type Small uint8 @@ -49,6 +50,7 @@ func TestMultiFileValueSemantics(t *testing.T) { } func TestValueTypeRejections(t *testing.T) { + t.Parallel() for name, code := range map[string]string{ "hidden context": `import "gosvm/solana";type Box struct { C solana.Context };func Process(c solana.Context)uint64{return 0}`, "float named": `type Bad float64;func Process(s,i []byte)uint64{var b Bad;return uint64(b)}`, @@ -68,6 +70,7 @@ func TestValueTypeRejections(t *testing.T) { } func TestPackageSourcesAndCache(t *testing.T) { + t.Parallel() dir := t.TempDir() src := filepath.Join(dir, "src") os.Mkdir(src, 0700) @@ -124,6 +127,7 @@ func TestPackageSourcesAndCache(t *testing.T) { } func TestPlatformWordsInsideFilename(t *testing.T) { + t.Parallel() dir := t.TempDir() if e := os.WriteFile(filepath.Join(dir, "my_linux_helpers.go"), []byte("package p"), 0600); e != nil { t.Fatal(e) diff --git a/internal/compiler/valuetypes_diff_test.go b/internal/compiler/valuetypes_diff_test.go index afe1adc1..a873edf5 100644 --- a/internal/compiler/valuetypes_diff_test.go +++ b/internal/compiler/valuetypes_diff_test.go @@ -160,6 +160,7 @@ func compileValueTypes(t *testing.T) []byte { } func TestValueTypesDifferential(t *testing.T) { + t.Parallel() bin := hostCompile(t, compileValueTypes(t), DefaultHeapBytes, valueTypesDriver, false) vectors := valueTypesVectors(20261014, 2000) var want []string diff --git a/internal/compiler/valuetypes_sbf_test.go b/internal/compiler/valuetypes_sbf_test.go index a8349a66..eb62f07b 100644 --- a/internal/compiler/valuetypes_sbf_test.go +++ b/internal/compiler/valuetypes_sbf_test.go @@ -151,6 +151,7 @@ func valueTypesCases(vectors [][]byte) (cases []allocCase, aborts, logged int) { // runner (make test). GOSVM_INT_RESULTS= keeps fixtures, ELFs, reports // and a summary under value-types/. func TestValueTypesSBF(t *testing.T) { + t.Parallel() if testing.Short() { t.Skip("SBF runs are skipped in -short mode") } diff --git a/internal/compiler/valuetypes_test.go b/internal/compiler/valuetypes_test.go index 1fffbc4f..f54239af 100644 --- a/internal/compiler/valuetypes_test.go +++ b/internal/compiler/valuetypes_test.go @@ -54,6 +54,7 @@ func Process(s, i []byte) uint64 { ` func TestValueTypesAcceptedForms(t *testing.T) { + t.Parallel() for name, body := range map[string]string{ "struct equality": `a, b := P{1, 2}, P{X: int16(i[0])}; if a == b || a != b { s[0] = 1 }`, "struct with every kind": `x := P{}; a := Q{A: 1, S: "x", I: 3, R: &x}; b := a; b.N[1].Y = 2; if a == b { s[0] = 1 }`, @@ -112,6 +113,7 @@ func must[T comparable](v T) T { var zero T; if v == zero { panic("zero") }; ret ` func TestValueTypesRejections(t *testing.T) { + t.Parallel() cases := map[string][2]string{ "recover": {`defer func() { _ = recover() }()`, recoverRule}, "defer panic": {`defer panic("x")`, "defer panic(...) unsupported; defer a function literal that panics"}, @@ -142,6 +144,7 @@ func TestValueTypesRejections(t *testing.T) { // of generic instantiations and through chains of aliases behave as the // aliased types: methods, map keys, interfaces and comparisons. func TestCrossPackageAliases(t *testing.T) { + t.Parallel() wide := `package wide type Int [4]uint64 func (z *Int) Add(x, y *Int) *Int { var c uint64; for j := range z { s := x[j] + y[j] + c; c = 0; if s < x[j] || (s == x[j] && y[j]+c != 0 && c != 0) { c = 1 }; z[j] = s }; return z } @@ -205,6 +208,7 @@ func Process(s, i []byte) uint64 { // Arrays of pointers keep Go's escape rules: a local whose address is // stored into an array literal or element moves to the heap. func TestCompositeArrayEscapes(t *testing.T) { + t.Parallel() source := `package p type P struct{ X uint8 } func f() [2]*P { x := P{1}; return [2]*P{&x, nil} } @@ -228,6 +232,7 @@ func Process(s, i []byte) uint64 { s[0] = f()[0].X + g()[1].X + h(); return 0 } // Check records every panic call's log line; the backend view is complete // and the C is deterministic. Programs without panic get no panic runtime. func TestPanicSites(t *testing.T) { + t.Parallel() source := valuePrefix + `switch i[0] { case 0: panic("boom") case 1: panic(string(i[:2])) @@ -297,6 +302,7 @@ func TestPanicSites(t *testing.T) { // then aborts; deferred calls do not run (Go would run them, but the // transaction fails and rolls back either way). func TestPanicLogLine(t *testing.T) { + t.Parallel() source := `package p func Process(s, i []byte) uint64 { defer func() { s[1] = 9 }() diff --git a/internal/compiler/variadic_test.go b/internal/compiler/variadic_test.go index 88cf5add..0af14b12 100644 --- a/internal/compiler/variadic_test.go +++ b/internal/compiler/variadic_test.go @@ -11,6 +11,7 @@ import ( // calls with no, one and several extra arguments, spread slices, nil // spreads, deferred calls and interface elements check. func TestVariadicForms(t *testing.T) { + t.Parallel() for name, body := range map[string]string{ "none": `func f(xs ...uint64) uint64 { return uint64(len(xs)) }; func Process(s, i []byte) uint64 { return f() }`, "several": `func f(a byte, xs ...uint64) uint64 { return uint64(a) + uint64(len(xs)) }; func Process(s, i []byte) uint64 { return f(1, 2, 3, uint64(s[0])) }`, @@ -32,6 +33,7 @@ func TestVariadicForms(t *testing.T) { // TestVariadicRejections: variadic function values, literals, function // types and interface methods stay unsupported. func TestVariadicRejections(t *testing.T) { + t.Parallel() for name, c := range map[string]struct{ body, want string }{ "function value": {`func f(xs ...uint64) {}; func Process(s, i []byte) uint64 { g := f; _ = g; return 0 }`, "variadic function types are unsupported"}, "literal": {`func Process(s, i []byte) uint64 { g := func(xs ...uint64) {}; g(); return 0 }`, "variadics are unsupported"}, @@ -50,6 +52,7 @@ func TestVariadicRejections(t *testing.T) { // "..." into one that passes the final parameter as a slice literal or nil // (docs/BACKEND_INTERFACE.md#variadic-functions). func TestVariadicLowering(t *testing.T) { + t.Parallel() checked, err := Check(&Program{Entry: "program", Packages: []PackageSources{{"program", []Source{{Name: "p.go", Data: []byte( "package p\nfunc f(a byte, xs ...uint64) uint64 { return uint64(len(xs)) }\nfunc Process(s, i []byte) uint64 { return f(1) + f(2, 3, 4) + f(5, nil...) }\n")}}}}}) if err != nil { @@ -87,6 +90,7 @@ func TestVariadicLowering(t *testing.T) { // into heap data, so a local stored that way moves to the heap, and a // parameter whose address is taken is the caller's obligation. func TestPointerToPointerBorrows(t *testing.T) { + t.Parallel() checked, err := Check(&Program{Entry: "program", Packages: []PackageSources{{"program", []Source{{Name: "p.go", Data: []byte(`package p func viaLocal() *uint64 { var p *uint64 diff --git a/internal/compiler/views_test.go b/internal/compiler/views_test.go index 9f0692ca..48f6c892 100644 --- a/internal/compiler/views_test.go +++ b/internal/compiler/views_test.go @@ -12,6 +12,7 @@ import ( ) func TestSliceViewsDifferential(t *testing.T) { + t.Parallel() p, err := ReadProgram("../../examples/slice-views") if err != nil { t.Fatal(err) @@ -57,6 +58,7 @@ func TestSliceViewsDifferential(t *testing.T) { } } func TestSliceViewArrayBoundary(t *testing.T) { + t.Parallel() p, err := ReadProgram("../../examples/slice-views") if err != nil { t.Fatal(err) @@ -82,6 +84,7 @@ func TestSliceViewArrayBoundary(t *testing.T) { } } func TestSliceViewRejections(t *testing.T) { + t.Parallel() for name, source := range map[string]string{ "unaddressable array": `func k()[4]byte{return [4]byte{}};func Process(s,i []byte)uint64{return uint64(len(k()[:]))}`, } { @@ -94,6 +97,7 @@ func TestSliceViewRejections(t *testing.T) { } } func TestSDKViewCapacities(t *testing.T) { + t.Parallel() source := `package p;import "gosvm/solana";func Process(c solana.Context)uint64 {s:=solana.Data(c,0);k:=solana.Key(c,0);o:=solana.Owner(c,0);i:=solana.Instruction(c);p:=solana.ProgramID(c);if cap(s)!=24||cap(k)!=32||cap(o)!=32||cap(i)!=16||cap(p)!=32{return 1};v:=s[4:8:12];w:=v[:8];w[7]=41;return 0}` c, err := Compile("sdk-views.go", []byte(source)) if err != nil { @@ -106,6 +110,7 @@ func TestSDKViewCapacities(t *testing.T) { } func TestNilSliceContexts(t *testing.T) { + t.Parallel() source := `package p type V uint64 func accept(s []byte)uint64{if s!=nil{return 1};return uint64(cap(s))} @@ -130,6 +135,7 @@ func TestNilSliceContexts(t *testing.T) { } } func TestViewCapacityBoundary(t *testing.T) { + t.Parallel() source := `package p func Process(s,i []byte)uint64 { var k [1024]byte @@ -149,6 +155,7 @@ func TestViewCapacityBoundary(t *testing.T) { } func TestSDKNilSliceArguments(t *testing.T) { + t.Parallel() source := `package p;import "gosvm/solana";func Process(c solana.Context)uint64{if solana.SHA256(c,nil,0,0,nil,0)!=2003{return 1};return 0}` c, err := Compile("sdk-nil.go", []byte(source)) if err != nil { @@ -161,6 +168,7 @@ func TestSDKNilSliceArguments(t *testing.T) { } func TestViewAggregateReturn(t *testing.T) { + t.Parallel() // Multiple borrowed descriptors form an aggregate even without array types. // Preserve their individual pointer/length/capacity fields across forwarding. var resultTypes, returns, names, terms []string diff --git a/scripts/test_shards.py b/scripts/test_shards.py new file mode 100644 index 00000000..f6b24af7 --- /dev/null +++ b/scripts/test_shards.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python3 +"""Run the root module tests (`make test`) as shards of concurrent processes. + +Every top-level test of every package is assigned to exactly one of N shards +(--shard i/N) by greedy bin-packing on this platform's durations in +scripts/test_timings.json (measured in CI); tests without a recorded duration +go to the lightest shard. Tests are read from each package's test files +(`go list`), and the script fails unless the shards partition them exactly. +Within a shard the tests are spread over one go test process per CPU, longest +first: most of these tests launch processes, and a +Go process launches children one at a time on macOS, so t.Parallel alone +does not use the cores there. + +Extra arguments go to every go test invocation (e.g. -count=1, -v). +--update-timings PLATFORM LOG... rewrites PLATFORM's timings from the +"--- PASS: TestX (1.23s)" lines of -v runs of this script. +""" +import argparse, concurrent.futures, json, os, pathlib, platform, re, subprocess, sys, threading + +ROOT = pathlib.Path(__file__).resolve().parents[1] +TIMINGS = ROOT / 'scripts/test_timings.json' + + +def go_flags(extra): + flags = ['-timeout', '30m'] + extra + if platform.system() == 'Darwin': + flags.append('-ldflags=-linkmode=external') + return flags + + +def list_tests(): + """(package, name) for every top-level test, fuzz target and example of + every package, read from the test files `go test` would compile.""" + out = subprocess.run(['go', 'list', '-json', './...'], cwd=ROOT, check=True, capture_output=True, text=True).stdout + tests = [] + for pkg in decode_stream(out): + for name in pkg.get('TestGoFiles', []) + pkg.get('XTestGoFiles', []): + source = code_only(pathlib.Path(pkg['Dir'], name).read_text()) + pattern = r'^func ((Test|Fuzz)(\w*))\(\w+ \*testing\.[TF]\)|^func (Example(\w*))\(\)' + for m in re.finditer(pattern, source, re.M): + name, suffix = (m.group(1), m.group(3)) if m.group(1) else (m.group(4), m.group(5)) + # go test's rule: the suffix must not start with a lower-case letter. + if not suffix or not suffix[0].islower(): + tests.append((pkg['ImportPath'], name)) + return tests + + +def code_only(src): + """src with comments and string/rune literals blanked (newlines kept), so + Go source embedded in test strings is not mistaken for tests.""" + out, i, n = [], 0, len(src) + while i < n: + c = src[i] + if src.startswith('//', i): + j = src.find('\n', i) + j = n if j < 0 else j + elif src.startswith('/*', i): + j = src.index('*/', i) + 2 + elif c == '`': + j = src.index('`', i + 1) + 1 + elif c in '"\'': + j = i + 1 + while src[j] != c: + j += 2 if src[j] == '\\' else 1 + j += 1 + else: + out.append(c) + i += 1 + continue + out.append(re.sub(r'[^\n]', ' ', src[i:j])) + i = j + return ''.join(out) + + +def decode_stream(text): + d, i = json.JSONDecoder(), 0 + while i < len(text): + while i < len(text) and text[i].isspace(): + i += 1 + if i == len(text): + break + obj, i = d.raw_decode(text, i) + yield obj + + +def pack(items, bins, weight): + """Greedy longest-first bin-packing; unweighted items go to the lightest bin.""" + loads, out = [0.0] * bins, [[] for _ in range(bins)] + known = sorted((i for i in items if weight(i) is not None), key=lambda i: (-weight(i), i)) + for item in known + [i for i in items if weight(i) is None]: + b = loads.index(min(loads)) + out[b].append(item) + loads[b] += weight(item) or 0 + return out, loads + + +def update_timings(platform_name, logs): + times, pkg = {}, None + for path in logs: + for line in open(path, errors='replace'): + line = re.sub(r'^.*?Z ', '', line.rstrip('\n')) # GitHub log timestamps + if m := re.match(r'^=== (\S+) \(\d+ tests\): exit', line): + pkg = m.group(1) + elif (m := re.match(r'^--- (?:PASS|FAIL|SKIP): (\w+) \(([\d.]+)s\)', line)) and pkg: + times[f'{pkg} {m.group(1)}'] = float(m.group(2)) + data = json.loads(TIMINGS.read_text()) if TIMINGS.exists() else {} + data[platform_name] = dict(sorted(times.items())) + TIMINGS.write_text(json.dumps(dict(sorted(data.items())), indent=1) + '\n') + print(f'wrote {len(times)} {platform_name} timings to {TIMINGS}') + + +def main(): + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument('--shard', default='1/1', help='i/N: run the i-th of N shards') + ap.add_argument('--jobs', type=int, default=os.cpu_count() or 2, help='concurrent go test processes') + ap.add_argument('--update-timings', nargs='+', metavar=('PLATFORM', 'LOG')) + a, extra = ap.parse_known_args() + if a.update_timings: + return update_timings(a.update_timings[0], a.update_timings[1:]) + index, total = map(int, a.shard.split('/')) + if not 1 <= index <= total: + sys.exit(f'bad --shard {a.shard}') + flags = go_flags(extra) + goos, goarch = subprocess.run(['go', 'env', 'GOOS', 'GOARCH'], check=True, capture_output=True, text=True).stdout.split() + timings = json.loads(TIMINGS.read_text()).get(f'{goos}-{goarch}', {}) + + def weight(unit): + known = [timings[k] for k in (f'{p} {n}' for p, n in unit) if k in timings] + return sum(known) if known else None + + tests = list_tests() + shards, loads = pack([(t,) for t in tests], total, weight) + if sorted(t for s in shards for u in s for t in u) != sorted(tests) or len(set(tests)) != len(tests): + sys.exit('shards do not partition the test list') + mine = shards[index - 1] + print(f'shard {index}/{total}: {sum(map(len, mine))} of {len(tests)} tests, ~{loads[index - 1]:.0f} s recorded ' + f'(shards: {", ".join(f"{l:.0f}" for l in loads)})', flush=True) + + # One process per (bucket, package); buckets are packed like shards. + buckets, _ = pack(mine, min(a.jobs, len(mine)) or 1, weight) + procs = [] + for bucket in buckets: + by_pkg = {} + for unit in bucket: + for pkg, test in unit: + by_pkg.setdefault(pkg, []).append(test) + for pkg, names in by_pkg.items(): + procs.append((weight([(pkg, n) for n in names]) or 0, pkg, names)) + procs.sort(key=lambda p: -p[0]) + lock, failed = threading.Lock(), [] + + def run(proc): + _, pkg, names = proc + cmd = ['go', 'test'] + flags + ['-run', '^(' + '|'.join(sorted(names)) + ')$', pkg] + r = subprocess.run(cmd, cwd=ROOT, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True) + with lock: + print(f'=== {pkg} ({len(names)} tests): exit {r.returncode}', flush=True) + sys.stdout.write(r.stdout) + sys.stdout.flush() + if r.returncode: + failed.append(pkg) + + with concurrent.futures.ThreadPoolExecutor(max_workers=a.jobs) as pool: + list(pool.map(run, procs)) + if failed: + sys.exit('failed: ' + ', '.join(sorted(failed))) + + +if __name__ == '__main__': + main() diff --git a/scripts/test_timings.json b/scripts/test_timings.json new file mode 100644 index 00000000..112bdf9e --- /dev/null +++ b/scripts/test_timings.json @@ -0,0 +1,962 @@ +{ + "darwin-arm64": { + "gosvm/cmd/gosvm TestCallDryRun": 1.0, + "gosvm/cmd/gosvm TestCallList": 0.2, + "gosvm/cmd/gosvm TestCallRawAccounts": 0.0, + "gosvm/cmd/gosvm TestExternalELFHeaderMustMatchTarget": 0.01, + "gosvm/cmd/gosvm TestExternalELFMatchesBuiltProgram": 2.05, + "gosvm/cmd/gosvm TestExternalELFRequiresOneTarget": 0.01, + "gosvm/cmd/gosvm TestExternalELFRequiresSVM": 0.0, + "gosvm/cmd/gosvm TestFastGenerationFailureRemovesPreviousReport": 0.01, + "gosvm/cmd/gosvm TestFastTestFlagsRejectConflictingModesBeforeProjectWork": 0.0, + "gosvm/cmd/gosvm TestFeaturesCommandProjectAndPackage": 0.42, + "gosvm/cmd/gosvm TestGoHostWarning": 0.0, + "gosvm/cmd/gosvm TestLCUUIDWatcherFindsSplitMessage": 0.0, + "gosvm/cmd/gosvm TestMacOSFromDarwin": 0.0, + "gosvm/cmd/gosvm TestSVMFixturesDefault": 0.16, + "gosvm/examples/amm TestInvalidLengths": 0.0, + "gosvm/examples/amm TestSwapAgainstBigIntegerReference": 0.0, + "gosvm/examples/protocol TestFixedRegions": 0.0, + "gosvm/examples/protocol TestIndependentReference": 0.0, + "gosvm/examples/protocol TestWireWords": 0.0, + "gosvm/examples/tokenswap TestFailedSecondCPI": 0.0, + "gosvm/examples/tokenswap TestMulDiv": 0.02, + "gosvm/examples/tokenswap TestNativeSwap": 0.0, + "gosvm/examples/tokenswap TestNativeValidation": 0.0, + "gosvm/examples/tokenswap TestWideQuote": 0.05, + "gosvm/internal/callplan TestEscrow": 0.12, + "gosvm/internal/callplan TestFieldParsing": 0.0, + "gosvm/internal/callplan TestFullSwap": 0.15, + "gosvm/internal/callplan TestHeapFrame": 0.0, + "gosvm/internal/callplan TestTutorialErrors": 0.12, + "gosvm/internal/callplan TestTutorialList": 0.0, + "gosvm/internal/callplan TestTutorialMatchesRunnerFixtures": 0.09, + "gosvm/internal/callplan TestTutorialRunnerE2E": 0.0, + "gosvm/internal/compiler TestAMMDifferential": 0.24, + "gosvm/internal/compiler TestAccounts64Frames": 11.11, + "gosvm/internal/compiler TestAccounts64SBF": 3.95, + "gosvm/internal/compiler TestAllocationAcceptedForms": 2.24, + "gosvm/internal/compiler TestAllocationDifferential": 6.56, + "gosvm/internal/compiler TestAllocationRejections": 0.02, + "gosvm/internal/compiler TestAllocationRuntimeOnlyWhenUsed": 0.0, + "gosvm/internal/compiler TestAllocationSBF": 19.27, + "gosvm/internal/compiler TestArrayCapacityMemory": 1.17, + "gosvm/internal/compiler TestArrayDeclarationOrder": 0.06, + "gosvm/internal/compiler TestArrayRejections": 0.0, + "gosvm/internal/compiler TestArrayStorageLimit": 0.0, + "gosvm/internal/compiler TestBitsCheckAcceptsSupportedFunctions": 0.32, + "gosvm/internal/compiler TestBitsCheckAcceptsUintAndIntValues": 0.01, + "gosvm/internal/compiler TestBitsCheckRejections": 0.0, + "gosvm/internal/compiler TestBitsDeclarationsMatchStandardLibrary": 0.01, + "gosvm/internal/compiler TestBitsDifferentialAgainstGo": 10.99, + "gosvm/internal/compiler TestBitsImportForms": 0.16, + "gosvm/internal/compiler TestBitsRuntimeOnlyWhenUsed": 0.0, + "gosvm/internal/compiler TestBitsSBF": 8.58, + "gosvm/internal/compiler TestBuildReceiptInvalidation": 0.06, + "gosvm/internal/compiler TestByvalCopies": 0.01, + "gosvm/internal/compiler TestByvalDifferential": 3.06, + "gosvm/internal/compiler TestByvalSBF": 6.22, + "gosvm/internal/compiler TestCPILimitsSBF": 3.15, + "gosvm/internal/compiler TestCheckLegacyEntryAndRejection": 0.0, + "gosvm/internal/compiler TestCheckedProgramDescribesContextProgram": 0.0, + "gosvm/internal/compiler TestCheckedProgramFuncMaps": 0.0, + "gosvm/internal/compiler TestCheckedProgramFunctions": 0.0, + "gosvm/internal/compiler TestCheckedProgramGlobals": 0.0, + "gosvm/internal/compiler TestCheckedProgramInstances": 0.0, + "gosvm/internal/compiler TestCheckedProgramInterfaces": 0.0, + "gosvm/internal/compiler TestCheckedProgramMaps": 0.0, + "gosvm/internal/compiler TestClosureEnvironmentHeap": 4.32, + "gosvm/internal/compiler TestClosureMapHeap": 2.28, + "gosvm/internal/compiler TestClosureStringHeap": 2.73, + "gosvm/internal/compiler TestCompositeArrayEscapes": 0.0, + "gosvm/internal/compiler TestCompoundAcceptedForms": 0.86, + "gosvm/internal/compiler TestCompoundDifferential": 43.72, + "gosvm/internal/compiler TestCompoundEmission": 0.0, + "gosvm/internal/compiler TestCompoundOperandOrder": 0.68, + "gosvm/internal/compiler TestCompoundRejections": 0.0, + "gosvm/internal/compiler TestCompoundSBF": 14.47, + "gosvm/internal/compiler TestConstInitDifferential": 32.22, + "gosvm/internal/compiler TestConstInitSBF": 25.02, + "gosvm/internal/compiler TestControlRejections": 0.0, + "gosvm/internal/compiler TestControlValuesDifferential": 0.16, + "gosvm/internal/compiler TestCorpusMatchesPreCheckCompiler": 2.27, + "gosvm/internal/compiler TestCrossPackageAliases": 0.22, + "gosvm/internal/compiler TestDependencyNamespaceSeparatesImportedContent": 0.24, + "gosvm/internal/compiler TestEvalOrderDifferential": 39.46, + "gosvm/internal/compiler TestEvalOrderHoisted": 0.0, + "gosvm/internal/compiler TestEvalOrderLocalsAndTraps": 0.0, + "gosvm/internal/compiler TestEvalOrderMaps": 0.0, + "gosvm/internal/compiler TestEvalOrderNothingToHoist": 0.0, + "gosvm/internal/compiler TestEvalOrderSBF": 54.1, + "gosvm/internal/compiler TestEvalOrderVariadicAndPointerToPointer": 0.0, + "gosvm/internal/compiler TestFormerEscapesMoveToHeap": 2.78, + "gosvm/internal/compiler TestFrameDiagnosticsParse": 0.0, + "gosvm/internal/compiler TestFrameOverflowFailsBuild": 1.33, + "gosvm/internal/compiler TestFuncAcceptedForms": 1.67, + "gosvm/internal/compiler TestFuncCombinationsSBF": 29.49, + "gosvm/internal/compiler TestFuncContextCapture": 0.03, + "gosvm/internal/compiler TestFuncMapAcceptedForms": 0.79, + "gosvm/internal/compiler TestFuncMapRecursion": 0.0, + "gosvm/internal/compiler TestFuncMapsDifferential": 32.8, + "gosvm/internal/compiler TestFuncRejections": 0.01, + "gosvm/internal/compiler TestFuncRuntimeOnlyWhenUsed": 0.0, + "gosvm/internal/compiler TestFuncStringsDifferential": 46.68, + "gosvm/internal/compiler TestFuncValuesDifferential": 51.1, + "gosvm/internal/compiler TestFuncValuesSBF": 17.12, + "gosvm/internal/compiler TestGenericAcceptedForms": 0.01, + "gosvm/internal/compiler TestGenericAliasSpellingsShareInstances": 0.09, + "gosvm/internal/compiler TestGenericArrayTypeArgsDifferential": 8.85, + "gosvm/internal/compiler TestGenericArrayTypeArgsForms": 1.64, + "gosvm/internal/compiler TestGenericArrayTypeArgsSBF": 14.73, + "gosvm/internal/compiler TestGenericCrossPackage": 0.0, + "gosvm/internal/compiler TestGenericDifferential": 21.57, + "gosvm/internal/compiler TestGenericMatchesHandwrittenSBF": 6.05, + "gosvm/internal/compiler TestGenericNamesAreDeterministic": 0.09, + "gosvm/internal/compiler TestGenericRejections": 0.03, + "gosvm/internal/compiler TestGenericSBF": 6.94, + "gosvm/internal/compiler TestGetReturnDataSBF": 3.05, + "gosvm/internal/compiler TestGlobalAcceptedForms": 2.39, + "gosvm/internal/compiler TestGlobalHeapAccounting": 0.6, + "gosvm/internal/compiler TestGlobalInitPanics": 5.55, + "gosvm/internal/compiler TestGlobalInitTrap": 0.36, + "gosvm/internal/compiler TestGlobalOperandOrder": 0.17, + "gosvm/internal/compiler TestGlobalPackages": 0.24, + "gosvm/internal/compiler TestGlobalReadOnly": 0.56, + "gosvm/internal/compiler TestGlobalRejections": 0.01, + "gosvm/internal/compiler TestGlobalRuntimeOnlyWhenUsed": 0.0, + "gosvm/internal/compiler TestGlobalValueTypesDifferential": 11.27, + "gosvm/internal/compiler TestGlobalValueTypesPlacement": 0.01, + "gosvm/internal/compiler TestGlobalValueTypesSBF": 22.75, + "gosvm/internal/compiler TestGlobalsDifferential": 17.8, + "gosvm/internal/compiler TestGlobalsSBF": 25.38, + "gosvm/internal/compiler TestGoSemantics": 0.11, + "gosvm/internal/compiler TestGrowthModelMatchesCompiledAppend": 0.0, + "gosvm/internal/compiler TestGrowthModelMatchesGoRuntime": 4.43, + "gosvm/internal/compiler TestGrowthRuntimeMatchesModel": 1.03, + "gosvm/internal/compiler TestHeapMovesExported": 0.0, + "gosvm/internal/compiler TestImportedMainPackage": 0.0, + "gosvm/internal/compiler TestImportedMethodsAndBorrowedResults": 0.07, + "gosvm/internal/compiler TestImportedMultipleResults": 0.06, + "gosvm/internal/compiler TestImportedPackageRejections": 0.0, + "gosvm/internal/compiler TestImportedSDKAndEntryIdentity": 0.08, + "gosvm/internal/compiler TestImportedValuesAndCalls": 0.07, + "gosvm/internal/compiler TestInitEvalEdgesSBF": 3.88, + "gosvm/internal/compiler TestInitEvalPartialPackage": 0.71, + "gosvm/internal/compiler TestInitEvalRuntimeInit": 0.01, + "gosvm/internal/compiler TestInitEvalStops": 6.85, + "gosvm/internal/compiler TestInitImageCheckedProgram": 0.0, + "gosvm/internal/compiler TestInitImageHeapAccounting": 18.83, + "gosvm/internal/compiler TestIntValuesDifferential": 12.78, + "gosvm/internal/compiler TestIntValuesFixture": 0.02, + "gosvm/internal/compiler TestIntValuesSBF": 17.68, + "gosvm/internal/compiler TestIntegerChecksAccept": 0.01, + "gosvm/internal/compiler TestIntegerChecksReject": 0.01, + "gosvm/internal/compiler TestInterfaceAcceptedForms": 1.14, + "gosvm/internal/compiler TestInterfaceBoxingHeap": 4.78, + "gosvm/internal/compiler TestInterfaceCrossPackage": 0.12, + "gosvm/internal/compiler TestInterfaceDifferential": 21.12, + "gosvm/internal/compiler TestInterfaceHeapMoves": 0.0, + "gosvm/internal/compiler TestInterfaceRejections": 0.06, + "gosvm/internal/compiler TestInterfaceRuntimeOnlyWhenUsed": 0.23, + "gosvm/internal/compiler TestInterfaceSBF": 7.13, + "gosvm/internal/compiler TestKeccak256SBF": 4.47, + "gosvm/internal/compiler TestKeccakReference": 0.0, + "gosvm/internal/compiler TestLargeTablesAccepted": 0.88, + "gosvm/internal/compiler TestLargeTablesRejected": 0.03, + "gosvm/internal/compiler TestMangleIsInjective": 0.0, + "gosvm/internal/compiler TestMapAcceptedForms": 1.54, + "gosvm/internal/compiler TestMapDifferential": 28.7, + "gosvm/internal/compiler TestMapDocumentationExample": 0.04, + "gosvm/internal/compiler TestMapHeap": 37.13, + "gosvm/internal/compiler TestMapHeapMoves": 0.04, + "gosvm/internal/compiler TestMapRejections": 0.01, + "gosvm/internal/compiler TestMapRuntimeOnlyWhenUsed": 0.55, + "gosvm/internal/compiler TestMapSBF": 69.15, + "gosvm/internal/compiler TestMaxAccountsOptIn": 0.08, + "gosvm/internal/compiler TestMemmoveHelperCompiles": 0.03, + "gosvm/internal/compiler TestMemmoveSBF": 5.68, + "gosvm/internal/compiler TestMemoryDifferential": 24.33, + "gosvm/internal/compiler TestMemoryLegacyUnchanged": 0.0, + "gosvm/internal/compiler TestMemoryReadOnlyWritesSBF": 4.98, + "gosvm/internal/compiler TestMemoryRuntimeSBF": 3.17, + "gosvm/internal/compiler TestMemorySBF": 36.23, + "gosvm/internal/compiler TestMemorySyscallRoutinesCompileForSBF": 1.24, + "gosvm/internal/compiler TestMixedAcceptedForms": 0.89, + "gosvm/internal/compiler TestMixedDifferential": 61.84, + "gosvm/internal/compiler TestMixedHeapRuntimeOnlyForInstances": 0.0, + "gosvm/internal/compiler TestMixedInstanceHeapMoves": 0.0, + "gosvm/internal/compiler TestMixedRejections": 0.0, + "gosvm/internal/compiler TestMixedSBF": 10.97, + "gosvm/internal/compiler TestModernRebuildIsByteIdentical": 6.82, + "gosvm/internal/compiler TestModuleImportFailures": 0.15, + "gosvm/internal/compiler TestModuleImportsAndCache": 0.81, + "gosvm/internal/compiler TestMultiFileValueSemantics": 0.07, + "gosvm/internal/compiler TestMultiplyBuiltinNativeDifferential": 0.13, + "gosvm/internal/compiler TestNilSliceContexts": 0.08, + "gosvm/internal/compiler TestNoGenericsLowersToItself": 0.0, + "gosvm/internal/compiler TestOutOfMemoryBoundaries": 1.69, + "gosvm/internal/compiler TestPackageSourcesAndCache": 0.2, + "gosvm/internal/compiler TestPackedStoreNativeCDifferential": 0.82, + "gosvm/internal/compiler TestPackedStoreRecognition": 0.01, + "gosvm/internal/compiler TestPanicLogLine": 0.85, + "gosvm/internal/compiler TestPanicSites": 0.0, + "gosvm/internal/compiler TestPlatformWordsInsideFilename": 0.0, + "gosvm/internal/compiler TestPointerArrayLengthAndReceiverEffects": 0.07, + "gosvm/internal/compiler TestPointerLifetimeRejections": 0.0, + "gosvm/internal/compiler TestPointerToPointerBorrows": 0.0, + "gosvm/internal/compiler TestPointerValuesDifferential": 0.84, + "gosvm/internal/compiler TestRangeAcceptedForms": 0.07, + "gosvm/internal/compiler TestRangeDifferential": 1.38, + "gosvm/internal/compiler TestRangeRejections": 0.0, + "gosvm/internal/compiler TestRangeUint16SBF": 16.03, + "gosvm/internal/compiler TestRealLibrariesDifferential": 67.35, + "gosvm/internal/compiler TestRealLibrariesInitSBF": 76.67, + "gosvm/internal/compiler TestRealLibrariesSBF": 104.63, + "gosvm/internal/compiler TestRealLibrariesWholePackages": 16.74, + "gosvm/internal/compiler TestRealLibraryFormsCheck": 0.0, + "gosvm/internal/compiler TestRealLibraryFormsDifferential": 6.38, + "gosvm/internal/compiler TestRealLibraryFormsSBF": 18.38, + "gosvm/internal/compiler TestRejectUnsupported": 0.02, + "gosvm/internal/compiler TestResolverFlagLikeImport": 0.07, + "gosvm/internal/compiler TestRuntimeGuards": 0.23, + "gosvm/internal/compiler TestSBFUnresolvedSymbolGuard": 0.0, + "gosvm/internal/compiler TestSDK2AggregateMemory": 0.72, + "gosvm/internal/compiler TestSDK2ArrayValueSemantics": 0.78, + "gosvm/internal/compiler TestSDK2ClockNativeCDifferential": 0.87, + "gosvm/internal/compiler TestSDK2GetReturnDataNativeCDifferential": 0.14, + "gosvm/internal/compiler TestSDK2InvokeBoundaryDifferential": 1.25, + "gosvm/internal/compiler TestSDK2Keccak256NativeCDifferential": 0.5, + "gosvm/internal/compiler TestSDK2LifecycleLoaderSelection": 0.01, + "gosvm/internal/compiler TestSDK2LogNativeCDifferential": 0.12, + "gosvm/internal/compiler TestSDK2LogRuntimeEmittedOnlyWhenCalled": 0.01, + "gosvm/internal/compiler TestSDK2MoveLamportsEmittedOnlyWhenCalled": 0.0, + "gosvm/internal/compiler TestSDK2MoveLamportsNativeCDifferential": 0.92, + "gosvm/internal/compiler TestSDK2OwnedLifecycleDifferential": 0.36, + "gosvm/internal/compiler TestSDK2RentCalculationC": 0.59, + "gosvm/internal/compiler TestSDK2ReturnDataNativeCDifferential": 0.24, + "gosvm/internal/compiler TestSDK2Secp256k1RecoverNativeCDifferential": 0.78, + "gosvm/internal/compiler TestSDKATACreateSBF": 6.08, + "gosvm/internal/compiler TestSDKAccountDecoderCapacityAndAliases": 3.0, + "gosvm/internal/compiler TestSDKContext": 0.07, + "gosvm/internal/compiler TestSDKHashBounds": 0.1, + "gosvm/internal/compiler TestSDKNilSliceArguments": 0.12, + "gosvm/internal/compiler TestSDKSystemPDASBF": 4.41, + "gosvm/internal/compiler TestSDKTokenCPISBF": 4.3, + "gosvm/internal/compiler TestSDKTokenExtensionsSBF": 2.82, + "gosvm/internal/compiler TestSDKVersionsAndNativeOnlyTypes": 0.01, + "gosvm/internal/compiler TestSDKViewCapacities": 0.09, + "gosvm/internal/compiler TestScalarArraysDifferential": 0.87, + "gosvm/internal/compiler TestSecp256k1RecoverSBF": 4.14, + "gosvm/internal/compiler TestSharedExampleDifferential": 0.75, + "gosvm/internal/compiler TestSignedRuntimeOnlyWhenUsed": 0.0, + "gosvm/internal/compiler TestSliceArrayCheck": 0.0, + "gosvm/internal/compiler TestSliceArrayDifferential": 11.92, + "gosvm/internal/compiler TestSliceArrayRejections": 0.0, + "gosvm/internal/compiler TestSliceArraySBF": 8.96, + "gosvm/internal/compiler TestSliceViewArrayBoundary": 0.93, + "gosvm/internal/compiler TestSliceViewRejections": 0.0, + "gosvm/internal/compiler TestSliceViewsDifferential": 1.36, + "gosvm/internal/compiler TestStdlibAPI": 0.17, + "gosvm/internal/compiler TestStdlibConstantsOnly": 0.0, + "gosvm/internal/compiler TestStdlibDifferential": 38.76, + "gosvm/internal/compiler TestStdlibIdentity": 0.0, + "gosvm/internal/compiler TestStdlibImportForms": 0.48, + "gosvm/internal/compiler TestStdlibIntrinsics": 0.08, + "gosvm/internal/compiler TestStdlibPackagesList": 0.04, + "gosvm/internal/compiler TestStdlibProvenance": 0.01, + "gosvm/internal/compiler TestStdlibRejections": 0.35, + "gosvm/internal/compiler TestStdlibSBF": 47.82, + "gosvm/internal/compiler TestStdlibUnicodeTables": 0.0, + "gosvm/internal/compiler TestStringAcceptedForms": 0.98, + "gosvm/internal/compiler TestStringDifferential": 43.3, + "gosvm/internal/compiler TestStringDocumentationExample": 0.06, + "gosvm/internal/compiler TestStringHeap": 9.4, + "gosvm/internal/compiler TestStringIntegerConversions": 1.73, + "gosvm/internal/compiler TestStringRejections": 0.0, + "gosvm/internal/compiler TestStringRuntimeOnlyWhenUsed": 0.35, + "gosvm/internal/compiler TestStringSBF": 16.54, + "gosvm/internal/compiler TestTrimDropsUnreachable": 1.66, + "gosvm/internal/compiler TestTrimEntryPackage": 0.0, + "gosvm/internal/compiler TestTrimModules": 2.84, + "gosvm/internal/compiler TestTrimRejections": 1.46, + "gosvm/internal/compiler TestTrimWarnings": 3.1, + "gosvm/internal/compiler TestTypeCheckBeforeEntryGeneration": 0.0, + "gosvm/internal/compiler TestTypeInspectionIsNotSubsetCertification": 0.0, + "gosvm/internal/compiler TestUint16Checks": 0.0, + "gosvm/internal/compiler TestUint16Differential": 1.03, + "gosvm/internal/compiler TestUint16TypedefOnlyWhenUsed": 0.0, + "gosvm/internal/compiler TestValidateTrim": 0.0, + "gosvm/internal/compiler TestValueTypeRejections": 0.0, + "gosvm/internal/compiler TestValueTypesAcceptedForms": 1.38, + "gosvm/internal/compiler TestValueTypesDifferential": 42.5, + "gosvm/internal/compiler TestValueTypesRejections": 0.0, + "gosvm/internal/compiler TestValueTypesSBF": 12.34, + "gosvm/internal/compiler TestVariadicForms": 0.0, + "gosvm/internal/compiler TestVariadicLowering": 0.0, + "gosvm/internal/compiler TestVariadicRejections": 0.0, + "gosvm/internal/compiler TestViewAggregateReturn": 0.2, + "gosvm/internal/compiler TestViewCapacityBoundary": 0.15, + "gosvm/internal/compiler TestWideQuoteDifferential": 0.14, + "gosvm/internal/compiler TestZeroLoopForms": 0.05, + "gosvm/internal/features TestAllocationCounters": 0.0, + "gosvm/internal/features TestCompoundCounters": 0.01, + "gosvm/internal/features TestDeterministicOutput": 0.39, + "gosvm/internal/features TestFullSwapFacts": 0.19, + "gosvm/internal/features TestFunctionValueCounters": 0.0, + "gosvm/internal/features TestFunctionValueUses": 0.0, + "gosvm/internal/features TestGenerics": 0.21, + "gosvm/internal/features TestGlobalCounters": 0.0, + "gosvm/internal/features TestGlobalUses": 0.01, + "gosvm/internal/features TestInlineProgram": 0.0, + "gosvm/internal/features TestInterfaceCounters": 0.0, + "gosvm/internal/features TestMapCounters": 0.0, + "gosvm/internal/features TestMapFunctionCounters": 0.0, + "gosvm/internal/features TestPointerConversionCounter": 0.0, + "gosvm/internal/features TestSignedIntegers": 0.0, + "gosvm/internal/features TestSliceArrayConversionCounter": 0.0, + "gosvm/internal/features TestStdlibCalls": 0.14, + "gosvm/internal/features TestStdlibUses": 0.06, + "gosvm/internal/features TestStringCounters": 0.0, + "gosvm/internal/features TestTrimmedUses": 0.47, + "gosvm/internal/features TestUsesSummary": 0.5, + "gosvm/internal/features TestValueTypeCounters": 0.0, + "gosvm/internal/library TestBendBuildKey": 0.01, + "gosvm/internal/library TestBendFogoV157Accepted": 0.0, + "gosvm/internal/library TestBuildBendSourceFake": 0.15, + "gosvm/internal/library TestBuildRustLibrary": 0.0, + "gosvm/internal/library TestBuildRustRefusals": 0.0, + "gosvm/internal/library TestInspectBendCheckoutPrerequisites": 0.07, + "gosvm/internal/library TestParseBendBuild": 0.0, + "gosvm/internal/library TestProducerRequiresExplicitPinnedContract": 0.01, + "gosvm/internal/library TestPublishedBendContract": 0.0, + "gosvm/internal/library TestPublishedBendContractFlatLayout": 0.0, + "gosvm/internal/library TestRustFingerprintAndWrapper": 0.0, + "gosvm/internal/library TestRustToolchainMissing": 0.0, + "gosvm/internal/network TestCheckDeployableFollowsLiveFeatures": 0.0, + "gosvm/internal/network TestEnsureKeypairRoundTrips": 0.0, + "gosvm/internal/network TestFundingMessage": 0.0, + "gosvm/internal/network TestProgramDataAddress": 0.0, + "gosvm/internal/network TestSignMatchesInvokeEncoding": 0.0, + "gosvm/internal/network TestUpgradeDecisions": 0.0, + "gosvm/internal/project TestAddBendLibrary": 0.0, + "gosvm/internal/project TestAddRustLibrary": 0.0, + "gosvm/internal/project TestBendSourceDeclarationsValidate": 0.0, + "gosvm/internal/project TestBendSourceIntegration": 0.0, + "gosvm/internal/project TestBendSourceNeedsCheckout": 0.01, + "gosvm/internal/project TestBendSourceSyncFake": 0.0, + "gosvm/internal/project TestCustomModuleAndDiscovery": 0.39, + "gosvm/internal/project TestExplicitSDK2AndLegacySnapshot": 1.39, + "gosvm/internal/project TestExplicitTargetMigrationPreservesApplicationAndWire": 0.32, + "gosvm/internal/project TestGenerationChecksBeforeWriting": 0.01, + "gosvm/internal/project TestGoModuleSyntax": 0.0, + "gosvm/internal/project TestHeapBytesSetting": 0.01, + "gosvm/internal/project TestLibraryDeclarationsValidate": 0.0, + "gosvm/internal/project TestLoadSchemaFullSwap": 0.11, + "gosvm/internal/project TestLoadSchemaRejectsSchema1": 0.01, + "gosvm/internal/project TestNetworkTargetsResolveAndValidate": 0.02, + "gosvm/internal/project TestSDK1RejectsNewBoundaryCalls": 0.01, + "gosvm/internal/project TestSDK2FixtureScaffold": 0.65, + "gosvm/internal/project TestSDKDriftRejected": 0.01, + "gosvm/internal/project TestSchema2AllInitTargetsValidatedBeforeCPI": 0.79, + "gosvm/internal/project TestSchema2CheckedConstraintDiagnostics": 1.17, + "gosvm/internal/project TestSchema2CheckedTokenAndPDAGeneration": 1.55, + "gosvm/internal/project TestSchema2HistoricalManifestValidation": 0.51, + "gosvm/internal/project TestSchema2InvalidDeclarations": 1.57, + "gosvm/internal/project TestSchema2LayoutVersionsAreGuarded": 0.29, + "gosvm/internal/project TestSchema2LifecycleDiagnostics": 0.51, + "gosvm/internal/project TestSchema2LifecycleGeneration": 1.34, + "gosvm/internal/project TestSchema2NamedScalarArrayWire": 0.38, + "gosvm/internal/project TestSchema2PDAAdapterOnlyImport": 0.19, + "gosvm/internal/project TestSchema2ReadonlyAliasAndProgramIdentity": 0.36, + "gosvm/internal/project TestSchema2RejectsCountsBeyondLoaderABI": 0.09, + "gosvm/internal/project TestSchema2RejectsGenericWireTypes": 0.38, + "gosvm/internal/project TestSchema2RejectsMaps": 0.35, + "gosvm/internal/project TestSchema2RejectsPlatformSizedIntegers": 0.36, + "gosvm/internal/project TestSchema2RejectsStrings": 0.37, + "gosvm/internal/project TestSchema2SignedFieldsAndSeeds": 0.61, + "gosvm/internal/project TestSchema2SourceDiagnosticsBeforePublication": 0.39, + "gosvm/internal/project TestSchema2StandaloneCanonicalLayouts": 1.01, + "gosvm/internal/project TestSchema2Uint16FieldsAndSeeds": 0.66, + "gosvm/internal/project TestStandaloneStarter": 0.31, + "gosvm/internal/project TestTrimSetting": 0.01, + "gosvm/internal/project TestWireFieldsAndSchemaChanges": 0.11, + "gosvm/internal/runner TestAtomicInstallAndPinnedIntegrity": 0.02, + "gosvm/internal/runner TestBusyInstallPreservesLock": 0.0, + "gosvm/internal/runner TestDownloadRejectsWrongBytesBeforeExecution": 0.05, + "gosvm/internal/runner TestEmbeddedPinsAndPackageDetection": 0.29, + "gosvm/internal/runner TestFailedSmokeAndCancellationDoNotPublish": 0.0, + "gosvm/internal/runner TestGzipTrailerAndInstalledFileType": 0.0, + "gosvm/internal/runner TestRejectArchivesBeforeExecution": 0.02, + "gosvm/internal/runner TestReleasePinAcceptsHistoricalInstall": 0.0, + "gosvm/internal/runner TestWrongPlatformArchiveIsNamed": 0.01, + "gosvm/internal/sbftest TestFastFailureRemovesPreviousPassingReport": 0.0, + "gosvm/internal/sbftest TestFastSelectionRejectsEmptyAndInvalidMatches": 0.0, + "gosvm/internal/sbftest TestFixtureTransactionMergesKeysAndPreservesReferences": 0.0, + "gosvm/internal/sbftest TestGeneralChecksMetadataAndExactErrorCategories": 0.0, + "gosvm/internal/sbftest TestGeneralFixturesRejectAmbiguousAndUncheckedInputs": 0.0, + "gosvm/internal/sbftest TestGeneralReportsAreClearedWithoutOverwritingInputs": 0.0, + "gosvm/internal/sbftest TestGeneralSysvarControlsValidateBeforeAnySelectedScenario": 0.0, + "gosvm/internal/sbftest TestNativeProgramAliasesAndDeclaredTransactions": 0.0, + "gosvm/internal/sbftest TestSimulationStateOverridesKeepCommittedChecks": 0.0, + "gosvm/internal/targets TestVersionAndMachineAreBothRequired": 0.0, + "gosvm/internal/testvm TestRunnerProfileIsValidAndOverrideIsExplicit": 0.0, + "gosvm/internal/testvm TestRunnerSelectionPerProfile": 0.04, + "gosvm/internal/testvm TestRunnerSelectionPrecedenceAndDamagedManagedCache": 0.02, + "gosvm/internal/testvm TestSVMControlsIntegration": 0.0, + "gosvm/internal/testvm TestSelectionAndVersion": 0.0, + "gosvm/internal/testvm TestSessionCancellationUnblocksRead": 0.1, + "gosvm/internal/testvm TestSessionChecksEveryCallIdentityAndError": 0.02, + "gosvm/internal/testvm TestSessionHelperProcess": 0.0, + "gosvm/internal/testvm TestSessionRejectsCorruptResponses": 0.02, + "gosvm/internal/testvm TestSysvarParsingPreservesIntegerLimitsAndPartialControls": 0.0, + "gosvm/internal/testvm TestSysvarParsingRejectsIncompleteAmbiguousAndOutOfRangeValues": 0.0, + "gosvm/internal/testvm TestTargetRuntimeContract": 0.0, + "gosvm/internal/toolchain TestAllowlistExtraction": 0.0, + "gosvm/internal/toolchain TestBadArchiveDoesNotPublish": 0.0, + "gosvm/internal/toolchain TestModernDownloadInstallsOnlyPinnedBackend": 0.01, + "gosvm/internal/toolchain TestModernLocalArchiveAndRejections": 0.02, + "gosvm/internal/toolchain TestModernReceiptSources": 0.01, + "gosvm/internal/toolchain TestOfficialArchivesPerHost": 0.0, + "gosvm/internal/toolchain TestOfficialFullPins": 0.0, + "gosvm/internal/toolchain TestOfficialModernPins": 0.0, + "gosvm/internal/toolchain TestRejectUnsafeOrIncompleteBackend": 0.0, + "gosvm/internal/toolchain TestRustFullTreeInstall": 0.04, + "gosvm/internal/toolchain TestRustFullTreeLocalArchiveWithExistingBackend": 0.01, + "gosvm/internal/toolchain TestRustFullTreeRejections": 0.07, + "gosvm/internal/toolchain TestRustPlatformToolsReceipt": 0.0, + "gosvm/sdk/ata TestAddressMatchesFindProgramAddress": 0.0, + "gosvm/sdk/ata TestCreateDelegatesAddressValidation": 0.0, + "gosvm/sdk/ata TestCreateEncoding": 0.0, + "gosvm/sdk/ata TestCreateGuards": 0.0, + "gosvm/sdk/cpi TestBoundedMetasAndSignerGroups": 0.0, + "gosvm/sdk/cpi TestInvokeSingleSignedUnsignedAndGuards": 0.0, + "gosvm/sdk/cpi TestInvokeValidationAndExactCallbackStatus": 0.0, + "gosvm/sdk/cpi TestSingleSignerEncodingAndRejectedAdds": 0.02, + "gosvm/sdk/fixture TestBase58Keys": 0.0, + "gosvm/sdk/fixture TestBuildErrors": 0.0, + "gosvm/sdk/fixture TestDeterministicKeys": 0.0, + "gosvm/sdk/fixture TestFindProgramAddressVectors": 0.0, + "gosvm/sdk/fixture TestOnCurve": 0.0, + "gosvm/sdk/fixture TestRent": 0.0, + "gosvm/sdk/fixture TestSuiteLoadsInRunnerValidation": 0.0, + "gosvm/sdk/pda TestAddressAndFailureOutput": 0.0, + "gosvm/sdk/pda TestExplicitSeedEncodingAndBounds": 0.0, + "gosvm/sdk/pda TestFindAddressMatchesSolana": 0.05, + "gosvm/sdk/pda TestFindAddressStatuses": 0.0, + "gosvm/sdk/system TestRentCurrentSysvar": 0.0, + "gosvm/sdk/system TestRentMinimumDifferential": 0.03, + "gosvm/sdk/system TestSystemAllocateAssignEncoding": 0.0, + "gosvm/sdk/system TestSystemCreateAndTransferEncoding": 0.0, + "gosvm/sdk/system TestSystemCreatePDAFundedAndUnfunded": 0.0, + "gosvm/sdk/system TestSystemFreeRentRetainsAccount": 0.0, + "gosvm/sdk/system TestSystemPDAAndCreationGuards": 0.0, + "gosvm/sdk/system TestSystemTransferSignedEncodingAndGuards": 0.0, + "gosvm/sdk/token TestCheckedBalanceRevalidation": 0.0, + "gosvm/sdk/token TestCheckedInstructionEncodings": 0.0, + "gosvm/sdk/token TestCheckedInstructionGuards": 0.0, + "gosvm/sdk/token TestCheckedInstructionsClassicAndSelfAuthority": 0.0, + "gosvm/sdk/token TestCheckedTransferAndCurrentReads": 0.0, + "gosvm/sdk/token TestFindExtensionAndTransferFeeConfig": 0.0, + "gosvm/sdk/token TestProgramPredicates": 0.0, + "gosvm/sdk/token TestReadAccountLayouts": 0.0, + "gosvm/sdk/token TestReadMintLayouts": 0.0, + "gosvm/sdk/token TestTokenCloseAuthorityAndCurrentReference": 0.0, + "gosvm/sdk/token TestTokenCreateCurrentStorageAndCPIEncoding": 0.0, + "gosvm/sdk/token TestTokenCreatePreconditionsAndDownstreamFailures": 0.0, + "gosvm/sdk/token TestTokenRevalidationBeforeInvoke": 0.0, + "gosvm/sdk/token TestTransferFeeArithmetic": 0.02, + "gosvm/solana TestClockCurrentWordsAndFailedOutput": 0.0, + "gosvm/solana TestGetReturnDataCopiesPrefixAndSetter": 0.0, + "gosvm/solana TestGetReturnDataOverlap": 0.0, + "gosvm/solana TestKeccak256BoundsAndCopy": 0.0, + "gosvm/solana TestLogMessages": 0.0, + "gosvm/solana TestLogRejectsInvalidUTF8": 0.0, + "gosvm/solana TestMoveLamportsRules": 0.0, + "gosvm/solana TestOwnedLifecycleAliases": 0.0, + "gosvm/solana TestOwnedLifecycleFailureAtomicity": 0.0, + "gosvm/solana TestRentBoundaryPreservesFailedOutput": 0.0, + "gosvm/solana TestReturnDataBoundsCopiesAndUnavailable": 0.0, + "gosvm/solana TestSHA256Regions": 0.0, + "gosvm/solana TestSecp256k1RecoverBoundsStatusesAndCopy": 0.0 + }, + "linux-amd64": { + "gosvm/cmd/gosvm TestCallDryRun": 1.76, + "gosvm/cmd/gosvm TestCallList": 0.17, + "gosvm/cmd/gosvm TestCallRawAccounts": 0.0, + "gosvm/cmd/gosvm TestExternalELFHeaderMustMatchTarget": 0.01, + "gosvm/cmd/gosvm TestExternalELFMatchesBuiltProgram": 2.05, + "gosvm/cmd/gosvm TestExternalELFRequiresOneTarget": 0.01, + "gosvm/cmd/gosvm TestExternalELFRequiresSVM": 0.0, + "gosvm/cmd/gosvm TestFastGenerationFailureRemovesPreviousReport": 0.01, + "gosvm/cmd/gosvm TestFastTestFlagsRejectConflictingModesBeforeProjectWork": 0.0, + "gosvm/cmd/gosvm TestFeaturesCommandProjectAndPackage": 0.86, + "gosvm/cmd/gosvm TestGoHostWarning": 0.0, + "gosvm/cmd/gosvm TestLCUUIDWatcherFindsSplitMessage": 0.0, + "gosvm/cmd/gosvm TestMacOSFromDarwin": 0.0, + "gosvm/cmd/gosvm TestSVMFixturesDefault": 0.17, + "gosvm/examples/amm TestInvalidLengths": 0.0, + "gosvm/examples/amm TestSwapAgainstBigIntegerReference": 0.01, + "gosvm/examples/protocol TestFixedRegions": 0.0, + "gosvm/examples/protocol TestIndependentReference": 0.0, + "gosvm/examples/protocol TestWireWords": 0.0, + "gosvm/examples/tokenswap TestFailedSecondCPI": 0.0, + "gosvm/examples/tokenswap TestMulDiv": 0.03, + "gosvm/examples/tokenswap TestNativeSwap": 0.0, + "gosvm/examples/tokenswap TestNativeValidation": 0.0, + "gosvm/examples/tokenswap TestWideQuote": 0.14, + "gosvm/internal/callplan TestEscrow": 0.08, + "gosvm/internal/callplan TestFieldParsing": 0.0, + "gosvm/internal/callplan TestFullSwap": 0.08, + "gosvm/internal/callplan TestHeapFrame": 0.0, + "gosvm/internal/callplan TestTutorialErrors": 0.09, + "gosvm/internal/callplan TestTutorialList": 0.0, + "gosvm/internal/callplan TestTutorialMatchesRunnerFixtures": 0.08, + "gosvm/internal/callplan TestTutorialRunnerE2E": 0.0, + "gosvm/internal/compiler TestAMMDifferential": 1.27, + "gosvm/internal/compiler TestAccounts64Frames": 17.86, + "gosvm/internal/compiler TestAccounts64SBF": 1.91, + "gosvm/internal/compiler TestAllocationAcceptedForms": 13.0, + "gosvm/internal/compiler TestAllocationDifferential": 3.76, + "gosvm/internal/compiler TestAllocationRejections": 0.04, + "gosvm/internal/compiler TestAllocationRuntimeOnlyWhenUsed": 0.0, + "gosvm/internal/compiler TestAllocationSBF": 18.01, + "gosvm/internal/compiler TestArrayCapacityMemory": 4.16, + "gosvm/internal/compiler TestArrayDeclarationOrder": 1.85, + "gosvm/internal/compiler TestArrayRejections": 0.05, + "gosvm/internal/compiler TestArrayStorageLimit": 0.01, + "gosvm/internal/compiler TestBitsCheckAcceptsSupportedFunctions": 0.42, + "gosvm/internal/compiler TestBitsCheckAcceptsUintAndIntValues": 0.07, + "gosvm/internal/compiler TestBitsCheckRejections": 0.01, + "gosvm/internal/compiler TestBitsDeclarationsMatchStandardLibrary": 0.02, + "gosvm/internal/compiler TestBitsDifferentialAgainstGo": 8.45, + "gosvm/internal/compiler TestBitsImportForms": 0.57, + "gosvm/internal/compiler TestBitsRuntimeOnlyWhenUsed": 0.0, + "gosvm/internal/compiler TestBitsSBF": 2.31, + "gosvm/internal/compiler TestBuildReceiptInvalidation": 0.15, + "gosvm/internal/compiler TestByvalCopies": 0.05, + "gosvm/internal/compiler TestByvalDifferential": 4.77, + "gosvm/internal/compiler TestByvalSBF": 13.55, + "gosvm/internal/compiler TestCPILimitsSBF": 4.55, + "gosvm/internal/compiler TestCheckLegacyEntryAndRejection": 0.0, + "gosvm/internal/compiler TestCheckedProgramDescribesContextProgram": 0.01, + "gosvm/internal/compiler TestCheckedProgramFuncMaps": 0.0, + "gosvm/internal/compiler TestCheckedProgramFunctions": 0.0, + "gosvm/internal/compiler TestCheckedProgramGlobals": 0.0, + "gosvm/internal/compiler TestCheckedProgramInstances": 0.0, + "gosvm/internal/compiler TestCheckedProgramInterfaces": 0.0, + "gosvm/internal/compiler TestCheckedProgramMaps": 0.0, + "gosvm/internal/compiler TestClosureEnvironmentHeap": 9.53, + "gosvm/internal/compiler TestClosureMapHeap": 3.9, + "gosvm/internal/compiler TestClosureStringHeap": 7.37, + "gosvm/internal/compiler TestCompositeArrayEscapes": 0.0, + "gosvm/internal/compiler TestCompoundAcceptedForms": 2.82, + "gosvm/internal/compiler TestCompoundDifferential": 26.83, + "gosvm/internal/compiler TestCompoundEmission": 0.0, + "gosvm/internal/compiler TestCompoundOperandOrder": 8.24, + "gosvm/internal/compiler TestCompoundRejections": 0.02, + "gosvm/internal/compiler TestCompoundSBF": 8.13, + "gosvm/internal/compiler TestConstInitDifferential": 19.19, + "gosvm/internal/compiler TestConstInitSBF": 12.98, + "gosvm/internal/compiler TestControlRejections": 0.01, + "gosvm/internal/compiler TestControlValuesDifferential": 0.97, + "gosvm/internal/compiler TestCorpusMatchesPreCheckCompiler": 7.59, + "gosvm/internal/compiler TestCrossPackageAliases": 0.75, + "gosvm/internal/compiler TestDependencyNamespaceSeparatesImportedContent": 0.29, + "gosvm/internal/compiler TestEvalOrderDifferential": 21.62, + "gosvm/internal/compiler TestEvalOrderHoisted": 0.0, + "gosvm/internal/compiler TestEvalOrderLocalsAndTraps": 0.02, + "gosvm/internal/compiler TestEvalOrderMaps": 0.0, + "gosvm/internal/compiler TestEvalOrderNothingToHoist": 0.0, + "gosvm/internal/compiler TestEvalOrderSBF": 40.67, + "gosvm/internal/compiler TestEvalOrderVariadicAndPointerToPointer": 0.02, + "gosvm/internal/compiler TestFormerEscapesMoveToHeap": 8.14, + "gosvm/internal/compiler TestFrameDiagnosticsParse": 0.0, + "gosvm/internal/compiler TestFrameOverflowFailsBuild": 1.2, + "gosvm/internal/compiler TestFuncAcceptedForms": 5.44, + "gosvm/internal/compiler TestFuncCombinationsSBF": 13.05, + "gosvm/internal/compiler TestFuncContextCapture": 0.15, + "gosvm/internal/compiler TestFuncMapAcceptedForms": 3.5, + "gosvm/internal/compiler TestFuncMapRecursion": 0.01, + "gosvm/internal/compiler TestFuncMapsDifferential": 29.8, + "gosvm/internal/compiler TestFuncRejections": 0.13, + "gosvm/internal/compiler TestFuncRuntimeOnlyWhenUsed": 0.0, + "gosvm/internal/compiler TestFuncStringsDifferential": 24.21, + "gosvm/internal/compiler TestFuncValuesDifferential": 29.5, + "gosvm/internal/compiler TestFuncValuesSBF": 21.31, + "gosvm/internal/compiler TestGenericAcceptedForms": 0.04, + "gosvm/internal/compiler TestGenericAliasSpellingsShareInstances": 0.65, + "gosvm/internal/compiler TestGenericArrayTypeArgsDifferential": 6.31, + "gosvm/internal/compiler TestGenericArrayTypeArgsForms": 1.18, + "gosvm/internal/compiler TestGenericArrayTypeArgsSBF": 16.32, + "gosvm/internal/compiler TestGenericCrossPackage": 0.0, + "gosvm/internal/compiler TestGenericDifferential": 14.22, + "gosvm/internal/compiler TestGenericMatchesHandwrittenSBF": 3.97, + "gosvm/internal/compiler TestGenericNamesAreDeterministic": 0.38, + "gosvm/internal/compiler TestGenericRejections": 0.11, + "gosvm/internal/compiler TestGenericSBF": 8.22, + "gosvm/internal/compiler TestGetReturnDataSBF": 1.96, + "gosvm/internal/compiler TestGlobalAcceptedForms": 5.35, + "gosvm/internal/compiler TestGlobalHeapAccounting": 0.51, + "gosvm/internal/compiler TestGlobalInitPanics": 5.31, + "gosvm/internal/compiler TestGlobalInitTrap": 5.7, + "gosvm/internal/compiler TestGlobalOperandOrder": 0.46, + "gosvm/internal/compiler TestGlobalPackages": 2.53, + "gosvm/internal/compiler TestGlobalReadOnly": 2.13, + "gosvm/internal/compiler TestGlobalRejections": 0.02, + "gosvm/internal/compiler TestGlobalRuntimeOnlyWhenUsed": 0.0, + "gosvm/internal/compiler TestGlobalValueTypesDifferential": 14.74, + "gosvm/internal/compiler TestGlobalValueTypesPlacement": 0.02, + "gosvm/internal/compiler TestGlobalValueTypesSBF": 30.13, + "gosvm/internal/compiler TestGlobalsDifferential": 12.1, + "gosvm/internal/compiler TestGlobalsSBF": 7.53, + "gosvm/internal/compiler TestGoSemantics": 0.35, + "gosvm/internal/compiler TestGrowthModelMatchesCompiledAppend": 0.01, + "gosvm/internal/compiler TestGrowthModelMatchesGoRuntime": 4.58, + "gosvm/internal/compiler TestGrowthRuntimeMatchesModel": 2.37, + "gosvm/internal/compiler TestHeapMovesExported": 0.01, + "gosvm/internal/compiler TestImportedMainPackage": 0.0, + "gosvm/internal/compiler TestImportedMethodsAndBorrowedResults": 0.3, + "gosvm/internal/compiler TestImportedMultipleResults": 0.53, + "gosvm/internal/compiler TestImportedPackageRejections": 0.01, + "gosvm/internal/compiler TestImportedSDKAndEntryIdentity": 4.84, + "gosvm/internal/compiler TestImportedValuesAndCalls": 6.41, + "gosvm/internal/compiler TestInitEvalEdgesSBF": 2.86, + "gosvm/internal/compiler TestInitEvalPartialPackage": 5.69, + "gosvm/internal/compiler TestInitEvalRuntimeInit": 0.0, + "gosvm/internal/compiler TestInitEvalStops": 17.52, + "gosvm/internal/compiler TestInitImageCheckedProgram": 0.01, + "gosvm/internal/compiler TestInitImageHeapAccounting": 34.54, + "gosvm/internal/compiler TestIntValuesDifferential": 8.99, + "gosvm/internal/compiler TestIntValuesFixture": 0.07, + "gosvm/internal/compiler TestIntValuesSBF": 8.22, + "gosvm/internal/compiler TestIntegerChecksAccept": 0.03, + "gosvm/internal/compiler TestIntegerChecksReject": 0.01, + "gosvm/internal/compiler TestInterfaceAcceptedForms": 5.47, + "gosvm/internal/compiler TestInterfaceBoxingHeap": 7.33, + "gosvm/internal/compiler TestInterfaceCrossPackage": 0.48, + "gosvm/internal/compiler TestInterfaceDifferential": 15.34, + "gosvm/internal/compiler TestInterfaceHeapMoves": 0.0, + "gosvm/internal/compiler TestInterfaceRejections": 0.06, + "gosvm/internal/compiler TestInterfaceRuntimeOnlyWhenUsed": 0.6, + "gosvm/internal/compiler TestInterfaceSBF": 11.66, + "gosvm/internal/compiler TestKeccak256SBF": 1.53, + "gosvm/internal/compiler TestKeccakReference": 0.0, + "gosvm/internal/compiler TestLargeTablesAccepted": 4.33, + "gosvm/internal/compiler TestLargeTablesRejected": 0.02, + "gosvm/internal/compiler TestMangleIsInjective": 0.0, + "gosvm/internal/compiler TestMapAcceptedForms": 6.82, + "gosvm/internal/compiler TestMapDifferential": 37.28, + "gosvm/internal/compiler TestMapDocumentationExample": 0.12, + "gosvm/internal/compiler TestMapHeap": 62.34, + "gosvm/internal/compiler TestMapHeapMoves": 0.13, + "gosvm/internal/compiler TestMapRejections": 0.08, + "gosvm/internal/compiler TestMapRuntimeOnlyWhenUsed": 0.94, + "gosvm/internal/compiler TestMapSBF": 36.86, + "gosvm/internal/compiler TestMaxAccountsOptIn": 0.07, + "gosvm/internal/compiler TestMemmoveHelperCompiles": 1.08, + "gosvm/internal/compiler TestMemmoveSBF": 3.38, + "gosvm/internal/compiler TestMemoryDifferential": 10.86, + "gosvm/internal/compiler TestMemoryLegacyUnchanged": 0.0, + "gosvm/internal/compiler TestMemoryReadOnlyWritesSBF": 2.28, + "gosvm/internal/compiler TestMemoryRuntimeSBF": 1.39, + "gosvm/internal/compiler TestMemorySBF": 43.0, + "gosvm/internal/compiler TestMemorySyscallRoutinesCompileForSBF": 0.41, + "gosvm/internal/compiler TestMixedAcceptedForms": 9.64, + "gosvm/internal/compiler TestMixedDifferential": 25.99, + "gosvm/internal/compiler TestMixedHeapRuntimeOnlyForInstances": 0.0, + "gosvm/internal/compiler TestMixedInstanceHeapMoves": 0.01, + "gosvm/internal/compiler TestMixedRejections": 0.02, + "gosvm/internal/compiler TestMixedSBF": 9.03, + "gosvm/internal/compiler TestModernRebuildIsByteIdentical": 7.09, + "gosvm/internal/compiler TestModuleImportFailures": 0.16, + "gosvm/internal/compiler TestModuleImportsAndCache": 0.36, + "gosvm/internal/compiler TestMultiFileValueSemantics": 0.09, + "gosvm/internal/compiler TestMultiplyBuiltinNativeDifferential": 0.72, + "gosvm/internal/compiler TestNilSliceContexts": 3.93, + "gosvm/internal/compiler TestNoGenericsLowersToItself": 0.0, + "gosvm/internal/compiler TestOutOfMemoryBoundaries": 4.67, + "gosvm/internal/compiler TestPackageSourcesAndCache": 0.15, + "gosvm/internal/compiler TestPackedStoreNativeCDifferential": 11.94, + "gosvm/internal/compiler TestPackedStoreRecognition": 0.05, + "gosvm/internal/compiler TestPanicLogLine": 0.54, + "gosvm/internal/compiler TestPanicSites": 0.01, + "gosvm/internal/compiler TestPlatformWordsInsideFilename": 0.0, + "gosvm/internal/compiler TestPointerArrayLengthAndReceiverEffects": 0.71, + "gosvm/internal/compiler TestPointerLifetimeRejections": 0.03, + "gosvm/internal/compiler TestPointerToPointerBorrows": 0.0, + "gosvm/internal/compiler TestPointerValuesDifferential": 0.26, + "gosvm/internal/compiler TestRangeAcceptedForms": 0.06, + "gosvm/internal/compiler TestRangeDifferential": 2.25, + "gosvm/internal/compiler TestRangeRejections": 0.01, + "gosvm/internal/compiler TestRangeUint16SBF": 24.43, + "gosvm/internal/compiler TestRealLibrariesDifferential": 35.57, + "gosvm/internal/compiler TestRealLibrariesInitSBF": 76.08, + "gosvm/internal/compiler TestRealLibrariesSBF": 70.3, + "gosvm/internal/compiler TestRealLibrariesWholePackages": 18.73, + "gosvm/internal/compiler TestRealLibraryFormsCheck": 0.01, + "gosvm/internal/compiler TestRealLibraryFormsDifferential": 4.72, + "gosvm/internal/compiler TestRealLibraryFormsSBF": 7.46, + "gosvm/internal/compiler TestRejectUnsupported": 0.03, + "gosvm/internal/compiler TestResolverFlagLikeImport": 0.05, + "gosvm/internal/compiler TestRuntimeGuards": 8.9, + "gosvm/internal/compiler TestSBFUnresolvedSymbolGuard": 0.0, + "gosvm/internal/compiler TestSDK2AggregateMemory": 0.8, + "gosvm/internal/compiler TestSDK2ArrayValueSemantics": 2.09, + "gosvm/internal/compiler TestSDK2ClockNativeCDifferential": 6.56, + "gosvm/internal/compiler TestSDK2GetReturnDataNativeCDifferential": 1.35, + "gosvm/internal/compiler TestSDK2InvokeBoundaryDifferential": 0.9, + "gosvm/internal/compiler TestSDK2Keccak256NativeCDifferential": 0.98, + "gosvm/internal/compiler TestSDK2LifecycleLoaderSelection": 0.05, + "gosvm/internal/compiler TestSDK2LogNativeCDifferential": 0.51, + "gosvm/internal/compiler TestSDK2LogRuntimeEmittedOnlyWhenCalled": 0.04, + "gosvm/internal/compiler TestSDK2MoveLamportsEmittedOnlyWhenCalled": 0.03, + "gosvm/internal/compiler TestSDK2MoveLamportsNativeCDifferential": 0.82, + "gosvm/internal/compiler TestSDK2OwnedLifecycleDifferential": 1.56, + "gosvm/internal/compiler TestSDK2RentCalculationC": 1.67, + "gosvm/internal/compiler TestSDK2ReturnDataNativeCDifferential": 8.44, + "gosvm/internal/compiler TestSDK2Secp256k1RecoverNativeCDifferential": 0.78, + "gosvm/internal/compiler TestSDKATACreateSBF": 4.02, + "gosvm/internal/compiler TestSDKAccountDecoderCapacityAndAliases": 15.16, + "gosvm/internal/compiler TestSDKContext": 0.19, + "gosvm/internal/compiler TestSDKHashBounds": 0.43, + "gosvm/internal/compiler TestSDKNilSliceArguments": 0.29, + "gosvm/internal/compiler TestSDKSystemPDASBF": 10.26, + "gosvm/internal/compiler TestSDKTokenCPISBF": 2.12, + "gosvm/internal/compiler TestSDKTokenExtensionsSBF": 5.54, + "gosvm/internal/compiler TestSDKVersionsAndNativeOnlyTypes": 0.02, + "gosvm/internal/compiler TestSDKViewCapacities": 0.69, + "gosvm/internal/compiler TestScalarArraysDifferential": 1.51, + "gosvm/internal/compiler TestSecp256k1RecoverSBF": 1.22, + "gosvm/internal/compiler TestSharedExampleDifferential": 2.05, + "gosvm/internal/compiler TestSignedRuntimeOnlyWhenUsed": 0.01, + "gosvm/internal/compiler TestSliceArrayCheck": 0.02, + "gosvm/internal/compiler TestSliceArrayDifferential": 17.59, + "gosvm/internal/compiler TestSliceArrayRejections": 0.0, + "gosvm/internal/compiler TestSliceArraySBF": 3.73, + "gosvm/internal/compiler TestSliceViewArrayBoundary": 0.6, + "gosvm/internal/compiler TestSliceViewRejections": 0.0, + "gosvm/internal/compiler TestSliceViewsDifferential": 6.31, + "gosvm/internal/compiler TestStdlibAPI": 0.2, + "gosvm/internal/compiler TestStdlibConstantsOnly": 0.02, + "gosvm/internal/compiler TestStdlibDifferential": 23.67, + "gosvm/internal/compiler TestStdlibIdentity": 0.0, + "gosvm/internal/compiler TestStdlibImportForms": 0.21, + "gosvm/internal/compiler TestStdlibIntrinsics": 0.17, + "gosvm/internal/compiler TestStdlibPackagesList": 0.12, + "gosvm/internal/compiler TestStdlibProvenance": 0.01, + "gosvm/internal/compiler TestStdlibRejections": 0.12, + "gosvm/internal/compiler TestStdlibSBF": 54.4, + "gosvm/internal/compiler TestStdlibUnicodeTables": 0.0, + "gosvm/internal/compiler TestStringAcceptedForms": 3.5, + "gosvm/internal/compiler TestStringDifferential": 34.42, + "gosvm/internal/compiler TestStringDocumentationExample": 6.67, + "gosvm/internal/compiler TestStringHeap": 12.74, + "gosvm/internal/compiler TestStringIntegerConversions": 2.08, + "gosvm/internal/compiler TestStringRejections": 0.03, + "gosvm/internal/compiler TestStringRuntimeOnlyWhenUsed": 0.23, + "gosvm/internal/compiler TestStringSBF": 19.6, + "gosvm/internal/compiler TestTrimDropsUnreachable": 1.12, + "gosvm/internal/compiler TestTrimEntryPackage": 0.0, + "gosvm/internal/compiler TestTrimModules": 1.67, + "gosvm/internal/compiler TestTrimRejections": 3.03, + "gosvm/internal/compiler TestTrimWarnings": 1.85, + "gosvm/internal/compiler TestTypeCheckBeforeEntryGeneration": 0.02, + "gosvm/internal/compiler TestTypeInspectionIsNotSubsetCertification": 0.02, + "gosvm/internal/compiler TestUint16Checks": 0.0, + "gosvm/internal/compiler TestUint16Differential": 2.84, + "gosvm/internal/compiler TestUint16TypedefOnlyWhenUsed": 0.0, + "gosvm/internal/compiler TestValidateTrim": 0.0, + "gosvm/internal/compiler TestValueTypeRejections": 0.02, + "gosvm/internal/compiler TestValueTypesAcceptedForms": 6.0, + "gosvm/internal/compiler TestValueTypesDifferential": 30.89, + "gosvm/internal/compiler TestValueTypesRejections": 0.07, + "gosvm/internal/compiler TestValueTypesSBF": 8.23, + "gosvm/internal/compiler TestVariadicForms": 0.01, + "gosvm/internal/compiler TestVariadicLowering": 0.0, + "gosvm/internal/compiler TestVariadicRejections": 0.0, + "gosvm/internal/compiler TestViewAggregateReturn": 0.43, + "gosvm/internal/compiler TestViewCapacityBoundary": 0.43, + "gosvm/internal/compiler TestWideQuoteDifferential": 0.64, + "gosvm/internal/compiler TestZeroLoopForms": 0.07, + "gosvm/internal/features TestAllocationCounters": 0.0, + "gosvm/internal/features TestCompoundCounters": 0.0, + "gosvm/internal/features TestDeterministicOutput": 0.49, + "gosvm/internal/features TestFullSwapFacts": 0.29, + "gosvm/internal/features TestFunctionValueCounters": 0.0, + "gosvm/internal/features TestFunctionValueUses": 0.0, + "gosvm/internal/features TestGenerics": 0.2, + "gosvm/internal/features TestGlobalCounters": 0.0, + "gosvm/internal/features TestGlobalUses": 0.01, + "gosvm/internal/features TestInlineProgram": 0.0, + "gosvm/internal/features TestInterfaceCounters": 0.0, + "gosvm/internal/features TestMapCounters": 0.0, + "gosvm/internal/features TestMapFunctionCounters": 0.0, + "gosvm/internal/features TestPointerConversionCounter": 0.0, + "gosvm/internal/features TestSignedIntegers": 0.0, + "gosvm/internal/features TestSliceArrayConversionCounter": 0.0, + "gosvm/internal/features TestStdlibCalls": 0.14, + "gosvm/internal/features TestStdlibUses": 0.08, + "gosvm/internal/features TestStringCounters": 0.0, + "gosvm/internal/features TestTrimmedUses": 0.81, + "gosvm/internal/features TestUsesSummary": 0.46, + "gosvm/internal/features TestValueTypeCounters": 0.0, + "gosvm/internal/library TestBendBuildKey": 0.02, + "gosvm/internal/library TestBendFogoV157Accepted": 0.0, + "gosvm/internal/library TestBuildBendSourceFake": 0.09, + "gosvm/internal/library TestBuildRustLibrary": 0.0, + "gosvm/internal/library TestBuildRustRefusals": 0.0, + "gosvm/internal/library TestInspectBendCheckoutPrerequisites": 0.02, + "gosvm/internal/library TestParseBendBuild": 0.0, + "gosvm/internal/library TestProducerRequiresExplicitPinnedContract": 0.0, + "gosvm/internal/library TestPublishedBendContract": 0.0, + "gosvm/internal/library TestPublishedBendContractFlatLayout": 0.0, + "gosvm/internal/library TestRustFingerprintAndWrapper": 0.0, + "gosvm/internal/library TestRustToolchainMissing": 0.0, + "gosvm/internal/network TestCheckDeployableFollowsLiveFeatures": 0.01, + "gosvm/internal/network TestEnsureKeypairRoundTrips": 0.0, + "gosvm/internal/network TestFundingMessage": 0.0, + "gosvm/internal/network TestProgramDataAddress": 0.0, + "gosvm/internal/network TestSignMatchesInvokeEncoding": 0.0, + "gosvm/internal/network TestUpgradeDecisions": 0.0, + "gosvm/internal/project TestAddBendLibrary": 0.0, + "gosvm/internal/project TestAddRustLibrary": 0.0, + "gosvm/internal/project TestBendSourceDeclarationsValidate": 0.0, + "gosvm/internal/project TestBendSourceIntegration": 0.0, + "gosvm/internal/project TestBendSourceNeedsCheckout": 0.01, + "gosvm/internal/project TestBendSourceSyncFake": 0.0, + "gosvm/internal/project TestCustomModuleAndDiscovery": 0.31, + "gosvm/internal/project TestExplicitSDK2AndLegacySnapshot": 1.67, + "gosvm/internal/project TestExplicitTargetMigrationPreservesApplicationAndWire": 0.29, + "gosvm/internal/project TestGenerationChecksBeforeWriting": 0.01, + "gosvm/internal/project TestGoModuleSyntax": 0.0, + "gosvm/internal/project TestHeapBytesSetting": 0.01, + "gosvm/internal/project TestLibraryDeclarationsValidate": 0.0, + "gosvm/internal/project TestLoadSchemaFullSwap": 0.12, + "gosvm/internal/project TestLoadSchemaRejectsSchema1": 0.01, + "gosvm/internal/project TestNetworkTargetsResolveAndValidate": 0.02, + "gosvm/internal/project TestSDK1RejectsNewBoundaryCalls": 0.01, + "gosvm/internal/project TestSDK2FixtureScaffold": 0.7, + "gosvm/internal/project TestSDKDriftRejected": 0.01, + "gosvm/internal/project TestSchema2AllInitTargetsValidatedBeforeCPI": 1.32, + "gosvm/internal/project TestSchema2CheckedConstraintDiagnostics": 0.87, + "gosvm/internal/project TestSchema2CheckedTokenAndPDAGeneration": 1.94, + "gosvm/internal/project TestSchema2HistoricalManifestValidation": 0.68, + "gosvm/internal/project TestSchema2InvalidDeclarations": 1.72, + "gosvm/internal/project TestSchema2LayoutVersionsAreGuarded": 0.18, + "gosvm/internal/project TestSchema2LifecycleDiagnostics": 0.41, + "gosvm/internal/project TestSchema2LifecycleGeneration": 1.2, + "gosvm/internal/project TestSchema2NamedScalarArrayWire": 0.37, + "gosvm/internal/project TestSchema2PDAAdapterOnlyImport": 0.23, + "gosvm/internal/project TestSchema2ReadonlyAliasAndProgramIdentity": 0.35, + "gosvm/internal/project TestSchema2RejectsCountsBeyondLoaderABI": 0.08, + "gosvm/internal/project TestSchema2RejectsGenericWireTypes": 0.33, + "gosvm/internal/project TestSchema2RejectsMaps": 0.28, + "gosvm/internal/project TestSchema2RejectsPlatformSizedIntegers": 0.54, + "gosvm/internal/project TestSchema2RejectsStrings": 0.45, + "gosvm/internal/project TestSchema2SignedFieldsAndSeeds": 0.58, + "gosvm/internal/project TestSchema2SourceDiagnosticsBeforePublication": 0.36, + "gosvm/internal/project TestSchema2StandaloneCanonicalLayouts": 1.48, + "gosvm/internal/project TestSchema2Uint16FieldsAndSeeds": 1.08, + "gosvm/internal/project TestStandaloneStarter": 0.3, + "gosvm/internal/project TestTrimSetting": 0.03, + "gosvm/internal/project TestWireFieldsAndSchemaChanges": 0.19, + "gosvm/internal/runner TestAtomicInstallAndPinnedIntegrity": 0.02, + "gosvm/internal/runner TestBusyInstallPreservesLock": 0.0, + "gosvm/internal/runner TestDownloadRejectsWrongBytesBeforeExecution": 0.09, + "gosvm/internal/runner TestEmbeddedPinsAndPackageDetection": 0.33, + "gosvm/internal/runner TestFailedSmokeAndCancellationDoNotPublish": 0.0, + "gosvm/internal/runner TestGzipTrailerAndInstalledFileType": 0.0, + "gosvm/internal/runner TestRejectArchivesBeforeExecution": 0.01, + "gosvm/internal/runner TestReleasePinAcceptsHistoricalInstall": 0.0, + "gosvm/internal/runner TestWrongPlatformArchiveIsNamed": 0.0, + "gosvm/internal/sbftest TestFastFailureRemovesPreviousPassingReport": 0.0, + "gosvm/internal/sbftest TestFastSelectionRejectsEmptyAndInvalidMatches": 0.0, + "gosvm/internal/sbftest TestFixtureTransactionMergesKeysAndPreservesReferences": 0.01, + "gosvm/internal/sbftest TestGeneralChecksMetadataAndExactErrorCategories": 0.0, + "gosvm/internal/sbftest TestGeneralFixturesRejectAmbiguousAndUncheckedInputs": 0.0, + "gosvm/internal/sbftest TestGeneralReportsAreClearedWithoutOverwritingInputs": 0.0, + "gosvm/internal/sbftest TestGeneralSysvarControlsValidateBeforeAnySelectedScenario": 0.01, + "gosvm/internal/sbftest TestNativeProgramAliasesAndDeclaredTransactions": 0.0, + "gosvm/internal/sbftest TestSimulationStateOverridesKeepCommittedChecks": 0.0, + "gosvm/internal/targets TestVersionAndMachineAreBothRequired": 0.0, + "gosvm/internal/testvm TestRunnerProfileIsValidAndOverrideIsExplicit": 0.0, + "gosvm/internal/testvm TestRunnerSelectionPerProfile": 0.04, + "gosvm/internal/testvm TestRunnerSelectionPrecedenceAndDamagedManagedCache": 0.04, + "gosvm/internal/testvm TestSVMControlsIntegration": 0.0, + "gosvm/internal/testvm TestSelectionAndVersion": 0.0, + "gosvm/internal/testvm TestSessionCancellationUnblocksRead": 0.1, + "gosvm/internal/testvm TestSessionChecksEveryCallIdentityAndError": 0.02, + "gosvm/internal/testvm TestSessionHelperProcess": 0.0, + "gosvm/internal/testvm TestSessionRejectsCorruptResponses": 0.01, + "gosvm/internal/testvm TestSysvarParsingPreservesIntegerLimitsAndPartialControls": 0.0, + "gosvm/internal/testvm TestSysvarParsingRejectsIncompleteAmbiguousAndOutOfRangeValues": 0.0, + "gosvm/internal/testvm TestTargetRuntimeContract": 0.0, + "gosvm/internal/toolchain TestAllowlistExtraction": 0.0, + "gosvm/internal/toolchain TestBadArchiveDoesNotPublish": 0.0, + "gosvm/internal/toolchain TestModernDownloadInstallsOnlyPinnedBackend": 0.01, + "gosvm/internal/toolchain TestModernLocalArchiveAndRejections": 0.02, + "gosvm/internal/toolchain TestModernReceiptSources": 0.0, + "gosvm/internal/toolchain TestOfficialArchivesPerHost": 0.0, + "gosvm/internal/toolchain TestOfficialFullPins": 0.0, + "gosvm/internal/toolchain TestOfficialModernPins": 0.0, + "gosvm/internal/toolchain TestRejectUnsafeOrIncompleteBackend": 0.0, + "gosvm/internal/toolchain TestRustFullTreeInstall": 0.02, + "gosvm/internal/toolchain TestRustFullTreeLocalArchiveWithExistingBackend": 0.02, + "gosvm/internal/toolchain TestRustFullTreeRejections": 0.08, + "gosvm/internal/toolchain TestRustPlatformToolsReceipt": 0.0, + "gosvm/sdk/ata TestAddressMatchesFindProgramAddress": 0.01, + "gosvm/sdk/ata TestCreateDelegatesAddressValidation": 0.0, + "gosvm/sdk/ata TestCreateEncoding": 0.0, + "gosvm/sdk/ata TestCreateGuards": 0.0, + "gosvm/sdk/cpi TestBoundedMetasAndSignerGroups": 0.0, + "gosvm/sdk/cpi TestInvokeSingleSignedUnsignedAndGuards": 0.0, + "gosvm/sdk/cpi TestInvokeValidationAndExactCallbackStatus": 0.0, + "gosvm/sdk/cpi TestSingleSignerEncodingAndRejectedAdds": 0.07, + "gosvm/sdk/fixture TestBase58Keys": 0.0, + "gosvm/sdk/fixture TestBuildErrors": 0.0, + "gosvm/sdk/fixture TestDeterministicKeys": 0.0, + "gosvm/sdk/fixture TestFindProgramAddressVectors": 0.0, + "gosvm/sdk/fixture TestOnCurve": 0.02, + "gosvm/sdk/fixture TestRent": 0.0, + "gosvm/sdk/fixture TestSuiteLoadsInRunnerValidation": 0.01, + "gosvm/sdk/pda TestAddressAndFailureOutput": 0.0, + "gosvm/sdk/pda TestExplicitSeedEncodingAndBounds": 0.0, + "gosvm/sdk/pda TestFindAddressMatchesSolana": 0.14, + "gosvm/sdk/pda TestFindAddressStatuses": 0.0, + "gosvm/sdk/system TestRentCurrentSysvar": 0.0, + "gosvm/sdk/system TestRentMinimumDifferential": 0.05, + "gosvm/sdk/system TestSystemAllocateAssignEncoding": 0.0, + "gosvm/sdk/system TestSystemCreateAndTransferEncoding": 0.0, + "gosvm/sdk/system TestSystemCreatePDAFundedAndUnfunded": 0.0, + "gosvm/sdk/system TestSystemFreeRentRetainsAccount": 0.0, + "gosvm/sdk/system TestSystemPDAAndCreationGuards": 0.0, + "gosvm/sdk/system TestSystemTransferSignedEncodingAndGuards": 0.0, + "gosvm/sdk/token TestCheckedBalanceRevalidation": 0.0, + "gosvm/sdk/token TestCheckedInstructionEncodings": 0.0, + "gosvm/sdk/token TestCheckedInstructionGuards": 0.0, + "gosvm/sdk/token TestCheckedInstructionsClassicAndSelfAuthority": 0.0, + "gosvm/sdk/token TestCheckedTransferAndCurrentReads": 0.0, + "gosvm/sdk/token TestFindExtensionAndTransferFeeConfig": 0.0, + "gosvm/sdk/token TestProgramPredicates": 0.0, + "gosvm/sdk/token TestReadAccountLayouts": 0.0, + "gosvm/sdk/token TestReadMintLayouts": 0.0, + "gosvm/sdk/token TestTokenCloseAuthorityAndCurrentReference": 0.0, + "gosvm/sdk/token TestTokenCreateCurrentStorageAndCPIEncoding": 0.0, + "gosvm/sdk/token TestTokenCreatePreconditionsAndDownstreamFailures": 0.0, + "gosvm/sdk/token TestTokenRevalidationBeforeInvoke": 0.0, + "gosvm/sdk/token TestTransferFeeArithmetic": 0.05, + "gosvm/solana TestClockCurrentWordsAndFailedOutput": 0.0, + "gosvm/solana TestGetReturnDataCopiesPrefixAndSetter": 0.0, + "gosvm/solana TestGetReturnDataOverlap": 0.0, + "gosvm/solana TestKeccak256BoundsAndCopy": 0.0, + "gosvm/solana TestLogMessages": 0.01, + "gosvm/solana TestLogRejectsInvalidUTF8": 0.01, + "gosvm/solana TestMoveLamportsRules": 0.0, + "gosvm/solana TestOwnedLifecycleAliases": 0.0, + "gosvm/solana TestOwnedLifecycleFailureAtomicity": 0.0, + "gosvm/solana TestRentBoundaryPreservesFailedOutput": 0.0, + "gosvm/solana TestReturnDataBoundsCopiesAndUnavailable": 0.0, + "gosvm/solana TestSHA256Regions": 0.0, + "gosvm/solana TestSecp256k1RecoverBoundsStatusesAndCopy": 0.0 + } +}