1*cf5a6c84SAndroid Build Coastguard Worker#!/bin/bash 2*cf5a6c84SAndroid Build Coastguard Worker 3*cf5a6c84SAndroid Build Coastguard Worker[ -f testing.sh ] && . testing.sh 4*cf5a6c84SAndroid Build Coastguard Worker 5*cf5a6c84SAndroid Build Coastguard WorkerOLDUMASK=$(umask) 6*cf5a6c84SAndroid Build Coastguard Workerumask 0002 7*cf5a6c84SAndroid Build Coastguard Worker 8*cf5a6c84SAndroid Build Coastguard Worker# Create test file 9*cf5a6c84SAndroid Build Coastguard Workerdd if=/dev/urandom of=random bs=64 count=1 2> /dev/null 10*cf5a6c84SAndroid Build Coastguard Worker 11*cf5a6c84SAndroid Build Coastguard Worker#testing "name" "command" "result" "infile" "stdin" 12*cf5a6c84SAndroid Build Coastguard Worker 13*cf5a6c84SAndroid Build Coastguard Workertesting "not enough arguments [fail]" "cp one 2>/dev/null || echo yes" \ 14*cf5a6c84SAndroid Build Coastguard Worker "yes\n" "" "" 15*cf5a6c84SAndroid Build Coastguard Workertesting "-missing source [fail]" "cp missing two 2>/dev/null || echo yes" \ 16*cf5a6c84SAndroid Build Coastguard Worker "yes\n" "" "" 17*cf5a6c84SAndroid Build Coastguard Workertesting "file->file" "cp random two && cmp random two && echo yes" \ 18*cf5a6c84SAndroid Build Coastguard Worker "yes\n" "" "" 19*cf5a6c84SAndroid Build Coastguard Workerrm two 20*cf5a6c84SAndroid Build Coastguard Worker 21*cf5a6c84SAndroid Build Coastguard Workermkdir two 22*cf5a6c84SAndroid Build Coastguard Workertesting "file->dir" "cp random two && cmp random two/random && echo yes" \ 23*cf5a6c84SAndroid Build Coastguard Worker "yes\n" "" "" 24*cf5a6c84SAndroid Build Coastguard Workerrm two/random 25*cf5a6c84SAndroid Build Coastguard Workertesting "file->dir/file" \ 26*cf5a6c84SAndroid Build Coastguard Worker "cp random two/random && cmp random two/random && echo yes" \ 27*cf5a6c84SAndroid Build Coastguard Worker "yes\n" "" "" 28*cf5a6c84SAndroid Build Coastguard Workertesting "-r dir->missing" \ 29*cf5a6c84SAndroid Build Coastguard Worker "cp -r two three && cmp random three/random && echo yes" \ 30*cf5a6c84SAndroid Build Coastguard Worker "yes\n" "" "" 31*cf5a6c84SAndroid Build Coastguard Workertouch walrus 32*cf5a6c84SAndroid Build Coastguard Workertesting "-r dir->file [fail]" \ 33*cf5a6c84SAndroid Build Coastguard Worker "cp -r two walrus 2>/dev/null || echo yes" "yes\n" "" "" 34*cf5a6c84SAndroid Build Coastguard Workertouch two/three 35*cf5a6c84SAndroid Build Coastguard Workertesting "-r dir hits file." \ 36*cf5a6c84SAndroid Build Coastguard Worker "cp -r three two 2>/dev/null || echo yes" "yes\n" "" "" 37*cf5a6c84SAndroid Build Coastguard Workerrm -rf two three walrus 38*cf5a6c84SAndroid Build Coastguard Worker 39*cf5a6c84SAndroid Build Coastguard Workertouch two 40*cf5a6c84SAndroid Build Coastguard Workerchmod 000 two 41*cf5a6c84SAndroid Build Coastguard Workerskipnot [ $(id -u) -ne 0 ] # Root doesn't count. 42*cf5a6c84SAndroid Build Coastguard Workertesting "file->inaccessible [fail]" \ 43*cf5a6c84SAndroid Build Coastguard Worker "cp random two 2>/dev/null || echo yes" "yes\n" "" "" 44*cf5a6c84SAndroid Build Coastguard Workerrm -f two 45*cf5a6c84SAndroid Build Coastguard Worker 46*cf5a6c84SAndroid Build Coastguard Workertouch two 47*cf5a6c84SAndroid Build Coastguard Workerchmod 000 two 48*cf5a6c84SAndroid Build Coastguard Workerskipnot [ $(id -u) -ne 0 ] # Root doesn't count. 49*cf5a6c84SAndroid Build Coastguard Workertesting "-f file->inaccessible" \ 50*cf5a6c84SAndroid Build Coastguard Worker "cp -f random two && cmp random two && echo yes" "yes\n" "" "" 51*cf5a6c84SAndroid Build Coastguard Workermkdir sub 52*cf5a6c84SAndroid Build Coastguard Workerchmod 000 sub 53*cf5a6c84SAndroid Build Coastguard Workerskipnot [ $(id -u) -ne 0 ] # Root doesn't count. 54*cf5a6c84SAndroid Build Coastguard Workertesting "file->inaccessible_dir [fail]" \ 55*cf5a6c84SAndroid Build Coastguard Worker "cp random sub 2>/dev/null || echo yes" "yes\n" "" "" 56*cf5a6c84SAndroid Build Coastguard Workerrm two 57*cf5a6c84SAndroid Build Coastguard Workerrmdir sub 58*cf5a6c84SAndroid Build Coastguard Worker 59*cf5a6c84SAndroid Build Coastguard Worker# This test fails because our -rf deletes existing target files without 60*cf5a6c84SAndroid Build Coastguard Worker# regard to what we'd be copying over it. Posix says to only do that if 61*cf5a6c84SAndroid Build Coastguard Worker# we'd be copying a file over the file, but does not say _why_. 62*cf5a6c84SAndroid Build Coastguard Worker 63*cf5a6c84SAndroid Build Coastguard Worker#mkdir dir 64*cf5a6c84SAndroid Build Coastguard Worker#touch file 65*cf5a6c84SAndroid Build Coastguard Worker#testing "-rf dir file [fail]" "cp -rf dir file 2>/dev/null || echo yes" \ 66*cf5a6c84SAndroid Build Coastguard Worker# "yes\n" "" "" 67*cf5a6c84SAndroid Build Coastguard Worker#rm -rf dir file 68*cf5a6c84SAndroid Build Coastguard Worker 69*cf5a6c84SAndroid Build Coastguard Workertouch one two 70*cf5a6c84SAndroid Build Coastguard Workertesting "file1 file2 missing [fail]" \ 71*cf5a6c84SAndroid Build Coastguard Worker "cp one two missing 2>/dev/null || echo yes" "yes\n" "" "" 72*cf5a6c84SAndroid Build Coastguard Workermkdir dir 73*cf5a6c84SAndroid Build Coastguard Workertesting "dir file missing [fail]" \ 74*cf5a6c84SAndroid Build Coastguard Worker "cp dir two missing 2>/dev/null || echo yes" "yes\n" "" "" 75*cf5a6c84SAndroid Build Coastguard Workertesting "-rf dir file missing [fail]" \ 76*cf5a6c84SAndroid Build Coastguard Worker "cp dir two missing 2>/dev/null || echo yes" "yes\n" "" "" 77*cf5a6c84SAndroid Build Coastguard Workertesting "file1 file2 file [fail]" \ 78*cf5a6c84SAndroid Build Coastguard Worker "cp random one two 2>/dev/null || echo yes" "yes\n" "" "" 79*cf5a6c84SAndroid Build Coastguard Workertesting "file1 file2 dir" \ 80*cf5a6c84SAndroid Build Coastguard Worker "cp random one dir && cmp random dir/random && cmp one dir/one && echo yes" \ 81*cf5a6c84SAndroid Build Coastguard Worker "yes\n" "" "" 82*cf5a6c84SAndroid Build Coastguard Workerrm one two random 83*cf5a6c84SAndroid Build Coastguard Workerrm -rf dir 84*cf5a6c84SAndroid Build Coastguard Worker 85*cf5a6c84SAndroid Build Coastguard Workermkdir -p one/two/three/four 86*cf5a6c84SAndroid Build Coastguard Workertouch one/two/three/five one/{six,seven,eight} 87*cf5a6c84SAndroid Build Coastguard Workertesting "-r /abspath dest" \ 88*cf5a6c84SAndroid Build Coastguard Worker "cp -r \"$(readlink -f one)\" dir && diff -r one dir && echo yes" \ 89*cf5a6c84SAndroid Build Coastguard Worker "yes\n" "" "" 90*cf5a6c84SAndroid Build Coastguard Workertesting "-r dir again" "cp -r one/. dir && diff -r one dir && echo yes" \ 91*cf5a6c84SAndroid Build Coastguard Worker "yes\n" "" "" 92*cf5a6c84SAndroid Build Coastguard Workermkdir dir2 93*cf5a6c84SAndroid Build Coastguard Workertesting "-r dir1/* dir2" \ 94*cf5a6c84SAndroid Build Coastguard Worker "cp -r one/* dir2 && diff -r one dir2 && echo yes" "yes\n" "" "" 95*cf5a6c84SAndroid Build Coastguard Workerrm -rf one dir dir2 96*cf5a6c84SAndroid Build Coastguard Worker 97*cf5a6c84SAndroid Build Coastguard Workermkdir one; touch one/two; cp one/two one/three 98*cf5a6c84SAndroid Build Coastguard Workercp -pr one/ one_ # Succeeds twice in a row 99*cf5a6c84SAndroid Build Coastguard Workertesting "-pr dir/." "cp -pr one/. one_ && echo yes" "yes\n" "" "" 100*cf5a6c84SAndroid Build Coastguard Workerrm -rf one one_ 101*cf5a6c84SAndroid Build Coastguard Workermkdir one; touch one/two; ln -s two one/three 102*cf5a6c84SAndroid Build Coastguard Workercp -pr one/ one_ # First time ok, second mustn't fail with "File exists" 103*cf5a6c84SAndroid Build Coastguard Workertesting "-pr dir/. symlink child" "cp -pr one/. one_ && echo yes" "yes\n" "" "" 104*cf5a6c84SAndroid Build Coastguard Workerrm -rf one one_ 105*cf5a6c84SAndroid Build Coastguard Worker 106*cf5a6c84SAndroid Build Coastguard Workertouch walrus 107*cf5a6c84SAndroid Build Coastguard Workerchmod 644 walrus 108*cf5a6c84SAndroid Build Coastguard Workerln -s walrus woot 109*cf5a6c84SAndroid Build Coastguard Workertesting "symlink dest permissions" "cp woot carpenter && stat -c %A carpenter" \ 110*cf5a6c84SAndroid Build Coastguard Worker "-rw-r--r--\n" "" "" 111*cf5a6c84SAndroid Build Coastguard Workertesting "duplicated --preserve options" \ 112*cf5a6c84SAndroid Build Coastguard Worker "cp --preserve=mode,mode walrus walrus2 2>&1 || echo bad" "" "" "" 113*cf5a6c84SAndroid Build Coastguard Workerrm -rf walrus woot carpenter 114*cf5a6c84SAndroid Build Coastguard Worker 115*cf5a6c84SAndroid Build Coastguard Workermkdir dir 116*cf5a6c84SAndroid Build Coastguard Workerecho a > file 117*cf5a6c84SAndroid Build Coastguard Workerecho b > b 118*cf5a6c84SAndroid Build Coastguard Workertesting "-T file" "cp -T b file && cat file" "b\n" "" "" 119*cf5a6c84SAndroid Build Coastguard Workertesting "-T dir" "cp -T b dir 2>/dev/null || echo expected" "expected\n" "" "" 120*cf5a6c84SAndroid Build Coastguard Workerrm b file 121*cf5a6c84SAndroid Build Coastguard Worker 122*cf5a6c84SAndroid Build Coastguard Workermkdir -p b/c/d/ a/ 123*cf5a6c84SAndroid Build Coastguard Workerecho a > b/c/d/file 124*cf5a6c84SAndroid Build Coastguard Workertesting "--parents b/c/d/file a/" "cp --parents b/c/d/file a/ && cat a/b/c/d/file" "a\n" "" "" 125*cf5a6c84SAndroid Build Coastguard Workerrm -rf a/ b/ 126*cf5a6c84SAndroid Build Coastguard Worker 127*cf5a6c84SAndroid Build Coastguard Workerecho a > file 128*cf5a6c84SAndroid Build Coastguard Workertesting "-P file" "cp -P file fdst && stat -c %F fdst" "regular file\n" "" "" 129*cf5a6c84SAndroid Build Coastguard Workerln -s file lnk 130*cf5a6c84SAndroid Build Coastguard Workertesting "-P symlink" "cp -P lnk ldst && stat -c %F ldst" "symbolic link\n" "" "" 131*cf5a6c84SAndroid Build Coastguard Workertesting "follow symlink" "cp lnk ldst2 && stat -c %F ldst2" "regular file\n" "" "" 132*cf5a6c84SAndroid Build Coastguard Workerrm file fdst lnk ldst ldst2 133*cf5a6c84SAndroid Build Coastguard Worker 134*cf5a6c84SAndroid Build Coastguard Workermkdir sub 135*cf5a6c84SAndroid Build Coastguard Workertesting "-t one arg" 'cp -t sub/ input && cat sub/input' 'yes\n' 'yes\n' '' 136*cf5a6c84SAndroid Build Coastguard Workertoyonly testing "-Dt" 'cp -Dt sub2 input && cat sub2/input' 'and\n' 'and\n' '' 137*cf5a6c84SAndroid Build Coastguard Workerrm -rf sub sub2 138*cf5a6c84SAndroid Build Coastguard Worker 139*cf5a6c84SAndroid Build Coastguard Workertesting '-u1' 'echo one>one; sleep .1; echo two>two; cp -u one two; cat two' \ 140*cf5a6c84SAndroid Build Coastguard Worker 'two\n' '' '' 141*cf5a6c84SAndroid Build Coastguard Workertesting '-u2' 'echo two>two; sleep .1; echo one>one; cp -u one two; cat two' \ 142*cf5a6c84SAndroid Build Coastguard Worker 'one\n' '' '' 143*cf5a6c84SAndroid Build Coastguard Workermkdir a b 144*cf5a6c84SAndroid Build Coastguard Worker 145*cf5a6c84SAndroid Build Coastguard Workerecho potato > a/one 146*cf5a6c84SAndroid Build Coastguard Workerecho potato > a/two 147*cf5a6c84SAndroid Build Coastguard Workertouch b/one b/two 148*cf5a6c84SAndroid Build Coastguard Workertesting '-i' 'cp -ri a/. b/. 2>/dev/null; cmp -s a/one b/one || cmp -s a/one b/two && echo yes' \ 149*cf5a6c84SAndroid Build Coastguard Worker 'yes\n' '' 'n\ny\n' 150*cf5a6c84SAndroid Build Coastguard Workerrm -rf one two a b 151*cf5a6c84SAndroid Build Coastguard Worker 152*cf5a6c84SAndroid Build Coastguard Worker# cp -r ../source destdir 153*cf5a6c84SAndroid Build Coastguard Worker# cp -r one/two/three missing 154*cf5a6c84SAndroid Build Coastguard Worker# cp -r one/two/three two 155*cf5a6c84SAndroid Build Coastguard Worker# cp file1 file2 dir 156*cf5a6c84SAndroid Build Coastguard Worker# cp file1 missing file2 -> dir 157*cf5a6c84SAndroid Build Coastguard Worker 158*cf5a6c84SAndroid Build Coastguard Worker# Make sure it's truncating existing file 159*cf5a6c84SAndroid Build Coastguard Worker# copy with -d at top level, with -d in directory, without -d at top level, 160*cf5a6c84SAndroid Build Coastguard Worker# without -d in directory 161*cf5a6c84SAndroid Build Coastguard Worker 162*cf5a6c84SAndroid Build Coastguard Workerumask $OLDUMASK 163