diff --git a/tests/testsuite/clean_new_layout.rs b/tests/testsuite/clean_new_layout.rs index b69ecc23497..635cb6deabf 100644 --- a/tests/testsuite/clean_new_layout.rs +++ b/tests/testsuite/clean_new_layout.rs @@ -1075,3 +1075,270 @@ fn quiet_does_not_show_summary() { .masquerade_as_nightly_cargo(&["new build-dir layout"]) .run(); } + +#[cargo_test] +fn explicit_target_dir_tag_not_present() { + // invalid target dir explicitly specified via --target-dir cli arg + + let p = project() + .file("Cargo.toml", &basic_bin_manifest("foo")) + .file("src/foo.rs", &main_file(r#""i am foo""#, &[])) + .file("bar/.keep", "") + .build(); + + p.cargo("clean --target-dir bar") + .arg("-Zbuild-dir-new-layout") + .masquerade_as_nightly_cargo(&["new build-dir layout"]) + .with_stdout_data("") + .with_stderr_data(str![[r#" +[ERROR] cannot clean `[ROOT]/foo/bar`: missing or invalid `CACHEDIR.TAG` file + | + = [NOTE] cleaning has been aborted to prevent accidental deletion of unrelated files + +"#]]) + .with_status(101) + .run(); +} + +#[cargo_test] +fn explicit_target_dir_tag_invalid_signature() { + let p = project() + .file("Cargo.toml", &basic_bin_manifest("foo")) + .file("src/foo.rs", &main_file(r#""i am foo""#, &[])) + .file("bar/CACHEDIR.TAG", "Signature: 1234") + .build(); + + p.cargo("clean --target-dir bar") + .arg("-Zbuild-dir-new-layout") + .masquerade_as_nightly_cargo(&["new build-dir layout"]) + .with_stdout_data("") + .with_stderr_data(str![[r#" +[ERROR] cannot clean `[ROOT]/foo/bar`: invalid signature in `CACHEDIR.TAG` file + | + = [NOTE] cleaning has been aborted to prevent accidental deletion of unrelated files + +"#]]) + .with_status(101) + .run(); +} + +#[cargo_test] +fn explicit_target_dir_tag_symlink() { + let p = project() + .file("Cargo.toml", &basic_bin_manifest("foo")) + .file("src/foo.rs", &main_file(r#""i am foo""#, &[])) + .file( + "src/CACHEDIR.TAG", + "Signature: 8a477f597d28d172789f06886806bc55", + ) + .symlink("src/CACHEDIR.TAG", "bar/CACHEDIR.TAG") + .build(); + + p.cargo("clean --target-dir bar") + .arg("-Zbuild-dir-new-layout") + .masquerade_as_nightly_cargo(&["new build-dir layout"]) + .with_stdout_data("") + .with_stderr_data(str![[r#" +[ERROR] cannot clean `[ROOT]/foo/bar`: expect `CACHEDIR.TAG` to be a regular file, got a symlink + | + = [NOTE] cleaning has been aborted to prevent accidental deletion of unrelated files + +"#]]) + .with_status(101) + .run(); +} + +#[cargo_test] +fn explicit_target_dir_tag_valid() { + let p = project() + .file("Cargo.toml", &basic_bin_manifest("foo")) + .file("src/foo.rs", &main_file(r#""i am foo""#, &[])) + .file( + "bar/CACHEDIR.TAG", + "Signature: 8a477f597d28d172789f06886806bc55", + ) + .build(); + + p.cargo("clean --target-dir bar") + .arg("-Zbuild-dir-new-layout") + .masquerade_as_nightly_cargo(&["new build-dir layout"]) + .run(); +} + +#[cargo_test] +fn env_target_dir_tag_not_present() { + // invalid target dir specified via env var + + let p = project() + .file("Cargo.toml", &basic_bin_manifest("foo")) + .file("bar/.keep", "") + .file("src/foo.rs", &main_file(r#""i am foo""#, &[])) + .build(); + + p.cargo("clean") + .arg("-Zbuild-dir-new-layout") + .masquerade_as_nightly_cargo(&["new build-dir layout"]) + .env("CARGO_TARGET_DIR", "bar") + .with_stderr_data(str![[r#" +[REMOVED] [FILE_NUM] files, [FILE_SIZE]B total + +"#]]) + .run(); +} + +#[cargo_test] +fn env_target_dir_tag_invalid_signature() { + let p = project() + .file("Cargo.toml", &basic_bin_manifest("foo")) + .file("src/foo.rs", &main_file(r#""i am foo""#, &[])) + .file("bar/CACHEDIR.TAG", "Signature: 1234") + .build(); + + p.cargo("clean") + .arg("-Zbuild-dir-new-layout") + .masquerade_as_nightly_cargo(&["new build-dir layout"]) + .env("CARGO_TARGET_DIR", "bar") + .with_stderr_data(str![[r#" +[REMOVED] [FILE_NUM] files, [FILE_SIZE]B total + +"#]]) + .run(); +} + +#[cargo_test] +fn env_target_dir_tag_symlink() { + let p = project() + .file("Cargo.toml", &basic_bin_manifest("foo")) + .file("src/foo.rs", &main_file(r#""i am foo""#, &[])) + .file( + "src/CACHEDIR.TAG", + "Signature: 8a477f597d28d172789f06886806bc55", + ) + .symlink("src/CACHEDIR.TAG", "bar/CACHEDIR.TAG") + .build(); + + p.cargo("clean") + .arg("-Zbuild-dir-new-layout") + .masquerade_as_nightly_cargo(&["new build-dir layout"]) + .env("CARGO_TARGET_DIR", "bar") + .with_stderr_data(str![[r#" +[REMOVED] [FILE_NUM] files, [FILE_SIZE]B total + +"#]]) + .run(); +} + +#[cargo_test] +fn env_target_dir_tag_valid() { + let p = project() + .file("Cargo.toml", &basic_bin_manifest("foo")) + .file("src/foo.rs", &main_file(r#""i am foo""#, &[])) + .file( + "bar/CACHEDIR.TAG", + "Signature: 8a477f597d28d172789f06886806bc55", + ) + .build(); + + p.cargo("clean") + .arg("-Zbuild-dir-new-layout") + .masquerade_as_nightly_cargo(&["new build-dir layout"]) + .env("CARGO_TARGET_DIR", "bar") + .run(); +} + +#[cargo_test] +fn config_target_dir_tag_not_present() { + // invalid target dir specified via build config + + let p = project() + .file("Cargo.toml", &basic_bin_manifest("foo")) + .file("bar/.keep", "") + .file("src/foo.rs", "") + .file( + ".cargo/config.toml", + "[build] + target-dir = 'bar'", + ) + .build(); + + p.cargo("clean") + .arg("-Zbuild-dir-new-layout") + .masquerade_as_nightly_cargo(&["new build-dir layout"]) + .with_stderr_data(str![[r#" +[REMOVED] [FILE_NUM] files, [FILE_SIZE]B total + +"#]]) + .run(); +} + +#[cargo_test] +fn config_target_dir_tag_invalid_signature() { + let p = project() + .file("Cargo.toml", &basic_bin_manifest("foo")) + .file("src/foo.rs", &main_file(r#""i am foo""#, &[])) + .file("bar/CACHEDIR.TAG", "Signature: 1234") + .file( + ".cargo/config.toml", + "[build] + target-dir = 'bar'", + ) + .build(); + + p.cargo("clean") + .arg("-Zbuild-dir-new-layout") + .masquerade_as_nightly_cargo(&["new build-dir layout"]) + .with_stderr_data(str![[r#" +[REMOVED] [FILE_NUM] files, [FILE_SIZE]B total + +"#]]) + .run(); +} + +#[cargo_test] +fn config_target_dir_tag_symlink() { + let p = project() + .file("Cargo.toml", &basic_bin_manifest("foo")) + .file("src/foo.rs", &main_file(r#""i am foo""#, &[])) + .file( + "src/CACHEDIR.TAG", + "Signature: 8a477f597d28d172789f06886806bc55", + ) + .symlink("src/CACHEDIR.TAG", "bar/CACHEDIR.TAG") + .file( + ".cargo/config.toml", + "[build] + target-dir = 'bar'", + ) + .build(); + + p.cargo("clean") + .arg("-Zbuild-dir-new-layout") + .masquerade_as_nightly_cargo(&["new build-dir layout"]) + .with_stderr_data(str![[r#" +[REMOVED] [FILE_NUM] files, [FILE_SIZE]B total + +"#]]) + .run(); +} + +#[cargo_test] +fn config_target_dir_tag_valid() { + let p = project() + .file("Cargo.toml", &basic_bin_manifest("foo")) + .file("src/foo.rs", &main_file(r#""i am foo""#, &[])) + .file( + "bar/CACHEDIR.TAG", + "Signature: 8a477f597d28d172789f06886806bc55", + ) + .file( + ".cargo/config.toml", + "[build] + target-dir = 'bar'", + ) + .build(); + + p.cargo("clean") + .arg("-Zbuild-dir-new-layout") + .masquerade_as_nightly_cargo(&["new build-dir layout"]) + .run(); +}