blob: 8b6bdab4b9ac83366e22ba9190562cd044349b81 [file] [log] [blame]
use crate::support::{basic_lib_manifest, is_nightly, paths, project};
#[test]
fn profile_config_gated() {
let p = project()
.file("Cargo.toml", &basic_lib_manifest("foo"))
.file("src/lib.rs", "")
.file(
".cargo/config",
r#"
[profile.dev]
debug = 1
"#,
)
.build();
p.cargo("build -v")
.with_stderr_contains(
"\
[WARNING] profiles in config files require `-Z config-profile` command-line option
",
)
.with_stderr_contains("[..]-C debuginfo=2[..]")
.run();
}
#[test]
fn profile_config_validate_warnings() {
let p = project()
.file(
"Cargo.toml",
r#"
cargo-features = ["profile-overrides"]
[package]
name = "foo"
version = "0.0.1"
"#,
)
.file("src/lib.rs", "")
.file(
".cargo/config",
r#"
[profile.test]
opt-level = 3
[profile.asdf]
opt-level = 3
[profile.dev]
bad-key = true
[profile.dev.build-override]
bad-key-bo = true
[profile.dev.overrides.bar]
bad-key-bar = true
"#,
)
.build();
p.cargo("build -Z config-profile")
.masquerade_as_nightly_cargo()
.with_stderr_unordered(
"\
[WARNING] unused key `profile.asdf` in config file `[..].cargo/config`
[WARNING] unused key `profile.test` in config file `[..].cargo/config`
[WARNING] unused key `profile.dev.bad-key` in config file `[..].cargo/config`
[WARNING] unused key `profile.dev.overrides.bar.bad-key-bar` in config file `[..].cargo/config`
[WARNING] unused key `profile.dev.build-override.bad-key-bo` in config file `[..].cargo/config`
[COMPILING] foo [..]
[FINISHED] [..]
",
)
.run();
}
#[test]
fn profile_config_error_paths() {
let p = project()
.file("Cargo.toml", &basic_lib_manifest("foo"))
.file("src/lib.rs", "")
.file(
".cargo/config",
r#"
[profile.dev]
opt-level = 3
"#,
)
.file(
paths::home().join(".cargo/config"),
r#"
[profile.dev]
rpath = "foo"
"#,
)
.build();
p.cargo("build -Z config-profile")
.masquerade_as_nightly_cargo()
.with_status(101)
.with_stderr(
"\
[ERROR] failed to parse manifest at `[CWD]/Cargo.toml`
Caused by:
error in [..].cargo/config: `profile.dev.rpath` expected true/false, but found a string
",
)
.run();
}
#[test]
fn profile_config_validate_errors() {
let p = project()
.file(
"Cargo.toml",
r#"
cargo-features = ["profile-overrides"]
[package]
name = "foo"
version = "0.0.1"
"#,
)
.file("src/lib.rs", "")
.file(
".cargo/config",
r#"
[profile.dev.overrides.foo]
panic = "abort"
"#,
)
.build();
p.cargo("build -Z config-profile")
.masquerade_as_nightly_cargo()
.with_status(101)
.with_stderr(
"\
[ERROR] config profile `profile.dev` is not valid
Caused by:
`panic` may not be specified in a profile override.
",
)
.run();
}
#[test]
fn profile_config_syntax_errors() {
let p = project()
.file("Cargo.toml", &basic_lib_manifest("foo"))
.file("src/lib.rs", "")
.file(
".cargo/config",
r#"
[profile.dev]
codegen-units = "foo"
"#,
)
.build();
p.cargo("build -Z config-profile")
.masquerade_as_nightly_cargo()
.with_status(101)
.with_stderr(
"\
[ERROR] failed to parse manifest at [..]
Caused by:
error in [..].cargo/config: `profile.dev.codegen-units` expected an integer, but found a string
",
)
.run();
}
#[test]
fn profile_config_override_spec_multiple() {
let p = project()
.file(
"Cargo.toml",
r#"
cargo-features = ["profile-overrides"]
[package]
name = "foo"
version = "0.0.1"
[dependencies]
bar = { path = "bar" }
"#,
)
.file(
".cargo/config",
r#"
[profile.dev.overrides.bar]
opt-level = 3
[profile.dev.overrides."bar:0.5.0"]
opt-level = 3
"#,
)
.file("src/lib.rs", "")
.file(
"bar/Cargo.toml",
r#"
cargo-features = ["profile-overrides"]
[package]
name = "bar"
version = "0.5.0"
"#,
)
.file("bar/src/lib.rs", "")
.build();
// Unfortunately this doesn't tell you which file, hopefully it's not too
// much of a problem.
p.cargo("build -v -Z config-profile")
.masquerade_as_nightly_cargo()
.with_status(101)
.with_stderr(
"\
[ERROR] multiple profile overrides in profile `dev` match package `bar v0.5.0 ([..])`
found profile override specs: bar, bar:0.5.0",
)
.run();
}
#[test]
fn profile_config_all_options() {
if !is_nightly() {
// May be removed once 1.34 is stable (added support for incremental-LTO).
return;
}
// Ensure all profile options are supported.
let p = project()
.file("src/main.rs", "fn main() {}")
.file(
".cargo/config",
r#"
[profile.release]
opt-level = 1
debug = true
debug-assertions = true
overflow-checks = false
rpath = true
lto = true
codegen-units = 2
panic = "abort"
incremental = true
"#,
)
.build();
p.cargo("build --release -v -Z config-profile")
.masquerade_as_nightly_cargo()
.env_remove("CARGO_INCREMENTAL")
.with_stderr(
"\
[COMPILING] foo [..]
[RUNNING] `rustc --crate-name foo [..] \
-C opt-level=1 \
-C panic=abort \
-C lto \
-C codegen-units=2 \
-C debuginfo=2 \
-C debug-assertions=on \
-C overflow-checks=off [..]\
-C rpath [..]\
-C incremental=[..]
[FINISHED] release [optimized + debuginfo] [..]
",
)
.run();
}
#[test]
fn profile_config_override_precedence() {
// Config values take precedence over manifest values.
let p = project()
.file(
"Cargo.toml",
r#"
cargo-features = ["profile-overrides"]
[package]
name = "foo"
version = "0.0.1"
[dependencies]
bar = {path = "bar"}
[profile.dev]
codegen-units = 2
[profile.dev.overrides.bar]
opt-level = 3
"#,
)
.file("src/lib.rs", "")
.file(
"bar/Cargo.toml",
r#"
cargo-features = ["profile-overrides"]
[package]
name = "bar"
version = "0.0.1"
"#,
)
.file("bar/src/lib.rs", "")
.file(
".cargo/config",
r#"
[profile.dev.overrides.bar]
opt-level = 2
"#,
)
.build();
p.cargo("build -v -Z config-profile")
.masquerade_as_nightly_cargo()
.with_stderr(
"\
[COMPILING] bar [..]
[RUNNING] `rustc --crate-name bar [..] -C opt-level=2 -C codegen-units=2 [..]
[COMPILING] foo [..]
[RUNNING] `rustc --crate-name foo [..]-C codegen-units=2 [..]
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]",
)
.run();
}
#[test]
fn profile_config_no_warn_unknown_override() {
let p = project()
.file(
"Cargo.toml",
r#"
cargo-features = ["profile-overrides"]
[package]
name = "foo"
version = "0.0.1"
"#,
)
.file("src/lib.rs", "")
.file(
".cargo/config",
r#"
[profile.dev.overrides.bar]
codegen-units = 4
"#,
)
.build();
p.cargo("build -Z config-profile")
.masquerade_as_nightly_cargo()
.with_stderr_does_not_contain("[..]warning[..]")
.run();
}
#[test]
fn profile_config_mixed_types() {
let p = project()
.file("Cargo.toml", &basic_lib_manifest("foo"))
.file("src/lib.rs", "")
.file(
".cargo/config",
r#"
[profile.dev]
opt-level = 3
"#,
)
.file(
paths::home().join(".cargo/config"),
r#"
[profile.dev]
opt-level = 's'
"#,
)
.build();
p.cargo("build -v -Z config-profile")
.masquerade_as_nightly_cargo()
.with_stderr_contains("[..]-C opt-level=3 [..]")
.run();
}