1 #include <wasmtime/trap.hh>
2
3 #include <gtest/gtest.h>
4 #include <wasmtime.hh>
5
6 using namespace wasmtime;
7
TEST(Trap,Smoke)8 TEST(Trap, Smoke) {
9 Trap t("foo");
10 EXPECT_EQ(t.message(), "foo");
11 EXPECT_EQ(t.trace().size(), 0);
12
13 Engine engine;
14 Module m =
15 Module::compile(engine, "(module (func (export \"\") unreachable))")
16 .unwrap();
17 Store store(engine);
18 Instance i = Instance::create(store, m, {}).unwrap();
19 auto func = std::get<Func>(*i.get(store, ""));
20 auto trap = std::get<Trap>(func.call(store, {}).err().data);
21 auto trace = trap.trace();
22 EXPECT_EQ(trace.size(), 1);
23 auto frame = *trace.begin();
24 EXPECT_EQ(frame.func_name(), std::nullopt);
25 EXPECT_EQ(frame.module_name(), std::nullopt);
26 EXPECT_EQ(frame.func_index(), 0);
27 EXPECT_EQ(frame.func_offset(), 1);
28 EXPECT_EQ(frame.module_offset(), 29);
29 for (auto &frame : trace) {
30 }
31
32 auto unreachable_trap = std::get<Trap>(func.call(store, {}).err().data);
33
34 EXPECT_EQ(unreachable_trap.code(),
35 WASMTIME_TRAP_CODE_UNREACHABLE_CODE_REACHED);
36 EXPECT_TRUE(unreachable_trap.message().find("unreachable") !=
37 std::string::npos);
38 EXPECT_EQ(func.call(store, {1}).err().message(),
39 "expected 0 arguments, got 1");
40
41 Trap out_of_fuel(WASMTIME_TRAP_CODE_OUT_OF_FUEL);
42 EXPECT_EQ(out_of_fuel.code(), WASMTIME_TRAP_CODE_OUT_OF_FUEL);
43 EXPECT_TRUE(out_of_fuel.message().find("all fuel consumed") !=
44 std::string::npos);
45 }
46
TEST(Trap,Codes)47 TEST(Trap, Codes) {
48 #define TEST_CODE(trapcode) \
49 EXPECT_EQ(Trap(WASMTIME_TRAP_CODE_##trapcode).code(), \
50 WASMTIME_TRAP_CODE_##trapcode);
51
52 TEST_CODE(STACK_OVERFLOW);
53 TEST_CODE(MEMORY_OUT_OF_BOUNDS);
54 TEST_CODE(HEAP_MISALIGNED);
55 TEST_CODE(TABLE_OUT_OF_BOUNDS);
56 TEST_CODE(INDIRECT_CALL_TO_NULL);
57 TEST_CODE(BAD_SIGNATURE);
58 TEST_CODE(INTEGER_OVERFLOW);
59 TEST_CODE(INTEGER_DIVISION_BY_ZERO);
60 TEST_CODE(BAD_CONVERSION_TO_INTEGER);
61 TEST_CODE(UNREACHABLE_CODE_REACHED);
62 TEST_CODE(INTERRUPT);
63 TEST_CODE(OUT_OF_FUEL);
64 TEST_CODE(ATOMIC_WAIT_NON_SHARED_MEMORY);
65 TEST_CODE(NULL_REFERENCE);
66 TEST_CODE(ARRAY_OUT_OF_BOUNDS);
67 TEST_CODE(ALLOCATION_TOO_LARGE);
68 TEST_CODE(CAST_FAILURE);
69 TEST_CODE(CANNOT_ENTER_COMPONENT);
70 TEST_CODE(NO_ASYNC_RESULT);
71 TEST_CODE(DISABLED_OPCODE);
72 #undef TEST_CODE
73 }
74