1 #include "utils.h" 2 3 #include <gtest/gtest.h> 4 #include <wasmtime.h> 5 6 TEST(component, define_module) { 7 static constexpr auto module_wat = std::string_view{ 8 R"END( 9 (module 10 (func $function (param $x i32) (result i32) 11 local.get $x) 12 (export "function" (func $function)) 13 ) 14 )END", 15 }; 16 17 static constexpr auto component_text = std::string_view{ 18 R"END( 19 (component 20 (import "x:y/z" (instance 21 (export "mod" (core module 22 (export "function" (func (param i32) (result i32))) 23 )) 24 )) 25 ) 26 )END", 27 }; 28 const auto engine = wasm_engine_new(); 29 EXPECT_NE(engine, nullptr); 30 31 wasm_byte_vec_t wasm; 32 auto err = wasmtime_wat2wasm(module_wat.data(), module_wat.size(), &wasm); 33 CHECK_ERR(err); 34 35 wasmtime_module_t *module = nullptr; 36 err = wasmtime_module_new( 37 engine, reinterpret_cast<const uint8_t *>(wasm.data), wasm.size, &module); 38 CHECK_ERR(err); 39 40 const auto store = wasmtime_store_new(engine, nullptr, nullptr); 41 const auto context = wasmtime_store_context(store); 42 43 wasmtime_component_t *component = nullptr; 44 45 err = wasmtime_component_new( 46 engine, reinterpret_cast<const uint8_t *>(component_text.data()), 47 component_text.size(), &component); 48 49 CHECK_ERR(err); 50 51 const auto linker = wasmtime_component_linker_new(engine); 52 53 const auto root = wasmtime_component_linker_root(linker); 54 55 wasmtime_component_linker_instance_t *x_y_z = nullptr; 56 err = wasmtime_component_linker_instance_add_instance( 57 root, "x:y/z", strlen("x:y/z"), &x_y_z); 58 CHECK_ERR(err); 59 60 err = wasmtime_component_linker_instance_add_module(x_y_z, "mod", 61 strlen("mod"), module); 62 CHECK_ERR(err); 63 64 wasmtime_component_linker_instance_delete(x_y_z); 65 wasmtime_component_linker_instance_delete(root); 66 67 wasmtime_component_instance_t instance = {}; 68 err = wasmtime_component_linker_instantiate(linker, context, component, 69 &instance); 70 CHECK_ERR(err); 71 72 wasmtime_component_linker_delete(linker); 73 74 wasmtime_store_delete(store); 75 wasm_engine_delete(engine); 76 } 77