1 package gojs_test
2
3 import (
4 "bytes"
5 "context"
6 "fmt"
7 "strings"
8 "testing"
9
10 "github.com/tetratelabs/wazero"
11 "github.com/tetratelabs/wazero/experimental"
12 "github.com/tetratelabs/wazero/experimental/logging"
13 "github.com/tetratelabs/wazero/internal/gojs/config"
14 "github.com/tetratelabs/wazero/internal/testing/require"
15 )
16
17 func Test_exit(t *testing.T) {
18 t.Parallel()
19
20 var log bytes.Buffer
21 loggingCtx := context.WithValue(testCtx, experimental.FunctionListenerFactoryKey{},
22 logging.NewHostLoggingListenerFactory(&log, logging.LogScopeProc))
23
24 stdout, stderr, err := compileAndRun(loggingCtx, "exit", defaultConfig)
25
26 require.Zero(t, stderr)
27 require.EqualError(t, err, `module closed with exit_code(255)`)
28 require.Zero(t, stdout)
29 require.Equal(t, `==> go.runtime.wasmExit(code=255)
30 <==
31 `, logString(log))
32 }
33
34 func Test_goroutine(t *testing.T) {
35 t.Parallel()
36
37 stdout, stderr, err := compileAndRun(testCtx, "goroutine", defaultConfig)
38
39 require.Zero(t, stderr)
40 require.NoError(t, err)
41 require.Equal(t, `producer
42 consumer
43 `, stdout)
44 }
45
46 func Test_mem(t *testing.T) {
47 t.Parallel()
48
49 var log bytes.Buffer
50 loggingCtx := context.WithValue(testCtx, experimental.FunctionListenerFactoryKey{},
51 logging.NewHostLoggingListenerFactory(&log, logging.LogScopeMemory))
52
53 stdout, stderr, err := compileAndRun(loggingCtx, "mem", defaultConfig)
54
55 require.Zero(t, stderr)
56 require.NoError(t, err)
57 require.Zero(t, stdout)
58
59
60 require.Contains(t, logString(log), `==> go.runtime.resetMemoryDataView()
61 <==
62 `)
63 }
64
65 func Test_stdio(t *testing.T) {
66 t.Parallel()
67
68 input := "stdin\n"
69 stdout, stderr, err := compileAndRun(testCtx, "stdio", func(moduleConfig wazero.ModuleConfig) (wazero.ModuleConfig, *config.Config) {
70 return defaultConfig(moduleConfig.WithStdin(strings.NewReader(input)))
71 })
72
73 require.Equal(t, "stderr 6\n", stderr)
74 require.NoError(t, err)
75 require.Equal(t, "stdout 6\n", stdout)
76 }
77
78 func Test_stdio_large(t *testing.T) {
79 t.Parallel()
80
81
82 var log bytes.Buffer
83 loggingCtx := context.WithValue(testCtx, experimental.FunctionListenerFactoryKey{},
84 logging.NewHostLoggingListenerFactory(&log, logging.LogScopePoll))
85
86 size := 2 * 1024 * 1024
87 input := make([]byte, size)
88 stdout, stderr, err := compileAndRun(loggingCtx, "stdio", func(moduleConfig wazero.ModuleConfig) (wazero.ModuleConfig, *config.Config) {
89 return defaultConfig(moduleConfig.WithStdin(bytes.NewReader(input)))
90 })
91
92 require.NoError(t, err)
93 require.Equal(t, fmt.Sprintf("stderr %d\n", size), stderr)
94 require.Equal(t, fmt.Sprintf("stdout %d\n", size), stdout)
95
96
97
98
99 }
100
101 func Test_gc(t *testing.T) {
102 t.Parallel()
103
104 stdout, stderr, err := compileAndRun(testCtx, "gc", defaultConfig)
105
106 require.NoError(t, err)
107 require.Equal(t, "", stderr)
108 require.Equal(t, "before gc\nafter gc\n", stdout)
109 }
110
View as plain text