aboutsummaryrefslogtreecommitdiff
path: root/tests/test/script/builtin/cp.testscript
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test/script/builtin/cp.testscript')
-rw-r--r--tests/test/script/builtin/cp.testscript376
1 files changed, 376 insertions, 0 deletions
diff --git a/tests/test/script/builtin/cp.testscript b/tests/test/script/builtin/cp.testscript
new file mode 100644
index 0000000..e1b654f
--- /dev/null
+++ b/tests/test/script/builtin/cp.testscript
@@ -0,0 +1,376 @@
+# file : tests/test/script/builtin/cp.testscript
+# copyright : Copyright (c) 2014-2018 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+.include ../common.testscript
+
+: args
+:
+{
+ : none
+ :
+ $c <'cp 2>"cp: missing arguments" == 1' && $b
+
+ : no-source
+ :
+ $c <'cp -R a 2>"cp: missing source path" == 1' && $b
+
+ : no-trailing-sep
+ :
+ $c <<EOI && $b
+ cp a b c 2>"cp: multiple source paths without trailing separator for destination directory" == 1
+ EOI
+
+ : empty
+ :
+ {
+ : dest
+ :
+ $c <<EOI && $b
+ cp '' 2>"cp: invalid path ''" == 1
+ EOI
+
+ : src1
+ :
+ $c <<EOI && $b
+ cp '' a 2>"cp: invalid path ''" == 1
+ EOI
+
+ : src2
+ :
+ $c <<EOI && $b
+ cp '' a b/ 2>"cp: invalid path ''" == 1
+ EOI
+ }
+}
+
+: file
+:
+: Test synopsis 1: make a file copy at the specified path.
+:
+{
+ : existing
+ :
+ {
+ : to-non-existing
+ :
+ $c <<EOI && $b
+ touch a;
+ cp a b && test -f b
+ EOI
+
+ : to-existing
+ :
+ $c <<EOI && $b
+ touch a b;
+ cp a b
+ EOI
+
+ : to-dir
+ :
+ $c <<EOI && $b
+ touch a;
+ mkdir b;
+ cp a b 2>>/~%EOE% != 0
+ %cp: unable to copy file '.+/a' to '.+/b': .+%
+ EOE
+ EOI
+ }
+
+ : non-existing
+ :
+ {
+ $c <<EOI && $b
+ cp a b 2>>/~%EOE% != 0
+ %cp: unable to copy file '.+/a' to '.+/b': .+%
+ EOE
+ EOI
+ }
+
+ : non-file
+ :
+ {
+ $c <<EOI && $b
+ mkdir a;
+ cp a b 2>>/~%EOE% != 0
+ %cp: unable to copy file '.+/a' to '.+/b': .+%
+ EOE
+ EOI
+ }
+
+ : cleanup
+ :
+ {
+ : existing
+ :
+ : Test that copy over an existing file does not register cleanup. If it
+ : does then the file would be removed while leaving the embedded scope,
+ : and so the cleanup registered by the outer touch would fail.
+ :
+ $c <<EOI && $b
+ +touch b
+ {
+ touch a;
+ cp a ../b
+ }
+ EOI
+ }
+}
+
+: dir
+:
+: Test synopsis 2: make a directory copy at the specified path.
+:
+{
+ : existing
+ :
+ {
+ : to-non-existing
+ :
+ $c <<EOI && $b
+ mkdir a;
+ cp -r a b && test -d b
+ EOI
+
+ : to-existing
+ :
+ $c <<EOI && $b
+ mkdir a b;
+ cp -R a b 2>>/~%EOE% != 0
+ %cp: unable to copy directory '.+/a' to '.+/b': .+%
+ EOE
+ EOI
+
+ : to-file
+ :
+ $c <<EOI && $b
+ mkdir a;
+ touch b;
+ cp -r a b 2>>/~%EOE% != 0
+ %cp: unable to copy directory '.+/a' to '.+/b': .+%
+ EOE
+ EOI
+
+ : recursively
+ :
+ {
+ $c <<EOI && $b
+ mkdir -p a/b/c;
+ touch a/x a/b/y;
+ cp -r a d && test -d d/b/c && test -f d/x && test -f d/b/y
+ EOI
+ }
+ }
+
+ : non-existing
+ :
+ {
+ $c <<EOI && $b
+ cp -r a b 2>>/~%EOE% != 0
+ %cp: unable to copy directory '.+/a' to '.+/b': .+%
+ EOE
+ EOI
+ }
+
+ : non-dir
+ :
+ {
+ $c <<EOI && $b
+ touch a;
+ cp -r a b 2>>/~%EOE% != 0
+ %cp: unable to copy directory '.+/a' to '.+/b': .+%
+ EOE
+ EOI
+ }
+}
+
+: files
+:
+: Test synopsis 3: copy files into the specified directory.
+:
+{
+ : existing
+ :
+ {
+ : into-dir
+ :
+ {
+ : over-non-existing
+ :
+ $c <<EOI && $b
+ mkdir b;
+ touch a;
+ cp a b/ && test -f b/a
+ EOI
+
+ : over-dir
+ :
+ $c <<EOI && $b
+ mkdir -p b/a;
+ touch a;
+ cp a b/ 2>>/~%EOE% != 0
+ %cp: unable to copy file '.+/a' to '.+/b/a': .+%
+ EOE
+ EOI
+
+ : multiple
+ :
+ $c <<EOI && $b
+ touch a b;
+ mkdir c;
+ cp a b c/ && test -f c/a && test -f c/b
+ EOI
+ }
+
+ : into-non-existing-dir
+ :
+ {
+ $c <<EOI && $b
+ touch a;
+ cp a b/ 2>>/~%EOE% != 0
+ %cp: unable to copy file '.+/a' to '.+/b/a': .+%
+ EOE
+ EOI
+ }
+
+ : into-non-dir
+ :
+ {
+ $c <<EOI && $b
+ touch a b;
+ cp a b/ 2>>/~%EOE% != 0
+ %cp: unable to copy file '.+/a' to '.+/b/a': .+%
+ EOE
+ EOI
+ }
+ }
+
+ : non-existing
+ :
+ {
+ $c <<EOI && $b
+ mkdir b;
+ cp a b/ 2>>/~%EOE% != 0
+ %cp: unable to copy file '.+/a' to '.+/b/a': .+%
+ EOE
+ EOI
+ }
+
+ : non-file
+ :
+ {
+ $c <<EOI && $b
+ mkdir a b;
+ cp a b/ 2>>/~%EOE% != 0
+ %cp: unable to copy file '.+/a' to '.+/b/a': .+%
+ EOE
+ EOI
+ }
+}
+
+: filesystem-entries
+:
+: Test synopsis 4: copy filesystem entries into the specified directory.
+:
+{
+ : file
+ :
+ {
+ $c <<EOI && $b
+ mkdir b;
+ touch a;
+ cp -R a b/ && test -f b/a
+ EOI
+ }
+
+ : dir
+ :
+ {
+ : over-non-existing
+ :
+ $c <<EOI && $b
+ mkdir a b;
+ touch a/c;
+ cp -R a b/ && test -f b/a/c
+ EOI
+
+ : over-existing
+ :
+ $c <<EOI && $b
+ mkdir -p a b/a;
+ cp -R a b/ 2>>/~%EOE% != 0
+ %cp: unable to copy directory '.+/a' to '.+/b/a': .+%
+ EOE
+ EOI
+ }
+}
+
+: 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
+ :
+ {
+ $c <<"EOI" && $b
+ ls -l $src_base/cp-dir | sed -n -e '$fs' | \
+ set t;
+
+ cp -p $src_base/cp-dir/cp-file ./;
+ ls -l | sed -n -e '$fs' >"\$t"
+ EOI
+ }
+
+ : dir
+ :
+ {
+ $c <<"EOI" && $b
+ ls -l $src_base | sed -n -e '$ds' | \
+ set t;
+
+ cp -p -r $src_base/cp-dir ./;
+ ls -l | sed -n -e '$ds' >"\$t"
+ EOI
+ }
+ }
+
+ : no-copy
+ :
+ {
+ : file
+ :
+ {
+ $c <<"EOI" && $b 2>>~%EOE% != 0
+ ls -l $src_base/cp-dir | sed -n -e '$fs' | \
+ set t;
+
+ cp $src_base/cp-dir/cp-file ./;
+ ls -l | sed -n -e '$fs' >"\$t"
+ EOI
+ %.+ error: sed stdout doesn't match expected%
+ %.+
+ EOE
+ }
+
+ : dir
+ :
+ {
+ $c <<"EOI" && $b 2>>~%EOE% != 0
+ ls -l $src_base | sed -n -e '$ds' | \
+ set t;
+
+ cp -r $src_base/cp-dir ./;
+ ls -l | sed -n -e '$ds' >"\$t"
+ EOI
+ %.+ error: sed stdout doesn't match expected%
+ %.+
+ EOE
+ }
+ }
+}