1 #include <wasmtime/trap.hh> 2 3 #include <gtest/gtest.h> 4 #include <wasmtime.hh> 5 6 using namespace wasmtime; 7 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 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