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