summaryrefslogtreecommitdiffstats
path: root/src/tools/cargo/tests/testsuite/cargo_config.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/cargo/tests/testsuite/cargo_config.rs')
-rw-r--r--src/tools/cargo/tests/testsuite/cargo_config.rs520
1 files changed, 520 insertions, 0 deletions
diff --git a/src/tools/cargo/tests/testsuite/cargo_config.rs b/src/tools/cargo/tests/testsuite/cargo_config.rs
new file mode 100644
index 000000000..e367f8e06
--- /dev/null
+++ b/src/tools/cargo/tests/testsuite/cargo_config.rs
@@ -0,0 +1,520 @@
+//! Tests for the `cargo config` command.
+
+use super::config::write_config_at;
+use cargo_test_support::paths;
+use std::fs;
+use std::path::PathBuf;
+
+fn cargo_process(s: &str) -> cargo_test_support::Execs {
+ let mut p = cargo_test_support::cargo_process(s);
+ // Clear out some of the environment added by the default cargo_process so
+ // the tests don't need to deal with it.
+ p.env_remove("CARGO_PROFILE_DEV_SPLIT_DEBUGINFO")
+ .env_remove("CARGO_PROFILE_TEST_SPLIT_DEBUGINFO")
+ .env_remove("CARGO_PROFILE_RELEASE_SPLIT_DEBUGINFO")
+ .env_remove("CARGO_PROFILE_BENCH_SPLIT_DEBUGINFO")
+ .env_remove("CARGO_INCREMENTAL");
+ p
+}
+
+#[cargo_test]
+fn gated() {
+ cargo_process("config get")
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .with_status(101)
+ .with_stderr("\
+error: the `cargo config` command is unstable, pass `-Z unstable-options` to enable it
+See https://github.com/rust-lang/cargo/issues/9301 for more information about the `cargo config` command.
+")
+ .run();
+}
+
+fn common_setup() -> PathBuf {
+ write_config_at(
+ paths::home().join(".cargo/config.toml"),
+ "
+ [alias]
+ foo = \"abc --xyz\"
+ [build]
+ jobs = 99
+ rustflags = [\"--flag-global\"]
+ [profile.dev]
+ opt-level = 3
+ [profile.dev.package.foo]
+ opt-level = 1
+ [target.'cfg(target_os = \"linux\")']
+ runner = \"runme\"
+
+ # How unknown keys are handled.
+ [extra-table]
+ somekey = \"somevalue\"
+ ",
+ );
+ let sub_folder = paths::root().join("foo/.cargo");
+ write_config_at(
+ sub_folder.join("config.toml"),
+ "
+ [alias]
+ sub-example = [\"sub\", \"example\"]
+ [build]
+ rustflags = [\"--flag-directory\"]
+ ",
+ );
+ sub_folder
+}
+
+#[cargo_test]
+fn get_toml() {
+ // Notes:
+ // - The "extra-table" is shown without a warning. I'm not sure how that
+ // should be handled, since displaying warnings could cause problems
+ // with ingesting the output.
+ // - Environment variables aren't loaded. :(
+ let sub_folder = common_setup();
+ cargo_process("config get -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .env("CARGO_ALIAS_BAR", "cat dog")
+ .env("CARGO_BUILD_JOBS", "100")
+ // The weird forward slash in the linux line is due to testsuite normalization.
+ .with_stdout(
+ "\
+alias.foo = \"abc --xyz\"
+alias.sub-example = [\"sub\", \"example\"]
+build.jobs = 99
+build.rustflags = [\"--flag-directory\", \"--flag-global\"]
+extra-table.somekey = \"somevalue\"
+profile.dev.opt-level = 3
+profile.dev.package.foo.opt-level = 1
+target.\"cfg(target_os = \\\"linux\\\")\".runner = \"runme\"
+# The following environment variables may affect the loaded values.
+# CARGO_ALIAS_BAR=[..]cat dog[..]
+# CARGO_BUILD_JOBS=100
+# CARGO_HOME=[ROOT]/home/.cargo
+",
+ )
+ .with_stderr("")
+ .run();
+
+ // Env keys work if they are specific.
+ cargo_process("config get build.jobs -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .env("CARGO_BUILD_JOBS", "100")
+ .with_stdout("build.jobs = 100")
+ .with_stderr("")
+ .run();
+
+ // Array value.
+ cargo_process("config get build.rustflags -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .with_stdout("build.rustflags = [\"--flag-directory\", \"--flag-global\"]")
+ .with_stderr("")
+ .run();
+
+ // Sub-table
+ cargo_process("config get profile -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .with_stdout(
+ "\
+profile.dev.opt-level = 3
+profile.dev.package.foo.opt-level = 1
+",
+ )
+ .with_stderr("")
+ .run();
+
+ // Specific profile entry.
+ cargo_process("config get profile.dev.opt-level -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .with_stdout("profile.dev.opt-level = 3")
+ .with_stderr("")
+ .run();
+
+ // A key that isn't set.
+ cargo_process("config get build.rustc -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .with_status(101)
+ .with_stdout("")
+ .with_stderr("error: config value `build.rustc` is not set")
+ .run();
+
+ // A key that is not part of Cargo's config schema.
+ cargo_process("config get not.set -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .with_status(101)
+ .with_stdout("")
+ .with_stderr("error: config value `not.set` is not set")
+ .run();
+}
+
+#[cargo_test]
+fn get_json() {
+ // Notes:
+ // - This does not show env vars at all. :(
+ let all_json = r#"
+ {
+ "alias": {
+ "foo": "abc --xyz",
+ "sub-example": [
+ "sub",
+ "example"
+ ]
+ },
+ "build": {
+ "jobs": 99,
+ "rustflags": [
+ "--flag-directory",
+ "--flag-global"
+ ]
+ },
+ "extra-table": {
+ "somekey": "somevalue"
+ },
+ "profile": {
+ "dev": {
+ "opt-level": 3,
+ "package": {
+ "foo": {
+ "opt-level": 1
+ }
+ }
+ }
+ },
+ "target": {
+ "cfg(target_os = \"linux\")": {
+ "runner": "runme"
+ }
+ }
+ }
+ "#;
+ let sub_folder = common_setup();
+ cargo_process("config get --format=json -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .env("CARGO_ALIAS_BAR", "cat dog")
+ .env("CARGO_BUILD_JOBS", "100")
+ .with_json(all_json)
+ .with_stderr(
+ "\
+note: The following environment variables may affect the loaded values.
+CARGO_ALIAS_BAR=[..]cat dog[..]
+CARGO_BUILD_JOBS=100
+CARGO_HOME=[ROOT]/home/.cargo
+",
+ )
+ .run();
+
+ // json-value is the same for the entire root table
+ cargo_process("config get --format=json-value -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .with_json(all_json)
+ .with_stderr(
+ "\
+note: The following environment variables may affect the loaded values.
+CARGO_HOME=[ROOT]/home/.cargo
+",
+ )
+ .run();
+
+ cargo_process("config get --format=json build.jobs -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .with_json(
+ r#"
+ {"build": {"jobs": 99}}
+ "#,
+ )
+ .with_stderr("")
+ .run();
+
+ cargo_process("config get --format=json-value build.jobs -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .with_stdout("99")
+ .with_stderr("")
+ .run();
+}
+
+#[cargo_test]
+fn show_origin_toml() {
+ let sub_folder = common_setup();
+ cargo_process("config get --show-origin -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .with_stdout(
+ "\
+alias.foo = \"abc --xyz\" # [ROOT]/home/.cargo/config.toml
+alias.sub-example = [
+ \"sub\", # [ROOT]/foo/.cargo/config.toml
+ \"example\", # [ROOT]/foo/.cargo/config.toml
+]
+build.jobs = 99 # [ROOT]/home/.cargo/config.toml
+build.rustflags = [
+ \"--flag-directory\", # [ROOT]/foo/.cargo/config.toml
+ \"--flag-global\", # [ROOT]/home/.cargo/config.toml
+]
+extra-table.somekey = \"somevalue\" # [ROOT]/home/.cargo/config.toml
+profile.dev.opt-level = 3 # [ROOT]/home/.cargo/config.toml
+profile.dev.package.foo.opt-level = 1 # [ROOT]/home/.cargo/config.toml
+target.\"cfg(target_os = \\\"linux\\\")\".runner = \"runme\" # [ROOT]/home/.cargo/config.toml
+# The following environment variables may affect the loaded values.
+# CARGO_HOME=[ROOT]/home/.cargo
+",
+ )
+ .with_stderr("")
+ .run();
+
+ cargo_process("config get --show-origin build.rustflags -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .env("CARGO_BUILD_RUSTFLAGS", "env1 env2")
+ .with_stdout(
+ "\
+build.rustflags = [
+ \"--flag-directory\", # [ROOT]/foo/.cargo/config.toml
+ \"--flag-global\", # [ROOT]/home/.cargo/config.toml
+ \"env1\", # environment variable `CARGO_BUILD_RUSTFLAGS`
+ \"env2\", # environment variable `CARGO_BUILD_RUSTFLAGS`
+]
+",
+ )
+ .with_stderr("")
+ .run();
+}
+
+#[cargo_test]
+fn show_origin_toml_cli() {
+ let sub_folder = common_setup();
+ cargo_process("config get --show-origin build.jobs -Zunstable-options --config build.jobs=123")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .env("CARGO_BUILD_JOBS", "1")
+ .with_stdout("build.jobs = 123 # --config cli option")
+ .with_stderr("")
+ .run();
+
+ cargo_process("config get --show-origin build.rustflags -Zunstable-options --config")
+ .arg("build.rustflags=[\"cli1\",\"cli2\"]")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .env("CARGO_BUILD_RUSTFLAGS", "env1 env2")
+ .with_stdout(
+ "\
+build.rustflags = [
+ \"--flag-directory\", # [ROOT]/foo/.cargo/config.toml
+ \"--flag-global\", # [ROOT]/home/.cargo/config.toml
+ \"cli1\", # --config cli option
+ \"cli2\", # --config cli option
+ \"env1\", # environment variable `CARGO_BUILD_RUSTFLAGS`
+ \"env2\", # environment variable `CARGO_BUILD_RUSTFLAGS`
+]
+",
+ )
+ .with_stderr("")
+ .run();
+}
+
+#[cargo_test]
+fn show_origin_json() {
+ let sub_folder = common_setup();
+ cargo_process("config get --show-origin --format=json -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .with_status(101)
+ .with_stderr("error: the `json` format does not support --show-origin, try the `toml` format instead")
+ .run();
+}
+
+#[cargo_test]
+fn unmerged_toml() {
+ let sub_folder = common_setup();
+ cargo_process("config get --merged=no -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .env("CARGO_ALIAS_BAR", "cat dog")
+ .env("CARGO_BUILD_JOBS", "100")
+ .with_stdout(
+ "\
+# Environment variables
+# CARGO=[..]
+# CARGO_ALIAS_BAR=[..]cat dog[..]
+# CARGO_BUILD_JOBS=100
+# CARGO_HOME=[ROOT]/home/.cargo
+
+# [ROOT]/foo/.cargo/config.toml
+alias.sub-example = [\"sub\", \"example\"]
+build.rustflags = [\"--flag-directory\"]
+
+# [ROOT]/home/.cargo/config.toml
+alias.foo = \"abc --xyz\"
+build.jobs = 99
+build.rustflags = [\"--flag-global\"]
+extra-table.somekey = \"somevalue\"
+profile.dev.opt-level = 3
+profile.dev.package.foo.opt-level = 1
+target.\"cfg(target_os = \\\"linux\\\")\".runner = \"runme\"
+
+",
+ )
+ .with_stderr("")
+ .run();
+
+ cargo_process("config get --merged=no build.rustflags -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .env("CARGO_BUILD_RUSTFLAGS", "env1 env2")
+ .with_stdout(
+ "\
+# Environment variables
+# CARGO_BUILD_RUSTFLAGS=[..]env1 env2[..]
+
+# [ROOT]/foo/.cargo/config.toml
+build.rustflags = [\"--flag-directory\"]
+
+# [ROOT]/home/.cargo/config.toml
+build.rustflags = [\"--flag-global\"]
+
+",
+ )
+ .with_stderr("")
+ .run();
+
+ cargo_process("config get --merged=no does.not.exist -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .with_stderr("")
+ .with_stderr("")
+ .run();
+
+ cargo_process("config get --merged=no build.rustflags.extra -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .with_status(101)
+ .with_stderr(
+ "error: expected table for configuration key `build.rustflags`, \
+ but found array in [ROOT]/foo/.cargo/config.toml",
+ )
+ .run();
+}
+
+#[cargo_test]
+fn unmerged_toml_cli() {
+ let sub_folder = common_setup();
+ cargo_process("config get --merged=no build.rustflags -Zunstable-options --config")
+ .arg("build.rustflags=[\"cli1\",\"cli2\"]")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .env("CARGO_BUILD_RUSTFLAGS", "env1 env2")
+ .with_stdout(
+ "\
+# --config cli option
+build.rustflags = [\"cli1\", \"cli2\"]
+
+# Environment variables
+# CARGO_BUILD_RUSTFLAGS=[..]env1 env2[..]
+
+# [ROOT]/foo/.cargo/config.toml
+build.rustflags = [\"--flag-directory\"]
+
+# [ROOT]/home/.cargo/config.toml
+build.rustflags = [\"--flag-global\"]
+
+",
+ )
+ .with_stderr("")
+ .run();
+}
+
+#[cargo_test]
+fn unmerged_json() {
+ let sub_folder = common_setup();
+ cargo_process("config get --merged=no --format=json -Zunstable-options")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config"])
+ .with_status(101)
+ .with_stderr(
+ "error: the `json` format does not support --merged=no, try the `toml` format instead",
+ )
+ .run();
+}
+
+#[cargo_test]
+fn includes() {
+ let sub_folder = common_setup();
+ fs::write(
+ sub_folder.join("config.toml"),
+ "
+ include = 'other.toml'
+ [build]
+ rustflags = [\"--flag-directory\"]
+ ",
+ )
+ .unwrap();
+ fs::write(
+ sub_folder.join("other.toml"),
+ "
+ [build]
+ rustflags = [\"--flag-other\"]
+ ",
+ )
+ .unwrap();
+
+ cargo_process("config get build.rustflags -Zunstable-options -Zconfig-include")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config", "config-include"])
+ .with_stdout(r#"build.rustflags = ["--flag-other", "--flag-directory", "--flag-global"]"#)
+ .with_stderr("")
+ .run();
+
+ cargo_process("config get build.rustflags --show-origin -Zunstable-options -Zconfig-include")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config", "config-include"])
+ .with_stdout(
+ "\
+build.rustflags = [
+ \"--flag-other\", # [ROOT]/foo/.cargo/other.toml
+ \"--flag-directory\", # [ROOT]/foo/.cargo/config.toml
+ \"--flag-global\", # [ROOT]/home/.cargo/config.toml
+]
+",
+ )
+ .with_stderr("")
+ .run();
+
+ cargo_process("config get --merged=no -Zunstable-options -Zconfig-include")
+ .cwd(&sub_folder.parent().unwrap())
+ .masquerade_as_nightly_cargo(&["cargo-config", "config-include"])
+ .with_stdout(
+ "\
+# Environment variables
+# CARGO=[..]
+# CARGO_HOME=[ROOT]/home/.cargo
+
+# [ROOT]/foo/.cargo/other.toml
+build.rustflags = [\"--flag-other\"]
+
+# [ROOT]/foo/.cargo/config.toml
+build.rustflags = [\"--flag-directory\"]
+include = \"other.toml\"
+
+# [ROOT]/home/.cargo/config.toml
+alias.foo = \"abc --xyz\"
+build.jobs = 99
+build.rustflags = [\"--flag-global\"]
+extra-table.somekey = \"somevalue\"
+profile.dev.opt-level = 3
+profile.dev.package.foo.opt-level = 1
+target.\"cfg(target_os = \\\"linux\\\")\".runner = \"runme\"
+
+",
+ )
+ .with_stderr("")
+ .run();
+}