github.com/wasilibs/wazerox@v0.0.0-20240124024944-4923be63ab5f/internal/wasm/binary/import_test.go (about)

     1  package binary
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/wasilibs/wazerox/internal/testing/binaryencoding"
     7  	"github.com/wasilibs/wazerox/internal/testing/require"
     8  	"github.com/wasilibs/wazerox/internal/wasm"
     9  )
    10  
    11  func TestEncodeImport(t *testing.T) {
    12  	ptrOfUint32 := func(v uint32) *uint32 {
    13  		return &v
    14  	}
    15  
    16  	tests := []struct {
    17  		name     string
    18  		input    *wasm.Import
    19  		expected []byte
    20  	}{
    21  		{
    22  			name: "func no module, no name, type index 0",
    23  			input: &wasm.Import{ // e.g. (import "" "" (func (type 0)))
    24  				Type:     wasm.ExternTypeFunc,
    25  				Module:   "",
    26  				Name:     "",
    27  				DescFunc: 0,
    28  			},
    29  			expected: []byte{wasm.ExternTypeFunc, 0x00, 0x00, 0x00},
    30  		},
    31  		{
    32  			name: "func module, no name, type index 0",
    33  			input: &wasm.Import{ // e.g. (import "$test" "" (func (type 0)))
    34  				Type:     wasm.ExternTypeFunc,
    35  				Module:   "test",
    36  				Name:     "",
    37  				DescFunc: 0,
    38  			},
    39  			expected: []byte{
    40  				0x04, 't', 'e', 's', 't',
    41  				0x00,
    42  				wasm.ExternTypeFunc,
    43  				0x00,
    44  			},
    45  		},
    46  		{
    47  			name: "func module, name, type index 0",
    48  			input: &wasm.Import{ // e.g. (import "$math" "$pi" (func (type 0)))
    49  				Type:     wasm.ExternTypeFunc,
    50  				Module:   "math",
    51  				Name:     "pi",
    52  				DescFunc: 0,
    53  			},
    54  			expected: []byte{
    55  				0x04, 'm', 'a', 't', 'h',
    56  				0x02, 'p', 'i',
    57  				wasm.ExternTypeFunc,
    58  				0x00,
    59  			},
    60  		},
    61  		{
    62  			name: "func module, name, type index 10",
    63  			input: &wasm.Import{ // e.g. (import "$math" "$pi" (func (type 10)))
    64  				Type:     wasm.ExternTypeFunc,
    65  				Module:   "math",
    66  				Name:     "pi",
    67  				DescFunc: 10,
    68  			},
    69  			expected: []byte{
    70  				0x04, 'm', 'a', 't', 'h',
    71  				0x02, 'p', 'i',
    72  				wasm.ExternTypeFunc,
    73  				0x0a,
    74  			},
    75  		},
    76  		{
    77  			name: "global const",
    78  			input: &wasm.Import{
    79  				Type:       wasm.ExternTypeGlobal,
    80  				Module:     "math",
    81  				Name:       "pi",
    82  				DescGlobal: wasm.GlobalType{ValType: wasm.ValueTypeF64},
    83  			},
    84  			expected: []byte{
    85  				0x04, 'm', 'a', 't', 'h',
    86  				0x02, 'p', 'i',
    87  				wasm.ExternTypeGlobal,
    88  				wasm.ValueTypeF64, 0x00, // 0 == const
    89  			},
    90  		},
    91  		{
    92  			name: "global var",
    93  			input: &wasm.Import{
    94  				Type:       wasm.ExternTypeGlobal,
    95  				Module:     "math",
    96  				Name:       "pi",
    97  				DescGlobal: wasm.GlobalType{ValType: wasm.ValueTypeF64, Mutable: true},
    98  			},
    99  			expected: []byte{
   100  				0x04, 'm', 'a', 't', 'h',
   101  				0x02, 'p', 'i',
   102  				wasm.ExternTypeGlobal,
   103  				wasm.ValueTypeF64, 0x01, // 1 == var
   104  			},
   105  		},
   106  		{
   107  			name: "table",
   108  			input: &wasm.Import{
   109  				Type:      wasm.ExternTypeTable,
   110  				Module:    "my",
   111  				Name:      "table",
   112  				DescTable: wasm.Table{Min: 1, Max: ptrOfUint32(2)},
   113  			},
   114  			expected: []byte{
   115  				0x02, 'm', 'y',
   116  				0x05, 't', 'a', 'b', 'l', 'e',
   117  				wasm.ExternTypeTable,
   118  				wasm.RefTypeFuncref,
   119  				0x1, 0x1, 0x2, // Limit with max.
   120  			},
   121  		},
   122  		{
   123  			name: "memory",
   124  			input: &wasm.Import{
   125  				Type:    wasm.ExternTypeMemory,
   126  				Module:  "my",
   127  				Name:    "memory",
   128  				DescMem: &wasm.Memory{Min: 1, Max: 2, IsMaxEncoded: true},
   129  			},
   130  			expected: []byte{
   131  				0x02, 'm', 'y',
   132  				0x06, 'm', 'e', 'm', 'o', 'r', 'y',
   133  				wasm.ExternTypeMemory,
   134  				0x1, 0x1, 0x2, // Limit with max.
   135  			},
   136  		},
   137  		{
   138  			name: "memory - defaultt max",
   139  			input: &wasm.Import{
   140  				Type:    wasm.ExternTypeMemory,
   141  				Module:  "my",
   142  				Name:    "memory",
   143  				DescMem: &wasm.Memory{Min: 1, Max: wasm.MemoryLimitPages, IsMaxEncoded: false},
   144  			},
   145  			expected: []byte{
   146  				0x02, 'm', 'y',
   147  				0x06, 'm', 'e', 'm', 'o', 'r', 'y',
   148  				wasm.ExternTypeMemory,
   149  				0x0, 0x1, // Limit without max.
   150  			},
   151  		},
   152  	}
   153  
   154  	for _, tt := range tests {
   155  		tc := tt
   156  
   157  		t.Run(tc.name, func(t *testing.T) {
   158  			bytes := binaryencoding.EncodeImport(tc.input)
   159  			require.Equal(t, tc.expected, bytes)
   160  		})
   161  	}
   162  }