summaryrefslogtreecommitdiffstats
path: root/src/tools/cargo/tests/testsuite/binary_name.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/cargo/tests/testsuite/binary_name.rs')
-rw-r--r--src/tools/cargo/tests/testsuite/binary_name.rs301
1 files changed, 301 insertions, 0 deletions
diff --git a/src/tools/cargo/tests/testsuite/binary_name.rs b/src/tools/cargo/tests/testsuite/binary_name.rs
new file mode 100644
index 000000000..7735d6054
--- /dev/null
+++ b/src/tools/cargo/tests/testsuite/binary_name.rs
@@ -0,0 +1,301 @@
+use cargo_test_support::install::{
+ assert_has_installed_exe, assert_has_not_installed_exe, cargo_home,
+};
+use cargo_test_support::project;
+
+#[cargo_test]
+fn gated() {
+ let p = project()
+ .file(
+ "Cargo.toml",
+ r#"
+ [package]
+ name = "foo"
+ version = "0.0.1"
+
+ [[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_contains("[..]feature `different-binary-name` is required")
+ .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"
+
+ [[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(
+ "\
+[FRESH] foo [..]
+[FINISHED] [..]
+",
+ )
+ .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"
+
+ [[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(
+ "\
+[COMPILING] foo v0.0.1 ([CWD])
+[FINISHED] test [unoptimized + debuginfo] target(s) in [..]
+[RUNNING] [..] (target/debug/deps/foo-[..][EXE])",
+ )
+ .with_stdout_contains("test tests::check_crabs ... ok")
+ .run();
+
+ // Check if `cargo run` is able to execute the binary
+ p.cargo("run")
+ .masquerade_as_nightly_cargo(&["different-binary-name"])
+ .with_stdout("Hello, crabs!")
+ .run();
+
+ p.cargo("install")
+ .masquerade_as_nightly_cargo(&["different-binary-name"])
+ .run();
+
+ assert_has_installed_exe(cargo_home(), "007bar");
+
+ p.cargo("uninstall")
+ .with_stderr("[REMOVING] [ROOT]/home/.cargo/bin/007bar[EXE]")
+ .masquerade_as_nightly_cargo(&["different-binary-name"])
+ .run();
+
+ assert_has_not_installed_exe(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"
+
+ [[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("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"
+
+ [[bin]]
+ name = "foo"
+ filename = "007bar"
+ path = "src/main.rs"
+ "#,
+ )
+ .file("src/main.rs", "fn main() { assert!(true) }")
+ .build();
+
+ let output = r#"
+{
+ "reason": "compiler-artifact",
+ "package_id": "foo 0.0.1 [..]",
+ "manifest_path": "[CWD]/Cargo.toml",
+ "target": "{...}",
+ "profile": "{...}",
+ "features": [],
+ "filenames": "{...}",
+ "executable": "[ROOT]/foo/target/debug/007bar[EXE]",
+ "fresh": false
+}
+
+{"reason":"build-finished", "success":true}
+"#;
+
+ // Run cargo build.
+ p.cargo("build --message-format=json")
+ .masquerade_as_nightly_cargo(&["different-binary-name"])
+ .with_json(output)
+ .run();
+}