From 5c07db8acb4d381d92bb52f80b08c0157ad54715 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 3 Apr 2025 08:59:01 -0700 Subject: [PATCH 1/2] Migrate `resource_import_and_export` to `wit-bindgen test` Made easier through the refactoring made by the `xcrate` test with a custom composition script and support for multiple components. That enables the tests here to mostly be a simple copy from the original test. --- crates/test-rust-wasm/Cargo.toml | 4 - .../src/bin/resource_import_and_export.rs | 3 - crates/test/src/c.rs | 11 ++- crates/test/src/rust.rs | 7 +- .../resource-import-and-export/compose.wac | 17 ++++ .../resource-import-and-export/intermediate.c | 61 +++++++++++++ .../intermediate.cs} | 12 +-- .../intermediate.rs} | 7 +- .../resource-import-and-export/leaf-thing.rs | 34 ++++++++ .../leaf-toplevel.rs | 11 +++ .../resource-import-and-export/runner.rs | 21 +++++ .../resource-import-and-export/test.wit} | 18 +++- tests/runtime/resource_import_and_export.rs | 87 ------------------- .../runtime/resource_import_and_export/wasm.c | 63 -------------- 14 files changed, 178 insertions(+), 178 deletions(-) delete mode 100644 crates/test-rust-wasm/src/bin/resource_import_and_export.rs create mode 100644 tests/runtime-new/resource-import-and-export/compose.wac create mode 100644 tests/runtime-new/resource-import-and-export/intermediate.c rename tests/{runtime/resource_import_and_export/wasm.cs => runtime-new/resource-import-and-export/intermediate.cs} (54%) rename tests/{runtime/resource_import_and_export/wasm.rs => runtime-new/resource-import-and-export/intermediate.rs} (93%) create mode 100644 tests/runtime-new/resource-import-and-export/leaf-thing.rs create mode 100644 tests/runtime-new/resource-import-and-export/leaf-toplevel.rs create mode 100644 tests/runtime-new/resource-import-and-export/runner.rs rename tests/{runtime/resource_import_and_export/world.wit => runtime-new/resource-import-and-export/test.wit} (56%) delete mode 100644 tests/runtime/resource_import_and_export.rs delete mode 100644 tests/runtime/resource_import_and_export/wasm.c diff --git a/crates/test-rust-wasm/Cargo.toml b/crates/test-rust-wasm/Cargo.toml index c95646399..48819d471 100644 --- a/crates/test-rust-wasm/Cargo.toml +++ b/crates/test-rust-wasm/Cargo.toml @@ -31,10 +31,6 @@ test = false name = "resource_floats" test = false -[[bin]] -name = "resource_import_and_export" -test = false - [[bin]] name = "resource_with_lists" test = false diff --git a/crates/test-rust-wasm/src/bin/resource_import_and_export.rs b/crates/test-rust-wasm/src/bin/resource_import_and_export.rs deleted file mode 100644 index 896a6ae00..000000000 --- a/crates/test-rust-wasm/src/bin/resource_import_and_export.rs +++ /dev/null @@ -1,3 +0,0 @@ -include!("../../../../tests/runtime/resource_import_and_export/wasm.rs"); - -fn main() {} diff --git a/crates/test/src/c.rs b/crates/test/src/c.rs index ab0811446..62e442adc 100644 --- a/crates/test/src/c.rs +++ b/crates/test/src/c.rs @@ -143,7 +143,7 @@ fn compile(runner: &Runner<'_>, compile: &Compile<'_>, compiler: PathBuf) -> Res cmd.arg( compile .bindings_dir - .join(format!("{}.c", compile.component.kind)), + .join(format!("{}.c", compile.component.bindgen.world)), ) .arg("-I") .arg(&compile.bindings_dir) @@ -161,11 +161,10 @@ fn compile(runner: &Runner<'_>, compile: &Compile<'_>, compiler: PathBuf) -> Res let mut cmd = Command::new(compiler); cmd.arg(&compile.component.path) .arg(&bindings_object) - .arg( - compile - .bindings_dir - .join(format!("{}_component_type.o", compile.component.kind)), - ) + .arg(compile.bindings_dir.join(format!( + "{}_component_type.o", + compile.component.bindgen.world + ))) .arg("-I") .arg(&compile.bindings_dir) .arg("-Wall") diff --git a/crates/test/src/rust.rs b/crates/test/src/rust.rs index 33726c33a..b4bdd1bb4 100644 --- a/crates/test/src/rust.rs +++ b/crates/test/src/rust.rs @@ -201,9 +201,10 @@ path = 'lib.rs' let mut cmd = rustc(&compile.component.path, &output); cmd.env( "BINDINGS", - compile - .bindings_dir - .join(format!("{}.rs", compile.component.bindgen.world)), + compile.bindings_dir.join(format!( + "{}.rs", + compile.component.bindgen.world.replace('-', "_") + )), ); for (name, path) in externs { let arg = format!("--extern={name}={}", path.display()); diff --git a/tests/runtime-new/resource-import-and-export/compose.wac b/tests/runtime-new/resource-import-and-export/compose.wac new file mode 100644 index 000000000..e7c63477a --- /dev/null +++ b/tests/runtime-new/resource-import-and-export/compose.wac @@ -0,0 +1,17 @@ +package example:composition; + +let leaf-thing = new test:leaf-thing { ... }; +let leaf-toplevel = new test:leaf-toplevel { + test: leaf-thing.test, + thing: leaf-thing.test.thing, + ... +}; +let intermediate = new test:intermediate { + test: leaf-thing.test, + toplevel-import: leaf-toplevel.toplevel-export, + thing: leaf-thing.test.thing, + ... +}; +let runner = new test:runner { test: intermediate.test, ... }; + +export runner...; diff --git a/tests/runtime-new/resource-import-and-export/intermediate.c b/tests/runtime-new/resource-import-and-export/intermediate.c new file mode 100644 index 000000000..47f96c5fb --- /dev/null +++ b/tests/runtime-new/resource-import-and-export/intermediate.c @@ -0,0 +1,61 @@ +//@ args = '--rename test:resource-import-and-export/test=test' + +#include +#include "intermediate.h" +#include +#include + +struct exports_test_thing_t { + test_own_thing_t thing; +}; + +intermediate_own_thing_t +exports_intermediate_toplevel_export(intermediate_own_thing_t a) { + return intermediate_toplevel_import(a); +} + +exports_test_own_thing_t +exports_test_constructor_thing(uint32_t v) { + exports_test_thing_t *val = + (exports_test_thing_t *) + malloc(sizeof(exports_test_thing_t)); + assert(val != NULL); + val->thing = test_constructor_thing(v + 1); + return exports_test_thing_new(val); +} + +uint32_t +exports_test_method_thing_foo(exports_test_borrow_thing_t self) { + test_borrow_thing_t borrow = + test_borrow_thing(self->thing); + return test_method_thing_foo(borrow) + 2; +} + +void +exports_test_method_thing_bar(exports_test_borrow_thing_t self, uint32_t v) { + test_borrow_thing_t borrow = + test_borrow_thing(self->thing); + test_method_thing_bar(borrow, v + 3); +} + +exports_test_own_thing_t +exports_test_static_thing_baz(exports_test_own_thing_t a, exports_test_own_thing_t b) { + exports_test_thing_t *a_rep = + exports_test_thing_rep(a); + exports_test_thing_t *b_rep = + exports_test_thing_rep(b); + + test_own_thing_t tmp = + test_static_thing_baz(a_rep->thing, b_rep->thing); + test_borrow_thing_t tmp_borrow = + test_borrow_thing(tmp); + uint32_t ret = test_method_thing_foo(tmp_borrow) + 4; + test_thing_drop_own(tmp); + + return exports_test_constructor_thing(ret); +} + +void +exports_test_thing_destructor(exports_test_thing_t *rep) { + free(rep); +} diff --git a/tests/runtime/resource_import_and_export/wasm.cs b/tests/runtime-new/resource-import-and-export/intermediate.cs similarity index 54% rename from tests/runtime/resource_import_and_export/wasm.cs rename to tests/runtime-new/resource-import-and-export/intermediate.cs index bc81a2051..d2094cc2a 100644 --- a/tests/runtime/resource_import_and_export/wasm.cs +++ b/tests/runtime-new/resource-import-and-export/intermediate.cs @@ -1,7 +1,7 @@ -using Import = ResourceImportAndExportWorld.wit.imports.test.resourceImportAndExport.ITest; -using Host = ResourceImportAndExportWorld.wit.imports.test.resourceImportAndExport.TestInterop; +using Import = IntermediateWorld.wit.imports.test.resourceImportAndExport.ITest; +using Host = IntermediateWorld.wit.imports.test.resourceImportAndExport.TestInterop; -namespace ResourceImportAndExportWorld.wit.exports.test.resourceImportAndExport +namespace IntermediateWorld.wit.exports.test.resourceImportAndExport { public class TestImpl : ITest { public class Thing : ITest.Thing, ITest.IThing { @@ -26,10 +26,10 @@ public static ITest.Thing Baz(ITest.Thing a, ITest.Thing b) { } } -namespace ResourceImportAndExportWorld { - public class ResourceImportAndExportWorldImpl : IResourceImportAndExportWorld { +namespace IntermediateWorld { + public class IntermediateWorldImpl : IIntermediateWorld { public static Import.Thing ToplevelExport(Import.Thing things) { - return exports.ResourceImportAndExportWorld.ToplevelImport(things); + return exports.IntermediateWorld.ToplevelImport(things); } } } diff --git a/tests/runtime/resource_import_and_export/wasm.rs b/tests/runtime-new/resource-import-and-export/intermediate.rs similarity index 93% rename from tests/runtime/resource_import_and_export/wasm.rs rename to tests/runtime-new/resource-import-and-export/intermediate.rs index b841ee2ad..17f6bcb8f 100644 --- a/tests/runtime/resource_import_and_export/wasm.rs +++ b/tests/runtime-new/resource-import-and-export/intermediate.rs @@ -1,10 +1,7 @@ -use std::cell::RefCell; - -wit_bindgen::generate!({ - path: "../../tests/runtime/resource_import_and_export", -}); +include!(env!("BINDINGS")); use exports::test::resource_import_and_export::test::{GuestThing, Thing as ExportThing}; +use std::cell::RefCell; pub struct Test {} diff --git a/tests/runtime-new/resource-import-and-export/leaf-thing.rs b/tests/runtime-new/resource-import-and-export/leaf-thing.rs new file mode 100644 index 000000000..538c93e86 --- /dev/null +++ b/tests/runtime-new/resource-import-and-export/leaf-thing.rs @@ -0,0 +1,34 @@ +include!(env!("BINDINGS")); + +use crate::exports::test::resource_import_and_export::test::{Guest, GuestThing, Thing}; +use std::cell::Cell; + +struct Component; + +export!(Component); + +struct MyThing(Cell); + +impl Guest for Component { + type Thing = MyThing; +} + +impl GuestThing for MyThing { + fn new(v: u32) -> MyThing { + MyThing(Cell::new(v + 1)) + } + + fn foo(&self) -> u32 { + self.0.get() + 2 + } + + fn bar(&self, v: u32) { + self.0.set(v + 3); + } + + fn baz(a: Thing, b: Thing) -> Thing { + let a = a.get::(); + let b = b.get::(); + Thing::new(MyThing::new(a.foo() + b.foo() + 4)) + } +} diff --git a/tests/runtime-new/resource-import-and-export/leaf-toplevel.rs b/tests/runtime-new/resource-import-and-export/leaf-toplevel.rs new file mode 100644 index 000000000..2f4caca8b --- /dev/null +++ b/tests/runtime-new/resource-import-and-export/leaf-toplevel.rs @@ -0,0 +1,11 @@ +include!(env!("BINDINGS")); + +export!(Component); + +struct Component; + +impl Guest for Component { + fn toplevel_export(a: Thing) -> Thing { + a + } +} diff --git a/tests/runtime-new/resource-import-and-export/runner.rs b/tests/runtime-new/resource-import-and-export/runner.rs new file mode 100644 index 000000000..8b0c1d34e --- /dev/null +++ b/tests/runtime-new/resource-import-and-export/runner.rs @@ -0,0 +1,21 @@ +use crate::test::resource_import_and_export::test::Thing; + +include!(env!("BINDINGS")); + +fn main() { + let thing1 = Thing::new(42); + + // 42 + 1 (constructor) + 1 (constructor) + 2 (foo) + 2 (foo) + assert_eq!(thing1.foo(), 48); + + // 33 + 3 (bar) + 3 (bar) + 2 (foo) + 2 (foo) + thing1.bar(33); + assert_eq!(thing1.foo(), 43); + + let thing2 = Thing::new(81); + let thing3 = Thing::baz(thing1, thing2); + assert_eq!( + thing3.foo(), + 33 + 3 + 3 + 81 + 1 + 1 + 2 + 2 + 4 + 1 + 2 + 4 + 1 + 1 + 2 + 2 + ); +} diff --git a/tests/runtime/resource_import_and_export/world.wit b/tests/runtime-new/resource-import-and-export/test.wit similarity index 56% rename from tests/runtime/resource_import_and_export/world.wit rename to tests/runtime-new/resource-import-and-export/test.wit index 5eef71a77..e38318d3f 100644 --- a/tests/runtime/resource_import_and_export/world.wit +++ b/tests/runtime-new/resource-import-and-export/test.wit @@ -1,3 +1,6 @@ +//@ dependencies = ['intermediate', 'leaf-thing', 'leaf-toplevel'] +//@ wac = 'compose.wac' + package test:resource-import-and-export; interface test { @@ -11,7 +14,16 @@ interface test { } } -world resource-import-and-export { +world leaf-thing { + export test; +} + +world leaf-toplevel { + use test.{thing}; + export toplevel-export: func(a: thing) -> thing; +} + +world intermediate { import test; export test; @@ -20,3 +32,7 @@ world resource-import-and-export { import toplevel-import: func(a: thing) -> thing; export toplevel-export: func(a: thing) -> thing; } + +world runner { + import test; +} diff --git a/tests/runtime/resource_import_and_export.rs b/tests/runtime/resource_import_and_export.rs deleted file mode 100644 index 362d1438a..000000000 --- a/tests/runtime/resource_import_and_export.rs +++ /dev/null @@ -1,87 +0,0 @@ -use std::collections::HashMap; -use wasmtime::{component::Resource, Result, Store}; - -use self::test::resource_import_and_export::test::{Host, HostThing}; -use crate::resource_import_and_export::exports::test::resource_import_and_export::test::Guest; - -wasmtime::component::bindgen!(in "tests/runtime/resource_import_and_export"); - -#[derive(Default)] -pub struct MyHostThing { - map_l: HashMap, - next_id: u32, -} - -impl ResourceImportAndExportImports for MyHostThing { - fn toplevel_import(&mut self, a: Resource) -> Resource { - a - } -} - -impl Host for MyHostThing {} - -impl HostThing for MyHostThing { - fn new(&mut self, v: u32) -> Resource { - let id = self.next_id; - self.next_id += 1; - self.map_l.insert(id, v + 1); - Resource::new_own(id) - } - - fn foo(&mut self, self_: Resource) -> u32 { - let id = self_.rep(); - self.map_l[&id] + 2 - } - - fn bar(&mut self, self_: Resource, v: u32) { - let id = self_.rep(); - self.map_l.insert(id, v + 3); - } - - fn baz(&mut self, a: Resource, b: Resource) -> Resource { - let a = self.foo(a); - let b = self.foo(b); - self.new(a + b + 4) - } - - fn drop(&mut self, rep: Resource) -> Result<()> { - let id = rep.rep(); - self.map_l.remove(&id); - Ok(()) - } -} - -#[test] -fn run() -> anyhow::Result<()> { - crate::run_test( - "resource_import_and_export", - |linker| ResourceImportAndExport::add_to_linker(linker, |x| &mut x.0), - |store, component, linker| { - Ok(ResourceImportAndExport::instantiate(store, component, linker)?.interface1) - }, - run_test, - ) -} - -fn run_test(instance: Guest, store: &mut Store>) -> anyhow::Result<()> { - let thing1 = instance.thing().call_constructor(&mut *store, 42)?; - - // 42 + 1 (constructor) + 1 (constructor) + 2 (foo) + 2 (foo) - let foo1 = instance.thing().call_foo(&mut *store, thing1)?; - assert_eq!(foo1, 48); - - // 33 + 3 (bar) + 3 (bar) + 2 (foo) + 2 (foo) - instance.thing().call_bar(&mut *store, thing1, 33)?; - let foo2 = instance.thing().call_foo(&mut *store, thing1)?; - assert_eq!(foo2, 43); - - let thing2 = instance.thing().call_constructor(&mut *store, 81)?; - let thing3 = instance.thing().call_baz(&mut *store, thing1, thing2)?; - let foo3 = instance.thing().call_foo(&mut *store, thing3)?; - assert_eq!( - foo3, - 33 + 3 + 3 + 81 + 1 + 1 + 2 + 2 + 4 + 1 + 2 + 4 + 1 + 1 + 2 + 2 - ); - - Ok(()) -} diff --git a/tests/runtime/resource_import_and_export/wasm.c b/tests/runtime/resource_import_and_export/wasm.c deleted file mode 100644 index 8ef886e29..000000000 --- a/tests/runtime/resource_import_and_export/wasm.c +++ /dev/null @@ -1,63 +0,0 @@ -#include -#include -/* #include */ -/* #include */ -/* #include */ -/* #include */ -#include -#include - -struct exports_test_resource_import_and_export_test_thing_t { - test_resource_import_and_export_test_own_thing_t thing; -}; - -resource_import_and_export_own_thing_t -exports_resource_import_and_export_toplevel_export(resource_import_and_export_own_thing_t a) { - return resource_import_and_export_toplevel_import(a); -} - -exports_test_resource_import_and_export_test_own_thing_t -exports_test_resource_import_and_export_test_constructor_thing(uint32_t v) { - exports_test_resource_import_and_export_test_thing_t *val = - (exports_test_resource_import_and_export_test_thing_t *) - malloc(sizeof(exports_test_resource_import_and_export_test_thing_t)); - assert(val != NULL); - val->thing = test_resource_import_and_export_test_constructor_thing(v + 1); - return exports_test_resource_import_and_export_test_thing_new(val); -} - -uint32_t -exports_test_resource_import_and_export_test_method_thing_foo(exports_test_resource_import_and_export_test_borrow_thing_t self) { - test_resource_import_and_export_test_borrow_thing_t borrow = - test_resource_import_and_export_test_borrow_thing(self->thing); - return test_resource_import_and_export_test_method_thing_foo(borrow) + 2; -} - -void -exports_test_resource_import_and_export_test_method_thing_bar(exports_test_resource_import_and_export_test_borrow_thing_t self, uint32_t v) { - test_resource_import_and_export_test_borrow_thing_t borrow = - test_resource_import_and_export_test_borrow_thing(self->thing); - test_resource_import_and_export_test_method_thing_bar(borrow, v + 3); -} - -exports_test_resource_import_and_export_test_own_thing_t -exports_test_resource_import_and_export_test_static_thing_baz(exports_test_resource_import_and_export_test_own_thing_t a, exports_test_resource_import_and_export_test_own_thing_t b) { - exports_test_resource_import_and_export_test_thing_t *a_rep = - exports_test_resource_import_and_export_test_thing_rep(a); - exports_test_resource_import_and_export_test_thing_t *b_rep = - exports_test_resource_import_and_export_test_thing_rep(b); - - test_resource_import_and_export_test_own_thing_t tmp = - test_resource_import_and_export_test_static_thing_baz(a_rep->thing, b_rep->thing); - test_resource_import_and_export_test_borrow_thing_t tmp_borrow = - test_resource_import_and_export_test_borrow_thing(tmp); - uint32_t ret = test_resource_import_and_export_test_method_thing_foo(tmp_borrow) + 4; - test_resource_import_and_export_test_thing_drop_own(tmp); - - return exports_test_resource_import_and_export_test_constructor_thing(ret); -} - -void -exports_test_resource_import_and_export_test_thing_destructor(exports_test_resource_import_and_export_test_thing_t *rep) { - free(rep); -} From b2b85e85a6ad85200af30cc5f9d25d202209cdb5 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 3 Apr 2025 09:07:06 -0700 Subject: [PATCH 2/2] Remove test directive --- tests/runtime/main.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/runtime/main.rs b/tests/runtime/main.rs index f8036663f..2964e7ee2 100644 --- a/tests/runtime/main.rs +++ b/tests/runtime/main.rs @@ -17,7 +17,6 @@ mod flavorful; mod options; mod resource_alias; mod resource_floats; -mod resource_import_and_export; mod resource_with_lists; mod resources; mod results;