From 2a38d9fcefa2d9ef4cd814c7ddc1421ceae1a32c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bennet=20Ble=C3=9Fmann?= Date: Thu, 1 May 2025 00:22:34 +0200 Subject: [PATCH 1/9] add sanity check --- .../crates/missing-deps-git/Cargo.toml | 2 +- tests/buildtest/mod.rs | 47 ++++++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/tests/buildtest/crates/missing-deps-git/Cargo.toml b/tests/buildtest/crates/missing-deps-git/Cargo.toml index 7e65c56..ceba8ea 100644 --- a/tests/buildtest/crates/missing-deps-git/Cargo.toml +++ b/tests/buildtest/crates/missing-deps-git/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "missing-deps" +name = "missing-deps-git" version = "0.1.0" authors = ["Pietro Albini "] edition = "2018" diff --git a/tests/buildtest/mod.rs b/tests/buildtest/mod.rs index 594df51..7f05082 100644 --- a/tests/buildtest/mod.rs +++ b/tests/buildtest/mod.rs @@ -5,6 +5,51 @@ use rustwide::cmd::{ProcessLinesActions, SandboxBuilder}; mod runner; mod inside_docker; +#[test] +fn buildtest_crate_name_matches_folder_name() { + for result in std::fs::read_dir(concat!( + env!("CARGO_MANIFEST_DIR"), + "/tests/buildtest/crates" + )) + .unwrap() + { + let dir_entry = result.unwrap(); + if dir_entry.file_type().unwrap().is_dir() { + let dir_name = dir_entry.file_name(); + + if [ + "cargo-workspace".as_ref(), + "invalid-cargotoml-syntax".as_ref(), + ] + .contains(&dir_name.as_os_str()) + { + continue; + } + + let expected_crate_name = if dir_name != "invalid-cargotoml-content" { + dir_name.clone() + } else { + "!".into() + }; + + let cargo_toml_path = dir_entry.path().join("Cargo.toml"); + + if !cargo_toml_path.exists() { + continue; + } + + let cargo_toml_content = std::fs::read_to_string(&cargo_toml_path).unwrap(); + + assert!( + cargo_toml_content.contains(&format!("name = {expected_crate_name:?}")), + "directory {:?} does not contain a crate with the expected name {:?}", + dir_name, + expected_crate_name + ) + } + } +} + #[test] fn test_hello_world() { runner::run("hello-world", |run| { @@ -199,7 +244,7 @@ test_prepare_error_stderr!( test_missing_deps_git, "missing-deps-git", MissingDependencies, - "failed to get `not-a-git-repo` as a dependency of package `missing-deps v0.1.0" + "failed to get `not-a-git-repo` as a dependency of package `missing-deps-git v0.1.0" ); test_prepare_error_stderr!( From f05a6ac2a84c7a9a5bf6ba0600df39c015b1d1de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bennet=20Ble=C3=9Fmann?= Date: Fri, 25 Apr 2025 20:59:38 +0200 Subject: [PATCH 2/9] add test crates --- .../Cargo.lock | 98 +++++++++++++++++++ .../Cargo.toml | 16 +++ .../src/main.rs | 3 + .../invalid-cargotoml-content-deps/Cargo.toml | 12 +++ .../src/main.rs | 3 + .../Cargo.lock | 25 +++++ .../Cargo.toml | 10 ++ .../src/main.rs | 3 + .../Cargo.toml | 12 +++ .../src/main.rs | 3 + .../Cargo.toml | 10 ++ .../src/main.rs | 3 + .../Cargo.toml | 13 +++ .../src/main.rs | 3 + .../Cargo.toml | 13 +++ .../src/main.rs | 3 + .../.cargo/config.toml | 2 + .../Cargo.lock | 7 ++ .../Cargo.toml | 10 ++ .../src/main.rs | 3 + .../invalid-cargotoml-syntax-deps/Cargo.toml | 10 ++ .../invalid-cargotoml-syntax-deps/src/main.rs | 3 + .../crates/invalid-lockfile-syntax/Cargo.lock | 7 ++ .../crates/invalid-lockfile-syntax/Cargo.toml | 9 ++ .../invalid-lockfile-syntax/src/main.rs | 3 + .../crates/lockfile-collision/Cargo.toml | 10 ++ .../crates/lockfile-collision/Cargo.toml | 9 ++ .../crates/lockfile-collision/src/lib.rs | 3 + .../crates/lockfile-collision/src/main.rs | 3 + .../missing-deps-registry-version/Cargo.lock | 16 +++ .../missing-deps-registry-version/Cargo.toml | 10 ++ .../missing-deps-registry-version/src/main.rs | 3 + .../crates/missing-deps-typo/Cargo.toml | 11 +++ .../crates/missing-deps-typo/src/main.rs | 3 + tests/buildtest/mod.rs | 91 +++++++++++++++++ tests/buildtest/runner.rs | 23 +++++ 36 files changed, 466 insertions(+) create mode 100644 tests/buildtest/crates/invalid-cargotoml-conflicting-links/Cargo.lock create mode 100644 tests/buildtest/crates/invalid-cargotoml-conflicting-links/Cargo.toml create mode 100644 tests/buildtest/crates/invalid-cargotoml-conflicting-links/src/main.rs create mode 100644 tests/buildtest/crates/invalid-cargotoml-content-deps/Cargo.toml create mode 100644 tests/buildtest/crates/invalid-cargotoml-content-deps/src/main.rs create mode 100644 tests/buildtest/crates/invalid-cargotoml-content-type-in-deps/Cargo.lock create mode 100644 tests/buildtest/crates/invalid-cargotoml-content-type-in-deps/Cargo.toml create mode 100644 tests/buildtest/crates/invalid-cargotoml-content-type-in-deps/src/main.rs create mode 100644 tests/buildtest/crates/invalid-cargotoml-cyclic-feature/Cargo.toml create mode 100644 tests/buildtest/crates/invalid-cargotoml-cyclic-feature/src/main.rs create mode 100644 tests/buildtest/crates/invalid-cargotoml-cyclic-package/Cargo.toml create mode 100644 tests/buildtest/crates/invalid-cargotoml-cyclic-package/src/main.rs create mode 100644 tests/buildtest/crates/invalid-cargotoml-missing-override/Cargo.toml create mode 100644 tests/buildtest/crates/invalid-cargotoml-missing-override/src/main.rs create mode 100644 tests/buildtest/crates/invalid-cargotoml-missing-patch/Cargo.toml create mode 100644 tests/buildtest/crates/invalid-cargotoml-missing-patch/src/main.rs create mode 100644 tests/buildtest/crates/invalid-cargotoml-missing-registry-config/.cargo/config.toml create mode 100644 tests/buildtest/crates/invalid-cargotoml-missing-registry-config/Cargo.lock create mode 100644 tests/buildtest/crates/invalid-cargotoml-missing-registry-config/Cargo.toml create mode 100644 tests/buildtest/crates/invalid-cargotoml-missing-registry-config/src/main.rs create mode 100644 tests/buildtest/crates/invalid-cargotoml-syntax-deps/Cargo.toml create mode 100644 tests/buildtest/crates/invalid-cargotoml-syntax-deps/src/main.rs create mode 100644 tests/buildtest/crates/invalid-lockfile-syntax/Cargo.lock create mode 100644 tests/buildtest/crates/invalid-lockfile-syntax/Cargo.toml create mode 100644 tests/buildtest/crates/invalid-lockfile-syntax/src/main.rs create mode 100644 tests/buildtest/crates/lockfile-collision/Cargo.toml create mode 100644 tests/buildtest/crates/lockfile-collision/crates/lockfile-collision/Cargo.toml create mode 100644 tests/buildtest/crates/lockfile-collision/crates/lockfile-collision/src/lib.rs create mode 100644 tests/buildtest/crates/lockfile-collision/src/main.rs create mode 100644 tests/buildtest/crates/missing-deps-registry-version/Cargo.lock create mode 100644 tests/buildtest/crates/missing-deps-registry-version/Cargo.toml create mode 100644 tests/buildtest/crates/missing-deps-registry-version/src/main.rs create mode 100644 tests/buildtest/crates/missing-deps-typo/Cargo.toml create mode 100644 tests/buildtest/crates/missing-deps-typo/src/main.rs diff --git a/tests/buildtest/crates/invalid-cargotoml-conflicting-links/Cargo.lock b/tests/buildtest/crates/invalid-cargotoml-conflicting-links/Cargo.lock new file mode 100644 index 0000000..fcd0b44 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-conflicting-links/Cargo.lock @@ -0,0 +1,98 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "cc" +version = "1.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" +dependencies = [ + "shlex", +] + +[[package]] +name = "invalid-cargotoml-conflicting-links" +version = "0.1.0" +dependencies = [ + "ring 0.13.5", + "ring 0.14.6", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "ring" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4db68a2e35f3497146b7e4563df7d4773a2433230c5e4b448328e31740458a" +dependencies = [ + "cc", + "lazy_static", + "libc", + "untrusted", +] + +[[package]] +name = "ring" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "426bc186e3e95cac1e4a4be125a4aca7e84c2d616ffc02244eef36e2a60a093c" +dependencies = [ + "cc", + "lazy_static", + "libc", + "spin", + "untrusted", + "winapi", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "untrusted" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/tests/buildtest/crates/invalid-cargotoml-conflicting-links/Cargo.toml b/tests/buildtest/crates/invalid-cargotoml-conflicting-links/Cargo.toml new file mode 100644 index 0000000..d397cb2 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-conflicting-links/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "invalid-cargotoml-conflicting-links" +version = "0.1.0" +authors = ["Pietro Albini "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +ring_13 = { version = "=0.13.5", package = "ring" } +ring_14 = { version = "=0.14.6", package = "ring" } + + +[replace] +"ring:0.13.5" = { git = "https://github.com/briansmith/ring.git", rev = "704e4216a397bd830479bcd6d7dd67fc62cdbe67" } +"ring:0.14.6" = { git = "https://github.com/briansmith/ring.git", rev = "ef85df478152aa3fe06c811309379efa08f8a529" } diff --git a/tests/buildtest/crates/invalid-cargotoml-conflicting-links/src/main.rs b/tests/buildtest/crates/invalid-cargotoml-conflicting-links/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-conflicting-links/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/tests/buildtest/crates/invalid-cargotoml-content-deps/Cargo.toml b/tests/buildtest/crates/invalid-cargotoml-content-deps/Cargo.toml new file mode 100644 index 0000000..e7ca4e7 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-content-deps/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "invalid-cargotoml-content-deps" +version = "0.1.0" +authors = ["Pietro Albini "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +parity-db = "=0.2.3" +# invalid package name in invalid-cargotoml-content is too invalid +# invalid-cargotoml-content = { git = "https://github.com/rust-lang/rustwide.git", rev = "ee102383cbe40aafdfce7bf04a120226c16a8983" } diff --git a/tests/buildtest/crates/invalid-cargotoml-content-deps/src/main.rs b/tests/buildtest/crates/invalid-cargotoml-content-deps/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-content-deps/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/tests/buildtest/crates/invalid-cargotoml-content-type-in-deps/Cargo.lock b/tests/buildtest/crates/invalid-cargotoml-content-type-in-deps/Cargo.lock new file mode 100644 index 0000000..1861b69 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-content-type-in-deps/Cargo.lock @@ -0,0 +1,25 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "invalid-cargotoml-content-type-in-deps" +version = "0.1.0" +dependencies = [ + "libressl-pnacl-sys", +] + +[[package]] +name = "libressl-pnacl-sys" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbbd33b70b69d25b726e2e747833e22c7ebd98cc46da2b368f45b36b4d026395" +dependencies = [ + "pnacl-build-helper", +] + +[[package]] +name = "pnacl-build-helper" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eb74016978b58b71690dc3bb9a4890bd41dac2d4c6835249edf71a698dbc2db" diff --git a/tests/buildtest/crates/invalid-cargotoml-content-type-in-deps/Cargo.toml b/tests/buildtest/crates/invalid-cargotoml-content-type-in-deps/Cargo.toml new file mode 100644 index 0000000..abf3e74 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-content-type-in-deps/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "invalid-cargotoml-content-type-in-deps" +version = "0.1.0" +authors = [] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +libressl-pnacl-sys = "=2.1.0" diff --git a/tests/buildtest/crates/invalid-cargotoml-content-type-in-deps/src/main.rs b/tests/buildtest/crates/invalid-cargotoml-content-type-in-deps/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-content-type-in-deps/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/tests/buildtest/crates/invalid-cargotoml-cyclic-feature/Cargo.toml b/tests/buildtest/crates/invalid-cargotoml-cyclic-feature/Cargo.toml new file mode 100644 index 0000000..915e692 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-cyclic-feature/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "invalid-cargotoml-cyclic-feature" +version = "0.1.0" +authors = ["Pietro Albini "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] + +[features] +cyclic = ["cyclic"] diff --git a/tests/buildtest/crates/invalid-cargotoml-cyclic-feature/src/main.rs b/tests/buildtest/crates/invalid-cargotoml-cyclic-feature/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-cyclic-feature/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/tests/buildtest/crates/invalid-cargotoml-cyclic-package/Cargo.toml b/tests/buildtest/crates/invalid-cargotoml-cyclic-package/Cargo.toml new file mode 100644 index 0000000..b5a0a5d --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-cyclic-package/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "invalid-cargotoml-cyclic-package" +version = "0.1.0" +authors = ["Pietro Albini "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +invalid-cargotoml-cyclic-package = { path = "./" } diff --git a/tests/buildtest/crates/invalid-cargotoml-cyclic-package/src/main.rs b/tests/buildtest/crates/invalid-cargotoml-cyclic-package/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-cyclic-package/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/tests/buildtest/crates/invalid-cargotoml-missing-override/Cargo.toml b/tests/buildtest/crates/invalid-cargotoml-missing-override/Cargo.toml new file mode 100644 index 0000000..f44d7f5 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-missing-override/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "invalid-cargotoml-missing-override" +version = "0.1.0" +authors = ["Pietro Albini "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +build-rs = "=0.1.2" + +[replace] +"build-rs:0.1.2" = { git = "https://github.com/rust-lang/rustwide.git", rev = "07784be00b68cfd6bf80006c8d8669a7d6374ec2" } diff --git a/tests/buildtest/crates/invalid-cargotoml-missing-override/src/main.rs b/tests/buildtest/crates/invalid-cargotoml-missing-override/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-missing-override/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/tests/buildtest/crates/invalid-cargotoml-missing-patch/Cargo.toml b/tests/buildtest/crates/invalid-cargotoml-missing-patch/Cargo.toml new file mode 100644 index 0000000..b7fc03d --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-missing-patch/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "invalid-cargotoml-missing-patch" +version = "0.1.0" +authors = ["Pietro Albini "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +build-rs = "=0.1.2" + +[patch.crates-io] +build-rs = { git = "https://github.com/rust-lang/rustwide.git", rev = "07784be00b68cfd6bf80006c8d8669a7d6374ec2" } diff --git a/tests/buildtest/crates/invalid-cargotoml-missing-patch/src/main.rs b/tests/buildtest/crates/invalid-cargotoml-missing-patch/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-missing-patch/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/tests/buildtest/crates/invalid-cargotoml-missing-registry-config/.cargo/config.toml b/tests/buildtest/crates/invalid-cargotoml-missing-registry-config/.cargo/config.toml new file mode 100644 index 0000000..01e9dc1 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-missing-registry-config/.cargo/config.toml @@ -0,0 +1,2 @@ +[registries] +will-be-removed = { index = "https://github.com/rust-lang/crates.io-index" } diff --git a/tests/buildtest/crates/invalid-cargotoml-missing-registry-config/Cargo.lock b/tests/buildtest/crates/invalid-cargotoml-missing-registry-config/Cargo.lock new file mode 100644 index 0000000..0af6668 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-missing-registry-config/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "invalid-cargotoml-missing-registry-config" +version = "0.1.0" diff --git a/tests/buildtest/crates/invalid-cargotoml-missing-registry-config/Cargo.toml b/tests/buildtest/crates/invalid-cargotoml-missing-registry-config/Cargo.toml new file mode 100644 index 0000000..40efe3b --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-missing-registry-config/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "invalid-cargotoml-missing-registry-config" +version = "0.1.0" +authors = ["Pietro Albini "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +build-rs = { version = "*", registry = "will-be-removed" } diff --git a/tests/buildtest/crates/invalid-cargotoml-missing-registry-config/src/main.rs b/tests/buildtest/crates/invalid-cargotoml-missing-registry-config/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-missing-registry-config/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/tests/buildtest/crates/invalid-cargotoml-syntax-deps/Cargo.toml b/tests/buildtest/crates/invalid-cargotoml-syntax-deps/Cargo.toml new file mode 100644 index 0000000..7f319f6 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-syntax-deps/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "invalid-cargotoml-syntax-deps" +version = "0.1.0" +authors = ["Pietro Albini "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +url = "=0.5.9" diff --git a/tests/buildtest/crates/invalid-cargotoml-syntax-deps/src/main.rs b/tests/buildtest/crates/invalid-cargotoml-syntax-deps/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/tests/buildtest/crates/invalid-cargotoml-syntax-deps/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/tests/buildtest/crates/invalid-lockfile-syntax/Cargo.lock b/tests/buildtest/crates/invalid-lockfile-syntax/Cargo.lock new file mode 100644 index 0000000..093a780 --- /dev/null +++ b/tests/buildtest/crates/invalid-lockfile-syntax/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "invalid-lockfile-syntax +version = "0.1.0" diff --git a/tests/buildtest/crates/invalid-lockfile-syntax/Cargo.toml b/tests/buildtest/crates/invalid-lockfile-syntax/Cargo.toml new file mode 100644 index 0000000..45ef771 --- /dev/null +++ b/tests/buildtest/crates/invalid-lockfile-syntax/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "invalid-lockfile-syntax" +version = "0.1.0" +authors = ["Pietro Albini "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/tests/buildtest/crates/invalid-lockfile-syntax/src/main.rs b/tests/buildtest/crates/invalid-lockfile-syntax/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/tests/buildtest/crates/invalid-lockfile-syntax/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/tests/buildtest/crates/lockfile-collision/Cargo.toml b/tests/buildtest/crates/lockfile-collision/Cargo.toml new file mode 100644 index 0000000..db22620 --- /dev/null +++ b/tests/buildtest/crates/lockfile-collision/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "lockfile-collision" +version = "0.1.0" +authors = ["Pietro Albini "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +lockfile-collision = { path = "./crates/lockfile-collision" } diff --git a/tests/buildtest/crates/lockfile-collision/crates/lockfile-collision/Cargo.toml b/tests/buildtest/crates/lockfile-collision/crates/lockfile-collision/Cargo.toml new file mode 100644 index 0000000..34e77d1 --- /dev/null +++ b/tests/buildtest/crates/lockfile-collision/crates/lockfile-collision/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "lockfile-collision" +version = "0.1.0" +authors = ["Pietro Albini "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/tests/buildtest/crates/lockfile-collision/crates/lockfile-collision/src/lib.rs b/tests/buildtest/crates/lockfile-collision/crates/lockfile-collision/src/lib.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/tests/buildtest/crates/lockfile-collision/crates/lockfile-collision/src/lib.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/tests/buildtest/crates/lockfile-collision/src/main.rs b/tests/buildtest/crates/lockfile-collision/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/tests/buildtest/crates/lockfile-collision/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/tests/buildtest/crates/missing-deps-registry-version/Cargo.lock b/tests/buildtest/crates/missing-deps-registry-version/Cargo.lock new file mode 100644 index 0000000..81155a1 --- /dev/null +++ b/tests/buildtest/crates/missing-deps-registry-version/Cargo.lock @@ -0,0 +1,16 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "empty-library" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2aa7b9820e9739aa1443425ad1f7deb9e7686d276d867e9c4752189b3130c" + +[[package]] +name = "missing-deps-registry-version" +version = "0.1.0" +dependencies = [ + "empty-library", +] diff --git a/tests/buildtest/crates/missing-deps-registry-version/Cargo.toml b/tests/buildtest/crates/missing-deps-registry-version/Cargo.toml new file mode 100644 index 0000000..40b69be --- /dev/null +++ b/tests/buildtest/crates/missing-deps-registry-version/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "missing-deps-registry-version" +version = "0.1.0" +authors = ["Pietro Albini "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +empty-library = "=0.5.0" diff --git a/tests/buildtest/crates/missing-deps-registry-version/src/main.rs b/tests/buildtest/crates/missing-deps-registry-version/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/tests/buildtest/crates/missing-deps-registry-version/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/tests/buildtest/crates/missing-deps-typo/Cargo.toml b/tests/buildtest/crates/missing-deps-typo/Cargo.toml new file mode 100644 index 0000000..afc3e9d --- /dev/null +++ b/tests/buildtest/crates/missing-deps-typo/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "missing-deps-typo" +version = "0.1.0" +authors = ["Pietro Albini "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +# it's build-rs (dash vs. underscore) +build_rs = "*" diff --git a/tests/buildtest/crates/missing-deps-typo/src/main.rs b/tests/buildtest/crates/missing-deps-typo/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/tests/buildtest/crates/missing-deps-typo/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/tests/buildtest/mod.rs b/tests/buildtest/mod.rs index 7f05082..e0c5a1f 100644 --- a/tests/buildtest/mod.rs +++ b/tests/buildtest/mod.rs @@ -260,3 +260,94 @@ test_prepare_error_stderr!( MissingDependencies, "error: no matching package named `macro` found" ); + +test_prepare_unknown_err!( + test_invalid_cargotoml_content_deps, + "invalid-cargotoml-content-deps", + BrokenDependencies, + "failed to parse the version requirement `0.11\t` for dependency `parking_lot`" +); + +test_prepare_unknown_err!( + test_invalid_cargotoml_syntax_deps, + "invalid-cargotoml-syntax-deps", + BrokenDependencies, + "error: invalid table header" +); + +test_prepare_unknown_err!( + test_invalid_lockfile_syntax, + "invalid-lockfile-syntax", + InvalidCargoLock, + "error: failed to parse lock file at" +); + +test_prepare_unknown_err!( + test_missing_deps_typo, + "missing-deps-typo", + MissingDependencies, + "error: no matching package found" +); + +test_prepare_unknown_err!( + test_invalid_cargotoml_cyclic_feature, + "invalid-cargotoml-cyclic-feature", + BrokenDependencies, + "error: cyclic feature dependency: feature" +); + +test_prepare_unknown_err!( + test_invalid_cargotoml_cyclic_package, + "invalid-cargotoml-cyclic-package", + BrokenDependencies, + "error: cyclic package dependency: package" +); + +test_prepare_unknown_err!( + test_invalid_cargotoml_missing_registry_config, + "invalid-cargotoml-missing-registry-config", + MissingDependencies, + "registry index was not found in any configuration: `will-be-removed`" +); + +test_prepare_unknown_err!( + test_invalid_cargotoml_missing_override, + "invalid-cargotoml-missing-override", + MissingDependencies, + "no matching package for override `https://github.com/rust-lang/crates.io-index#build-rs@0.1.2` found" +); + +test_prepare_unknown_err!( + test_missing_deps_registry_version, + "missing-deps-registry-version", + MissingDependencies, + "error: failed to select a version for the requirement `empty-library = \"=0.5.0\"`" +); + +test_prepare_unknown_err!( + test_invalid_cargotoml_content_type_in_deps, + "invalid-cargotoml-content-type-in-deps", + BrokenDependencies, + "error: invalid type: map, expected a string" +); + +test_prepare_unknown_err!( + test_invalid_cargotoml_conflicting_links, + "invalid-cargotoml-conflicting-links", + InvalidCargoLock, + "error: Attempting to resolve a dependency with more than one crate with links=ring-asm" +); + +test_prepare_unknown_err!( + test_lockfile_collision, + "lockfile-collision", + BrokenDependencies, + "error: package collision in the lockfile: packages lockfile-collision v0.1.0 " +); + +test_prepare_unknown_err!( + test_invalid_cargotoml_missing_patch, + "invalid-cargotoml-missing-patch", + MissingDependencies, + "The patch location `https://github.com/rust-lang/rustwide.git?rev=07784be00b68cfd6bf80006c8d8669a7d6374ec2` does not appear to contain any packages matching the name `build-rs`" +); diff --git a/tests/buildtest/runner.rs b/tests/buildtest/runner.rs index a849d16..e99628b 100644 --- a/tests/buildtest/runner.rs +++ b/tests/buildtest/runner.rs @@ -63,6 +63,29 @@ impl Runner { } } +macro_rules! test_prepare_unknown_err { + ($name:ident, $krate:expr, $expected:ident $(,$expected_output:expr)?) => { + #[test] + fn $name() { + runner::run($krate, |run| { + let res = run.run( + rustwide::cmd::SandboxBuilder::new().enable_networking(false), + |_| Ok(()), + ); + if let Some(err) = res + .err() + .and_then(|err| err.downcast::().ok()) + { + panic!("did get an unexpected error: \n\n{}", err); + } else { + // Everything is OK! + } + Ok(()) + }); + } + }; +} + macro_rules! test_prepare_error { ($name:ident, $krate:expr, $expected:ident) => { #[test] From 27fa80431da402030bfc705720cc8baf871dc97d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bennet=20Ble=C3=9Fmann?= Date: Wed, 23 Jul 2025 21:02:17 +0200 Subject: [PATCH 3/9] fix broken test --- tests/buildtest/mod.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/buildtest/mod.rs b/tests/buildtest/mod.rs index e0c5a1f..59b4cef 100644 --- a/tests/buildtest/mod.rs +++ b/tests/buildtest/mod.rs @@ -303,11 +303,10 @@ test_prepare_unknown_err!( "error: cyclic package dependency: package" ); -test_prepare_unknown_err!( +test_prepare_error!( test_invalid_cargotoml_missing_registry_config, "invalid-cargotoml-missing-registry-config", - MissingDependencies, - "registry index was not found in any configuration: `will-be-removed`" + InvalidCargoTomlSyntax ); test_prepare_unknown_err!( From 1de26fdd7b61619efd4b8b8d23eb8ca386ffbebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bennet=20Ble=C3=9Fmann?= Date: Wed, 23 Jul 2025 21:03:41 +0200 Subject: [PATCH 4/9] make failing test output useful --- tests/buildtest/runner.rs | 46 +++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/tests/buildtest/runner.rs b/tests/buildtest/runner.rs index e99628b..ceb0532 100644 --- a/tests/buildtest/runner.rs +++ b/tests/buildtest/runner.rs @@ -95,12 +95,23 @@ macro_rules! test_prepare_error { rustwide::cmd::SandboxBuilder::new().enable_networking(false), |_| Ok(()), ); - if let Some(rustwide::PrepareError::$expected) = - res.err().and_then(|err| err.downcast().ok()) - { - // Everything is OK! - } else { - panic!("didn't get the error {}", stringify!($expected)); + match res.err().and_then(|err| err.downcast().ok()) { + Some(rustwide::PrepareError::$expected) => { + // Everything is OK! + } + Some(other) => { + panic!( + "expected PrepareError::{} error, got {:?} instead", + stringify!($expected), + other + ); + } + None => { + panic!( + "expected PrepareError::{} error, but did get None instead", + stringify!($expected) + ); + } } Ok(()) }); @@ -117,12 +128,23 @@ macro_rules! test_prepare_error_stderr { rustwide::cmd::SandboxBuilder::new().enable_networking(false), |_| Ok(()), ); - if let Some(rustwide::PrepareError::$expected(output)) = - res.err().and_then(|err| err.downcast().ok()) - { - assert!(output.contains($expected_output), "output: {:?}", output); - } else { - panic!("didn't get the error {}", stringify!($expected)); + match res.err().and_then(|err| err.downcast().ok()) { + Some(rustwide::PrepareError::$expected(output)) => { + assert!(output.contains($expected_output), "output: {:?}", output); + } + Some(other) => { + panic!( + "expected PrepareError::{} error, got {:?} instead", + stringify!($expected), + other + ); + } + None => { + panic!( + "expected PrepareError::{} error, but did get None instead", + stringify!($expected) + ); + } } Ok(()) }); From 326ed9f426582a5143920f558c30cee9e8e6e318 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bennet=20Ble=C3=9Fmann?= Date: Tue, 22 Jul 2025 22:23:47 +0200 Subject: [PATCH 5/9] have prepare add a generic PrepareError context if a more specifc one hasn't already been provided this way we can easily distinguish BuildDirectory::run failing due to Prepare::prepare failing from it failing for other reasons --- src/build.rs | 10 ++++++++-- src/prepare.rs | 2 ++ tests/buildtest/runner.rs | 31 ++++++++----------------------- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/src/build.rs b/src/build.rs index 6df0e62..3504e98 100644 --- a/src/build.rs +++ b/src/build.rs @@ -1,6 +1,6 @@ use crate::cmd::{Command, MountKind, Runnable, SandboxBuilder}; use crate::prepare::Prepare; -use crate::{Crate, Toolchain, Workspace}; +use crate::{Crate, PrepareError, Toolchain, Workspace}; use std::path::PathBuf; use std::vec::Vec; @@ -194,7 +194,13 @@ impl BuildDirectory { } let mut prepare = Prepare::new(&self.workspace, toolchain, krate, &source_dir, patches); - prepare.prepare()?; + prepare.prepare().map_err(|err| { + if err.downcast_ref::().is_none() { + err.context(PrepareError::Unknown) + } else { + err + } + })?; std::fs::create_dir_all(self.target_dir())?; let res = f(&Build { diff --git a/src/prepare.rs b/src/prepare.rs index a0d4110..0e1f3ad 100644 --- a/src/prepare.rs +++ b/src/prepare.rs @@ -390,6 +390,8 @@ pub enum PrepareError { /// Some of the dependencies do not exist anymore. #[error("the crate depends on missing dependencies: \n\n{0}")] MissingDependencies(String), + #[error("prepare failed without further details")] + Unknown, } #[cfg(test)] diff --git a/tests/buildtest/runner.rs b/tests/buildtest/runner.rs index ceb0532..1e5598c 100644 --- a/tests/buildtest/runner.rs +++ b/tests/buildtest/runner.rs @@ -63,29 +63,6 @@ impl Runner { } } -macro_rules! test_prepare_unknown_err { - ($name:ident, $krate:expr, $expected:ident $(,$expected_output:expr)?) => { - #[test] - fn $name() { - runner::run($krate, |run| { - let res = run.run( - rustwide::cmd::SandboxBuilder::new().enable_networking(false), - |_| Ok(()), - ); - if let Some(err) = res - .err() - .and_then(|err| err.downcast::().ok()) - { - panic!("did get an unexpected error: \n\n{}", err); - } else { - // Everything is OK! - } - Ok(()) - }); - } - }; -} - macro_rules! test_prepare_error { ($name:ident, $krate:expr, $expected:ident) => { #[test] @@ -119,6 +96,8 @@ macro_rules! test_prepare_error { }; } +pub(crate) use test_prepare_error; + macro_rules! test_prepare_error_stderr { ($name:ident, $krate:expr, $expected:ident, $expected_output:expr) => { #[test] @@ -151,3 +130,9 @@ macro_rules! test_prepare_error_stderr { } }; } + +macro_rules! test_prepare_unknown_err { + ($name:ident, $krate:expr, $expected:ident $(,$expected_output:expr)?) => { + $crate::buildtest::runner::test_prepare_error!($name, $krate, Unknown); + }; +} From f25d523c2bdb215704bd4eb3d6f947984224aabe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bennet=20Ble=C3=9Fmann?= Date: Tue, 22 Jul 2025 22:50:19 +0200 Subject: [PATCH 6/9] apease clippy --- build.rs | 2 +- src/cmd/mod.rs | 6 +++--- src/cmd/sandbox.rs | 10 +++++----- src/crates/registry.rs | 2 +- src/inside_docker.rs | 4 ++-- src/prepare.rs | 7 ++++--- src/toolchain.rs | 5 ++--- src/tools/rustup.rs | 4 ++-- src/utils.rs | 2 +- 9 files changed, 21 insertions(+), 21 deletions(-) diff --git a/build.rs b/build.rs index 84032c1..efb11ad 100644 --- a/build.rs +++ b/build.rs @@ -8,7 +8,7 @@ fn main() -> Result<(), Box> { let target = std::env::var("TARGET")?; let output = std::env::var("OUT_DIR")?; - ::std::fs::write(format!("{}/target", output), target.as_bytes())?; + ::std::fs::write(format!("{output}/target"), target.as_bytes())?; println!("cargo:rerun-if-env-changed=DOCS_RS"); if std::env::var_os("DOCS_RS").as_deref() == Some(std::ffi::OsStr::new("1")) { diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs index 922592a..5077033 100644 --- a/src/cmd/mod.rs +++ b/src/cmd/mod.rs @@ -501,14 +501,14 @@ impl<'w, 'pl> Command<'w, 'pl> { cmd.env(k, v); } - let cmdstr = format!("{:?}", cmd); + let cmdstr = format!("{cmd:?}"); if let Some(ref cd) = self.cd { cmd.current_dir(cd); } if self.log_command { - info!("running `{}`", cmdstr); + info!("running `{cmdstr}`"); } let out = RUNTIME @@ -521,7 +521,7 @@ impl<'w, 'pl> Command<'w, 'pl> { self.log_output, )) .map_err(|e| { - error!("error running command: {}", e); + error!("error running command: {e}"); e })?; diff --git a/src/cmd/sandbox.rs b/src/cmd/sandbox.rs index e553ead..3a3954b 100644 --- a/src/cmd/sandbox.rs +++ b/src/cmd/sandbox.rs @@ -29,7 +29,7 @@ impl SandboxImage { /// error will be returned instead. pub fn remote(name: &str) -> Result { let mut image = SandboxImage { name: name.into() }; - info!("pulling image {} from Docker Hub", name); + info!("pulling image {name} from Docker Hub"); Command::new_workspaceless("docker") .args(&["pull", name]) .run() @@ -219,7 +219,7 @@ impl SandboxBuilder { } pub(super) fn user(mut self, user: u32, group: u32) -> Self { - self.user = Some(format!("{}:{}", user, group)); + self.user = Some(format!("{user}:{group}")); self } @@ -242,7 +242,7 @@ impl SandboxBuilder { for (var, value) in &self.env { args.push("-e".into()); - args.push(format! {"{}={}", var, value}) + args.push(format! {"{var}={value}"}) } if let Some(workdir) = self.workdir { @@ -308,10 +308,10 @@ impl SandboxBuilder { scopeguard::defer! {{ if let Err(err) = container.delete() { error!("failed to delete container {}", container.id); - error!("caused by: {}", err); + error!("caused by: {err}"); let mut err: &dyn Error = &err; while let Some(cause) = err.source() { - error!("caused by: {}", cause); + error!("caused by: {cause}"); err = cause; } } diff --git a/src/crates/registry.rs b/src/crates/registry.rs index 26344fb..fd89993 100644 --- a/src/crates/registry.rs +++ b/src/crates/registry.rs @@ -122,7 +122,7 @@ impl RegistryCrate { git2::build::RepoBuilder::new() .fetch_options(fo) .clone(url, &index_path) - .with_context(|| format!("unable to update_index at {}", url))?; + .with_context(|| format!("unable to update_index at {url}"))?; info!("cloned registry index"); } let config = std::fs::read_to_string(index_path.join("config.json"))?; diff --git a/src/inside_docker.rs b/src/inside_docker.rs index af3c513..ec3cb4c 100644 --- a/src/inside_docker.rs +++ b/src/inside_docker.rs @@ -62,7 +62,7 @@ pub(crate) fn probe_container_id(workspace: &Workspace) -> anyhow::Result