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

1import unittest 

2 

3from wasmtime import * 

4 

5 

6class TestTrap(unittest.TestCase): 

7 def test_new(self): 

8 trap = Trap('x') 

9 self.assertEqual(trap.message, u'x') 

10 

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 

29 

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) 

35 

36 self.assertEqual(frames[0].func_name, 'bar') 

37 self.assertEqual(frames[1].func_name, 'foo') 

38 self.assertEqual(frames[2].func_name, None) 

39 

40 self.assertEqual(frames[0].module_name, 'module') 

41 self.assertEqual(frames[1].module_name, 'module') 

42 self.assertEqual(frames[2].module_name, 'module') 

43 

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> 

49 

50Caused by: 

51 wasm trap: wasm `unreachable` instruction executed\ 

52""") 

53 self.assertEqual(trap.trap_code, TrapCode.UNREACHABLE) 

54 

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 

68 

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) 

74 

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)) 

92 

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') 

97 

98 with self.assertRaises(ExitTrap) as exn: 

99 exit(store, 1) 

100 self.assertEqual(exn.exception.code, 1)