Files
wazero/examples/wasi_test.go
Crypt Keeper 0186e41b27 Consolidates API to config input types (#280)
This makes instantiating host or wasm-defined modules similar, by using
XXXConfig types. Doing so also allows configuration engines to seed
properties.

Since decoded modules are only usable during instantiation, this pushes
decoding inside those functions. By doing so, the API is easier to use
as it has less choices and less errors to catch. Detection is done
internally by peeking at the magic number.

See https://github.com/tetratelabs/wazero/issues/279

Signed-off-by: Adrian Cole <adrian@tetrate.io>
2022-02-23 16:41:32 +08:00

63 lines
2.0 KiB
Go

package examples
import (
"bytes"
"fmt"
"testing"
"github.com/stretchr/testify/require"
"github.com/tetratelabs/wazero"
"github.com/tetratelabs/wazero/wasi"
"github.com/tetratelabs/wazero/wasm"
)
func Test_WASI(t *testing.T) {
// built-in WASI function to write a random value to memory
randomGet := func(ctx wasm.ModuleContext, buf, bufLen uint32) wasi.Errno {
panic("unimplemented")
}
stdout := new(bytes.Buffer)
goFunc := func(ctx wasm.ModuleContext) {
// Write 8 random bytes to memory using WASI.
errno := randomGet(ctx, 0, 8)
require.Equal(t, wasi.ErrnoSuccess, errno)
// Read them back and print it in hex!
random, ok := ctx.Memory().ReadUint64Le(0)
require.True(t, ok)
_, _ = fmt.Fprintf(stdout, "random: %x\n", random)
}
store := wazero.NewStore()
// Host functions can be exported as any module name, including the empty string.
env := &wazero.HostModuleConfig{Name: "", Functions: map[string]interface{}{"random": goFunc}}
_, err := wazero.InstantiateHostModule(store, env)
// Configure WASI and implement the function to use it
we, err := wazero.InstantiateHostModule(store, wazero.WASISnapshotPreview1())
require.NoError(t, err)
randomGetFn := we.Function("random_get")
// Implement the function pointer. This mainly shows how you can decouple a host function dependency.
randomGet = func(ctx wasm.ModuleContext, buf, bufLen uint32) wasi.Errno {
res, err := randomGetFn(ctx, uint64(buf), uint64(bufLen))
require.NoError(t, err)
return wasi.Errno(res[0])
}
// The "random" function was imported as $random in Wasm. Since it was marked as the start
// function, it is invoked on instantiation. Ensure that worked: "random" was called!
_, err = wazero.InstantiateModule(store, &wazero.ModuleConfig{Source: []byte(`(module $wasi
(import "wasi_snapshot_preview1" "random_get"
(func $wasi.random_get (param $buf i32) (param $buf_len i32) (result (;errno;) i32)))
(import "" "random" (func $random))
(memory 1)
(start $random)
)`)})
require.NoError(t, err)
require.Contains(t, stdout.String(), "random: ")
}