| //! Tests for `cargo-features = ["different-binary-name"]`. |
| |
| 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::prelude::*; |
| 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.to_str().unwrap()); |
| |
| // 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(); |
| } |
| } |