mirror of
https://github.com/rust-lang/cargo.git
synced 2025-10-01 11:30:39 +00:00

This change ensures cargo will output file paths in the expected format (C:\foo\... on Windows, /foo/... elsewhere). Previously it would output file:// URLs instead. To support this change, additional changes were made to the test suite string processing such that [ROOT] is now replaced with the appropriate file path root for the platform. The CWD template was also updated to use [CWD] like other replacement templates and to do the replacement on the expected value rather than the actual value to avoid replacing things we don't expect with CWD.
412 lines
11 KiB
Rust
412 lines
11 KiB
Rust
use support::{basic_bin_manifest, basic_lib_manifest, basic_manifest, project};
|
|
|
|
const CARGO_RUSTC_ERROR: &str =
|
|
"[ERROR] extra arguments to `rustc` can only be passed to one target, consider filtering
|
|
the package by passing e.g. `--lib` or `--bin NAME` to specify a single target";
|
|
|
|
#[test]
|
|
fn build_lib_for_foo() {
|
|
let p = project()
|
|
.file("src/main.rs", "fn main() {}")
|
|
.file("src/lib.rs", r#" "#)
|
|
.build();
|
|
|
|
p.cargo("rustc --lib -v")
|
|
.with_stderr(
|
|
"\
|
|
[COMPILING] foo v0.0.1 ([CWD])
|
|
[RUNNING] `rustc --crate-name foo src/lib.rs --crate-type lib \
|
|
--emit=dep-info,link -C debuginfo=2 \
|
|
-C metadata=[..] \
|
|
--out-dir [..] \
|
|
-L dependency=[CWD]/target/debug/deps`
|
|
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
|
|
",
|
|
).run();
|
|
}
|
|
|
|
#[test]
|
|
fn lib() {
|
|
let p = project()
|
|
.file("src/main.rs", "fn main() {}")
|
|
.file("src/lib.rs", r#" "#)
|
|
.build();
|
|
|
|
p.cargo("rustc --lib -v -- -C debug-assertions=off")
|
|
.with_stderr(
|
|
"\
|
|
[COMPILING] foo v0.0.1 ([CWD])
|
|
[RUNNING] `rustc --crate-name foo src/lib.rs --crate-type lib \
|
|
--emit=dep-info,link -C debuginfo=2 \
|
|
-C debug-assertions=off \
|
|
-C metadata=[..] \
|
|
--out-dir [..] \
|
|
-L dependency=[CWD]/target/debug/deps`
|
|
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
|
|
",
|
|
).run();
|
|
}
|
|
|
|
#[test]
|
|
fn build_main_and_allow_unstable_options() {
|
|
let p = project()
|
|
.file("src/main.rs", "fn main() {}")
|
|
.file("src/lib.rs", r#" "#)
|
|
.build();
|
|
|
|
p.cargo("rustc -v --bin foo -- -C debug-assertions")
|
|
.with_stderr(format!(
|
|
"\
|
|
[COMPILING] {name} v{version} ([CWD])
|
|
[RUNNING] `rustc --crate-name {name} src/lib.rs --crate-type lib \
|
|
--emit=dep-info,link -C debuginfo=2 \
|
|
-C metadata=[..] \
|
|
--out-dir [..] \
|
|
-L dependency=[CWD]/target/debug/deps`
|
|
[RUNNING] `rustc --crate-name {name} src/main.rs --crate-type bin \
|
|
--emit=dep-info,link -C debuginfo=2 \
|
|
-C debug-assertions \
|
|
-C metadata=[..] \
|
|
--out-dir [..] \
|
|
-L dependency=[CWD]/target/debug/deps \
|
|
--extern {name}=[CWD]/target/debug/deps/lib{name}-[..].rlib`
|
|
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
|
|
",
|
|
name = "foo",
|
|
version = "0.0.1"
|
|
)).run();
|
|
}
|
|
|
|
#[test]
|
|
fn fails_when_trying_to_build_main_and_lib_with_args() {
|
|
let p = project()
|
|
.file("src/main.rs", "fn main() {}")
|
|
.file("src/lib.rs", r#" "#)
|
|
.build();
|
|
|
|
p.cargo("rustc -v -- -C debug-assertions")
|
|
.with_status(101)
|
|
.with_stderr(CARGO_RUSTC_ERROR)
|
|
.run();
|
|
}
|
|
|
|
#[test]
|
|
fn build_with_args_to_one_of_multiple_binaries() {
|
|
let p = project()
|
|
.file("src/bin/foo.rs", "fn main() {}")
|
|
.file("src/bin/bar.rs", "fn main() {}")
|
|
.file("src/bin/baz.rs", "fn main() {}")
|
|
.file("src/lib.rs", r#" "#)
|
|
.build();
|
|
|
|
p.cargo("rustc -v --bin bar -- -C debug-assertions")
|
|
.with_stderr(
|
|
"\
|
|
[COMPILING] foo v0.0.1 ([CWD])
|
|
[RUNNING] `rustc --crate-name foo src/lib.rs --crate-type lib --emit=dep-info,link \
|
|
-C debuginfo=2 -C metadata=[..] \
|
|
--out-dir [..]`
|
|
[RUNNING] `rustc --crate-name bar src/bin/bar.rs --crate-type bin --emit=dep-info,link \
|
|
-C debuginfo=2 -C debug-assertions [..]`
|
|
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
|
|
",
|
|
).run();
|
|
}
|
|
|
|
#[test]
|
|
fn fails_with_args_to_all_binaries() {
|
|
let p = project()
|
|
.file("src/bin/foo.rs", "fn main() {}")
|
|
.file("src/bin/bar.rs", "fn main() {}")
|
|
.file("src/bin/baz.rs", "fn main() {}")
|
|
.file("src/lib.rs", r#" "#)
|
|
.build();
|
|
|
|
p.cargo("rustc -v -- -C debug-assertions")
|
|
.with_status(101)
|
|
.with_stderr(CARGO_RUSTC_ERROR)
|
|
.run();
|
|
}
|
|
|
|
#[test]
|
|
fn build_with_args_to_one_of_multiple_tests() {
|
|
let p = project()
|
|
.file("tests/foo.rs", r#" "#)
|
|
.file("tests/bar.rs", r#" "#)
|
|
.file("tests/baz.rs", r#" "#)
|
|
.file("src/lib.rs", r#" "#)
|
|
.build();
|
|
|
|
p.cargo("rustc -v --test bar -- -C debug-assertions")
|
|
.with_stderr(
|
|
"\
|
|
[COMPILING] foo v0.0.1 ([CWD])
|
|
[RUNNING] `rustc --crate-name foo src/lib.rs --crate-type lib --emit=dep-info,link \
|
|
-C debuginfo=2 -C metadata=[..] \
|
|
--out-dir [..]`
|
|
[RUNNING] `rustc --crate-name bar tests/bar.rs --emit=dep-info,link -C debuginfo=2 \
|
|
-C debug-assertions [..]--test[..]`
|
|
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
|
|
",
|
|
).run();
|
|
}
|
|
|
|
#[test]
|
|
fn build_foo_with_bar_dependency() {
|
|
let foo = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
authors = []
|
|
|
|
[dependencies.bar]
|
|
path = "../bar"
|
|
"#,
|
|
).file("src/main.rs", "extern crate bar; fn main() { bar::baz() }")
|
|
.build();
|
|
let _bar = project()
|
|
.at("bar")
|
|
.file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
|
|
.file("src/lib.rs", "pub fn baz() {}")
|
|
.build();
|
|
|
|
foo.cargo("rustc -v -- -C debug-assertions")
|
|
.with_stderr(
|
|
"\
|
|
[COMPILING] bar v0.1.0 ([..])
|
|
[RUNNING] `[..] -C debuginfo=2 [..]`
|
|
[COMPILING] foo v0.0.1 ([CWD])
|
|
[RUNNING] `[..] -C debuginfo=2 -C debug-assertions [..]`
|
|
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
|
|
",
|
|
).run();
|
|
}
|
|
|
|
#[test]
|
|
fn build_only_bar_dependency() {
|
|
let foo = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
authors = []
|
|
|
|
[dependencies.bar]
|
|
path = "../bar"
|
|
"#,
|
|
).file("src/main.rs", "extern crate bar; fn main() { bar::baz() }")
|
|
.build();
|
|
let _bar = project()
|
|
.at("bar")
|
|
.file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
|
|
.file("src/lib.rs", "pub fn baz() {}")
|
|
.build();
|
|
|
|
foo.cargo("rustc -v -p bar -- -C debug-assertions")
|
|
.with_stderr(
|
|
"\
|
|
[COMPILING] bar v0.1.0 ([..])
|
|
[RUNNING] `rustc --crate-name bar [..] --crate-type lib [..] -C debug-assertions [..]`
|
|
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
|
|
",
|
|
).run();
|
|
}
|
|
|
|
#[test]
|
|
fn targets_selected_default() {
|
|
let p = project().file("src/main.rs", "fn main() {}").build();
|
|
p.cargo("rustc -v")
|
|
// bin
|
|
.with_stderr_contains("\
|
|
[RUNNING] `rustc --crate-name foo src/main.rs --crate-type bin \
|
|
--emit=dep-info,link[..]")
|
|
// bench
|
|
.with_stderr_does_not_contain("\
|
|
[RUNNING] `rustc --crate-name foo src/main.rs --emit=dep-info,link \
|
|
-C opt-level=3 --test [..]")
|
|
// unit test
|
|
.with_stderr_does_not_contain("\
|
|
[RUNNING] `rustc --crate-name foo src/main.rs --emit=dep-info,link \
|
|
-C debuginfo=2 --test [..]").run();
|
|
}
|
|
|
|
#[test]
|
|
fn targets_selected_all() {
|
|
let p = project().file("src/main.rs", "fn main() {}").build();
|
|
p.cargo("rustc -v --all-targets")
|
|
// bin
|
|
.with_stderr_contains("\
|
|
[RUNNING] `rustc --crate-name foo src/main.rs --crate-type bin \
|
|
--emit=dep-info,link[..]")
|
|
// bench
|
|
.with_stderr_contains("\
|
|
[RUNNING] `rustc --crate-name foo src/main.rs --emit=dep-info,link \
|
|
-C opt-level=3 --test [..]")
|
|
// unit test
|
|
.with_stderr_contains("\
|
|
[RUNNING] `rustc --crate-name foo src/main.rs --emit=dep-info,link \
|
|
-C debuginfo=2 --test [..]").run();
|
|
}
|
|
|
|
#[test]
|
|
fn fail_with_multiple_packages() {
|
|
let foo = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
authors = []
|
|
|
|
[dependencies.bar]
|
|
path = "../bar"
|
|
|
|
[dependencies.baz]
|
|
path = "../baz"
|
|
"#,
|
|
).file("src/main.rs", "fn main() {}")
|
|
.build();
|
|
|
|
let _bar = project()
|
|
.at("bar")
|
|
.file("Cargo.toml", &basic_manifest("bar", "0.1.0"))
|
|
.file(
|
|
"src/main.rs",
|
|
r#"
|
|
fn main() {
|
|
if cfg!(flag = "1") { println!("Yeah from bar!"); }
|
|
}
|
|
"#,
|
|
).build();
|
|
|
|
let _baz = project()
|
|
.at("baz")
|
|
.file("Cargo.toml", &basic_manifest("baz", "0.1.0"))
|
|
.file(
|
|
"src/main.rs",
|
|
r#"
|
|
fn main() {
|
|
if cfg!(flag = "1") { println!("Yeah from baz!"); }
|
|
}
|
|
"#,
|
|
).build();
|
|
|
|
foo.cargo("rustc -v -p bar -p baz")
|
|
.with_status(1)
|
|
.with_stderr_contains(
|
|
"\
|
|
error: The argument '--package <SPEC>' was provided more than once, \
|
|
but cannot be used multiple times
|
|
",
|
|
).run();
|
|
}
|
|
|
|
#[test]
|
|
fn rustc_with_other_profile() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
authors = []
|
|
|
|
[dev-dependencies]
|
|
a = { path = "a" }
|
|
"#,
|
|
).file(
|
|
"src/main.rs",
|
|
r#"
|
|
#[cfg(test)] extern crate a;
|
|
|
|
#[test]
|
|
fn foo() {}
|
|
"#,
|
|
).file("a/Cargo.toml", &basic_manifest("a", "0.1.0"))
|
|
.file("a/src/lib.rs", "")
|
|
.build();
|
|
|
|
p.cargo("rustc --profile test").run();
|
|
}
|
|
|
|
#[test]
|
|
fn rustc_fingerprint() {
|
|
// Verify that the fingerprint includes the rustc args.
|
|
let p = project()
|
|
.file("Cargo.toml", &basic_lib_manifest("foo"))
|
|
.file("src/lib.rs", "")
|
|
.build();
|
|
|
|
p.cargo("rustc -v -- -C debug-assertions")
|
|
.with_stderr(
|
|
"\
|
|
[COMPILING] foo [..]
|
|
[RUNNING] `rustc [..]-C debug-assertions [..]
|
|
[FINISHED] [..]
|
|
",
|
|
).run();
|
|
|
|
p.cargo("rustc -v -- -C debug-assertions")
|
|
.with_stderr(
|
|
"\
|
|
[FRESH] foo [..]
|
|
[FINISHED] [..]
|
|
",
|
|
).run();
|
|
|
|
p.cargo("rustc -v")
|
|
.with_stderr_does_not_contain("-C debug-assertions")
|
|
.with_stderr(
|
|
"\
|
|
[COMPILING] foo [..]
|
|
[RUNNING] `rustc [..]
|
|
[FINISHED] [..]
|
|
",
|
|
).run();
|
|
|
|
p.cargo("rustc -v")
|
|
.with_stderr(
|
|
"\
|
|
[FRESH] foo [..]
|
|
[FINISHED] [..]
|
|
",
|
|
).run();
|
|
}
|
|
|
|
#[test]
|
|
fn rustc_test_with_implicit_bin() {
|
|
let p = project()
|
|
.file("Cargo.toml", &basic_bin_manifest("foo"))
|
|
.file(
|
|
"src/main.rs",
|
|
r#"
|
|
#[cfg(foo)]
|
|
fn f() { compile_fail!("Foo shouldn't be set."); }
|
|
fn main() {}
|
|
"#,
|
|
).file(
|
|
"tests/test1.rs",
|
|
r#"
|
|
#[cfg(not(foo))]
|
|
fn f() { compile_fail!("Foo should be set."); } "#,
|
|
).build();
|
|
|
|
p.cargo("rustc --test test1 -v -- --cfg foo")
|
|
.with_stderr_contains(
|
|
"\
|
|
[RUNNING] `rustc --crate-name test1 tests/test1.rs [..] --cfg foo [..]
|
|
",
|
|
).with_stderr_contains(
|
|
"\
|
|
[RUNNING] `rustc --crate-name foo src/main.rs [..]
|
|
",
|
|
).run();
|
|
}
|