summaryrefslogtreecommitdiff
path: root/tests/cp
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2011-07-27 09:32:39 +0100
committerPádraig Brady <P@draigBrady.com>2011-07-27 09:36:59 +0100
commit2aea1828a1aab158f68cccf3eac408203889021e (patch)
treed1cf98679bb66e747d3b2ed64a7cb7ea3f419e75 /tests/cp
parentb2bb19b4b32506debf65f03c8e44b66374550597 (diff)
downloadcoreutils-2aea1828a1aab158f68cccf3eac408203889021e.tar.xz
tests: cp/preserve-link: test all relevant paths
* tests/cp/preserve-link: Add test cases for when a missing link in the destination tree is encountered first and second. Also add cases for old and new separate files in the destination tree, both to make the clobbering behavior explicit, and to test any changes in this area in future.
Diffstat (limited to 'tests/cp')
-rwxr-xr-xtests/cp/preserve-link68
1 files changed, 60 insertions, 8 deletions
diff --git a/tests/cp/preserve-link b/tests/cp/preserve-link
index d0da87356..e3c31f9e4 100755
--- a/tests/cp/preserve-link
+++ b/tests/cp/preserve-link
@@ -26,15 +26,67 @@ same_inode()
v=$(stat --format %i "$2") && test "$u" = "$v"
}
-mkdir -p s t/s || framework_failure_
-touch s/f t/s/f || framework_failure_
-ln s/f s/link || framework_failure_
+create_source_tree()
+{
+ rm -Rf s
+ mkdir s || framework_failure_
+
+ # a missing link in dest will be created
+ touch s/f || framework_failure_
+ ln s/f s/linkm || framework_failure_
+
+ # an existing link in dest will be maintained
+ ln s/f s/linke || framework_failure_
+
+ # a separate older file in dest will be overwritten
+ ln s/f s/fileo || framework_failure_
+
+ # a separate newer file in dest will be overwritten!
+ ln s/f s/fileu || framework_failure_
+}
+
+create_target_tree()
+{
+ f=$1 # which of f or linkm to create in t/
+
+ rm -Rf t
+ mkdir -p t/s/ || framework_failure_
+
+ # a missing link in dest must be created
+ touch t/s/$f || framework_failure_
+
+ # an existing link must be maintained
+ ln t/s/$f t/s/linke || framework_failure_
+
+ # a separate older file in dest will be overwritten
+ touch -d '-1 hour' t/s/fileo || framework_failure_
+
+ # a separate newer file in dest will be overwritten!
+ touch -d '+1 hour' t/s/fileu || framework_failure_
+}
+
+
+# Note we repeat this, creating either one of
+# two hard linked files from source in the dest, so as to
+# test both paths in `cp` for creating the hard links.
+# The path taken by cp is dependent on which cp encounters
+# first in the source, which is non deterministic currently
+# (I'm guessing that results are sorted by inode and
+# beauses they're the same here, and due to the sort
+# being unstable, either can be processed first).
+create_source_tree
+
+for f in f linkm; do
+ create_target_tree $f
-# This must create a hard link, t/s/link, to the existing file, t/s/f.
-# With cp from coreutils-8.12 and prior, it would mistakenly copy
-# the file rather than creating the link.
-cp -au s t || fail=1
+ # Copy all the hard links across. With cp from coreutils-8.12
+ # and prior, it would sometimes mistakenly copy rather than link.
+ cp -au s t || fail=1
-same_inode t/s/f t/s/link || fail=1
+ same_inode t/s/f t/s/linkm || fail=1
+ same_inode t/s/f t/s/linke || fail=1
+ same_inode t/s/f t/s/fileo || fail=1
+ same_inode t/s/f t/s/fileu || fail=1
+done
Exit $fail