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