Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/c-api/tests/trap.cc
1692 views
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(ALWAYS_TRAP_ADAPTER);
64
TEST_CODE(OUT_OF_FUEL);
65
TEST_CODE(ATOMIC_WAIT_NON_SHARED_MEMORY);
66
TEST_CODE(NULL_REFERENCE);
67
TEST_CODE(ARRAY_OUT_OF_BOUNDS);
68
TEST_CODE(ALLOCATION_TOO_LARGE);
69
TEST_CODE(CAST_FAILURE);
70
TEST_CODE(CANNOT_ENTER_COMPONENT);
71
TEST_CODE(NO_ASYNC_RESULT);
72
TEST_CODE(DISABLED_OPCODE);
73
#undef TEST_CODE
74
}
75
76