| //! Tests for `[alias]` config command aliases. |
| |
| use std::env; |
| |
| use cargo_test_support::tools::echo_subcommand; |
| use cargo_test_support::{basic_bin_manifest, project}; |
| |
| #[cargo_test] |
| fn alias_incorrect_config_type() { |
| let p = project() |
| .file("Cargo.toml", &basic_bin_manifest("foo")) |
| .file("src/main.rs", "fn main() {}") |
| .file( |
| ".cargo/config", |
| r#" |
| [alias] |
| b-cargo-test = 5 |
| "#, |
| ) |
| .build(); |
| |
| p.cargo("b-cargo-test -v") |
| .with_status(101) |
| .with_stderr_contains( |
| "\ |
| [ERROR] invalid configuration for key `alias.b-cargo-test` |
| expected a list, but found a integer for [..]", |
| ) |
| .run(); |
| } |
| |
| #[cargo_test] |
| fn alias_config() { |
| let p = project() |
| .file("Cargo.toml", &basic_bin_manifest("foo")) |
| .file("src/main.rs", "fn main() {}") |
| .file( |
| ".cargo/config", |
| r#" |
| [alias] |
| b-cargo-test = "build" |
| "#, |
| ) |
| .build(); |
| |
| p.cargo("b-cargo-test -v") |
| .with_stderr_contains( |
| "\ |
| [COMPILING] foo v0.5.0 [..] |
| [RUNNING] `rustc --crate-name foo [..]", |
| ) |
| .run(); |
| } |
| |
| #[cargo_test] |
| fn dependent_alias() { |
| let p = project() |
| .file("Cargo.toml", &basic_bin_manifest("foo")) |
| .file("src/main.rs", "fn main() {}") |
| .file( |
| ".cargo/config", |
| r#" |
| [alias] |
| b-cargo-test = "build" |
| a-cargo-test = ["b-cargo-test", "-v"] |
| "#, |
| ) |
| .build(); |
| |
| p.cargo("a-cargo-test") |
| .with_stderr_contains( |
| "\ |
| [COMPILING] foo v0.5.0 [..] |
| [RUNNING] `rustc --crate-name foo [..]", |
| ) |
| .run(); |
| } |
| |
| #[cargo_test] |
| fn default_args_alias() { |
| let echo = echo_subcommand(); |
| let p = project() |
| .file("Cargo.toml", &basic_bin_manifest("foo")) |
| .file("src/main.rs", "fn main() {}") |
| .file( |
| ".cargo/config", |
| r#" |
| [alias] |
| echo = "echo --flag1 --flag2" |
| test-1 = "echo" |
| build = "build --verbose" |
| "#, |
| ) |
| .build(); |
| |
| let mut paths: Vec<_> = env::split_paths(&env::var_os("PATH").unwrap_or_default()).collect(); |
| paths.push(echo.target_debug_dir()); |
| let path = env::join_paths(paths).unwrap(); |
| |
| p.cargo("echo") |
| .env("PATH", &path) |
| .with_status(101) |
| .with_stderr("error: alias echo has unresolvable recursive definition: echo -> echo") |
| .run(); |
| |
| p.cargo("test-1") |
| .env("PATH", &path) |
| .with_status(101) |
| .with_stderr( |
| "error: alias test-1 has unresolvable recursive definition: test-1 -> echo -> echo", |
| ) |
| .run(); |
| |
| // Builtins are not expanded by rule |
| p.cargo("build") |
| .with_stderr( |
| "\ |
| [WARNING] user-defined alias `build` is ignored, because it is shadowed by a built-in command |
| [COMPILING] foo v0.5.0 ([..]) |
| [FINISHED] dev [unoptimized + debuginfo] target(s) in [..] |
| ", |
| ) |
| .run(); |
| } |
| |
| #[cargo_test] |
| fn corecursive_alias() { |
| let p = project() |
| .file("Cargo.toml", &basic_bin_manifest("foo")) |
| .file("src/main.rs", "fn main() {}") |
| .file( |
| ".cargo/config", |
| r#" |
| [alias] |
| test-1 = "test-2 --flag1" |
| test-2 = "test-3 --flag2" |
| test-3 = "test-1 --flag3" |
| "#, |
| ) |
| .build(); |
| |
| p.cargo("test-1") |
| .with_status(101) |
| .with_stderr( |
| "error: alias test-1 has unresolvable recursive definition: test-1 -> test-2 -> test-3 -> test-1", |
| ) |
| .run(); |
| |
| p.cargo("test-2") |
| .with_status(101) |
| .with_stderr( |
| "error: alias test-2 has unresolvable recursive definition: test-2 -> test-3 -> test-1 -> test-2", |
| ) |
| .run(); |
| } |
| |
| #[cargo_test] |
| fn alias_list_test() { |
| let p = project() |
| .file("Cargo.toml", &basic_bin_manifest("foo")) |
| .file("src/main.rs", "fn main() {}") |
| .file( |
| ".cargo/config", |
| r#" |
| [alias] |
| b-cargo-test = ["build", "--release"] |
| "#, |
| ) |
| .build(); |
| |
| p.cargo("b-cargo-test -v") |
| .with_stderr_contains("[COMPILING] foo v0.5.0 [..]") |
| .with_stderr_contains("[RUNNING] `rustc --crate-name [..]") |
| .run(); |
| } |
| |
| #[cargo_test] |
| fn alias_with_flags_config() { |
| let p = project() |
| .file("Cargo.toml", &basic_bin_manifest("foo")) |
| .file("src/main.rs", "fn main() {}") |
| .file( |
| ".cargo/config", |
| r#" |
| [alias] |
| b-cargo-test = "build --release" |
| "#, |
| ) |
| .build(); |
| |
| p.cargo("b-cargo-test -v") |
| .with_stderr_contains("[COMPILING] foo v0.5.0 [..]") |
| .with_stderr_contains("[RUNNING] `rustc --crate-name foo [..]") |
| .run(); |
| } |
| |
| #[cargo_test] |
| fn alias_cannot_shadow_builtin_command() { |
| let p = project() |
| .file("Cargo.toml", &basic_bin_manifest("foo")) |
| .file("src/main.rs", "fn main() {}") |
| .file( |
| ".cargo/config", |
| r#" |
| [alias] |
| build = "fetch" |
| "#, |
| ) |
| .build(); |
| |
| p.cargo("build") |
| .with_stderr( |
| "\ |
| [WARNING] user-defined alias `build` is ignored, because it is shadowed by a built-in command |
| [COMPILING] foo v0.5.0 ([..]) |
| [FINISHED] dev [unoptimized + debuginfo] target(s) in [..] |
| ", |
| ) |
| .run(); |
| } |
| |
| #[cargo_test] |
| fn alias_override_builtin_alias() { |
| let p = project() |
| .file("Cargo.toml", &basic_bin_manifest("foo")) |
| .file("src/main.rs", "fn main() {}") |
| .file( |
| ".cargo/config", |
| r#" |
| [alias] |
| b = "run" |
| "#, |
| ) |
| .build(); |
| |
| p.cargo("b") |
| .with_stderr( |
| "\ |
| [COMPILING] foo v0.5.0 ([..]) |
| [FINISHED] dev [unoptimized + debuginfo] target(s) in [..] |
| [RUNNING] `target/debug/foo[EXE]` |
| ", |
| ) |
| .run(); |
| } |
| |
| #[cargo_test] |
| fn builtin_alias_takes_options() { |
| // #6381 |
| let p = project() |
| .file("src/lib.rs", "") |
| .file( |
| "examples/ex1.rs", |
| r#"fn main() { println!("{}", std::env::args().skip(1).next().unwrap()) }"#, |
| ) |
| .build(); |
| |
| p.cargo("r --example ex1 -- asdf").with_stdout("asdf").run(); |
| } |
| |
| #[cargo_test] |
| fn global_options_with_alias() { |
| // Check that global options are passed through. |
| let p = project().file("src/lib.rs", "").build(); |
| |
| p.cargo("-v c") |
| .with_stderr( |
| "\ |
| [CHECKING] foo [..] |
| [RUNNING] `rustc [..] |
| [FINISHED] dev [..] |
| ", |
| ) |
| .run(); |
| } |
| |
| #[cargo_test] |
| fn weird_check() { |
| let p = project() |
| .file("Cargo.toml", &basic_bin_manifest("foo")) |
| .file("src/main.rs", "fn main() {}") |
| .build(); |
| |
| p.cargo("-- check --invalid_argument -some-other-argument") |
| .with_stderr( |
| "\ |
| [WARNING] trailing arguments after built-in command `check` are ignored: `--invalid_argument -some-other-argument` |
| [CHECKING] foo v0.5.0 ([..]) |
| [FINISHED] dev [unoptimized + debuginfo] target(s) in [..] |
| ", |
| ) |
| .run(); |
| } |