Path: blob/main/tests/all/compile_time_builtins.rs
2450 views
use super::*;1use std::path::Path;2use wasmtime::*;34#[test]5#[cfg_attr(miri, ignore)]6fn smoke() -> Result<()> {7let engine = Engine::default();8let linker = component::Linker::new(&engine);910let component = unsafe {11CodeBuilder::new(&engine)12.expose_unsafe_intrinsics("unsafe-intrinsics")13.compile_time_builtins_binary_or_text(14"host-api",15r#"16(component17(import "unsafe-intrinsics"18(instance $intrinsics19(export "store-data-address" (func (result u64)))20(export "u8-native-load" (func (param "pointer" u64) (result u8)))21)22)2324(core func $store-data-address' (canon lower (func $intrinsics "store-data-address")))25(core func $u8-native-load' (canon lower (func $intrinsics "u8-native-load")))2627(core module $m28(import "" "store-data-address" (func $store-data-address (result i64)))29(import "" "u8-native-load" (func $u8-native-load (param i64) (result i32)))30(func (export "get") (result i32)31(call $u8-native-load (call $store-data-address))32)33)3435(core instance $i36(instantiate $m37(with "" (instance (export "store-data-address" (func $store-data-address'))38(export "u8-native-load" (func $u8-native-load'))))39)40)4142(func (export "get") (result u8)43(canon lift (core func $i "get"))44)45)46"#.as_bytes(),47Some(Path::new("host-api.wat")),48)?49.wasm_binary_or_text(50r#"51(component52(import "host-api"53(instance $host-api54(export "get" (func (result u8)))55)56)5758(core func $get' (canon lower (func $host-api "get")))5960(core module $m61(import "" "get" (func $get (result i32)))62(func (export "double-get") (result i32)63(i32.add (call $get) (call $get))64)65)6667(core instance $i68(instantiate $m (with "" (instance (export "get" (func $get')))))69)7071(func (export "double-get") (result u8)72(canon lift (core func $i "double-get"))73)74)75"#.as_bytes(),76Some(Path::new("main.wat")),77)?78.compile_component()?79};8081let mut store = Store::new(&engine, 42_u8);82let instance = linker.instantiate(&mut store, &component)?;8384let (result,) = instance85.get_typed_func::<(), (u8,)>(&mut store, "double-get")?86.call(&mut store, ())?;87assert_eq!(result, 84);8889Ok(())90}9192#[test]93#[cfg_attr(miri, ignore)]94fn unused_compile_time_builtins() -> Result<()> {95let engine = Engine::default();96let linker = component::Linker::new(&engine);9798let component = unsafe {99CodeBuilder::new(&engine)100.expose_unsafe_intrinsics("unsafe-intrinsics")101.compile_time_builtins_binary_or_text(102"host-api",103"(component)".as_bytes(),104Some(Path::new("host-api.wat")),105)?106.wasm_binary_or_text(107r#"108(component109(core module $m110(func (export "foo") (result i32)111(i32.const 42)112)113)114115(core instance $i (instantiate $m))116117(func (export "foo") (result u8)118(canon lift (core func $i "foo"))119)120)121"#122.as_bytes(),123Some(Path::new("main.wat")),124)?125.compile_component()?126};127128let mut store = Store::new(&engine, ());129let instance = linker.instantiate(&mut store, &component)?;130131let (result,) = instance132.get_typed_func::<(), (u8,)>(&mut store, "foo")?133.call(&mut store, ())?;134assert_eq!(result, 42);135136Ok(())137}138139#[test]140#[cfg_attr(miri, ignore)]141fn multiple_compile_time_builtins() -> Result<()> {142let engine = Engine::default();143let linker = component::Linker::new(&engine);144145let component = unsafe {146CodeBuilder::new(&engine)147.expose_unsafe_intrinsics("unsafe-intrinsics")148.compile_time_builtins_binary_or_text(149"host-api1",150"(component)".as_bytes(),151Some(Path::new("host-api1.wat")),152)?153.compile_time_builtins_binary_or_text(154"host-api2",155"(component)".as_bytes(),156Some(Path::new("host-api2.wat")),157)?158.compile_time_builtins_binary_or_text(159"host-api3",160"(component)".as_bytes(),161Some(Path::new("host-api3.wat")),162)?163.wasm_binary_or_text(164r#"165(component166(import "host-api2" (instance))167(import "host-api3" (instance))168169(core module $m170(func (export "foo") (result i32)171(i32.const 42)172)173)174175(core instance $i (instantiate $m))176177(func (export "foo") (result u8)178(canon lift (core func $i "foo"))179)180)181"#182.as_bytes(),183Some(Path::new("main.wat")),184)?185.compile_component()?186};187188let mut store = Store::new(&engine, ());189let instance = linker.instantiate(&mut store, &component)?;190191let (result,) = instance192.get_typed_func::<(), (u8,)>(&mut store, "foo")?193.call(&mut store, ())?;194assert_eq!(result, 42);195196Ok(())197}198199#[test]200#[cfg_attr(miri, ignore)]201fn main_wasm_cannot_use_intrinsics() -> Result<()> {202let engine = Engine::default();203204let err = unsafe {205CodeBuilder::new(&engine)206.expose_unsafe_intrinsics("unsafe-intrinsics")207.compile_time_builtins_binary_or_text(208"host-api",209"(component)".as_bytes(),210Some(Path::new("host-api.wat")),211)?212.wasm_binary_or_text(213r#"214(component215(import "unsafe-intrinsics" (instance $intrinsics))216)217"#218.as_bytes(),219Some(Path::new("main.wat")),220)?221.compile_component()222.map(|_| ())223.unwrap_err()224};225226err.assert_contains("main Wasm cannot import the unsafe intrinsics");227Ok(())228}229230#[test]231#[cfg_attr(miri, ignore)]232fn import_erased() -> Result<()> {233let engine = Engine::default();234235let component = unsafe {236CodeBuilder::new(&engine)237.expose_unsafe_intrinsics("unsafe-intrinsics")238.compile_time_builtins_binary_or_text(239"compile-time-api",240"(component)".as_bytes(),241Some(Path::new("compile-time-api.wat")),242)?243.wasm_binary_or_text(244r#"245(component246(import "compile-time-api" (instance))247(import "link-time-api" (instance))248)249"#250.as_bytes(),251Some(Path::new("main.wat")),252)?253.compile_component()?254};255256let component_type = component.component_type();257let imports = component_type258.imports(&engine)259.map(|(name, _ty)| name)260.collect::<Vec<_>>();261assert_eq!(imports, ["link-time-api"]);262263Ok(())264}265266267