github.com/wasilibs/wazerox@v0.0.0-20240124024944-4923be63ab5f/internal/testing/maintester/maintester.go (about) 1 package maintester 2 3 import ( 4 "os" 5 "path" 6 "strings" 7 "testing" 8 9 "github.com/wasilibs/wazerox/internal/testing/require" 10 ) 11 12 func TestMain(t *testing.T, main func(), args ...string) (stdout, stderr string) { 13 // Setup files to capture stdout and stderr 14 tmp := t.TempDir() 15 16 stdoutPath := path.Join(tmp, "stdout.txt") 17 stdoutF, err := os.Create(stdoutPath) 18 require.NoError(t, err) 19 20 stderrPath := path.Join(tmp, "stderr.txt") 21 stderrF, err := os.Create(stderrPath) 22 require.NoError(t, err) 23 24 // Save the old os.XXX and revert regardless of the outcome. 25 oldArgs := os.Args 26 os.Args = args 27 oldStdout := os.Stdout 28 os.Stdout = stdoutF 29 oldStderr := os.Stderr 30 os.Stderr = stderrF 31 revertOS := func() { 32 os.Args = oldArgs 33 _ = stdoutF.Close() 34 os.Stdout = oldStdout 35 _ = stderrF.Close() 36 os.Stderr = oldStderr 37 } 38 defer revertOS() 39 40 // Run the main command. 41 main() 42 43 // Revert os.XXX so that test output is visible on failure. 44 revertOS() 45 46 // Capture any output and return it in a portable way (ex without windows newlines) 47 stdoutB, err := os.ReadFile(stdoutPath) 48 require.NoError(t, err) 49 stdout = strings.ReplaceAll(string(stdoutB), "\r\n", "\n") 50 51 stderrB, err := os.ReadFile(stderrPath) 52 require.NoError(t, err) 53 stderr = strings.ReplaceAll(string(stderrB), "\r\n", "\n") 54 55 return 56 }