Coverage for tests/test_trap.py: 100%
58 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-02-20 16:25 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-02-20 16:25 +0000
1import unittest
3from wasmtime import *
6class TestTrap(unittest.TestCase):
7 def test_new(self):
8 trap = Trap('x')
9 self.assertEqual(trap.message, u'x')
11 def test_frames(self):
12 store = Store()
13 module = Module(store.engine, """
14 (module $module
15 (func (export "init")
16 call $foo)
17 (func $foo
18 call $bar)
19 (func $bar
20 unreachable)
21 )
22 """)
23 i = Instance(store, module, [])
24 with self.assertRaises(Trap) as exn:
25 e = i.exports(store).by_index[0]
26 assert(isinstance(e, Func))
27 e(store)
28 trap = exn.exception
30 frames = trap.frames
31 self.assertEqual(len(frames), 3)
32 self.assertEqual(frames[0].func_index, 2)
33 self.assertEqual(frames[1].func_index, 1)
34 self.assertEqual(frames[2].func_index, 0)
36 self.assertEqual(frames[0].func_name, 'bar')
37 self.assertEqual(frames[1].func_name, 'foo')
38 self.assertEqual(frames[2].func_name, None)
40 self.assertEqual(frames[0].module_name, 'module')
41 self.assertEqual(frames[1].module_name, 'module')
42 self.assertEqual(frames[2].module_name, 'module')
44 self.assertEqual(str(trap), """\
45error while executing at wasm backtrace:
46 0: 0x2d - module!bar
47 1: 0x28 - module!foo
48 2: 0x23 - module!<wasm function 0>
50Caused by:
51 wasm trap: wasm `unreachable` instruction executed\
52""")
53 self.assertEqual(trap.trap_code, TrapCode.UNREACHABLE)
55 def test_frames_no_module(self):
56 store = Store()
57 module = Module(store.engine, """
58 (module
59 (func (export "init") unreachable)
60 )
61 """)
62 i = Instance(store, module, [])
63 with self.assertRaises(Trap) as exn:
64 e = i.exports(store).by_index[0]
65 assert(isinstance(e, Func))
66 e(store)
67 trap = exn.exception
69 frames = trap.frames
70 self.assertEqual(len(frames), 1)
71 self.assertEqual(frames[0].func_index, 0)
72 self.assertEqual(frames[0].func_name, None)
73 self.assertEqual(frames[0].module_name, None)
75 def test_wasi_exit(self):
76 linker = Linker(Engine())
77 linker.define_wasi()
78 module = Module(linker.engine, """
79 (module
80 (import "wasi_snapshot_preview1" "proc_exit" (func $exit (param i32)))
81 (memory (export "memory") 1)
82 (func (export "exit") (param i32)
83 local.get 0
84 call $exit)
85 )
86 """)
87 store = Store(linker.engine)
88 store.set_wasi(WasiConfig())
89 instance = linker.instantiate(store, module)
90 exit = instance.exports(store)["exit"]
91 assert(isinstance(exit, Func))
93 with self.assertRaises(ExitTrap) as exn:
94 exit(store, 0)
95 self.assertEqual(exn.exception.code, 0)
96 self.assertRegex(str(exn.exception), 'Exited with i32 exit status 0')
98 with self.assertRaises(ExitTrap) as exn:
99 exit(store, 1)
100 self.assertEqual(exn.exception.code, 1)