Files
wazero/internal/integration_test/fuzz/wazerolib/nodiff_test.go
Takeshi Yoneda 2b8047770f fuzz: ensures mutable global match (#1783)
Signed-off-by: Takeshi Yoneda <t.y.mathetake@gmail.com>
2023-10-16 08:40:26 +09:00

210 lines
6.5 KiB
Go

package main
import (
"os"
"testing"
"github.com/tetratelabs/wazero/internal/testing/require"
"github.com/tetratelabs/wazero/internal/wasm"
)
// TestReRunFailedRequireNoDiffCase re-runs the failed case specified by WASM_BINARY_NAME in testdata directory.
func TestReRunFailedRequireNoDiffCase(t *testing.T) {
binaryPath := os.Getenv("WASM_BINARY_PATH")
wasmBin, err := os.ReadFile(binaryPath)
if err != nil {
t.Skip(err)
}
requireNoDiff(wasmBin, true, func(err error) { require.NoError(t, err) })
}
func Test_ensureMutableGlobalsMatch(t *testing.T) {
for _, tc := range []struct {
name string
cm, im *wasm.ModuleInstance
expErr string
}{
{
name: "no globals",
cm: &wasm.ModuleInstance{},
im: &wasm.ModuleInstance{},
},
{
name: "i32 match",
cm: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 10, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeI32}},
},
},
im: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 10, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeI32}},
},
},
},
{
name: "i32 match not match",
cm: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 10, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeI32}},
},
},
im: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 11, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeI32}},
},
},
expErr: "mutable global[1] value mismatch: 10 != 11",
},
{
name: "i64 match",
cm: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 1 << 62, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeI64}},
},
},
im: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 1 << 62, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeI64}},
},
},
},
{
name: "i64 match not match",
cm: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 1 << 62, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeI64}},
},
},
im: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 1 << 63, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeI64}},
},
},
expErr: "mutable global[2] value mismatch: 4611686018427387904 != 9223372036854775808",
},
{
name: "f32 match",
cm: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 10, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeF32}},
},
},
im: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 10, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeF32}},
},
},
},
{
name: "f32 match not match",
cm: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 10, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeF32}},
},
},
im: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 11, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeF32}},
},
},
expErr: "mutable global[1] value mismatch: 10 != 11",
},
{
name: "f64 match",
cm: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 1 << 62, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeF64}},
},
},
im: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 1 << 62, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeF64}},
},
},
},
{
name: "f64 match not match",
cm: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 1 << 62, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeF64}},
},
},
im: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 1 << 63, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeF64}},
},
},
expErr: "mutable global[2] value mismatch: 4611686018427387904 != 9223372036854775808",
},
{
name: "v128 match",
cm: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{ValHi: 1 << 62, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeV128}},
},
},
im: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{ValHi: 1 << 62, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeV128}},
},
},
},
{
name: "v128 match not match",
cm: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 1 << 62, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeV128}},
},
},
im: &wasm.ModuleInstance{
Globals: []*wasm.GlobalInstance{
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Type: wasm.GlobalType{ValType: wasm.ValueTypeV128}},
{Val: 1 << 62, ValHi: 1234, Type: wasm.GlobalType{Mutable: true, ValType: wasm.ValueTypeV128}},
},
},
expErr: "mutable global[2] value mismatch: (4611686018427387904,0) != (4611686018427387904,1234)",
},
} {
t.Run(tc.name, func(t *testing.T) {
var actualErr error
ensureMutableGlobalsMatch(tc.cm, tc.im, func(err error) {
actualErr = err
})
if tc.expErr == "" {
require.NoError(t, actualErr)
} else {
require.Equal(t, tc.expErr, actualErr.Error())
}
})
}
}