xref: /wasmtime-44.0.1/crates/c-api/tests/trap.cc (revision b856261d)
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