#!/bin/bash # TODO: needs root to mount tmpfs to test moving across filesystems. # check handling of chattr +i immutable bit # "touch two; chmod -w two; mv one two" shouldn't prompt to delete two if # one doesn't exist. # Copyright 2013 Robin Mittal # Copyright 2013 Divya Kothari [ -f testing.sh ] && . testing.sh #testing "name" "command" "result" "infile" "stdin" touch file testing "file to file" \ "mv file file1 && [ ! -e file -a -f file1 ] && echo yes" \ "yes\n" "" "" rm -f file* touch file mkdir dir testing "file to dir" \ "mv file dir && [ ! -e file -a -f dir/file ] && echo yes" \ "yes\n" "" "" rm -rf file* dir* mkdir dir testing "dir to dir" \ "mv dir dir1 && [ ! -e dir -a -d dir1 ] && echo yes" \ "yes\n" "" "" rm -rf dir* mkdir dir1 dir2 touch file1 file2 dir1/file3 ln -s file1 link1 testing "multiple files/dirs to a dir" \ "mv file1 file2 link1 dir1 dir2 && [ ! -e file1 -a ! -e file2 -a ! -e link1 -a ! -e dir1 ] && [ -f dir2/file1 -a -f dir2/file2 -a -L dir2/link1 -a -d dir2/dir1 ] && [ -f dir2/dir1/file3 ] && readlink dir2/link1" \ "file1\n" "" "" rm -rf file* link* dir* dd if=/dev/zero of=file1 seek=10k count=1 >/dev/null 2>&1 testing "random file to new file" \ "mv file1 file2 && [ ! -e file1 -a -f file2 ] && stat -c %s file2" \ "5243392\n" "" "" rm -f file* touch file1 ln -s file1 link1 testing "symlink to new symlink" \ "mv link1 link2 && [ ! -e link1 -a -L link2 ] && readlink link2" \ "file1\n" "" "" unlink tLink2 &>/dev/null rm -f file* link* touch file1 ln file1 link1 testing "hard link to new hardlink" \ "mv link1 link2 && [ ! -e link1 -a -f link2 -a file1 -ef link2 ] && echo yes" \ "yes\n" "" "" unlink link2 &>/dev/null rm -f file* link* touch file1 chmod a-r file1 testing "file to unreadable file" \ "mv file1 file2 && [ ! -e file1 -a -f file2 ] && echo yes" \ "yes\n" "" "" rm -f file* touch file1 ln file1 link1 mkdir dir1 testing "file hardlink dir" \ "mv file1 link1 dir1 && [ ! -e file1 -a ! -e link1 -a -f dir1/file1 -a -f dir1/link1 ] && [ dir1/file1 -ef dir1/link1 ] && echo yes" \ "yes\n" "" "" rm -rf file* link* dir* mkdir -p dir1/dir2 dir3 touch dir1/dir2/file1 dir1/dir2/file2 testing "dir to new dir" \ "mv dir1/dir2 dir3/new && [ ! -e dir1/dir2 -a -d dir3/new -a -f dir3/new/file1 ] && [ -f dir3/new/file2 ] && echo yes" \ "yes\n" "" "" rm -rf file* dir* mkdir dir1 dir2 testing "dir to existing dir" \ "mv dir1 dir2 && [ ! -e dir1 -a -d dir2/dir1 ] && echo yes" \ "yes\n" "" "" rm -rf dir* # Trailing slash was once throwing: bad 'dir1/dir2/': Resource busy mkdir -p dir1/dir2 testing "dir1/dir2 to ." \ "mv dir1/dir2 . && [ ! -e dir1/dir2 -a -d dir2 ] && echo yes" \ "yes\n" "" "" rm -rf dir* mkdir -p dir1/dir2 testing "dir1/dir2/ to ." \ "mv dir1/dir2/ . && [ ! -e dir1/dir2 -a -d dir2 ] && echo yes" \ "yes\n" "" "" rm -rf dir* mkdir -p dir1/dir2 testing "dir1/dir2/ to ./" \ "mv dir1/dir2/ ./ && [ ! -e dir1/dir2 -a -d dir2 ] && echo yes" \ "yes\n" "" "" rm -rf dir* testing "not/exists/ to ./" \ "mv not/exists/ ./ 2>&1 | grep -o not/exists/" \ "not/exists/\n" "" "" touch file1 file2 chmod 400 file1 file2 testing "force over unwritable" \ "mv -f file1 file2 && [ ! -e file1 -a -e file2 ] && echo yes" \ "yes\n" "" "" rm -f file* touch file1 file2 testing "no clobber (dest exists)" \ "mv -n file1 file2 && [ -e file1 -a -e file2 ] && echo yes"\ "yes\n" "" "" rm -f file* touch file1 testing "no clobber (dest doesn't exist)" \ "mv -n file1 new-dest && [ ! -e file1 -a -e new-dest ] && echo yes"\ "yes\n" "" "" rm -f file* touch file1 file2 chmod 400 file1 file2 testing "over unwritable file only prompts when stdin is a terminal" \ "mv file2 file1 2>/dev/null && [ -e file1 -a ! -e file2 ] && echo yes" \ "yes\n" "" "" rm -f file* touch file1 file2 testing "interactive: no stdin" \ "mv -i file2 file1 2>/dev/null && [ -e file1 -a -e file2 ] && echo yes" \ "yes\n" "" "" rm -f file* touch file1 file2 testing "interactive: answered YES" \ "mv -i file2 file1 2>/dev/null && [ -e file1 -a ! -e file2 ] && echo yes" \ "yes\n" "" "y\n" rm -f file* touch file1 file2 testing "interactive: answered NO" \ "mv -i file2 file1 2>/dev/null && [ -e file1 -a -e file2 ] && echo yes" \ "yes\n" "" "n\n" rm -f file*