mirror of
https://github.com/rust-lang/cargo.git
synced 2025-09-25 11:14:46 +00:00
528 lines
13 KiB
Rust
528 lines
13 KiB
Rust
//! Tests for `cargo-features = ["different-binary-name"]`.
|
|
|
|
use crate::prelude::*;
|
|
use cargo_test_support::install::assert_has_installed_exe;
|
|
use cargo_test_support::install::assert_has_not_installed_exe;
|
|
use cargo_test_support::is_nightly;
|
|
use cargo_test_support::paths;
|
|
use cargo_test_support::project;
|
|
use cargo_test_support::str;
|
|
|
|
#[cargo_test]
|
|
fn gated() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
edition = "2015"
|
|
|
|
[[bin]]
|
|
name = "foo"
|
|
filename = "007bar"
|
|
path = "src/main.rs"
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() { assert!(true) }")
|
|
.build();
|
|
|
|
// Run cargo build.
|
|
p.cargo("build")
|
|
.masquerade_as_nightly_cargo(&["different-binary-name"])
|
|
.with_status(101)
|
|
.with_stderr_data(str![[r#"
|
|
[ERROR] failed to parse manifest at `[ROOT]/foo/Cargo.toml`
|
|
|
|
Caused by:
|
|
feature `different-binary-name` is required
|
|
|
|
The package requires the Cargo feature called `different-binary-name`, but that feature is not stabilized in this version of Cargo ([..]).
|
|
Consider adding `cargo-features = ["different-binary-name"]` to the top of Cargo.toml (above the [package] table) to tell Cargo you are opting in to use this unstable feature.
|
|
See https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#different-binary-name for more information about the status of this feature.
|
|
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
// This test checks if:
|
|
// 1. The correct binary is produced
|
|
// 2. The deps file has the correct content
|
|
// 3. Fingerprinting works
|
|
// 4. `cargo clean` command works
|
|
fn binary_name1() {
|
|
// Create the project.
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
cargo-features = ["different-binary-name"]
|
|
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
edition = "2015"
|
|
|
|
[[bin]]
|
|
name = "foo"
|
|
filename = "007bar"
|
|
path = "src/main.rs"
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() { assert!(true) }")
|
|
.build();
|
|
|
|
// Run cargo build.
|
|
p.cargo("build")
|
|
.masquerade_as_nightly_cargo(&["different-binary-name"])
|
|
.run();
|
|
|
|
// Check the name of the binary that cargo has generated.
|
|
// A binary with the name of the crate should NOT be created.
|
|
let foo_path = p.bin("foo");
|
|
assert!(!foo_path.is_file());
|
|
// A binary with the name provided in `filename` parameter should be created.
|
|
let bar_path = p.bin("007bar");
|
|
assert!(bar_path.is_file());
|
|
|
|
// Check if deps file exists.
|
|
let deps_path = p.bin("007bar").with_extension("d");
|
|
assert!(deps_path.is_file(), "{:?}", bar_path);
|
|
|
|
let depinfo = p.read_file(&deps_path);
|
|
|
|
// Prepare what content we expect to be present in deps file.
|
|
let deps_exp = format!(
|
|
"{}: {}",
|
|
p.bin("007bar").to_str().unwrap(),
|
|
p.root().join("src").join("main.rs").to_str().unwrap()
|
|
);
|
|
|
|
// Compare actual deps content with expected deps content.
|
|
assert!(
|
|
depinfo.lines().any(|line| line == deps_exp),
|
|
"Content of `{}` is incorrect",
|
|
deps_path.to_string_lossy()
|
|
);
|
|
|
|
// Run cargo second time, to verify fingerprint.
|
|
p.cargo("build -p foo -v")
|
|
.masquerade_as_nightly_cargo(&["different-binary-name"])
|
|
.with_stderr_data(str![[r#"
|
|
[FRESH] foo v0.0.1 ([ROOT]/foo)
|
|
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
|
|
// Run cargo clean.
|
|
p.cargo("clean -p foo")
|
|
.masquerade_as_nightly_cargo(&["different-binary-name"])
|
|
.run();
|
|
|
|
// Check if the appropriate file was removed.
|
|
assert!(
|
|
!bar_path.is_file(),
|
|
"`cargo clean` did not remove the correct files"
|
|
);
|
|
}
|
|
|
|
#[cargo_test]
|
|
// This test checks if:
|
|
// 1. Check `cargo run`
|
|
// 2. Check `cargo test`
|
|
// 3. Check `cargo install/uninstall`
|
|
fn binary_name2() {
|
|
// Create the project.
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
cargo-features = ["different-binary-name"]
|
|
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
edition = "2015"
|
|
|
|
[[bin]]
|
|
name = "foo"
|
|
filename = "007bar"
|
|
"#,
|
|
)
|
|
.file(
|
|
"src/main.rs",
|
|
r#"
|
|
fn hello(name: &str) -> String {
|
|
format!("Hello, {}!", name)
|
|
}
|
|
|
|
fn main() {
|
|
println!("{}", hello("crabs"));
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn check_crabs() {
|
|
assert_eq!(hello("crabs"), "Hello, crabs!");
|
|
}
|
|
}
|
|
"#,
|
|
)
|
|
.build();
|
|
|
|
// Run cargo build.
|
|
p.cargo("build")
|
|
.masquerade_as_nightly_cargo(&["different-binary-name"])
|
|
.run();
|
|
|
|
// Check the name of the binary that cargo has generated.
|
|
// A binary with the name of the crate should NOT be created.
|
|
let foo_path = p.bin("foo");
|
|
assert!(!foo_path.is_file());
|
|
// A binary with the name provided in `filename` parameter should be created.
|
|
let bar_path = p.bin("007bar");
|
|
assert!(bar_path.is_file());
|
|
|
|
// Check if `cargo test` works
|
|
p.cargo("test")
|
|
.masquerade_as_nightly_cargo(&["different-binary-name"])
|
|
.with_stderr_data(str![[r#"
|
|
[COMPILING] foo v0.0.1 ([ROOT]/foo)
|
|
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
|
[RUNNING] unittests src/main.rs (target/debug/deps/foo-[..][EXE])
|
|
|
|
"#]])
|
|
.with_stdout_data(str![[r#"
|
|
|
|
running 1 test
|
|
test tests::check_crabs ... ok
|
|
|
|
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in [ELAPSED]s
|
|
|
|
|
|
"#]])
|
|
.run();
|
|
|
|
// Check if `cargo run` is able to execute the binary
|
|
p.cargo("run")
|
|
.masquerade_as_nightly_cargo(&["different-binary-name"])
|
|
.with_stdout_data(str![[r#"
|
|
Hello, crabs!
|
|
|
|
"#]])
|
|
.run();
|
|
|
|
p.cargo("install")
|
|
.masquerade_as_nightly_cargo(&["different-binary-name"])
|
|
.run();
|
|
|
|
assert_has_installed_exe(paths::cargo_home(), "007bar");
|
|
|
|
p.cargo("uninstall")
|
|
.with_stderr_data(str![[r#"
|
|
[REMOVING] [ROOT]/home/.cargo/bin/007bar[EXE]
|
|
|
|
"#]])
|
|
.masquerade_as_nightly_cargo(&["different-binary-name"])
|
|
.run();
|
|
|
|
assert_has_not_installed_exe(paths::cargo_home(), "007bar");
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn check_env_vars() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
cargo-features = ["different-binary-name"]
|
|
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
edition = "2015"
|
|
|
|
[[bin]]
|
|
name = "foo"
|
|
filename = "007bar"
|
|
"#,
|
|
)
|
|
.file(
|
|
"src/main.rs",
|
|
r#"
|
|
fn main() {
|
|
println!("{}", option_env!("CARGO_BIN_NAME").unwrap());
|
|
}
|
|
"#,
|
|
)
|
|
.file(
|
|
"tests/integration.rs",
|
|
r#"
|
|
#[test]
|
|
fn check_env_vars2() {
|
|
let value = option_env!("CARGO_BIN_EXE_007bar").expect("Could not find environment variable.");
|
|
assert!(value.contains("007bar"));
|
|
}
|
|
"#
|
|
)
|
|
.build();
|
|
|
|
// Run cargo build.
|
|
p.cargo("build")
|
|
.masquerade_as_nightly_cargo(&["different-binary-name"])
|
|
.run();
|
|
p.cargo("run")
|
|
.masquerade_as_nightly_cargo(&["different-binary-name"])
|
|
.with_stdout_data(str![[r#"
|
|
007bar
|
|
|
|
"#]])
|
|
.run();
|
|
p.cargo("test")
|
|
.masquerade_as_nightly_cargo(&["different-binary-name"])
|
|
.with_status(0)
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn check_msg_format_json() {
|
|
// Create the project.
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
cargo-features = ["different-binary-name"]
|
|
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
edition = "2015"
|
|
|
|
[[bin]]
|
|
name = "foo"
|
|
filename = "007bar"
|
|
path = "src/main.rs"
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() { assert!(true) }")
|
|
.build();
|
|
|
|
// Run cargo build.
|
|
p.cargo("build --message-format=json")
|
|
.masquerade_as_nightly_cargo(&["different-binary-name"])
|
|
.with_stdout_data(
|
|
str![[r#"
|
|
[
|
|
{
|
|
"executable": "[ROOT]/foo/target/debug/007bar[EXE]",
|
|
"features": [],
|
|
"filenames": "{...}",
|
|
"fresh": false,
|
|
"manifest_path": "[ROOT]/foo/Cargo.toml",
|
|
"package_id": "path+[ROOTURL]/foo#0.0.1",
|
|
"profile": "{...}",
|
|
"reason": "compiler-artifact",
|
|
"target": "{...}"
|
|
},
|
|
{
|
|
"reason": "build-finished",
|
|
"success": true
|
|
}
|
|
]
|
|
"#]]
|
|
.is_json()
|
|
.against_jsonlines(),
|
|
)
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn targets_with_relative_path_in_workspace_members() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[workspace]
|
|
members = ["relative-bar"]
|
|
resolver = "2"
|
|
"#,
|
|
)
|
|
.file(
|
|
"relative-bar/Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "relative-bar"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
|
|
build = "./build.rs"
|
|
|
|
[[bin]]
|
|
name = "bar"
|
|
path = "./src/main.rs"
|
|
|
|
[lib]
|
|
name = "lib"
|
|
path = "./src/lib.rs"
|
|
|
|
[[example]]
|
|
name = "example"
|
|
path = "./example.rs"
|
|
|
|
[[test]]
|
|
name = "test"
|
|
path = "./test.rs"
|
|
|
|
[[bench]]
|
|
name = "bench"
|
|
path = "./bench.rs"
|
|
"#,
|
|
)
|
|
.file("relative-bar/build.rs", "fn main() { let a = 1; }")
|
|
.file("relative-bar/src/main.rs", "fn main() { let a = 1; }")
|
|
.file("relative-bar/src/lib.rs", "fn a() {}")
|
|
.file("relative-bar/example.rs", "fn main() { let a = 1; }")
|
|
.file(
|
|
"relative-bar/test.rs",
|
|
r#"
|
|
fn main() {}
|
|
|
|
#[test]
|
|
fn test_a() { let a = 1; }
|
|
"#,
|
|
)
|
|
.file(
|
|
"relative-bar/bench.rs",
|
|
r#"
|
|
#![feature(test)]
|
|
#[cfg(test)]
|
|
extern crate test;
|
|
|
|
#[bench]
|
|
fn bench_a(_b: &mut test::Bencher) { let a = 1; }
|
|
"#,
|
|
)
|
|
.build();
|
|
|
|
p.cargo("check")
|
|
.with_stderr_data(str![[r#"
|
|
...
|
|
--> relative-bar/build.rs:1:17
|
|
...
|
|
--> relative-bar/src/lib.rs:1:4
|
|
...
|
|
--> relative-bar/src/main.rs:1:17
|
|
...
|
|
"#]])
|
|
.run();
|
|
|
|
p.cargo("check --example example")
|
|
.with_stderr_data(str![[r#"
|
|
...
|
|
--> relative-bar/example.rs:1:17
|
|
...
|
|
"#]])
|
|
.run();
|
|
|
|
p.cargo("check --test test")
|
|
.with_stderr_data(str![[r#"
|
|
...
|
|
--> relative-bar/test.rs:5:35
|
|
...
|
|
"#]])
|
|
.run();
|
|
|
|
if is_nightly() {
|
|
p.cargo("check --bench bench")
|
|
.with_stderr_data(str![[r#"
|
|
...
|
|
--> relative-bar/bench.rs:7:58
|
|
...
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
// Disable Cargo target auto-discovery.
|
|
p.change_file(
|
|
"relative-bar/Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "relative-bar"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
|
|
autolib = false
|
|
autobins = false
|
|
autoexamples = false
|
|
autotests = false
|
|
autobenches = false
|
|
|
|
build = "./build.rs"
|
|
|
|
[[bin]]
|
|
name = "bar"
|
|
path = "./src/main.rs"
|
|
|
|
[lib]
|
|
name = "lib"
|
|
path = "./src/lib.rs"
|
|
|
|
[[example]]
|
|
name = "example"
|
|
path = "./example.rs"
|
|
|
|
[[test]]
|
|
name = "test"
|
|
path = "./test.rs"
|
|
|
|
[[bench]]
|
|
name = "bench"
|
|
path = "./bench.rs"
|
|
"#,
|
|
);
|
|
|
|
p.cargo("check")
|
|
.with_stderr_data(str![[r#"
|
|
...
|
|
--> relative-bar/build.rs:1:17
|
|
...
|
|
--> relative-bar/src/lib.rs:1:4
|
|
...
|
|
--> relative-bar/src/main.rs:1:17
|
|
...
|
|
"#]])
|
|
.run();
|
|
|
|
p.cargo("check --example example")
|
|
.with_stderr_data(str![[r#"
|
|
...
|
|
--> relative-bar/example.rs:1:17
|
|
...
|
|
"#]])
|
|
.run();
|
|
|
|
p.cargo("check --test test")
|
|
.with_stderr_data(str![[r#"
|
|
...
|
|
--> relative-bar/test.rs:5:35
|
|
...
|
|
"#]])
|
|
.run();
|
|
|
|
if is_nightly() {
|
|
p.cargo("check --bench bench")
|
|
.with_stderr_data(str![[r#"
|
|
...
|
|
--> relative-bar/bench.rs:7:58
|
|
...
|
|
"#]])
|
|
.run();
|
|
}
|
|
}
|