github.com/tetratelabs/wazero@v1.7.3-0.20240513003603-48f702e154b5/imports/wasi_snapshot_preview1/wasi_snapshot_preview1_test.go (about) 1 package wasi_snapshot_preview1_test 2 3 import ( 4 "context" 5 "fmt" 6 "os" 7 "os/exec" 8 "path" 9 "testing" 10 "time" 11 12 "github.com/tetratelabs/wazero" 13 ) 14 15 func TestMain(m *testing.M) { 16 var err error 17 if wasmGo, err = compileWasip1Wasm(); err != nil { 18 println("go: skipping due compilation error:", err) 19 } 20 os.Exit(m.Run()) 21 } 22 23 // runtimeCfg is a shared runtime configuration for tests within this package to reduce the compilation time of the binary. 24 var runtimeCfg = wazero.NewRuntimeConfig().WithCompilationCache(wazero.NewCompilationCache()) 25 26 // compileWasip1Wasm allows us to generate a binary with runtime.GOOS=wasip1 27 // and runtime.GOARCH=wasm. This intentionally does so on-demand, because the 28 // wasm is too big to check in. 29 func compileWasip1Wasm() ([]byte, error) { 30 // Prepare the working directory. 31 workdir, err := os.MkdirTemp("", "wasi") 32 if err != nil { 33 return nil, err 34 } 35 defer os.RemoveAll(workdir) 36 37 ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) 38 defer cancel() 39 40 binPath := path.Join(workdir, "wasi.wasm") 41 cmd := exec.CommandContext(ctx, "go", "build", "-o", binPath, ".") //nolint:gosec 42 cmd.Env = append(os.Environ(), "GOOS=wasip1", "GOARCH=wasm") 43 cmd.Dir = "testdata/go" 44 out, err := cmd.CombinedOutput() 45 if err != nil { 46 return nil, fmt.Errorf("couldn't compile %s: %w", string(out), err) 47 } 48 49 bin, err := os.ReadFile(binPath) //nolint:gosec 50 if err != nil { 51 return nil, err 52 } 53 54 // Proactively compile the binary to reduce the test time. 55 r := wazero.NewRuntimeWithConfig(context.Background(), runtimeCfg) 56 defer r.Close(context.Background()) 57 _, err = r.CompileModule(context.Background(), bin) 58 return bin, err 59 }