diff --git a/src/services/comp-sys/cargo-component/tests/reexport.rs b/src/services/comp-sys/cargo-component/tests/reexport.rs new file mode 100644 index 00000000..89f4cf43 --- /dev/null +++ b/src/services/comp-sys/cargo-component/tests/reexport.rs @@ -0,0 +1,25 @@ +//! This test checks that if cargo-component can control reexported entry points. + +#![feature(once_cell)] + +use std::path::PathBuf; +use test_utils::{cargo_clean, cargo_component, clean_after_test}; +mod test_utils; + +#[test] +fn reexport() { + let root_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + let target_dir = root_dir.join("target").join("reexport_test"); + let cwd = root_dir.join("tests").join("reexport_test"); + let output = cargo_clean(&cwd, &target_dir); + assert!(output.status.success()); + + let output = cargo_component(&cwd, &target_dir); + let stderr = String::from_utf8_lossy(&output.stderr); + println!("stderr: {stderr}"); + + assert!(output.status.success()); + assert!(!stderr.contains("access controlled entry point is disallowed")); + + clean_after_test(&cwd); +} diff --git a/src/services/comp-sys/cargo-component/tests/reexport_test/Cargo.toml b/src/services/comp-sys/cargo-component/tests/reexport_test/Cargo.toml new file mode 100644 index 00000000..fe99f363 --- /dev/null +++ b/src/services/comp-sys/cargo-component/tests/reexport_test/Cargo.toml @@ -0,0 +1,2 @@ +[workspace] +members = ["foo", "bar", "baz"] \ No newline at end of file diff --git a/src/services/comp-sys/cargo-component/tests/reexport_test/Components.toml b/src/services/comp-sys/cargo-component/tests/reexport_test/Components.toml new file mode 100644 index 00000000..a5c187df --- /dev/null +++ b/src/services/comp-sys/cargo-component/tests/reexport_test/Components.toml @@ -0,0 +1,20 @@ +[components] +foo = { name = "foo" } +bar = { name = "bar" } +baz = { name = "baz" } + +[whitelist] +[whitelist.foo.f1] +baz = true + +[whitelist.foo.Foo.new] +baz = true + +[whitelist.foo.Foo.get] +baz = true + +[whitelist.foo.FooTrait.t_new] +baz = true + +[whitelist.foo.FooTrait.t_get] +baz = true \ No newline at end of file diff --git a/src/services/comp-sys/cargo-component/tests/reexport_test/bar/Cargo.toml b/src/services/comp-sys/cargo-component/tests/reexport_test/bar/Cargo.toml new file mode 100644 index 00000000..b4b3aead --- /dev/null +++ b/src/services/comp-sys/cargo-component/tests/reexport_test/bar/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "bar" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +foo = {path ="../foo"} \ No newline at end of file diff --git a/src/services/comp-sys/cargo-component/tests/reexport_test/bar/src/lib.rs b/src/services/comp-sys/cargo-component/tests/reexport_test/bar/src/lib.rs new file mode 100644 index 00000000..5845d299 --- /dev/null +++ b/src/services/comp-sys/cargo-component/tests/reexport_test/bar/src/lib.rs @@ -0,0 +1,3 @@ +pub use foo::f1; +pub use foo::Foo; +pub use foo::FooTrait; \ No newline at end of file diff --git a/src/services/comp-sys/cargo-component/tests/reexport_test/baz/Cargo.toml b/src/services/comp-sys/cargo-component/tests/reexport_test/baz/Cargo.toml new file mode 100644 index 00000000..18538a69 --- /dev/null +++ b/src/services/comp-sys/cargo-component/tests/reexport_test/baz/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "baz" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +foo = {path ="../foo"} +bar = {path ="../bar"} \ No newline at end of file diff --git a/src/services/comp-sys/cargo-component/tests/reexport_test/baz/src/lib.rs b/src/services/comp-sys/cargo-component/tests/reexport_test/baz/src/lib.rs new file mode 100644 index 00000000..f5682e24 --- /dev/null +++ b/src/services/comp-sys/cargo-component/tests/reexport_test/baz/src/lib.rs @@ -0,0 +1,24 @@ +pub fn reexport_fn() { + foo::f1(); + bar::f1(); +} + +pub fn reexport_method() { + let foo_struct = foo::Foo::new(); + foo_struct.get(); + + let another_foo = bar::Foo::new(); + another_foo.get(); +} + +pub fn reexport_trait_1() { + use foo::FooTrait; + let foo_struct = foo::Foo::t_new(); + foo_struct.t_get(); +} + +pub fn reexport_trait_2() { + use bar::FooTrait; + let foo_struct = bar::Foo::t_new(); + foo_struct.t_get(); +} \ No newline at end of file diff --git a/src/services/comp-sys/cargo-component/tests/reexport_test/foo/Cargo.toml b/src/services/comp-sys/cargo-component/tests/reexport_test/foo/Cargo.toml new file mode 100644 index 00000000..840cd556 --- /dev/null +++ b/src/services/comp-sys/cargo-component/tests/reexport_test/foo/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "foo" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +controlled = {path = "../../../../controlled"} \ No newline at end of file diff --git a/src/services/comp-sys/cargo-component/tests/reexport_test/foo/src/lib.rs b/src/services/comp-sys/cargo-component/tests/reexport_test/foo/src/lib.rs new file mode 100644 index 00000000..3ffa7886 --- /dev/null +++ b/src/services/comp-sys/cargo-component/tests/reexport_test/foo/src/lib.rs @@ -0,0 +1,39 @@ +#![feature(register_tool)] +#![register_tool(component_access_control)] + +#[macro_use] +extern crate controlled; + +#[controlled] +pub fn f1() {} + +pub struct Foo; + +impl Foo { + #[controlled] + pub fn new() -> Self { + Foo + } + + #[controlled] + pub fn get(&self) -> usize { + 42 + } +} + +pub trait FooTrait { + #[controlled] + fn t_new() -> Self; + #[controlled] + fn t_get(&self) -> usize; +} + +impl FooTrait for Foo { + fn t_new() -> Self { + Foo + } + + fn t_get(&self) -> usize { + 43 + } +} \ No newline at end of file diff --git a/src/services/comp-sys/cargo-component/tests/test_utils/mod.rs b/src/services/comp-sys/cargo-component/tests/test_utils/mod.rs index 3147a334..7dba4431 100644 --- a/src/services/comp-sys/cargo-component/tests/test_utils/mod.rs +++ b/src/services/comp-sys/cargo-component/tests/test_utils/mod.rs @@ -31,6 +31,7 @@ pub fn cargo_component(cwd: &PathBuf, target_dir: &PathBuf) -> Output { } pub fn clean_after_test(cwd: &PathBuf) { + Command::new("cargo").arg("clean").current_dir(cwd).status().unwrap(); let cargo_lock = cwd.join("Cargo.lock"); std::fs::remove_file(cargo_lock); } diff --git a/src/services/comp-sys/cargo-component/tests/trait_method.rs b/src/services/comp-sys/cargo-component/tests/trait_method.rs index b4e5dbae..c74cabd1 100644 --- a/src/services/comp-sys/cargo-component/tests/trait_method.rs +++ b/src/services/comp-sys/cargo-component/tests/trait_method.rs @@ -17,7 +17,7 @@ fn trait_method() { let output = cargo_component(&cwd, &target_dir); let stderr = String::from_utf8_lossy(&output.stderr); println!("stderr: {stderr}"); - + assert!(output.status.success()); assert!(stderr.contains("access controlled entry point is disallowed")); assert!(stderr.contains("access foo::Foo::method in bar"));