# ============================================================================ # 硬链接基础工具测试(src/lib/link.sh) # ============================================================================ setup() { TEST_DIR="$(mktemp -d)" DRY_RUN=false } teardown() { rm -rf "$TEST_DIR" } # get_file_inode:GNU stat 与兜底路径均可用 test_get_file_inode_works() { local f="$TEST_DIR/a.txt" echo hi >"$f" local inode inode="$(get_file_inode "$f")" assert_not_empty "$inode" assert_eq "$(stat -c '%i' "$f")" "$inode" "inode 应与 stat 一致" } # same_inode:硬链接同 inode,普通文件不同 test_same_inode_detection() { local f1="$TEST_DIR/a.txt" f2="$TEST_DIR/b.txt" echo hi >"$f1" ln "$f1" "$f2" assert_success same_inode "$f1" "$f2" echo other >"$TEST_DIR/c.txt" assert_failure same_inode "$f1" "$TEST_DIR/c.txt" assert_failure same_inode "$f1" "$TEST_DIR/不存在.txt" } # hardlink_or_dryrun:真实创建硬链接 test_hardlink_or_dryrun_creates_link() { local f1="$TEST_DIR/a.txt" f2="$TEST_DIR/link.txt" echo data >"$f1" assert_success hardlink_or_dryrun "$f1" "$f2" assert_file_exists "$f2" assert_success same_inode "$f1" "$f2" } # hardlink_or_dryrun:干运行不创建 test_hardlink_or_dryrun_dry_run() { local f1="$TEST_DIR/a.txt" f2="$TEST_DIR/link.txt" echo data >"$f1" DRY_RUN=true assert_success hardlink_or_dryrun "$f1" "$f2" assert_file_absent "$f2" } # hardlink_or_dryrun:目标已存在时替换 test_hardlink_or_dryrun_replaces_existing() { local f1="$TEST_DIR/a.txt" f2="$TEST_DIR/exists.txt" echo new >"$f1" echo old >"$f2" assert_success hardlink_or_dryrun "$f1" "$f2" assert_success same_inode "$f1" "$f2" assert_eq "new" "$(cat "$f2")" }