1 #include "utils.h" 2 3 #include <array> 4 #include <gtest/gtest.h> 5 #include <wasmtime.h> 6 7 TEST(component, call_func) { 8 static constexpr auto component_text = std::string_view{ 9 R"END( 10 (component 11 (core module $m 12 (func (export "f") (param $x i32) (param $y i32) (result i32) 13 (local.get $x) 14 (local.get $y) 15 (i32.add) 16 ) 17 ) 18 (core instance $i (instantiate $m)) 19 (func $f (param "x" u32) (param "y" u32) (result u32) (canon lift (core func $i "f"))) 20 (export "f" (func $f)) 21 ) 22 )END", 23 }; 24 const auto engine = wasm_engine_new(); 25 EXPECT_NE(engine, nullptr); 26 27 const auto store = wasmtime_store_new(engine, nullptr, nullptr); 28 const auto context = wasmtime_store_context(store); 29 30 wasmtime_component_t *component = nullptr; 31 32 auto err = wasmtime_component_new( 33 engine, reinterpret_cast<const uint8_t *>(component_text.data()), 34 component_text.size(), &component); 35 36 CHECK_ERR(err); 37 38 const auto f = 39 wasmtime_component_get_export_index(component, nullptr, "f", 1); 40 41 EXPECT_NE(f, nullptr); 42 43 const auto linker = wasmtime_component_linker_new(engine); 44 45 wasmtime_component_instance_t instance = {}; 46 err = wasmtime_component_linker_instantiate(linker, context, component, 47 &instance); 48 CHECK_ERR(err); 49 50 wasmtime_component_func_t func = {}; 51 const auto found = 52 wasmtime_component_instance_get_func(&instance, context, f, &func); 53 EXPECT_TRUE(found); 54 55 auto params = std::array<wasmtime_component_val_t, 2>{ 56 wasmtime_component_val_t{ 57 .kind = WASMTIME_COMPONENT_U32, 58 .of = {.u32 = 34}, 59 }, 60 wasmtime_component_val_t{ 61 .kind = WASMTIME_COMPONENT_U32, 62 .of = {.u32 = 35}, 63 }, 64 }; 65 66 auto results = std::array<wasmtime_component_val_t, 1>{}; 67 68 err = 69 wasmtime_component_func_call(&func, context, params.data(), params.size(), 70 results.data(), results.size()); 71 CHECK_ERR(err); 72 73 err = wasmtime_component_func_post_return(&func, context); 74 CHECK_ERR(err); 75 76 EXPECT_EQ(results[0].kind, WASMTIME_COMPONENT_U32); 77 EXPECT_EQ(results[0].of.u32, 69); 78 79 wasmtime_component_export_index_delete(f); 80 wasmtime_component_linker_delete(linker); 81 wasmtime_component_delete(component); 82 83 wasmtime_store_delete(store); 84 wasm_engine_delete(engine); 85 } 86