diff options
Diffstat (limited to 'tests/builtin/cp.testscript')
-rw-r--r-- | tests/builtin/cp.testscript | 447 |
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 +} |