cargo/tests/testsuite/member_errors.rs

168 lines
4.8 KiB
Rust
Raw Normal View History

2019-11-25 02:42:45 +00:00
//! 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};
2018-10-09 13:05:10 +00:00
use cargo_test_support::install::cargo_home;
use cargo_test_support::project;
use cargo_test_support::registry;
2018-10-09 13:05:10 +00:00
/// Tests inclusion of a `ManifestError` pointing to a member manifest
/// when that manifest fails to deserialize.
#[cargo_test]
2018-10-09 13:05:10 +00:00
fn toml_deserialize_manifest_error() {
let p = project()
.file(
"Cargo.toml",
r#"
[package]
2020-09-27 00:59:58 +00:00
name = "foo"
version = "0.1.0"
authors = []
2018-10-09 13:05:10 +00:00
2020-09-27 00:59:58 +00:00
[dependencies]
bar = { path = "bar" }
2018-10-09 13:05:10 +00:00
2020-09-27 00:59:58 +00:00
[workspace]
"#,
2018-10-09 13:05:10 +00:00
)
.file("src/main.rs", "fn main() {}")
.file(
"bar/Cargo.toml",
r#"
[package]
2020-09-27 00:59:58 +00:00
name = "bar"
version = "0.1.0"
authors = []
[dependencies]
foobar == "0.55"
"#,
2018-10-09 13:05:10 +00:00
)
.file("bar/src/main.rs", "fn main() {}")
.build();
p.cargo("check")
.with_status(101)
.with_stderr(
"\
[ERROR] invalid string
expected `\"`, `'`
--> bar/Cargo.toml:8:25
|
8 | foobar == \"0.55\"
| ^
|
[ERROR] failed to load manifest for dependency `bar`
",
)
.run();
2018-10-09 13:05:10 +00:00
}
/// Tests inclusion of a `ManifestError` pointing to a member manifest
/// when that manifest has an invalid dependency path.
#[cargo_test]
2018-10-09 13:05:10 +00:00
fn member_manifest_path_io_error() {
let p = project()
.file(
"Cargo.toml",
r#"
[package]
2020-09-27 00:59:58 +00:00
name = "foo"
version = "0.1.0"
authors = []
2018-10-09 13:05:10 +00:00
2020-09-27 00:59:58 +00:00
[dependencies]
bar = { path = "bar" }
2018-10-09 13:05:10 +00:00
2020-09-27 00:59:58 +00:00
[workspace]
"#,
2018-10-09 13:05:10 +00:00
)
.file("src/main.rs", "fn main() {}")
.file(
"bar/Cargo.toml",
r#"
[package]
2020-09-27 00:59:58 +00:00
name = "bar"
version = "0.1.0"
authors = []
[dependencies]
foobar = { path = "nosuch" }
"#,
2018-10-09 13:05:10 +00:00
)
.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");
2018-10-09 13:05:10 +00:00
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);
2018-10-09 13:05:10 +00:00
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);
2018-10-09 13:05:10 +00:00
}
2019-02-03 04:01:23 +00:00
/// 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]
2020-09-27 00:59:58 +00:00
name = "foo"
version = "0.1.0"
authors = []
2020-09-27 00:59:58 +00:00
[dependencies]
bar = { path = "bar" }
2020-09-27 00:59:58 +00:00
[workspace]
"#,
)
.file("src/main.rs", "fn main() {}")
.file(
"bar/Cargo.toml",
r#"
[package]
2020-09-27 00:59:58 +00:00
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());
}