xref: /aosp_15_r20/external/toybox/tests/mv.test (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker#!/bin/bash
2*cf5a6c84SAndroid Build Coastguard Worker
3*cf5a6c84SAndroid Build Coastguard Worker# TODO: needs root to mount tmpfs to test moving across filesystems.
4*cf5a6c84SAndroid Build Coastguard Worker# check handling of chattr +i immutable bit
5*cf5a6c84SAndroid Build Coastguard Worker# "touch two; chmod -w two; mv one two" shouldn't prompt to delete two if
6*cf5a6c84SAndroid Build Coastguard Worker#   one doesn't exist.
7*cf5a6c84SAndroid Build Coastguard Worker
8*cf5a6c84SAndroid Build Coastguard Worker# Copyright 2013 Robin Mittal <[email protected]>
9*cf5a6c84SAndroid Build Coastguard Worker# Copyright 2013 Divya Kothari <[email protected]>
10*cf5a6c84SAndroid Build Coastguard Worker
11*cf5a6c84SAndroid Build Coastguard Worker[ -f testing.sh ] && . testing.sh
12*cf5a6c84SAndroid Build Coastguard Worker
13*cf5a6c84SAndroid Build Coastguard Worker#testing "name" "command" "result" "infile" "stdin"
14*cf5a6c84SAndroid Build Coastguard Worker
15*cf5a6c84SAndroid Build Coastguard Workertouch file
16*cf5a6c84SAndroid Build Coastguard Workertesting "file to file" \
17*cf5a6c84SAndroid Build Coastguard Worker  "mv file file1 && [ ! -e file -a -f file1 ] && echo yes" \
18*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
19*cf5a6c84SAndroid Build Coastguard Workerrm -f file*
20*cf5a6c84SAndroid Build Coastguard Worker
21*cf5a6c84SAndroid Build Coastguard Workertouch file
22*cf5a6c84SAndroid Build Coastguard Workermkdir dir
23*cf5a6c84SAndroid Build Coastguard Workertesting "file to dir" \
24*cf5a6c84SAndroid Build Coastguard Worker  "mv file dir && [ ! -e file -a -f dir/file ] && echo yes" \
25*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
26*cf5a6c84SAndroid Build Coastguard Workerrm -rf file* dir*
27*cf5a6c84SAndroid Build Coastguard Worker
28*cf5a6c84SAndroid Build Coastguard Workermkdir dir
29*cf5a6c84SAndroid Build Coastguard Workertesting "dir to dir" \
30*cf5a6c84SAndroid Build Coastguard Worker  "mv dir dir1 && [ ! -e dir -a -d dir1 ] && echo yes" \
31*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
32*cf5a6c84SAndroid Build Coastguard Workerrm -rf dir*
33*cf5a6c84SAndroid Build Coastguard Worker
34*cf5a6c84SAndroid Build Coastguard Workermkdir dir1 dir2
35*cf5a6c84SAndroid Build Coastguard Workertouch file1 file2 dir1/file3
36*cf5a6c84SAndroid Build Coastguard Workerln -s file1 link1
37*cf5a6c84SAndroid Build Coastguard Workertesting "multiple files/dirs to a dir" \
38*cf5a6c84SAndroid Build Coastguard Worker  "mv file1 file2 link1 dir1 dir2 &&
39*cf5a6c84SAndroid Build Coastguard Worker  [ ! -e file1 -a ! -e file2 -a ! -e link1 -a ! -e dir1 ] &&
40*cf5a6c84SAndroid Build Coastguard Worker  [ -f dir2/file1 -a -f dir2/file2 -a -L dir2/link1 -a -d dir2/dir1 ] &&
41*cf5a6c84SAndroid Build Coastguard Worker  [ -f dir2/dir1/file3 ] && readlink dir2/link1" \
42*cf5a6c84SAndroid Build Coastguard Worker  "file1\n" "" ""
43*cf5a6c84SAndroid Build Coastguard Workerrm -rf file* link* dir*
44*cf5a6c84SAndroid Build Coastguard Worker
45*cf5a6c84SAndroid Build Coastguard Workerdd if=/dev/zero of=file1 seek=10k count=1 >/dev/null 2>&1
46*cf5a6c84SAndroid Build Coastguard Workertesting "random file to new file" \
47*cf5a6c84SAndroid Build Coastguard Worker  "mv file1 file2 && [ ! -e file1 -a -f file2 ] && stat -c %s file2" \
48*cf5a6c84SAndroid Build Coastguard Worker  "5243392\n" "" ""
49*cf5a6c84SAndroid Build Coastguard Workerrm -f file*
50*cf5a6c84SAndroid Build Coastguard Worker
51*cf5a6c84SAndroid Build Coastguard Workertouch file1
52*cf5a6c84SAndroid Build Coastguard Workerln -s file1 link1
53*cf5a6c84SAndroid Build Coastguard Workertesting "symlink to new symlink" \
54*cf5a6c84SAndroid Build Coastguard Worker  "mv link1 link2 && [ ! -e link1 -a -L link2 ] && readlink link2" \
55*cf5a6c84SAndroid Build Coastguard Worker  "file1\n" "" ""
56*cf5a6c84SAndroid Build Coastguard Workerunlink tLink2 &>/dev/null
57*cf5a6c84SAndroid Build Coastguard Workerrm -f file* link*
58*cf5a6c84SAndroid Build Coastguard Worker
59*cf5a6c84SAndroid Build Coastguard Workertouch file1
60*cf5a6c84SAndroid Build Coastguard Workerln file1 link1
61*cf5a6c84SAndroid Build Coastguard Workertesting "hard link to new hardlink" \
62*cf5a6c84SAndroid Build Coastguard Worker  "mv link1 link2 && [ ! -e link1 -a -f link2 -a file1 -ef link2 ] && echo yes" \
63*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
64*cf5a6c84SAndroid Build Coastguard Workerunlink link2 &>/dev/null
65*cf5a6c84SAndroid Build Coastguard Workerrm -f file* link*
66*cf5a6c84SAndroid Build Coastguard Worker
67*cf5a6c84SAndroid Build Coastguard Workertouch file1
68*cf5a6c84SAndroid Build Coastguard Workerchmod a-r file1
69*cf5a6c84SAndroid Build Coastguard Workertesting "file to unreadable file" \
70*cf5a6c84SAndroid Build Coastguard Worker  "mv file1 file2 && [ ! -e file1 -a -f file2 ] && echo yes" \
71*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
72*cf5a6c84SAndroid Build Coastguard Workerrm -f file*
73*cf5a6c84SAndroid Build Coastguard Worker
74*cf5a6c84SAndroid Build Coastguard Workertouch file1
75*cf5a6c84SAndroid Build Coastguard Workerln file1 link1
76*cf5a6c84SAndroid Build Coastguard Workermkdir dir1
77*cf5a6c84SAndroid Build Coastguard Workertesting "file hardlink dir" \
78*cf5a6c84SAndroid Build Coastguard Worker  "mv file1 link1 dir1 &&
79*cf5a6c84SAndroid Build Coastguard Worker  [ ! -e file1 -a ! -e link1 -a -f dir1/file1 -a -f dir1/link1 ] &&
80*cf5a6c84SAndroid Build Coastguard Worker  [ dir1/file1 -ef dir1/link1 ] && echo yes" \
81*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
82*cf5a6c84SAndroid Build Coastguard Workerrm -rf file* link* dir*
83*cf5a6c84SAndroid Build Coastguard Worker
84*cf5a6c84SAndroid Build Coastguard Workermkdir -p dir1/dir2 dir3
85*cf5a6c84SAndroid Build Coastguard Workertouch dir1/dir2/file1 dir1/dir2/file2
86*cf5a6c84SAndroid Build Coastguard Workertesting "dir to new dir" \
87*cf5a6c84SAndroid Build Coastguard Worker  "mv dir1/dir2 dir3/new &&
88*cf5a6c84SAndroid Build Coastguard Worker  [ ! -e dir1/dir2 -a -d dir3/new -a -f dir3/new/file1 ] &&
89*cf5a6c84SAndroid Build Coastguard Worker  [ -f dir3/new/file2 ] && echo yes" \
90*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
91*cf5a6c84SAndroid Build Coastguard Workerrm -rf file* dir*
92*cf5a6c84SAndroid Build Coastguard Worker
93*cf5a6c84SAndroid Build Coastguard Workermkdir dir1 dir2
94*cf5a6c84SAndroid Build Coastguard Workertesting "dir to existing dir" \
95*cf5a6c84SAndroid Build Coastguard Worker  "mv dir1 dir2 && [ ! -e dir1 -a -d dir2/dir1 ] && echo yes" \
96*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
97*cf5a6c84SAndroid Build Coastguard Workerrm -rf dir*
98*cf5a6c84SAndroid Build Coastguard Worker
99*cf5a6c84SAndroid Build Coastguard Worker# Trailing slash was once throwing: bad 'dir1/dir2/': Resource busy
100*cf5a6c84SAndroid Build Coastguard Workermkdir -p dir1/dir2
101*cf5a6c84SAndroid Build Coastguard Workertesting "dir1/dir2 to ." \
102*cf5a6c84SAndroid Build Coastguard Worker  "mv dir1/dir2 . && [ ! -e dir1/dir2 -a -d dir2 ] && echo yes" \
103*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
104*cf5a6c84SAndroid Build Coastguard Workerrm -rf dir*
105*cf5a6c84SAndroid Build Coastguard Workermkdir -p dir1/dir2
106*cf5a6c84SAndroid Build Coastguard Workertesting "dir1/dir2/ to ." \
107*cf5a6c84SAndroid Build Coastguard Worker  "mv dir1/dir2/ . && [ ! -e dir1/dir2 -a -d dir2 ] && echo yes" \
108*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
109*cf5a6c84SAndroid Build Coastguard Workerrm -rf dir*
110*cf5a6c84SAndroid Build Coastguard Workermkdir -p dir1/dir2
111*cf5a6c84SAndroid Build Coastguard Workertesting "dir1/dir2/ to ./" \
112*cf5a6c84SAndroid Build Coastguard Worker  "mv dir1/dir2/ ./ && [ ! -e dir1/dir2 -a -d dir2 ] && echo yes" \
113*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
114*cf5a6c84SAndroid Build Coastguard Workerrm -rf dir*
115*cf5a6c84SAndroid Build Coastguard Workertesting "not/exists/ to ./" \
116*cf5a6c84SAndroid Build Coastguard Worker  "mv not/exists/ ./ 2>&1 | grep -o not/exists/" \
117*cf5a6c84SAndroid Build Coastguard Worker  "not/exists/\n" "" ""
118*cf5a6c84SAndroid Build Coastguard Worker
119*cf5a6c84SAndroid Build Coastguard Workertouch file1 file2
120*cf5a6c84SAndroid Build Coastguard Workerchmod 400 file1 file2
121*cf5a6c84SAndroid Build Coastguard Workertesting "force over unwritable" \
122*cf5a6c84SAndroid Build Coastguard Worker  "mv -f file1 file2 && [ ! -e file1 -a -e file2 ] && echo yes" \
123*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
124*cf5a6c84SAndroid Build Coastguard Workerrm -f file*
125*cf5a6c84SAndroid Build Coastguard Worker
126*cf5a6c84SAndroid Build Coastguard Workertouch file1 file2
127*cf5a6c84SAndroid Build Coastguard Workertesting "no clobber (dest exists)" \
128*cf5a6c84SAndroid Build Coastguard Worker  "mv -n file1 file2 && [ -e file1 -a -e file2 ] && echo yes"\
129*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
130*cf5a6c84SAndroid Build Coastguard Workerrm -f file*
131*cf5a6c84SAndroid Build Coastguard Worker
132*cf5a6c84SAndroid Build Coastguard Workertouch file1
133*cf5a6c84SAndroid Build Coastguard Workertesting "no clobber (dest doesn't exist)" \
134*cf5a6c84SAndroid Build Coastguard Worker  "mv -n file1 new-dest && [ ! -e file1 -a -e new-dest ] && echo yes"\
135*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
136*cf5a6c84SAndroid Build Coastguard Workerrm -f file*
137*cf5a6c84SAndroid Build Coastguard Worker
138*cf5a6c84SAndroid Build Coastguard Workertouch file1 file2
139*cf5a6c84SAndroid Build Coastguard Workerchmod 400 file1 file2
140*cf5a6c84SAndroid Build Coastguard Workertesting "over unwritable file only prompts when stdin is a terminal" \
141*cf5a6c84SAndroid Build Coastguard Worker  "mv file2 file1 2>/dev/null && [ -e file1 -a ! -e file2 ] && echo yes" \
142*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
143*cf5a6c84SAndroid Build Coastguard Workerrm -f file*
144*cf5a6c84SAndroid Build Coastguard Worker
145*cf5a6c84SAndroid Build Coastguard Workertouch file1 file2
146*cf5a6c84SAndroid Build Coastguard Workertesting "interactive: no stdin" \
147*cf5a6c84SAndroid Build Coastguard Worker  "mv -i file2 file1 2>/dev/null && [ -e file1 -a -e file2 ] && echo yes" \
148*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" ""
149*cf5a6c84SAndroid Build Coastguard Workerrm -f file*
150*cf5a6c84SAndroid Build Coastguard Worker
151*cf5a6c84SAndroid Build Coastguard Workertouch file1 file2
152*cf5a6c84SAndroid Build Coastguard Workertesting "interactive: answered YES" \
153*cf5a6c84SAndroid Build Coastguard Worker  "mv -i file2 file1 2>/dev/null && [ -e file1 -a ! -e file2 ] && echo yes" \
154*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" "y\n"
155*cf5a6c84SAndroid Build Coastguard Workerrm -f file*
156*cf5a6c84SAndroid Build Coastguard Worker
157*cf5a6c84SAndroid Build Coastguard Workertouch file1 file2
158*cf5a6c84SAndroid Build Coastguard Workertesting "interactive: answered NO" \
159*cf5a6c84SAndroid Build Coastguard Worker  "mv -i file2 file1 2>/dev/null && [ -e file1 -a -e file2 ] && echo yes" \
160*cf5a6c84SAndroid Build Coastguard Worker  "yes\n" "" "n\n"
161*cf5a6c84SAndroid Build Coastguard Workerrm -f file*
162