Files
wazero/internal/testing/binaryencoding/import_test.go
2023-03-13 12:50:36 +09:00

162 lines
3.5 KiB
Go

package binaryencoding
import (
"testing"
"github.com/tetratelabs/wazero/internal/testing/require"
"github.com/tetratelabs/wazero/internal/wasm"
)
func TestEncodeImport(t *testing.T) {
ptrOfUint32 := func(v uint32) *uint32 {
return &v
}
tests := []struct {
name string
input *wasm.Import
expected []byte
}{
{
name: "func no module, no name, type index 0",
input: &wasm.Import{ // e.g. (import "" "" (func (type 0)))
Type: wasm.ExternTypeFunc,
Module: "",
Name: "",
DescFunc: 0,
},
expected: []byte{wasm.ExternTypeFunc, 0x00, 0x00, 0x00},
},
{
name: "func module, no name, type index 0",
input: &wasm.Import{ // e.g. (import "$test" "" (func (type 0)))
Type: wasm.ExternTypeFunc,
Module: "test",
Name: "",
DescFunc: 0,
},
expected: []byte{
0x04, 't', 'e', 's', 't',
0x00,
wasm.ExternTypeFunc,
0x00,
},
},
{
name: "func module, name, type index 0",
input: &wasm.Import{ // e.g. (import "$math" "$pi" (func (type 0)))
Type: wasm.ExternTypeFunc,
Module: "math",
Name: "pi",
DescFunc: 0,
},
expected: []byte{
0x04, 'm', 'a', 't', 'h',
0x02, 'p', 'i',
wasm.ExternTypeFunc,
0x00,
},
},
{
name: "func module, name, type index 10",
input: &wasm.Import{ // e.g. (import "$math" "$pi" (func (type 10)))
Type: wasm.ExternTypeFunc,
Module: "math",
Name: "pi",
DescFunc: 10,
},
expected: []byte{
0x04, 'm', 'a', 't', 'h',
0x02, 'p', 'i',
wasm.ExternTypeFunc,
0x0a,
},
},
{
name: "global const",
input: &wasm.Import{
Type: wasm.ExternTypeGlobal,
Module: "math",
Name: "pi",
DescGlobal: wasm.GlobalType{ValType: wasm.ValueTypeF64},
},
expected: []byte{
0x04, 'm', 'a', 't', 'h',
0x02, 'p', 'i',
wasm.ExternTypeGlobal,
wasm.ValueTypeF64, 0x00, // 0 == const
},
},
{
name: "global var",
input: &wasm.Import{
Type: wasm.ExternTypeGlobal,
Module: "math",
Name: "pi",
DescGlobal: wasm.GlobalType{ValType: wasm.ValueTypeF64, Mutable: true},
},
expected: []byte{
0x04, 'm', 'a', 't', 'h',
0x02, 'p', 'i',
wasm.ExternTypeGlobal,
wasm.ValueTypeF64, 0x01, // 1 == var
},
},
{
name: "table",
input: &wasm.Import{
Type: wasm.ExternTypeTable,
Module: "my",
Name: "table",
DescTable: wasm.Table{Min: 1, Max: ptrOfUint32(2)},
},
expected: []byte{
0x02, 'm', 'y',
0x05, 't', 'a', 'b', 'l', 'e',
wasm.ExternTypeTable,
wasm.RefTypeFuncref,
0x1, 0x1, 0x2, // Limit with max.
},
},
{
name: "memory",
input: &wasm.Import{
Type: wasm.ExternTypeMemory,
Module: "my",
Name: "memory",
DescMem: &wasm.Memory{Min: 1, Max: 2, IsMaxEncoded: true},
},
expected: []byte{
0x02, 'm', 'y',
0x06, 'm', 'e', 'm', 'o', 'r', 'y',
wasm.ExternTypeMemory,
0x1, 0x1, 0x2, // Limit with max.
},
},
{
name: "memory - defaultt max",
input: &wasm.Import{
Type: wasm.ExternTypeMemory,
Module: "my",
Name: "memory",
DescMem: &wasm.Memory{Min: 1, Max: wasm.MemoryLimitPages, IsMaxEncoded: false},
},
expected: []byte{
0x02, 'm', 'y',
0x06, 'm', 'e', 'm', 'o', 'r', 'y',
wasm.ExternTypeMemory,
0x0, 0x1, // Limit without max.
},
},
}
for _, tt := range tests {
tc := tt
t.Run(tc.name, func(t *testing.T) {
bytes := EncodeImport(tc.input)
require.Equal(t, tc.expected, bytes)
})
}
}