xref: /aosp_15_r20/external/toybox/tests/cp.test (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
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