提交 5319e5a5 编写于 作者: chai2010's avatar chai2010

test 切换到 wazero 包装函数

上级 473e0fcf
......@@ -4,20 +4,16 @@ package app
import (
"bytes"
"context"
"crypto/rand"
"fmt"
"os"
"strings"
"time"
"github.com/tetratelabs/wazero"
"github.com/tetratelabs/wazero/sys"
"wa-lang.org/wa/internal/app/waruntime"
"wa-lang.org/wa/internal/backends/compiler_wat"
"wa-lang.org/wa/internal/config"
"wa-lang.org/wa/internal/loader"
"wa-lang.org/wa/internal/wabt"
"wa-lang.org/wa/internal/wazero"
)
func (p *App) RunTest(pkgpath string, appArgs ...string) error {
......@@ -30,6 +26,8 @@ func (p *App) RunTest(pkgpath string, appArgs ...string) error {
startTime := time.Now()
mainPkg := prog.Pkgs[prog.Manifest.MainPkg]
wasmName := "unittest://" + pkgpath
wasmArgs := []string{}
if len(mainPkg.TestInfo.Files) == 0 {
fmt.Printf("? %s [no test files]\n", prog.Manifest.MainPkg)
......@@ -51,84 +49,25 @@ func (p *App) RunTest(pkgpath string, appArgs ...string) error {
return err
}
// 构建 wasm 可执行实例
// https://pkg.go.dev/github.com/tetratelabs/wazero@v1.0.0-pre.4#section-readme
var r wazero.Runtime
var ctx = context.Background()
var stdoutBuffer = new(bytes.Buffer)
var stderrBuffer = new(bytes.Buffer)
{
r = wazero.NewRuntime(ctx)
defer r.Close(ctx)
switch cfg.WaOS {
case config.WaOS_arduino:
if _, err = waruntime.ArduinoInstantiate(ctx, r); err != nil {
if s := sWithPrefix(stderrBuffer.String(), " "); s != "" {
fmt.Println(s)
}
return err
}
case config.WaOS_chrome:
if _, err = waruntime.ChromeInstantiate(ctx, r); err != nil {
if s := sWithPrefix(stderrBuffer.String(), " "); s != "" {
fmt.Println(s)
}
return err
}
case config.WaOS_wasi:
if _, err = waruntime.WasiInstantiate(ctx, r); err != nil {
if s := sWithPrefix(stderrBuffer.String(), " "); s != "" {
fmt.Println(s)
}
return err
}
}
}
conf := wazero.NewModuleConfig().
WithStdout(stdoutBuffer).
WithStderr(stderrBuffer).
WithStdin(os.Stdin).
WithRandSource(rand.Reader).
WithSysNanosleep().
WithSysNanotime().
WithSysWalltime().
WithArgs("a.out.wasm").
WithName("unittest")
// 执行 init 函数
compiled, err := r.CompileModule(ctx, wasmBytes)
m, err := wazero.BuildModule(cfg, wasmName, wasmBytes, wasmArgs...)
if err != nil {
return err
}
wasmIns, err := r.InstantiateModule(ctx, compiled, conf)
if err != nil {
if s := sWithPrefix(stderrBuffer.String(), " "); s != "" {
fmt.Println(s)
}
return err
}
defer m.Close()
// 执行测试函数
var firstError error
for _, t := range mainPkg.TestInfo.Tests {
stdoutBuffer.Reset()
stderrBuffer.Reset()
_, err := wasmIns.ExportedFunction(mainPkg.Pkg.Path() + "." + t.Name).Call(ctx)
_, stdout, stderr, err := m.RunFunc(mainPkg.Pkg.Path() + "." + t.Name)
if err != nil {
if s := sWithPrefix(stderrBuffer.String(), " "); s != "" {
fmt.Println(s)
if len(stderr) > 0 {
if s := sWithPrefix(string(stderr), " "); s != "" {
fmt.Println(s)
}
}
return err
}
stdout := stdoutBuffer.Bytes()
stderr := stderrBuffer.Bytes()
stdout = bytes.TrimSpace(stdout)
if t.Output != "" && t.Output == string(stdout) {
continue
......@@ -162,20 +101,16 @@ func (p *App) RunTest(pkgpath string, appArgs ...string) error {
}
}
for _, t := range mainPkg.TestInfo.Examples {
stdoutBuffer.Reset()
stderrBuffer.Reset()
_, err := wasmIns.ExportedFunction(mainPkg.Pkg.Path() + "." + t.Name).Call(ctx)
_, stdout, stderr, err := m.RunFunc(mainPkg.Pkg.Path() + "." + t.Name)
if err != nil {
if s := sWithPrefix(stderrBuffer.String(), " "); s != "" {
fmt.Println(s)
if len(stderr) > 0 {
if s := sWithPrefix(string(stderr), " "); s != "" {
fmt.Println(s)
}
}
return err
}
stdout := stdoutBuffer.Bytes()
stderr := stderrBuffer.Bytes()
stdout = bytes.TrimSpace(stdout)
if t.Output != "" && t.Output == string(stdout) {
continue
......
// 版权 @2022 凹语言 作者。保留所有权利。
package waruntime
package wazero
import (
"context"
......
// 版权 @2022 凹语言 作者。保留所有权利。
package waruntime
package wazero
import (
"context"
......
......@@ -14,7 +14,6 @@ import (
"github.com/tetratelabs/wazero"
"github.com/tetratelabs/wazero/api"
"wa-lang.org/wa/internal/app/waruntime"
"wa-lang.org/wa/internal/config"
)
......@@ -142,17 +141,17 @@ func (p *Module) buildModule() error {
switch p.cfg.WaOS {
case config.WaOS_arduino:
if _, err = waruntime.ArduinoInstantiate(p.wazeroCtx, p.wazeroRuntime); err != nil {
if _, err = ArduinoInstantiate(p.wazeroCtx, p.wazeroRuntime); err != nil {
p.wazeroInitErr = err
return err
}
case config.WaOS_chrome:
if _, err = waruntime.ChromeInstantiate(p.wazeroCtx, p.wazeroRuntime); err != nil {
if _, err = ChromeInstantiate(p.wazeroCtx, p.wazeroRuntime); err != nil {
p.wazeroInitErr = err
return err
}
case config.WaOS_wasi:
if _, err = waruntime.WasiInstantiate(p.wazeroCtx, p.wazeroRuntime); err != nil {
if _, err = WasiInstantiate(p.wazeroCtx, p.wazeroRuntime); err != nil {
p.wazeroInitErr = err
return err
}
......
// 版权 @2022 凹语言 作者。保留所有权利。
package waruntime
package wazero
import (
"context"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册