github.com/bananabytelabs/wazero@v0.0.0-20240105073314-54b22a776da8/experimental/gojs/example/cat_test.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"os"
     7  	"os/exec"
     8  	"testing"
     9  
    10  	"github.com/bananabytelabs/wazero/internal/testing/maintester"
    11  	"github.com/bananabytelabs/wazero/internal/testing/require"
    12  )
    13  
    14  // Test_main ensures the following will work:
    15  //
    16  //	go run cat.go /test.txt
    17  func Test_main(t *testing.T) {
    18  	stdout, stderr := maintester.TestMain(t, main, "cat", "test.txt")
    19  	require.Equal(t, "", stderr)
    20  	require.Equal(t, "greet filesystem\n", stdout)
    21  }
    22  
    23  // TestMain compiles the wasm on-demand, which uses the runner's Go as opposed
    24  // to a binary checked in, which would be pinned to one version. This is
    25  // separate from Test_main to show that compilation doesn't dominate the
    26  // execution time.
    27  func TestMain(m *testing.M) {
    28  	// Notably our scratch containers don't have go, so don't fail tests.
    29  	if err := compileFromGo(); err != nil {
    30  		log.Println("Skipping tests due to:", err)
    31  		os.Exit(0)
    32  	}
    33  	os.Exit(m.Run())
    34  }
    35  
    36  // compileFromGo compiles "stars/main.go" on demand as the binary generated is
    37  // too big (>7MB) to check into the source tree.
    38  func compileFromGo() error {
    39  	cmd := exec.Command("go", "build", "-o", "main.wasm", ".")
    40  	cmd.Dir = "cat"
    41  	cmd.Env = append(os.Environ(), "GOARCH=wasm", "GOOS=js", "GOWASM=satconv,signext")
    42  	if out, err := cmd.CombinedOutput(); err != nil {
    43  		return fmt.Errorf("go build: %v\n%s", err, out)
    44  	}
    45  	return nil
    46  }