From 35d2a30a5c47fce732bfb79601d502f86d885cf8 Mon Sep 17 00:00:00 2001 From: Raghavender Singh Date: Fri, 30 May 2025 00:25:18 +0530 Subject: [PATCH] test: Add test demonstrating cargo add replaces symlinks This test shows the current behavior where cargo add replaces symlinked Cargo.toml files with regular files. The test passes, documenting this problematic behavior. --- tests/testsuite/cargo_add/mod.rs | 1 + tests/testsuite/cargo_add/symlink.rs | 52 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 tests/testsuite/cargo_add/symlink.rs diff --git a/tests/testsuite/cargo_add/mod.rs b/tests/testsuite/cargo_add/mod.rs index a2881cfbc..5dea186f2 100644 --- a/tests/testsuite/cargo_add/mod.rs +++ b/tests/testsuite/cargo_add/mod.rs @@ -145,6 +145,7 @@ mod script_bare; mod script_frontmatter; mod script_shebang; mod sorted_table_with_dotted_item; +mod symlink; mod target; mod target_cfg; mod unknown_inherited_feature; diff --git a/tests/testsuite/cargo_add/symlink.rs b/tests/testsuite/cargo_add/symlink.rs new file mode 100644 index 000000000..9f9c578d6 --- /dev/null +++ b/tests/testsuite/cargo_add/symlink.rs @@ -0,0 +1,52 @@ +use cargo_test_support::prelude::*; +use cargo_test_support::project; +use cargo_test_support::registry; +use std::fs; + +#[cargo_test] +fn symlink_case() { + if !cargo_test_support::symlink_supported() { + return; + } + + registry::init(); + registry::Package::new("test-dep", "1.0.0").publish(); + + let project = project().file("src/lib.rs", "").build(); + + let target_dir = project.root().join("target_dir"); + fs::create_dir_all(&target_dir).unwrap(); + + fs::copy( + project.root().join("Cargo.toml"), + target_dir.join("Cargo.toml"), + ) + .unwrap(); + + fs::remove_file(project.root().join("Cargo.toml")).unwrap(); + + #[cfg(unix)] + { + use std::os::unix::fs::symlink; + symlink( + target_dir.join("Cargo.toml"), + project.root().join("Cargo.toml"), + ) + .unwrap(); + } + + #[cfg(windows)] + { + use std::os::windows::fs::symlink_file; + symlink_file( + target_dir.join("Cargo.toml"), + project.root().join("Cargo.toml"), + ) + .unwrap(); + } + + project.cargo("add test-dep").run(); + + // Current behavior: symlink is NOT preserved (gets replaced) + assert!(!project.root().join("Cargo.toml").is_symlink()); +} \ No newline at end of file