1#!/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 138# If there is stdin, it prompts. If no stdin, it moves anyway and file2 won't 139# exist. 140touch file1 file2 141chmod 400 file1 file2 142testing "mv over unwritable file: no stdin" \ 143 "mv file2 file1 2>/dev/null && [ -e file1 -a ! -e file2 ] && echo yes" \ 144 "yes\n" "" "" 145rm -f file* 146 147touch file1 file2 148chmod 400 file1 file2 149testing "mv over unwritable file: answered YES" \ 150 "mv file2 file1 2>/dev/null && [ -e file1 -a ! -e file2 ] && echo yes" \ 151 "yes\n" "" "y\n" 152rm -f file* 153 154touch file1 file2 155chmod 400 file1 file2 156testing "mv over unwritable file: answered NO" \ 157 "mv file2 file1 2>/dev/null && [ -e file1 -a -e file2 ] && echo yes" \ 158 "yes\n" "" "n\n" 159rm -f file* 160 161touch file1 file2 162testing "interactive: no stdin" \ 163 "mv -i file2 file1 2>/dev/null && [ -e file1 -a ! -e file2 ] && echo yes" \ 164 "yes\n" "" "" 165rm -f file* 166 167touch file1 file2 168testing "interactive: answered YES" \ 169 "mv -i file2 file1 2>/dev/null && [ -e file1 -a ! -e file2 ] && echo yes" \ 170 "yes\n" "" "y\n" 171rm -f file* 172 173touch file1 file2 174testing "interactive: answered NO" \ 175 "mv -i file2 file1 2>/dev/null && [ -e file1 -a -e file2 ] && echo yes" \ 176 "yes\n" "" "n\n" 177rm -f file* 178