aboutsummaryrefslogtreecommitdiff
path: root/tests/builtin/cp.testscript
diff options
context:
space:
mode:
Diffstat (limited to 'tests/builtin/cp.testscript')
-rw-r--r--tests/builtin/cp.testscript447
1 files changed, 447 insertions, 0 deletions
diff --git a/tests/builtin/cp.testscript b/tests/builtin/cp.testscript
new file mode 100644
index 0000000..4f83586
--- /dev/null
+++ b/tests/builtin/cp.testscript
@@ -0,0 +1,447 @@
+# file : tests/builtin/cp.testscript
+# copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+test.arguments = "cp"
+test.options += -c
+
+: unknown-option
+:
+$* -u >'option -u' 2>"cp: unknown option '-u'" == 1
+
+: args
+:
+{
+ : none
+ :
+ $* 2>"cp: missing arguments" == 1
+
+ : no-source
+ :
+ $* -R a 2>"cp: missing source path" == 1
+
+ : no-trailing-sep
+ :
+ $* a b c 2>"cp: multiple source paths without trailing separator for destination directory" == 1
+
+ : empty
+ :
+ {
+ : dest
+ :
+ $* '' 2>"cp: invalid path ''" == 1
+
+ : src1
+ :
+ $* '' a 2>"cp: invalid path ''" == 1
+
+ : src2
+ :
+ $* '' a b/ 2>"cp: invalid path ''" == 1
+ }
+}
+
+: file
+:
+: Test synopsis 1: make a file copy at the specified path.
+:
+{
+ : existing
+ :
+ {
+ : to-non-existing
+ :
+ {
+ touch a;
+
+ $* a b >>/~%EOO% &b;
+ %create .+/b true%
+ %create .+/b false%
+ EOO
+
+ test -f b
+ }
+
+ : to-existing
+ :
+ {
+ touch a b;
+
+ $* a b >>/~%EOO%
+ %create .+/b true%
+ %create .+/b false%
+ EOO
+ }
+
+ : to-dir
+ :
+ {
+ touch a;
+ mkdir b;
+
+ $* a b >>/~%EOO% 2>>/~%EOE% != 0
+ %create .+/b true%
+ EOO
+ %cp: unable to copy file '.+/a' to '.+/b': .+%
+ EOE
+ }
+ }
+
+ : non-existing
+ :
+ {
+ $* a b >>/~%EOO% 2>>/~%EOE% != 0
+ %create .+/b true%
+ EOO
+ %cp: unable to copy file '.+/a' to '.+/b': .+%
+ EOE
+ }
+
+ : non-file
+ :
+ {
+ mkdir a;
+
+ $* a b >>/~%EOO% 2>>/~%EOE% != 0
+ %create .+/b true%
+ EOO
+ %cp: unable to copy file '.+/a' to '.+/b': .+%
+ EOE
+ }
+}
+
+: dir
+:
+: Test synopsis 2: make a directory copy at the specified path.
+:
+{
+ : existing
+ :
+ {
+ : to-non-existing
+ :
+ {
+ mkdir a;
+
+ $* -r a b >>/~%EOO% &b/;
+ %create .+/b/ true%
+ %create .+/b/ false%
+ EOO
+
+ test -d b
+ }
+
+ : to-existing
+ :
+ {
+ mkdir a b;
+
+ $* -R a b >>/~%EOO% 2>>/~%EOE% != 0
+ %create .+/b/ true%
+ EOO
+ %cp: unable to copy directory '.+/a' to '.+/b': .+%
+ EOE
+ }
+
+ : to-file
+ :
+ {
+ mkdir a;
+ touch b;
+
+ $* -r a b >>/~%EOO% 2>>/~%EOE% != 0
+ %create .+/b/ true%
+ EOO
+ %cp: unable to copy directory '.+/a' to '.+/b': .+%
+ EOE
+ }
+
+ : recursively
+ :
+ {
+ mkdir -p a/b/c;
+ touch a/x a/b/y;
+
+ $* -r a d >>/~%EOO% &d/ &d/x &d/b/ &d/b/y &d/b/c/;
+ %create .+/d/ true%
+ %create .+/d/ false%
+ %(
+ %create .+/d/.+ true%
+ %create .+/d/.+ false%
+ %){4}
+ EOO
+
+ test -d d/b/c && test -f d/x && test -f d/b/y
+ }
+ }
+
+ : non-existing
+ :
+ {
+ $* -r a b >>/~%EOO% 2>>/~%EOE% &b/ != 0
+ %create .+/b/ true%
+ %create .+/b/ false%
+ EOO
+ %cp: unable to copy directory '.+/a' to '.+/b': .+%
+ EOE
+ }
+
+ : non-dir
+ :
+ {
+ touch a;
+
+ $* -r a b >>/~%EOO% 2>>/~%EOE% &b/ != 0
+ %create .+/b/ true%
+ %create .+/b/ false%
+ EOO
+ %cp: unable to copy directory '.+/a' to '.+/b': .+%
+ EOE
+ }
+}
+
+: files
+:
+: Test synopsis 3: copy files into the specified directory.
+:
+{
+ : existing
+ :
+ {
+ : into-dir
+ :
+ {
+ : over-non-existing
+ :
+ {
+ mkdir b;
+ touch a;
+
+ $* a b/ >>/~%EOO% &b/a;
+ %create .+/b/a true%
+ %create .+/b/a false%
+ EOO
+
+ test -f b/a
+ }
+
+ : over-dir
+ :
+ {
+ mkdir -p b/a;
+ touch a;
+
+ $* a b/ >>/~%EOO% 2>>/~%EOE% != 0
+ %create .+/b/a true%
+ EOO
+ %cp: unable to copy file '.+/a' to '.+/b/a': .+%
+ EOE
+ }
+
+ : multiple
+ :
+ {
+ touch a b;
+ mkdir c;
+
+ $* a b c/ >>/~%EOO% &c/a &c/b &c/;
+ %create .+/c/a true%
+ %create .+/c/a false%
+ %create .+/c/b true%
+ %create .+/c/b false%
+ EOO
+
+ test -f c/a && test -f c/b
+ }
+ }
+
+ : into-non-existing-dir
+ :
+ {
+ touch a;
+
+ $* a b/ >>/~%EOO% 2>>/~%EOE% != 0
+ %create .+/b/a true%
+ EOO
+ %cp: unable to copy file '.+/a' to '.+/b/a': .+%
+ EOE
+ }
+
+ : into-non-dir
+ :
+ {
+ touch a b;
+
+ $* a b/ >>/~%EOO% 2>>/~%EOE% != 0
+ %create .+/b/a true%
+ EOO
+ %cp: unable to copy file '.+/a' to '.+/b/a': .+%
+ EOE
+ }
+ }
+
+ : non-existing
+ :
+ {
+ mkdir b;
+
+ $* a b/ >>/~%EOO% 2>>/~%EOE% != 0
+ %create .+/b/a true%
+ EOO
+ %cp: unable to copy file '.+/a' to '.+/b/a': .+%
+ EOE
+ }
+
+ : non-file
+ :
+ {
+ mkdir a b;
+
+ $* a b/ >>/~%EOO% 2>>/~%EOE% != 0
+ %create .+/b/a true%
+ EOO
+ %cp: unable to copy file '.+/a' to '.+/b/a': .+%
+ EOE
+ }
+}
+
+: filesystem-entries
+:
+: Test synopsis 4: copy filesystem entries into the specified directory.
+:
+{
+ : file
+ :
+ {
+ mkdir b;
+ touch a;
+
+ $* -R a b/ >>/~%EOO% &b/a;
+ %create .+/b/a true%
+ %create .+/b/a false%
+ EOO
+
+ test -f b/a
+ }
+
+ : dir
+ :
+ {
+ : over-non-existing
+ :
+ {
+ mkdir a b;
+ touch a/c;
+
+ $* -R a b/ >>/~%EOO% &b/a/ &b/a/c;
+ %create .+/b/a/ true%
+ %create .+/b/a/ false%
+ %create .+/b/a/c true%
+ %create .+/b/a/c false%
+ EOO
+
+ test -f b/a/c
+ }
+
+ : over-existing
+ :
+ {
+ mkdir -p a b/a;
+
+ $* -R a b/ >>/~%EOO% 2>>/~%EOE% != 0
+ %create .+/b/a/ true%
+ EOO
+ %cp: unable to copy directory '.+/a' to '.+/b/a': .+%
+ EOE
+ }
+ }
+}
+
+: attrs
+:
+if ($cxx.target.class != 'windows')
+{
+ fs = 's/.+ (\S+\s+\S+\s+\S+)\s+cp-file/\1/p'
+ ds = 's/.+ (\S+\s+\S+\s+\S+)\s+cp-dir/\1/p'
+
+ : copy
+ :
+ {
+ : file
+ :
+ {
+ ls -l $src_base/cp-dir | sed -n -e "$fs" | set t;
+
+ $* -p $src_base/cp-dir/cp-file ./ >! &cp-file;
+
+ ls -l | sed -n -e "$fs" >"$t"
+ }
+
+ : dir
+ :
+ {
+ ls -l $src_base | sed -n -e "$ds" | set t;
+
+ $* -pr $src_base/cp-dir ./ >! &cp-dir/ &cp-dir/cp-file;
+
+ ls -l | sed -n -e "$ds" >"$t"
+ }
+ }
+
+ : no-copy
+ :
+ : Note that the `ls -l` command by default displays the filesystem entry
+ : modification time with the minute resolution and building from git
+ : repository may not preserve the filesystem entry original modification
+ : times. That is why we also pass --full-time and enable the test for only
+ : platforms where ls supports this option.
+ :
+ if ($cxx.target.class == 'linux')
+ {
+ : file
+ :
+ {
+ ls -l --full-time $src_base/cp-dir | sed -n -e "$fs" | set t;
+
+ $* $src_base/cp-dir/cp-file ./ >! &cp-file;
+
+ ls -l --full-time | sed -n -e "$fs" | set tn;
+
+ if ("$tn" == "$t")
+ exit "unexpectedly copied timestamp \($t\)"
+ end
+ }
+
+ : dir
+ :
+ {
+ ls -l --full-time $src_base | sed -n -e "$ds" | set t;
+
+ $* -r $src_base/cp-dir ./ >! &cp-dir/ &cp-dir/cp-file;
+
+ ls -l --full-time | sed -n -e "$ds" | set tn;
+
+ if ("$tn" == "$t")
+ exit "unexpectedly copied timestamp \($t\)"
+ end
+ }
+ }
+}
+
+: cwd
+:
+: When cross-testing we cannot guarantee that host absolute paths are
+: recognized by the target process.
+:
+if ($test.target == $build.host)
+{
+ test.options += -d $~/a;
+ mkdir -p a/b;
+
+ $* -R b c >>/~%EOO% &a/c/;
+ %create .+/a/c/ true%
+ %create .+/a/c/ false%
+ EOO
+
+ test -d a/c
+}