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