summaryrefslogtreecommitdiffstats
path: root/src/tools/cargo/tests/testsuite/member_errors.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/cargo/tests/testsuite/member_errors.rs')
-rw-r--r--src/tools/cargo/tests/testsuite/member_errors.rs164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/tools/cargo/tests/testsuite/member_errors.rs b/src/tools/cargo/tests/testsuite/member_errors.rs
new file mode 100644
index 000000000..c3c340ce0
--- /dev/null
+++ b/src/tools/cargo/tests/testsuite/member_errors.rs
@@ -0,0 +1,164 @@
+//! Tests for workspace member errors.
+
+use cargo::core::resolver::ResolveError;
+use cargo::core::{compiler::CompileMode, Shell, Workspace};
+use cargo::ops::{self, CompileOptions};
+use cargo::util::{config::Config, errors::ManifestError};
+
+use cargo_test_support::install::cargo_home;
+use cargo_test_support::project;
+use cargo_test_support::registry;
+
+/// Tests inclusion of a `ManifestError` pointing to a member manifest
+/// when that manifest fails to deserialize.
+#[cargo_test]
+fn toml_deserialize_manifest_error() {
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.1.0"
+ authors = []
+
+ [dependencies]
+ bar = { path = "bar" }
+
+ [workspace]
+ "#,
+ )
+ .file("src/main.rs", "fn main() {}")
+ .file(
+ "bar/Cargo.toml",
+ r#"
+ [package]
+ name = "bar"
+ version = "0.1.0"
+ authors = []
+
+ [dependencies]
+ foobar == "0.55"
+ "#,
+ )
+ .file("bar/src/main.rs", "fn main() {}")
+ .build();
+
+ let root_manifest_path = p.root().join("Cargo.toml");
+ let member_manifest_path = p.root().join("bar").join("Cargo.toml");
+
+ let error = Workspace::new(&root_manifest_path, &Config::default().unwrap()).unwrap_err();
+ eprintln!("{:?}", error);
+
+ let manifest_err: &ManifestError = error.downcast_ref().expect("Not a ManifestError");
+ assert_eq!(manifest_err.manifest_path(), &root_manifest_path);
+
+ let causes: Vec<_> = manifest_err.manifest_causes().collect();
+ assert_eq!(causes.len(), 1, "{:?}", causes);
+ assert_eq!(causes[0].manifest_path(), &member_manifest_path);
+}
+
+/// Tests inclusion of a `ManifestError` pointing to a member manifest
+/// when that manifest has an invalid dependency path.
+#[cargo_test]
+fn member_manifest_path_io_error() {
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.1.0"
+ authors = []
+
+ [dependencies]
+ bar = { path = "bar" }
+
+ [workspace]
+ "#,
+ )
+ .file("src/main.rs", "fn main() {}")
+ .file(
+ "bar/Cargo.toml",
+ r#"
+ [package]
+ name = "bar"
+ version = "0.1.0"
+ authors = []
+
+ [dependencies]
+ foobar = { path = "nosuch" }
+ "#,
+ )
+ .file("bar/src/main.rs", "fn main() {}")
+ .build();
+
+ let root_manifest_path = p.root().join("Cargo.toml");
+ let member_manifest_path = p.root().join("bar").join("Cargo.toml");
+ let missing_manifest_path = p.root().join("bar").join("nosuch").join("Cargo.toml");
+
+ let error = Workspace::new(&root_manifest_path, &Config::default().unwrap()).unwrap_err();
+ eprintln!("{:?}", error);
+
+ let manifest_err: &ManifestError = error.downcast_ref().expect("Not a ManifestError");
+ assert_eq!(manifest_err.manifest_path(), &root_manifest_path);
+
+ let causes: Vec<_> = manifest_err.manifest_causes().collect();
+ assert_eq!(causes.len(), 2, "{:?}", causes);
+ assert_eq!(causes[0].manifest_path(), &member_manifest_path);
+ assert_eq!(causes[1].manifest_path(), &missing_manifest_path);
+}
+
+/// Tests dependency version errors provide which package failed via a `ResolveError`.
+#[cargo_test]
+fn member_manifest_version_error() {
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.1.0"
+ authors = []
+
+ [dependencies]
+ bar = { path = "bar" }
+
+ [workspace]
+ "#,
+ )
+ .file("src/main.rs", "fn main() {}")
+ .file(
+ "bar/Cargo.toml",
+ r#"
+ [package]
+ name = "bar"
+ version = "0.1.0"
+ authors = []
+
+ [dependencies]
+ i-dont-exist = "0.55"
+ "#,
+ )
+ .file("bar/src/main.rs", "fn main() {}")
+ .build();
+
+ // Prevent this test from accessing the network by setting up .cargo/config.
+ registry::init();
+ let config = Config::new(
+ Shell::from_write(Box::new(Vec::new())),
+ cargo_home(),
+ cargo_home(),
+ );
+ let ws = Workspace::new(&p.root().join("Cargo.toml"), &config).unwrap();
+ let compile_options = CompileOptions::new(&config, CompileMode::Build).unwrap();
+ let member_bar = ws.members().find(|m| &*m.name() == "bar").unwrap();
+
+ let error = ops::compile(&ws, &compile_options).map(|_| ()).unwrap_err();
+ eprintln!("{:?}", error);
+
+ let resolve_err: &ResolveError = error.downcast_ref().expect("Not a ResolveError");
+ let package_path = resolve_err.package_path();
+ assert_eq!(package_path.len(), 1, "package_path: {:?}", package_path);
+ assert_eq!(package_path[0], member_bar.package_id());
+}