#!/bin/bash [ -f testing.sh ] && . testing.sh # Create test file dd if=/dev/urandom of=random bs=64 count=1 2> /dev/null #testing "name" "command" "result" "infile" "stdin" testing "not enough arguments [fail]" "cp one 2>/dev/null || echo yes" \ "yes\n" "" "" testing "-missing source [fail]" "cp missing two 2>/dev/null || echo yes" \ "yes\n" "" "" testing "file->file" "cp random two && cmp random two && echo yes" \ "yes\n" "" "" rm two mkdir two testing "file->dir" "cp random two && cmp random two/random && echo yes" \ "yes\n" "" "" rm two/random testing "file->dir/file" \ "cp random two/random && cmp random two/random && echo yes" \ "yes\n" "" "" testing "-r dir->missing" \ "cp -r two three && cmp random three/random && echo yes" \ "yes\n" "" "" touch walrus testing "-r dir->file [fail]" \ "cp -r two walrus 2>/dev/null || echo yes" "yes\n" "" "" touch two/three testing "-r dir hits file." \ "cp -r three two 2>/dev/null || echo yes" "yes\n" "" "" rm -rf two three walrus touch two chmod 000 two testing "file->inaccessable [fail]" \ "cp random two 2>/dev/null || echo yes" "yes\n" "" "" rm -f two touch two chmod 000 two testing "-f file->inaccessable" \ "cp -f random two && cmp random two && echo yes" "yes\n" "" "" mkdir sub chmod 000 sub testing "file->inaccessable_dir [fail]" \ "cp random sub 2>/dev/null || echo yes" "yes\n" "" "" rm two rmdir sub # This test fails because our -rf deletes existing target files without # regard to what we'd be copying over it. Posix says to only do that if # we'd be copying a file over the file, but does not say _why_. #mkdir dir #touch file #testing "-rf dir file [fail]" "cp -rf dir file 2>/dev/null || echo yes" \ # "yes\n" "" "" #rm -rf dir file touch one two testing "file1 file2 missing [fail]" \ "cp one two missing 2>/dev/null || echo yes" "yes\n" "" "" mkdir dir testing "dir file missing [fail]" \ "cp dir two missing 2>/dev/null || echo yes" "yes\n" "" "" testing "-rf dir file missing [fail]" \ "cp dir two missing 2>/dev/null || echo yes" "yes\n" "" "" testing "file1 file2 file [fail]" \ "cp random one two 2>/dev/null || echo yes" "yes\n" "" "" testing "file1 file2 dir" \ "cp random one dir && cmp random dir/random && cmp one dir/one && echo yes" \ "yes\n" "" "" rm one two random rm -rf dir mkdir -p one/two/three/four touch one/two/three/five touch one/{six,seven,eight} testing "-r /abspath dest" \ "cp -r \"$(readlink -f one)\" dir && diff -r one dir && echo yes" \ "yes\n" "" "" testing "-r dir again" "cp -r one/. dir && diff -r one dir && echo yes" \ "yes\n" "" "" mkdir dir2 testing "-r dir1/* dir2" \ "cp -r one/* dir2 && diff -r one dir2 && echo yes" "yes\n" "" "" rm -rf one dir dir2 touch walrus chmod 644 walrus ln -s walrus woot testing "symlink dest permissions" "cp woot carpenter && stat -c %A carpenter" \ "-rw-r--r--\n" "" "" # cp -r ../source destdir # cp -r one/two/three missing # cp -r one/two/three two # mkdir one; touch one/two; ln -s two one/three # cp file1 file2 dir # cp file1 missing file2 -> dir # Make sure it's truncating existing file # copy with -d at top level, with -d in directory, without -d at top level, # without -d in directory