Automatically generate pywasm3 test binaties using WABT

extensions
Volodymyr Shymanskyy 3 years ago
parent ccab6a438b
commit b606d8ff40

@ -556,6 +556,9 @@ jobs:
cd platforms/python cd platforms/python
python setup.py sdist python setup.py sdist
pip install ./dist/pywasm3-*.tar.gz pip install ./dist/pywasm3-*.tar.gz
- name: Install WABT
run: |
sudo apt install wabt
- name: Test - name: Test
run: | run: |
pip install pytest pip install pytest

@ -1,34 +1,49 @@
import wasm3 as m3 import wasm3 as m3
import pytest import pytest
FIB32_WASM = bytes.fromhex( import tempfile, subprocess
"00 61 73 6d 01 00 00 00 01 06 01 60 01 7f 01 7f"
"03 02 01 00 07 07 01 03 66 69 62 00 00 0a 1f 01" def wat2wasm(wat):
"1d 00 20 00 41 02 49 04 40 20 00 0f 0b 20 00 41" with tempfile.TemporaryDirectory() as d:
"02 6b 10 00 20 00 41 01 6b 10 00 6a 0f 0b") fn_in = d + "/input.wat"
fn_out = d + "/output.wasm"
FIB64_WASM = bytes.fromhex( with open(fn_in, "wb") as f:
"00 61 73 6d 01 00 00 00 01 06 01 60 01 7e 01 7e" f.write(wat.encode('utf8'))
"03 02 01 00 07 07 01 03 66 69 62 00 00 0a 1f 01" subprocess.run(["wat2wasm", "-o", fn_out, fn_in], check=True)
"1d 00 20 00 42 02 54 04 40 20 00 0f 0b 20 00 42" with open(fn_out, "rb") as f:
"02 7d 10 00 20 00 42 01 7d 10 00 7c 0f 0b") return f.read()
""" FIB64_WASM = wat2wasm("""
(type (;0;) (func (param i32 i32) (result i32))) (module
(func $i (import "env" "callback") (type 0)) (func $fib2 (param $n i64) (param $a i64) (param $b i64) (result i64)
(func (export "run_callback") (type 0) (if (result i64)
(i64.eqz (get_local $n))
(then (get_local $a))
(else (call $fib2 (i64.sub (get_local $n)
(i64.const 1))
(get_local $b)
(i64.add (get_local $a)
(get_local $b))))))
(func $fib (export "fib") (param i64) (result i64)
(call $fib2 (get_local 0)
(i64.const 0) ;; seed value $a
(i64.const 1))) ;; seed value $b
)
""")
CALLBACK_WASM = wat2wasm("""
(module
(type (;0;) (func (param i32 i32) (result i32)))
(func $i (import "env" "callback") (type 0))
(func (export "run_callback") (type 0)
local.get 0 local.get 0
local.get 1 local.get 1
call $i) call $i)
""" )
CALLBACK_WASM = bytes.fromhex( """)
"00 61 73 6d 01 00 00 00 01 07 01 60 02 7f 7f 01"
"7f 02 10 01 03 65 6e 76 08 63 61 6c 6c 62 61 63" DYN_CALLBACK_WASM = wat2wasm("""
"6b 00 00 03 02 01 00 07 10 01 0c 72 75 6e 5f 63"
"61 6c 6c 62 61 63 6b 00 01 0a 0a 01 08 00 20 00"
"20 01 10 00 0b")
"""
(module (module
(type $t0 (func (param i32 i32) (result i32))) (type $t0 (func (param i32 i32) (result i32)))
(type $t1 (func)) (type $t1 (func))
@ -62,34 +77,19 @@ CALLBACK_WASM = bytes.fromhex(
call_indirect $table (type $t0)) call_indirect $table (type $t0))
(table $table (export "table") 2 funcref) (table $table (export "table") 2 funcref)
(elem (global.get $env.__table_base) func $f2 $f3)) (elem (global.get $env.__table_base) func $f2 $f3))
""" """)
DYN_CALLBACK_WASM = bytes.fromhex(
"00 61 73 6d 01 00 00 00 01 15 04 60 02 7f 7f 01"
"7f 60 00 00 60 01 7f 00 60 03 7f 7f 7f 01 7f 02" ADD_WASM = wat2wasm("""
"25 02 03 65 6e 76 09 70 61 73 73 5f 66 70 74 72" (module
"00 02 03 65 6e 76 0c 5f 5f 74 61 62 6c 65 5f 62" (func (export "add") (param i64 i64) (result i64)
"61 73 65 03 7f 00 03 06 05 01 00 00 02 03 04 04"
"01 70 00 02 07 33 04 08 72 75 6e 5f 74 65 73 74"
"00 01 0e 63 61 6c 6c 5f 70 61 73 73 5f 66 70 74"
"72 00 04 0b 64 79 6e 43 61 6c 6c 5f 69 69 69 00"
"05 05 74 61 62 6c 65 01 00 09 08 01 00 23 00 0b"
"02 02 03 0a 32 05 0d 00 23 00 10 00 23 00 41 01"
"6a 10 00 0b 07 00 20 00 20 01 6a 0b 07 00 20 00"
"20 01 6c 0b 06 00 20 00 10 00 0b 0b 00 20 01 20"
"02 20 00 11 00 00 0b")
"""
(func (export "add") (param i64 i64) (result i64)
local.get 0 local.get 0
local.get 1 local.get 1
i64.add i64.add
return return)
) )
""" """)
ADD_WASM = bytes.fromhex(
"00 61 73 6d 01 00 00 00 01 07 01 60 02 7e 7e 01"
"7e 03 02 01 00 07 07 01 03 61 64 64 00 00 0a 0a"
"01 08 00 20 00 20 01 7c 0f 0b")
def test_classes(): def test_classes():
assert isinstance(m3.Environment, type) assert isinstance(m3.Environment, type)
@ -166,7 +166,7 @@ def test_m3(capfd):
env = m3.Environment() env = m3.Environment()
rt = env.new_runtime(1024) rt = env.new_runtime(1024)
assert isinstance(rt, m3.Runtime) assert isinstance(rt, m3.Runtime)
mod = env.parse_module(FIB32_WASM) mod = env.parse_module(FIB64_WASM)
assert isinstance(mod, m3.Module) assert isinstance(mod, m3.Module)
assert mod.name == '.unnamed' assert mod.name == '.unnamed'
rt.load(mod) rt.load(mod)
@ -189,8 +189,8 @@ def test_m3(capfd):
assert func.name == 'fib' assert func.name == 'fib'
assert func.num_args == 1 assert func.num_args == 1
assert func.num_rets == 1 assert func.num_rets == 1
assert func.arg_types == (1,) assert func.arg_types == (2,)
assert func.ret_types == (1,) assert func.ret_types == (2,)
assert func(0) == 0 assert func(0) == 0
assert func(1) == 1 assert func(1) == 1
rt.load(env.parse_module(ADD_WASM)) rt.load(env.parse_module(ADD_WASM))

Loading…
Cancel
Save