cargo/tests/testsuite/rename_deps.rs
Alex Crichton 5295caddd5 Use listed dependency name for feature names
This commit updates the implementation of renamed dependencies to use the listed
name of a dependency in Cargo.toml for the name of the associated feature,
rather than using the package name. This'll allow disambiguating between
different packages of the same name and was the intention all along!

Closes #5753
2018-07-31 07:28:53 -07:00

467 lines
11 KiB
Rust

use support::ChannelChanger;
use support::git;
use support::paths;
use support::registry::Package;
use support::{basic_manifest, execs, project};
use support::hamcrest::assert_that;
#[test]
fn gated() {
let p = project()
.file(
"Cargo.toml",
r#"
[project]
name = "foo"
version = "0.0.1"
authors = []
[dependencies]
bar = { package = "foo", version = "0.1" }
"#,
)
.file("src/lib.rs", "")
.build();
assert_that(
p.cargo("build").masquerade_as_nightly_cargo(),
execs().with_status(101).with_stderr(
"\
error: failed to parse manifest at `[..]`
Caused by:
feature `rename-dependency` is required
consider adding `cargo-features = [\"rename-dependency\"]` to the manifest
",
),
);
let p = project().at("bar")
.file(
"Cargo.toml",
r#"
[project]
name = "foo"
version = "0.0.1"
authors = []
[dependencies]
bar = { version = "0.1", package = "baz" }
"#,
)
.file("src/lib.rs", "")
.build();
assert_that(
p.cargo("build").masquerade_as_nightly_cargo(),
execs().with_status(101).with_stderr(
"\
error: failed to parse manifest at `[..]`
Caused by:
feature `rename-dependency` is required
consider adding `cargo-features = [\"rename-dependency\"]` to the manifest
",
),
);
}
#[test]
fn rename_dependency() {
Package::new("bar", "0.1.0").publish();
Package::new("bar", "0.2.0").publish();
let p = project()
.file(
"Cargo.toml",
r#"
cargo-features = ["rename-dependency"]
[project]
name = "foo"
version = "0.0.1"
authors = []
[dependencies]
bar = { version = "0.1.0" }
baz = { version = "0.2.0", package = "bar" }
"#,
)
.file("src/lib.rs", "extern crate bar; extern crate baz;")
.build();
assert_that(
p.cargo("build").masquerade_as_nightly_cargo(),
execs().with_status(0),
);
}
#[test]
fn rename_with_different_names() {
let p = project()
.file(
"Cargo.toml",
r#"
cargo-features = ["rename-dependency"]
[project]
name = "foo"
version = "0.0.1"
authors = []
[dependencies]
baz = { path = "bar", package = "bar" }
"#,
)
.file("src/lib.rs", "extern crate baz;")
.file(
"bar/Cargo.toml",
r#"
[project]
name = "bar"
version = "0.0.1"
authors = []
[lib]
name = "random_name"
"#,
)
.file("bar/src/lib.rs", "")
.build();
assert_that(
p.cargo("build").masquerade_as_nightly_cargo(),
execs().with_status(0),
);
}
#[test]
fn lots_of_names() {
Package::new("foo", "0.1.0")
.file("src/lib.rs", "pub fn foo1() {}")
.publish();
Package::new("foo", "0.2.0")
.file("src/lib.rs", "pub fn foo() {}")
.publish();
Package::new("foo", "0.1.0")
.file("src/lib.rs", "pub fn foo2() {}")
.alternative(true)
.publish();
let g = git::repo(&paths::root().join("another"))
.file("Cargo.toml", &basic_manifest("foo", "0.1.0"))
.file("src/lib.rs", "pub fn foo3() {}")
.build();
let p = project()
.file(
"Cargo.toml",
&format!(r#"
cargo-features = ["alternative-registries", "rename-dependency"]
[package]
name = "test"
version = "0.1.0"
authors = []
[dependencies]
foo = "0.2"
foo1 = {{ version = "0.1", package = "foo" }}
foo2 = {{ version = "0.1", registry = "alternative", package = "foo" }}
foo3 = {{ git = '{}', package = "foo" }}
foo4 = {{ path = "foo", package = "foo" }}
"#,
g.url())
)
.file(
"src/lib.rs",
"
extern crate foo;
extern crate foo1;
extern crate foo2;
extern crate foo3;
extern crate foo4;
pub fn foo() {
foo::foo();
foo1::foo1();
foo2::foo2();
foo3::foo3();
foo4::foo4();
}
",
)
.file("foo/Cargo.toml", &basic_manifest("foo", "0.1.0"))
.file("foo/src/lib.rs", "pub fn foo4() {}")
.build();
assert_that(
p.cargo("build -v").masquerade_as_nightly_cargo(),
execs().with_status(0),
);
}
#[test]
fn rename_and_patch() {
Package::new("foo", "0.1.0").publish();
let p = project()
.file(
"Cargo.toml",
r#"
cargo-features = ["rename-dependency"]
[package]
name = "test"
version = "0.1.0"
authors = []
[dependencies]
bar = { version = "0.1", package = "foo" }
[patch.crates-io]
foo = { path = "foo" }
"#,
)
.file("src/lib.rs", "extern crate bar; pub fn foo() { bar::foo(); }")
.file("foo/Cargo.toml", &basic_manifest("foo", "0.1.0"))
.file("foo/src/lib.rs", "pub fn foo() {}")
.build();
assert_that(
p.cargo("build -v").masquerade_as_nightly_cargo(),
execs().with_status(0),
);
}
#[test]
fn rename_twice() {
Package::new("foo", "0.1.0").publish();
let p = project()
.file(
"Cargo.toml",
r#"
cargo-features = ["rename-dependency"]
[package]
name = "test"
version = "0.1.0"
authors = []
[dependencies]
bar = { version = "0.1", package = "foo" }
[build-dependencies]
foo = { version = "0.1" }
"#,
)
.file("src/lib.rs", "",)
.build();
assert_that(
p.cargo("build -v").masquerade_as_nightly_cargo(),
execs().with_status(101)
.with_stderr("\
[UPDATING] registry `[..]`
[DOWNLOADING] foo v0.1.0 (registry [..])
error: multiple dependencies listed for the same crate must all have the same \
name, but the dependency on `foo v0.1.0` is listed as having different names
")
);
}
#[test]
fn rename_affects_fingerprint() {
Package::new("foo", "0.1.0").publish();
let p = project()
.file(
"Cargo.toml",
r#"
cargo-features = ["rename-dependency"]
[package]
name = "test"
version = "0.1.0"
authors = []
[dependencies]
foo = { version = "0.1", package = "foo" }
"#,
)
.file("src/lib.rs", "extern crate foo;")
.build();
assert_that(
p.cargo("build -v").masquerade_as_nightly_cargo(),
execs().with_status(0),
);
p.change_file(
"Cargo.toml",
r#"
cargo-features = ["rename-dependency"]
[package]
name = "test"
version = "0.1.0"
authors = []
[dependencies]
bar = { version = "0.1", package = "foo" }
"#,
);
assert_that(
p.cargo("build -v").masquerade_as_nightly_cargo(),
execs().with_status(101),
);
}
#[test]
fn can_run_doc_tests() {
Package::new("bar", "0.1.0").publish();
Package::new("bar", "0.2.0").publish();
let foo = project()
.file(
"Cargo.toml",
r#"
cargo-features = ["rename-dependency"]
[project]
name = "foo"
version = "0.0.1"
[dependencies]
bar = { version = "0.1.0" }
baz = { version = "0.2.0", package = "bar" }
"#,
)
.file(
"src/lib.rs",
"
extern crate bar;
extern crate baz;
",
)
.build();
assert_that(
foo.cargo("test").arg("-v").masquerade_as_nightly_cargo(),
execs().with_status(0).with_stderr_contains(format!(
"\
[DOCTEST] foo
[RUNNING] `rustdoc --test {dir}[/]src[/]lib.rs \
[..] \
--extern baz={dir}[/]target[/]debug[/]deps[/]libbar-[..].rlib \
--extern bar={dir}[/]target[/]debug[/]deps[/]libbar-[..].rlib \
[..]`
",
dir = foo.root().display(),
)),
);
}
#[test]
fn features_still_work() {
Package::new("foo", "0.1.0").publish();
Package::new("bar", "0.1.0").publish();
let p = project()
.file(
"Cargo.toml",
r#"
[package]
name = "test"
version = "0.1.0"
authors = []
[dependencies]
p1 = { path = 'a', features = ['b'] }
p2 = { path = 'b' }
"#,
)
.file("src/lib.rs", "")
.file(
"a/Cargo.toml",
r#"
cargo-features = ["rename-dependency"]
[package]
name = "p1"
version = "0.1.0"
authors = []
[dependencies]
b = { version = "0.1", package = "foo", optional = true }
"#,
)
.file("a/src/lib.rs", "extern crate b;")
.file(
"b/Cargo.toml",
r#"
cargo-features = ["rename-dependency"]
[package]
name = "p2"
version = "0.1.0"
authors = []
[dependencies]
b = { version = "0.1", package = "bar", optional = true }
[features]
default = ['b']
"#,
)
.file("b/src/lib.rs", "extern crate b;")
.build();
assert_that(
p.cargo("build -v").masquerade_as_nightly_cargo(),
execs().with_status(0),
);
}
#[test]
fn features_not_working() {
Package::new("foo", "0.1.0").publish();
Package::new("bar", "0.1.0").publish();
let p = project()
.file(
"Cargo.toml",
r#"
cargo-features = ["rename-dependency"]
[package]
name = "test"
version = "0.1.0"
authors = []
[dependencies]
a = { path = 'a', package = 'p1', optional = true }
[features]
default = ['p1']
"#,
)
.file("src/lib.rs", "")
.file("a/Cargo.toml", &basic_manifest("p1", "0.1.0"))
.build();
assert_that(
p.cargo("build -v").masquerade_as_nightly_cargo(),
execs()
.with_status(101)
.with_stderr("\
error: failed to parse manifest at `[..]`
Caused by:
Feature `default` includes `p1` which is neither a dependency nor another feature
")
);
}