1 #include <gtest/gtest.h>
2 #include <wasmtime.hh>
3 #include <wasmtime/config.hh>
4
5 using namespace wasmtime;
6
TEST(PoolAllocationConfig,Smoke)7 TEST(PoolAllocationConfig, Smoke) {
8 PoolAllocationConfig config;
9 config.max_unused_warm_slots(1);
10 config.decommit_batch_size(2);
11 config.async_stack_keep_resident(3);
12 config.linear_memory_keep_resident(4);
13 config.table_keep_resident(5);
14 config.total_component_instances(6);
15 config.max_component_instance_size(7);
16 config.max_core_instances_per_component(8);
17 config.max_memories_per_component(9);
18 config.max_tables_per_component(10);
19 config.total_memories(11);
20 config.total_tables(12);
21 config.total_stacks(13);
22 config.total_core_instances(14);
23 config.max_core_instance_size(15);
24 config.max_tables_per_module(16);
25 config.table_elements(17);
26 config.max_memories_per_module(18);
27 config.max_memory_size(19);
28 config.total_gc_heaps(20);
29
30 PoolAllocationConfig config2 = std::move(config);
31 PoolAllocationConfig config3(std::move(config));
32 }
33
TEST(Config,Smoke)34 TEST(Config, Smoke) {
35 Config config;
36 config.debug_info(false);
37 config.epoch_interruption(false);
38 config.consume_fuel(false);
39 config.max_wasm_stack(100);
40 config.wasm_threads(false);
41 config.wasm_tail_call(false);
42 config.wasm_reference_types(false);
43 config.wasm_function_references(false);
44 config.wasm_gc(false);
45 config.wasm_simd(false);
46 config.wasm_relaxed_simd(false);
47 config.wasm_relaxed_simd_deterministic(false);
48 config.wasm_bulk_memory(false);
49 config.wasm_multi_value(false);
50 config.wasm_multi_memory(false);
51 config.wasm_memory64(false);
52 config.wasm_wide_arithmetic(false);
53 config.wasm_component_model(false);
54 config.wasm_exceptions(false);
55 config.wasm_custom_page_sizes(false);
56 config.strategy(Strategy::Auto);
57 config.cranelift_debug_verifier(false);
58 config.cranelift_opt_level(OptLevel::Speed);
59 config.cranelift_nan_canonicalization(false);
60 config.profiler(ProfilingStrategy::None);
61 config.memory_reservation(0);
62 config.memory_reservation_for_growth(0);
63 config.memory_guard_size(0);
64 config.memory_may_move(false);
65 config.memory_init_cow(false);
66 config.native_unwind_info(false);
67 config.macos_use_mach_ports(false);
68 config.cranelift_flag_enable("foo");
69 config.cranelift_flag_set("foo", "bar");
70 EXPECT_TRUE(config.cache_load_default());
71 EXPECT_FALSE(config.cache_load("nonexistent"));
72 config.concurrency_support(false);
73
74 PoolAllocationConfig pooling_config;
75 config.pooling_allocation_strategy(pooling_config);
76
77 Config config2 = std::move(config);
78 Config config3(std::move(config));
79 }
80
81 struct MyMemoryCreator {
82 struct Memory {
83 std::vector<uint8_t> storage;
84
get_memoryMyMemoryCreator::Memory85 uint8_t *get_memory(size_t *byte_size, size_t *byte_capacity) {
86 *byte_size = storage.size();
87 *byte_capacity = storage.capacity();
88 return &storage[0];
89 }
90
grow_memoryMyMemoryCreator::Memory91 Result<std::monostate> grow_memory(size_t new_size) {
92 storage.resize(new_size, 0);
93 return std::monostate();
94 }
95 };
96
new_memoryMyMemoryCreator97 Result<Memory> new_memory(const MemoryType::Ref &ty, size_t minimum,
98 size_t maximum, size_t reserved_size_in_bytes,
99 size_t guard_size_in_bytes) {
100 EXPECT_EQ(guard_size_in_bytes, 0);
101 EXPECT_EQ(reserved_size_in_bytes, 0);
102
103 Memory mem;
104 mem.grow_memory(minimum).unwrap();
105 return mem;
106 }
107 };
108
TEST(Config,MemoryCreator)109 TEST(Config, MemoryCreator) {
110 Config config;
111 config.memory_guard_size(0);
112 config.memory_reservation(0);
113 config.memory_reservation_for_growth(0);
114 config.host_memory_creator(MyMemoryCreator());
115
116 Engine engine(std::move(config));
117 Module m =
118 Module::compile(engine, "(module (memory (export \"x\") 1))").unwrap();
119
120 Store store(engine);
121 Instance i = Instance::create(store, m, {}).unwrap();
122 Memory mem = std::get<Memory>(*i.get(store, "x"));
123 {
124 auto data = mem.data(store);
125 EXPECT_EQ(data.size(), 65536);
126 for (auto &i : data) {
127 EXPECT_EQ(i, 0);
128 }
129 }
130
131 EXPECT_EQ(mem.grow(store, 1).unwrap(), 1);
132
133 {
134 auto data = mem.data(store);
135 EXPECT_EQ(data.size(), 65536 * 2);
136 for (auto &i : data) {
137 EXPECT_EQ(i, 0);
138 }
139 }
140 }
141