aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2014-09-20 13:09:14 -0500
committerRob Landley <rob@landley.net>2014-09-20 13:09:14 -0500
commit387edf547eb09b27ca6d49772eb048d729f09cf4 (patch)
tree59d482f33735690cab6d90723393afa1e2c8dce5 /tests
parentd3df423a6cde0c6282658ff628574771d3824d71 (diff)
downloadtoybox-387edf547eb09b27ca6d49772eb048d729f09cf4.tar.gz
Move testsuite out of scripts/test into its own top level tests directory, and make ctrl-c kill "make test" more reliably.
Diffstat (limited to 'tests')
-rwxr-xr-xtests/basename.test23
-rwxr-xr-xtests/blkid.test44
-rw-r--r--tests/blkid/cramfs.bz2bin0 -> 121 bytes
-rw-r--r--tests/blkid/ext2.bz2bin0 -> 2396 bytes
-rw-r--r--tests/blkid/ext3.bz2bin0 -> 4132 bytes
-rw-r--r--tests/blkid/ext4.bz2bin0 -> 2491 bytes
-rw-r--r--tests/blkid/f2fs.bz2bin0 -> 634 bytes
-rw-r--r--tests/blkid/minix.bz2bin0 -> 157 bytes
-rw-r--r--tests/blkid/msdos.bz2bin0 -> 288 bytes
-rw-r--r--tests/blkid/ntfs.bz2bin0 -> 35854 bytes
-rw-r--r--tests/blkid/reiser3.bz2bin0 -> 329 bytes
-rw-r--r--tests/blkid/squashfs.bz2bin0 -> 158 bytes
-rw-r--r--tests/blkid/vfat.bz2bin0 -> 291 bytes
-rw-r--r--tests/blkid/xfs.bz2bin0 -> 437 bytes
-rw-r--r--tests/bzcat.test26
-rwxr-xr-xtests/cat.test31
-rwxr-xr-xtests/chgrp.test102
-rw-r--r--tests/chmod.test244
-rwxr-xr-xtests/cksum.test29
-rwxr-xr-xtests/cmp.test35
-rwxr-xr-xtests/cp.test101
-rwxr-xr-xtests/cpio.test39
-rw-r--r--tests/cut.test47
-rw-r--r--tests/dd.test83
-rwxr-xr-xtests/dirname.test10
-rwxr-xr-xtests/du.test26
-rwxr-xr-xtests/echo.test37
-rwxr-xr-xtests/expand.test44
-rw-r--r--tests/expr.test10
-rwxr-xr-xtests/factor.test18
-rw-r--r--tests/find.test42
-rwxr-xr-xtests/grep.test98
-rw-r--r--tests/groupadd.test56
-rw-r--r--tests/groupdel.test27
-rwxr-xr-xtests/head.test17
-rw-r--r--tests/hostname.test18
-rwxr-xr-xtests/link.test26
-rw-r--r--tests/ln.test70
-rwxr-xr-xtests/losetup.test46
-rw-r--r--tests/ls.test49
-rw-r--r--tests/lsattr.test159
-rwxr-xr-xtests/md5sum.test22
-rwxr-xr-xtests/mkdir.test73
-rwxr-xr-xtests/mkfifo.test28
-rwxr-xr-xtests/modinfo.test30
-rw-r--r--tests/mount.test87
-rw-r--r--tests/mv.test98
-rw-r--r--tests/nl.test50
-rw-r--r--tests/pgrep.test122
-rw-r--r--tests/printf.test29
-rwxr-xr-xtests/pwd.test26
-rwxr-xr-xtests/readlink.test67
-rw-r--r--tests/renice.test110
-rw-r--r--tests/rev.test25
-rw-r--r--tests/rm.test46
-rwxr-xr-xtests/rmdir.test55
-rwxr-xr-xtests/seq.test28
-rwxr-xr-xtests/sha1sum.test57
-rwxr-xr-xtests/sort.test100
-rwxr-xr-xtests/split.test31
-rw-r--r--tests/tac.test29
-rwxr-xr-xtests/tail.test61
-rw-r--r--tests/tar.test73
-rwxr-xr-xtests/test.test67
-rwxr-xr-xtests/touch.test24
-rw-r--r--tests/useradd.test90
-rw-r--r--tests/uudecode.test27
-rw-r--r--tests/uuencode.test26
-rwxr-xr-xtests/wc.test48
-rwxr-xr-xtests/xargs.test35
-rw-r--r--tests/xzcat.test26
-rw-r--r--tests/zcat.test26
72 files changed, 3173 insertions, 0 deletions
diff --git a/tests/basename.test b/tests/basename.test
new file mode 100755
index 00000000..2f7a2ec3
--- /dev/null
+++ b/tests/basename.test
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+# Removal of extra /'s
+testing "basename /-only" "basename ///////" "/\n" "" ""
+testing "basename trailing /" "basename a//////" "a\n" "" ""
+testing "basename combined" "basename /////a///b///c///d/////" "d\n" "" ""
+
+# Standard suffix behavior.
+testing "basename suffix" "basename a/b/c/d.suffix .suffix" "d\n" "" ""
+
+# A suffix cannot be the entire result.
+testing "basename suffix=result" "basename .txt .txt" ".txt\n" "" ""
+
+# Deal with suffix appearing in the filename
+testing "basename reappearing suffix 1" "basename a.txt.txt .txt" "a.txt\n" "" ""
+testing "basename reappearing suffix 2" "basename a.txt.old .txt" "a.txt.old\n" "" ""
+
+# A suffix should be a real suffix, only a the end.
+testing "basename invalid suffix" "basename isthisasuffix? suffix" "isthisasuffix?\n" "" ""
diff --git a/tests/blkid.test b/tests/blkid.test
new file mode 100755
index 00000000..3f676df8
--- /dev/null
+++ b/tests/blkid.test
@@ -0,0 +1,44 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+BDIR="$TOPDIR/tests/blkid"
+
+bzcat "$BDIR"/squashfs.bz2 > temp.img
+testing "blkid file" "blkid temp.img" 'temp.img: TYPE="squashfs"\n' "" ""
+rm temp.img
+
+testing "blkid cramfs" 'bzcat "$BDIR"/cramfs.bz2 | blkid -' \
+ '-: LABEL="mycramfs" TYPE="cramfs"\n' "" ""
+testing "blkid ext2" 'bzcat "$BDIR"/ext2.bz2 | blkid -' \
+ '-: LABEL="myext2" UUID="e59093ba-4135-4fdb-bcc4-f20beae4dfaf" TYPE="ext2"\n' \
+ "" ""
+testing "blkid ext3" 'bzcat "$BDIR"/ext3.bz2 | blkid -' \
+ '-: LABEL="myext3" UUID="79d1c877-1a0f-4e7d-b21d-fc32ae3ef101" TYPE="ext2"\n' \
+ "" ""
+testing "blkid ext4" 'bzcat "$BDIR"/ext4.bz2 | blkid -' \
+ '-: LABEL="myext4" UUID="dc4b7c00-c0c0-4600-af7e-0335f09770fa" TYPE="ext2"\n' \
+ "" ""
+testing "blkid f2fs" 'bzcat "$BDIR"/f2fs.bz2 | blkid -' \
+ '-: LABEL="" UUID="b53d3619-c204-4c0b-8504-36363578491c" TYPE="f2fs"\n' \
+ "" ""
+testing "blkid msdos" 'bzcat "$BDIR"/msdos.bz2 | blkid -' \
+ '-: LABEL="mymsdos " UUID="5108-1e6e" TYPE="vfat"\n' "" ""
+testing "blkid ntfs" 'bzcat "$BDIR"/ntfs.bz2 | blkid -' \
+ '-: UUID="8585600838bfe16e" TYPE="ntfs"\n' "" ""
+testing "blkid reiserfs" 'bzcat "$BDIR"/reiser3.bz2 | blkid -' \
+ '-: LABEL="" UUID="a5b99bec-45cc-41d7-986e-32f4b6fc28f2" TYPE="reiserfs"\n' \
+ "" ""
+testing "blkid squashfs" 'bzcat "$BDIR"/squashfs.bz2 | blkid -' \
+ '-: TYPE="squashfs"\n' "" ""
+testing "blkid vfat" 'bzcat "$BDIR"/vfat.bz2 | blkid -' \
+ '-: LABEL="myvfat " UUID="1db9-5673" TYPE="vfat"\n' "" ""
+testing "blkid xfs" 'bzcat "$BDIR"/xfs.bz2 | blkid -' \
+ '-: LABEL="XFS_test" UUID="d63a1dc3-27d5-4dd4-8b38-f4f97f495c6f" TYPE="xfs"\n' \
+ "" ""
+
+#testing "blkid minix" 'bzcat "$BDIR"/minix.bz2 | blkid -'
+#adfs bfs btrfs cramfs jfs nilfs romfs
+#vfat // fat32 fat12 fat16
diff --git a/tests/blkid/cramfs.bz2 b/tests/blkid/cramfs.bz2
new file mode 100644
index 00000000..37438fe8
--- /dev/null
+++ b/tests/blkid/cramfs.bz2
Binary files differ
diff --git a/tests/blkid/ext2.bz2 b/tests/blkid/ext2.bz2
new file mode 100644
index 00000000..e27c4d76
--- /dev/null
+++ b/tests/blkid/ext2.bz2
Binary files differ
diff --git a/tests/blkid/ext3.bz2 b/tests/blkid/ext3.bz2
new file mode 100644
index 00000000..be7f11f2
--- /dev/null
+++ b/tests/blkid/ext3.bz2
Binary files differ
diff --git a/tests/blkid/ext4.bz2 b/tests/blkid/ext4.bz2
new file mode 100644
index 00000000..a8314f91
--- /dev/null
+++ b/tests/blkid/ext4.bz2
Binary files differ
diff --git a/tests/blkid/f2fs.bz2 b/tests/blkid/f2fs.bz2
new file mode 100644
index 00000000..4111e876
--- /dev/null
+++ b/tests/blkid/f2fs.bz2
Binary files differ
diff --git a/tests/blkid/minix.bz2 b/tests/blkid/minix.bz2
new file mode 100644
index 00000000..b2f022e0
--- /dev/null
+++ b/tests/blkid/minix.bz2
Binary files differ
diff --git a/tests/blkid/msdos.bz2 b/tests/blkid/msdos.bz2
new file mode 100644
index 00000000..26c9b665
--- /dev/null
+++ b/tests/blkid/msdos.bz2
Binary files differ
diff --git a/tests/blkid/ntfs.bz2 b/tests/blkid/ntfs.bz2
new file mode 100644
index 00000000..b654ecd6
--- /dev/null
+++ b/tests/blkid/ntfs.bz2
Binary files differ
diff --git a/tests/blkid/reiser3.bz2 b/tests/blkid/reiser3.bz2
new file mode 100644
index 00000000..b2adfc85
--- /dev/null
+++ b/tests/blkid/reiser3.bz2
Binary files differ
diff --git a/tests/blkid/squashfs.bz2 b/tests/blkid/squashfs.bz2
new file mode 100644
index 00000000..2f1b7937
--- /dev/null
+++ b/tests/blkid/squashfs.bz2
Binary files differ
diff --git a/tests/blkid/vfat.bz2 b/tests/blkid/vfat.bz2
new file mode 100644
index 00000000..1df8b89a
--- /dev/null
+++ b/tests/blkid/vfat.bz2
Binary files differ
diff --git a/tests/blkid/xfs.bz2 b/tests/blkid/xfs.bz2
new file mode 100644
index 00000000..a7571960
--- /dev/null
+++ b/tests/blkid/xfs.bz2
Binary files differ
diff --git a/tests/bzcat.test b/tests/bzcat.test
new file mode 100644
index 00000000..8bc5f5c9
--- /dev/null
+++ b/tests/bzcat.test
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# Copyright 2014 Divya Kothari <divya.s.kothari@gmail.com>
+# Copyright 2014 Naha Maggu <maggu.neha@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+echo "hello" > file
+tar -cjf file.tar.bz2 file
+# Get system bzcat
+bzcatExe=`which bzcat`
+$bzcatExe file.tar.bz2 > bzcatOut
+testing "bzcat - decompresses a single file" "bzcat file.tar.bz2 > Tempfile && echo "yes"; diff Tempfile bzcatOut && echo "yes"; rm -rf file* bzcatOut Tempfile" "yes\nyes\n" "" ""
+
+#testing "name" "command" "result" "infile" "stdin"
+echo "hello" > file1
+echo "hi" > file2
+echo "Hi, Good morning !! I am a bzcat tester" > file3
+tar -cjf file1.tar.bz2 file1
+tar -cjf file2.tar.bz2 file2
+tar -cjf file3.tar.bz2 file3
+# Get system bzcat
+bzcatExe=`which bzcat`
+$bzcatExe file1.tar.bz2 file2.tar.bz2 file3.tar.bz2 > bzcatOut
+testing "bzcat - decompresses multiple files" "bzcat file1.tar.bz2 file2.tar.bz2 file3.tar.bz2 > Tempfile && echo "yes" ; diff Tempfile bzcatOut && echo "yes"; rm -rf file* bzcatOut Tempfile " "yes\nyes\n" "" ""
diff --git a/tests/cat.test b/tests/cat.test
new file mode 100755
index 00000000..3d5842ae
--- /dev/null
+++ b/tests/cat.test
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+echo "one" > file1
+echo "two" > file2
+testing "cat" "cat && echo yes" "oneyes\n" "" "one"
+testing "cat -" "cat - && echo yes" "oneyes\n" "" "one"
+testing "cat file1 file2" "cat file1 file2" "one\ntwo\n" "" ""
+testing "cat - file" "cat - file1" "zero\none\n" "" "zero\n"
+testing "cat file -" "cat file1 -" "one\nzero\n" "" "zero\n"
+
+testing "cat file1 notfound file2" \
+ "cat file1 notfound file2 2>stderr && echo ok ; cat stderr; rm stderr" \
+ "one\ntwo\ncat: notfound: No such file or directory\n" "" ""
+
+testing "cat file1" \
+ "cat /proc/self/exe > file1 && cmp /proc/self/exe file1 && echo yes" \
+ "yes\n" "" ""
+
+testing "cat - file1" \
+ "cat - file1 | diff -a -U 0 - file1 | tail -n 1" \
+ "-hello\n" "" "hello\n"
+
+testing "cat > /dev/full" \
+ "cat - > /dev/full 2>stderr && echo ok; cat stderr; rm stderr" \
+ "cat: xwrite: No space left on device\n" "" "zero\n"
+
+rm file1 file2 \ No newline at end of file
diff --git a/tests/chgrp.test b/tests/chgrp.test
new file mode 100755
index 00000000..2af93857
--- /dev/null
+++ b/tests/chgrp.test
@@ -0,0 +1,102 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+if [ "$(id -u)" -ne 0 ]
+then
+ echo "SKIPPED: chgrp (not root)"
+ continue 2>/dev/null
+ exit
+fi
+
+# We chgrp between "root" and the last group in /etc/group.
+
+GRP="$(sed -n '$s/:.*//p' /etc/group)"
+
+# Set up a little testing hierarchy
+
+rm -rf testdir &&
+mkdir -p testdir/dir/dir/dir testdir/dir2 &&
+touch testdir/dir/file &&
+ln -s ../dir/dir testdir/dir2/dir &&
+ln -s ../dir/file testdir/dir2/file || exit 1
+
+# Wrapper to reset groups and return results
+
+IN="cd testdir && chgrp -R $GRP dir dir2 &&"
+OUT="&& cd .. && echo \$(ls -lR testdir | awk '{print \$4}')"
+
+# The groups returned by $OUT are, in order:
+# dir dir2 dir/dir dir/file dir/dir/dir dir2/dir dir2/file
+
+#testing "name" "command" "result" "infile" "stdin"
+
+# Basic smoketest
+testing "chgrp dir" "$IN chgrp root dir $OUT" \
+ "root $GRP $GRP $GRP $GRP $GRP $GRP\n" "" ""
+testing "chgrp file" "$IN chgrp root dir/file $OUT" \
+ "$GRP $GRP $GRP root $GRP $GRP $GRP\n" "" ""
+testing "chgrp dir and file" "$IN chgrp root dir dir/file $OUT" \
+ "root $GRP $GRP root $GRP $GRP $GRP\n" "" ""
+
+# symlinks (affect target, not symlink)
+testing "chgrp symlink->file" "$IN chgrp root dir2/file $OUT" \
+ "$GRP $GRP $GRP root $GRP $GRP $GRP\n" "" ""
+testing "chgrp symlink->dir" "$IN chgrp root dir2/dir $OUT" \
+ "$GRP $GRP root $GRP $GRP $GRP $GRP\n" "" ""
+testing "chgrp -h symlink->dir" "$IN chgrp -h root dir2/dir $OUT" \
+ "$GRP $GRP $GRP $GRP $GRP root $GRP\n" "" ""
+
+# What does -h do (affect symlink, not target)
+testing "chgrp -h symlink->file" "$IN chgrp -h root dir2/file $OUT" \
+ "$GRP $GRP $GRP $GRP $GRP $GRP root\n" "" ""
+testing "chgrp -h symlink->dir" "$IN chgrp -h root dir2/dir $OUT" \
+ "$GRP $GRP $GRP $GRP $GRP root $GRP\n" "" ""
+
+# chgrp -R (note, -h is implied by -R)
+
+testing "chgrp -R dir" "$IN chgrp -R root dir $OUT" \
+ "root $GRP root root root $GRP $GRP\n" "" ""
+testing "chgrp -R dir2" "$IN chgrp -R root dir2 $OUT" \
+ "$GRP root $GRP $GRP $GRP root root\n" "" ""
+testing "chgrp -R symlink->dir" "$IN chgrp -R root dir2/dir $OUT" \
+ "$GRP $GRP $GRP $GRP $GRP root $GRP\n" "" ""
+testing "chgrp -R symlink->file" "$IN chgrp -R root dir2/file $OUT" \
+ "$GRP $GRP $GRP $GRP $GRP $GRP root\n" "" ""
+
+# chgrp -RP (same as -R by itself)
+
+testing "chgrp -RP dir2" "$IN chgrp -RP root dir2 $OUT" \
+ "$GRP root $GRP $GRP $GRP root root\n" "" ""
+testing "chgrp -RP symlink->dir" "$IN chgrp -RP root dir2/dir $OUT" \
+ "$GRP $GRP $GRP $GRP $GRP root $GRP\n" "" ""
+testing "chgrp -RP symlink->file" "$IN chgrp -RP root dir2/file $OUT" \
+ "$GRP $GRP $GRP $GRP $GRP $GRP root\n" "" ""
+
+# chgrp -RH (change target but only recurse through symlink->dir on cmdline)
+
+testing "chgrp -RH dir2" "$IN chgrp -RH root dir2 $OUT" \
+ "$GRP root root root $GRP $GRP $GRP\n" "" ""
+testing "chgrp -RH symlink->dir" "$IN chgrp -RH root dir2/dir $OUT" \
+ "$GRP $GRP root $GRP root $GRP $GRP\n" "" ""
+testing "chgrp -RH symlink->file" "$IN chgrp -RH root dir2/file $OUT" \
+ "$GRP $GRP $GRP root $GRP $GRP $GRP\n" "" ""
+
+# chgrp -RL (change target and always recurse through symlink->dir)
+
+testing "chgrp -RL dir2" "$IN chgrp -RL root dir2 $OUT" \
+ "$GRP root root root root $GRP $GRP\n" "" ""
+testing "chgrp -RL symlink->dir" "$IN chgrp -RL root dir2/dir $OUT" \
+ "$GRP $GRP root $GRP root $GRP $GRP\n" "" ""
+testing "chgrp -RL symlink->file" "$IN chgrp -RL root dir2/file $OUT" \
+ "$GRP $GRP $GRP root $GRP $GRP $GRP\n" "" ""
+
+# -HLP are NOPs without -R
+testing "chgrp -H without -R" "$IN chgrp -H root dir2/dir $OUT" \
+ "$GRP $GRP root $GRP $GRP $GRP $GRP\n" "" ""
+testing "chgrp -L without -R" "$IN chgrp -L root dir2/dir $OUT" \
+ "$GRP $GRP root $GRP $GRP $GRP $GRP\n" "" ""
+testing "chgrp -P without -R" "$IN chgrp -P root dir2/dir $OUT" \
+ "$GRP $GRP root $GRP $GRP $GRP $GRP\n" "" ""
+
+rm -rf testdir
diff --git a/tests/chmod.test b/tests/chmod.test
new file mode 100644
index 00000000..77106a69
--- /dev/null
+++ b/tests/chmod.test
@@ -0,0 +1,244 @@
+#!/bin/bash
+
+# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
+# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
+
+#testing "name" "command" "result" "infile" "stdin"
+
+PERM="---""--x""-w-""-wx""r--""r-x""rw-""rwx"
+
+num2perm()
+{
+ for i in 0 1 2
+ do
+ num=${1:$i:1}
+ printf "%s" ${PERM:$(($num*3)):3}
+ done
+ echo
+}
+
+# Creating test files to test chmod command
+mkdir dir
+touch file
+
+# We don't need to test all 511 permissions
+for u in 0 1 2 3 4 5 6 7
+do
+ for g in 0 3 6
+ do
+ for o in 0 7
+ do
+ if [ "$type" == file ]
+ then
+ type=dir
+ rm -rf "./$type" && mkdir $type
+ DASH=d
+ else
+ type=file
+ rm -f "./$type" && touch $type
+ DASH=-
+ fi
+ DASHES=$(num2perm $u$g$o)
+ testing "chmod $u$g$o $type" "chmod $u$g$o $type &&
+ ls -ld $type | cut -d' ' -f 1 | cut -d. -f 1" "$DASH$DASHES\n" "" ""
+ done
+ done
+done
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod 750 dir 640 file" \
+ "chmod 750 dir 640 file 2>/dev/null ||
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-x---\n-rwxr-x---\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod 666 dir file" \
+ "chmod 666 dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drw-rw-rw-\n-rw-rw-rw-\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod 765 *" "chmod 765 * &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxrw-r-x\n-rwxrw-r-x\n" "" ""
+
+##### u,g,o,a=r,w,x
+rm -rf dir file && mkdir dir && touch file
+testing "chmod u=r dir file" "chmod u=r dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "dr--r-xr-x\n-r--r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod u=w dir file" "chmod u=w dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "d-w-r-xr-x\n--w-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod u=x dir file" "chmod u=x dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "d--xr-xr-x\n---xr--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod u+r dir file" "chmod u+r dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr-x\n-rw-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod u+w dir file" "chmod u+w dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr-x\n-rw-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod u+x dir file" "chmod u+x dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr-x\n-rwxr--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod u-r dir file" "chmod u-r dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "d-wxr-xr-x\n--w-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod u-w dir file" "chmod u-w dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "dr-xr-xr-x\n-r--r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod u-x dir file" "chmod u-x dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drw-r-xr-x\n-rw-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod g=r dir file" "chmod g=r dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr--r-x\n-rw-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod g=w dir file" "chmod g=w dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwx-w-r-x\n-rw--w-r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod g=x dir file" "chmod g=x dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwx--xr-x\n-rw---xr--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod g+r dir file" "chmod g+r dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr-x\n-rw-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod g+w dir file" "chmod g+w dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxrwxr-x\n-rw-rw-r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod g+x dir file" "chmod g+x dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr-x\n-rw-r-xr--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod g-r dir file" "chmod g-r dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwx--xr-x\n-rw----r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod g-w dir file" "chmod g-w dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr-x\n-rw-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod g-x dir file" "chmod g-x dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr--r-x\n-rw-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod o=r dir file" "chmod o=r dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr--\n-rw-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod o=w dir file" "chmod o=w dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-x-w-\n-rw-r---w-\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod o=x dir file" "chmod o=x dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-x--x\n-rw-r----x\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod o+r dir file" "chmod o+r dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr-x\n-rw-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod o+w dir file" "chmod o+w dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xrwx\n-rw-r--rw-\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod o+x dir file" "chmod o+x dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr-x\n-rw-r--r-x\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod o-r dir file" "chmod o-r dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-x--x\n-rw-r-----\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod o-w dir file" "chmod o-w dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr-x\n-rw-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod o-x dir file" "chmod o-x dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr--\n-rw-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod a=r dir file" "chmod a=r dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "dr--r--r--\n-r--r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod a=w dir file" "chmod a=w dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "d-w--w--w-\n--w--w--w-\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod a=x dir file" "chmod a=x dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "d--x--x--x\n---x--x--x\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod a+r dir file" "chmod a+r dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr-x\n-rw-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod a+w dir file" "chmod a+w dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxrwxrwx\n-rw-rw-rw-\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod a+x dir file" "chmod a+x dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr-x\n-rwxr-xr-x\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod a-r dir file" "chmod a-r dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "d-wx--x--x\n--w-------\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod a-w dir file" "chmod a-w dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "dr-xr-xr-x\n-r--r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod a-x dir file" "chmod a-x dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drw-r--r--\n-rw-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod =r dir file" "chmod =r dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "dr--r--r--\n-r--r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod =w dir file" "chmod =w dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "d-w-------\n--w-------\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod =x dir file" "chmod =x dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "d--x--x--x\n---x--x--x\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod +r dir file" "chmod +r dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr-x\n-rw-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod +w dir file" "chmod +w dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr-x\n-rw-r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod +x dir file" "chmod +x dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drwxr-xr-x\n-rwxr-xr-x\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod -r dir file" "chmod -r dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "d-wx--x--x\n--w-------\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod -w dir file" "chmod -w dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "dr-xr-xr-x\n-r--r--r--\n" "" ""
+
+rm -rf dir file && mkdir dir && touch file
+testing "chmod -x dir file" "chmod -x dir file &&
+ ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" "drw-r--r--\n-rw-r--r--\n" "" ""
+
+# Removing test files for cleanup purpose
+rm -rf dir file
diff --git a/tests/cksum.test b/tests/cksum.test
new file mode 100755
index 00000000..152dc12c
--- /dev/null
+++ b/tests/cksum.test
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+
+#testing "name" "command" "result" "infile" "stdin"
+
+# Default behavior on stdin and on files.
+testing "cksum on stdin" "echo -n hello | cksum" "3287646509 5\n" "" ""
+echo -n "hello" > tmpfile
+testing "cksum on file" "cksum tmpfile" "3287646509 5 tmpfile\n" "" ""
+rm -f tmpfile
+touch one two
+testing "cksum on multiple files" "cksum one two" "4294967295 0 one\n4294967295 0 two\n" "" ""
+rm -f one two
+
+# Check the length suppression, both calculate the CRC on 'abc' but the second
+# option has length suppression on and has the length concatenated to 'abc'.
+testing "cksum on abc including length" "echo -n 'abc' | cksum" "1219131554 3\n" "" ""
+testing "cksum on abc excluding length" "echo -ne 'abc\x3' | cksum -N" "1219131554 4\n" "" ""
+
+# cksum on no contents gives 0xffffffff (=4294967295)
+testing "cksum on no data post-inversion" "echo -n "" | cksum" "4294967295 0\n" "" ""
+# If we do preinversion we will then get 0.
+testing "cksum on no data pre+post-inversion" "echo -n "" | cksum -P" "0 0\n" "" ""
+# If we skip the post-inversion we also get 0
+testing "cksum on no data no inversion" "echo -n "" | cksum -I" "0 0\n" "" ""
+# Two wrongs make a right.
+testing "cksum on no data pre-inversion" "echo -n "" | cksum -PI" "4294967295 0\n" "" ""
diff --git a/tests/cmp.test b/tests/cmp.test
new file mode 100755
index 00000000..ef53b37d
--- /dev/null
+++ b/tests/cmp.test
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+testing "cmp not enough arguments [fail]" "cmp input 2>/dev/null || echo yes" "yes\n" "foo" ""
+testing "cmp missing file1 [fail]" "cmp file1 input 2>/dev/null || echo yes" "yes\n" "foo" ""
+
+#mkdir dir
+#testing "cmp directory [fail]" "cmp dir dir 2>/dev/null || echo yes" \
+ #"yes\n" "" ""
+#rmdir dir
+
+echo "ab
+c" > input2
+
+testing "cmp identical files, stdout" "cmp input input2" "" "ab\nc\n" ""
+testing "cmp identical files, return code" "cmp input input2 && echo yes" "yes\n" "ab\nc\n" ""
+
+testing "cmp EOF, stderr" "cmp input input2 2>&1" "cmp: EOF on input2\n" "ab\nc\nx" ""
+testing "cmp EOF, return code" "cmp input input2 2>/dev/null || echo yes" "yes\n" "ab\nc\nx" ""
+# The gnu/dammit version fails this because posix says "char" and they don't.
+testing "cmp diff, stdout" "cmp input input2" "input input2 differ: char 4, line 2\n" "ab\nx\nx" ""
+testing "cmp diff, return code" "cmp input input2 > /dev/null || echo yes" "yes\n" "ab\nx\nx" ""
+
+testing "cmp -s EOF, return code" "cmp -s input input2 || echo yes" "yes\n" "ab\nc\nx" ""
+testing "cmp -s diff, return code" "cmp -s input input2 || echo yes" "yes\n" "ab\nx\nx" ""
+
+testing "cmp -l EOF, stderr" "cmp -l input input2 2>&1" "cmp: EOF on input2\n" "ab\nc\nx" ""
+testing "cmp -l diff and EOF, stdout and stderr" "cmp -l input input2 2>&1 | sort" "4 170 143\ncmp: EOF on input2\n" "ab\nx\nx" ""
+
+rm input2
+
+testing "cmp stdin and file" "cmp input -" "input - differ: char 4, line 2\n" "ab\nc\n" "ab\nx\n"
+#testing "cmp stdin and stdin" "cmp input -" "" "" "ab\nc\n"
+
diff --git a/tests/cp.test b/tests/cp.test
new file mode 100755
index 00000000..43272565
--- /dev/null
+++ b/tests/cp.test
@@ -0,0 +1,101 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+# Create test file
+dd if=/dev/urandom of=random bs=64 count=1 2> /dev/null
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "cp not enough arguments [fail]" "cp one 2>/dev/null || echo yes" \
+ "yes\n" "" ""
+testing "cp -missing source [fail]" "cp missing two 2>/dev/null || echo yes" \
+ "yes\n" "" ""
+testing "cp file->file" "cp random two && cmp random two && echo yes" \
+ "yes\n" "" ""
+rm two
+
+mkdir two
+testing "cp file->dir" "cp random two && cmp random two/random && echo yes" \
+ "yes\n" "" ""
+rm two/random
+testing "cp file->dir/file" \
+ "cp random two/random && cmp random two/random && echo yes" \
+ "yes\n" "" ""
+testing "cp -r dir->missing" \
+ "cp -r two three && cmp random three/random && echo yes" \
+ "yes\n" "" ""
+touch walrus
+testing "cp -r dir->file [fail]" \
+ "cp -r two walrus 2>/dev/null || echo yes" "yes\n" "" ""
+touch two/three
+testing "cp -r dir hits file." \
+ "cp -r three two 2>/dev/null || echo yes" "yes\n" "" ""
+rm -rf two three walrus
+
+touch two
+chmod 000 two
+testing "cp file->inaccessable [fail]" \
+ "cp random two 2>/dev/null || echo yes" "yes\n" "" ""
+rm -f two
+
+touch two
+chmod 000 two
+testing "cp -f file->inaccessable" \
+ "cp -f random two && cmp random two && echo yes" "yes\n" "" ""
+mkdir sub
+chmod 000 sub
+testing "cp file->inaccessable_dir [fail]" \
+ "cp random sub 2>/dev/null || echo yes" "yes\n" "" ""
+rm two
+rmdir sub
+
+# This test fails because our -rf deletes existing target files without
+# regard to what we'd be copying over it. Posix says to only do that if
+# we'd be copying a file over the file, but does not say _why_.
+
+#mkdir dir
+#touch file
+#testing "cp -rf dir file [fail]" "cp -rf dir file 2>/dev/null || echo yes" \
+# "yes\n" "" ""
+#rm -rf dir file
+
+touch one two
+testing "cp file1 file2 missing [fail]" \
+ "cp one two missing 2>/dev/null || echo yes" "yes\n" "" ""
+mkdir dir
+testing "cp dir file missing [fail]" \
+ "cp dir two missing 2>/dev/null || echo yes" "yes\n" "" ""
+testing "cp -rf dir file missing [fail]" \
+ "cp dir two missing 2>/dev/null || echo yes" "yes\n" "" ""
+testing "cp file1 file2 file [fail]" \
+ "cp random one two 2>/dev/null || echo yes" "yes\n" "" ""
+testing "cp file1 file2 dir" \
+ "cp random one dir && cmp random dir/random && cmp one dir/one && echo yes" \
+ "yes\n" "" ""
+rm one two random
+rm -rf dir
+
+mkdir -p one/two/three/four
+touch one/two/three/five
+touch one/{six,seven,eight}
+testing "cp -r /abspath dest" \
+ "cp -r \"$(readlink -f one)\" dir && diff -r one dir && echo yes" \
+ "yes\n" "" ""
+testing "cp -r dir again" "cp -r one/. dir && diff -r one dir && echo yes" \
+ "yes\n" "" ""
+mkdir dir2
+testing "cp -r dir1/* dir2" \
+ "cp -r one/* dir2 && diff -r one dir2 && echo yes" "yes\n" "" ""
+rm -rf one dir dir2
+
+# cp -r ../source destdir
+# cp -r one/two/three missing
+# cp -r one/two/three two
+# mkdir one; touch one/two; ln -s two one/three
+# cp file1 file2 dir
+# cp file1 missing file2 -> dir
+
+# Make sure it's truncating existing file
+# copy with -d at top level, with -d in directory, without -d at top level,
+# without -d in directory
diff --git a/tests/cpio.test b/tests/cpio.test
new file mode 100755
index 00000000..d0528e52
--- /dev/null
+++ b/tests/cpio.test
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+# We need to test name and file padding.
+# This means all possible values of strlen(name)+1 % 4,
+# plus file sizes of at least 0-4.
+
+touch a bb ccc dddd
+testing "cpio name padding" "cpio -o -H newc|cpio -it" "a\nbb\nccc\ndddd\n" "" "a\nbb\nccc\ndddd\n"
+rm a bb ccc dddd
+
+touch a
+printf '1' >b
+printf '22' >c
+printf '333' >d
+testing "cpio file padding" "cpio -o -H newc|cpio -it" "a\nb\nc\nd\n" "" "a\nb\nc\nd\n"
+rm a b c d
+
+touch a
+printf '1' >bb
+printf '22' >ccc
+printf '333' >dddd
+# With the proper padding, header length, and file length,
+# the relevant bit should be here:
+# 110*5 + 4*3 + 2 + 6*3 = 550 + 12 + 20 = 582
+# files are padded to n*4, names are padded to 2 + n*4 due to the header length
+testing "cpio archive length" "cpio -o -H newc|dd ibs=2 skip=291 count=5" "TRAILER!!!" "" "a\nbb\nccc\ndddd\n"
+testing "cpio archive magic" "cpio -o -H newc|dd ibs=2 count=3" "070701" "" "a\n"
+# check name length (8 bytes before the empty "crc")
+testing "cpio name length" "cpio -o -H newc|dd ibs=2 skip=47 count=4" "00000002" "" "a\n"
+rm a bb ccc dddd
+
+# archive dangling symlinks and empty files even if we cannot open them
+touch a; chmod a-rwx a; ln -s a/cant b
+testing "cpio archives unreadable empty files" "cpio -o -H newc|cpio -it" "a\nb\n" "" "a\nb\n"
+chmod u+rw a; rm -f a b
+
+
diff --git a/tests/cut.test b/tests/cut.test
new file mode 100644
index 00000000..a0019527
--- /dev/null
+++ b/tests/cut.test
@@ -0,0 +1,47 @@
+#!/bin/bash
+
+# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
+# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
+# Copyright 2013 Kyungwan.Han <asura321@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+#set -x
+
+# Creating test file for testing cut
+echo "one:two:three:four:five:six:seven
+alpha:beta:gamma:delta:epsilon:zeta:eta:teta:iota:kappa:lambda:mu
+the quick brown fox jumps over the lazy dog" >abc.txt
+
+testing "cut with -c (a-b)" "cut -c 4-10 abc.txt" ":two:th\nha:beta\n quick \n" "" ""
+testing "cut with -f (a-)" "cut -d ':' -f 5- abc.txt" "five:six:seven\nepsilon:zeta:eta:teta:iota:kappa:lambda:mu\nthe quick brown fox jumps over the lazy dog\n" "" ""
+
+testing "cut with -f (a)" "cut -d ' ' -f 3 abc.txt" "one:two:three:four:five:six:seven\nalpha:beta:gamma:delta:epsilon:zeta:eta:teta:iota:kappa:lambda:mu\nbrown\n" "" ""
+
+testing "cut with echo, -c (a-b)" "echo 'ref_categorie=test' | cut -c 1-15 " "ref_categorie=t\n" "" ""
+testing "cut with echo, -c (a)" "echo 'ref_categorie=test' | cut -c 14" "=\n" "" ""
+
+# Modifying abc.txt data as per new testcase
+echo "abcdefghijklmnopqrstuvwxyz" >abc.txt
+
+testing "cut with -c (a,b,c)" "cut -c 4,5,20 abc.txt" "det\n" "" ""
+
+testing "cut with -b (a,b,c)" "cut -b 4,5,20 abc.txt" "det\n" "" ""
+
+# Modifying abc.txt data as per testcase
+echo "406378:Sales:Itorre:Jan
+031762:Marketing:Nasium:Jim
+636496:Research:Ancholie:Mel
+396082:Sales:Jucacion:Ed" >abc.txt
+
+testing "cut with -d -f(:) -s" "cut -d: -f3 -s abc.txt" "Itorre\nNasium\nAncholie\nJucacion\n" "" ""
+
+testing "cut with -d -f( ) -s" "cut -d' ' -f3 -s abc.txt && echo yes" "yes\n" "" ""
+
+testing "cut with -d -f(a) -s" "cut -da -f3 -s abc.txt" "n\nsium:Jim\n\ncion:Ed\n" "" ""
+
+testing "cut with -d -f(a) -s -n" "cut -da -f3 -s -n abc.txt" "n\nsium:Jim\n\ncion:Ed\n" "" ""
+
+# Removing abc.txt file for cleanup purpose
+rm abc.txt
diff --git a/tests/dd.test b/tests/dd.test
new file mode 100644
index 00000000..9bdcac5b
--- /dev/null
+++ b/tests/dd.test
@@ -0,0 +1,83 @@
+#!/bin/bash
+
+# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
+# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+# 'dd' command, stderr prints redirecting to /dev/null
+opt="2>/dev/null"
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "dd if=(file)" "dd if=input $opt" "I WANT\n" "I WANT\n" ""
+testing "dd of=(file)" "dd of=file $opt && cat file" "I WANT\n" "" "I WANT\n"
+testing "dd if=file of=file" "dd if=input of=foo $opt && cat foo && rm -f foo" \
+ "I WANT\n" "I WANT\n" ""
+testing "dd if=file | dd of=file" "dd if=input $opt | dd of=foo $opt &&
+ cat foo && rm -f foo" "I WANT\n" "I WANT\n" ""
+testing "dd (stdout)" "dd $opt" "I WANT\n" "" "I WANT\n"
+testing "dd sync,noerror" \
+ "dd if=input of=outFile seek=8860 bs=1M conv=sync,noerror $opt &&
+ stat -c \"%s\" outFile && rm -f outFile" "9291431936\n" "I WANT\n" ""
+testing "dd if=file of=(null)" \
+ "dd if=input of=/dev/null $opt && echo 'yes'" "yes\n" "I WANT\n" ""
+testing "dd with if of bs" \
+ "dd if=/dev/zero of=sda.txt bs=512 count=1 $opt &&
+ stat -c '%s' sda.txt && rm -f sda.txt" "512\n" "" ""
+testing "dd with if of ibs obs" \
+ "dd if=/dev/zero of=sda.txt ibs=512 obs=256 count=1 $opt &&
+ stat -c '%s' sda.txt && rm -f sda.txt" "512\n" "" ""
+testing "dd with if of ibs obs count" \
+ "dd if=/dev/zero of=sda.txt ibs=512 obs=256 count=3 $opt &&
+ stat -c '%s' sda.txt && rm -f sda.txt" "1536\n" "" ""
+
+ln -s input softlink
+testing "dd if=softlink" "dd if=softlink $opt" "I WANT\n" "I WANT\n" ""
+unlink softlink
+
+ln -s file softlink
+testing "dd if=file of=softlink" "dd if=input of=softlink $opt &&
+ [ -f file -a -L softlink ] && cat softlink" "I WANT\n" "I WANT\n" ""
+unlink softlink && rm -f file
+
+testing "dd if=file of=file (same file)" "dd if=input of=input $opt &&
+ [ -f input ] && cat input && echo 'yes'" "yes\n" "I WANT\n" ""
+
+testing "dd with ibs obs bs" "dd ibs=2 obs=5 bs=9 $opt" "I WANT\n" "" "I WANT\n"
+testing "dd with ibs obs bs if" "dd ibs=2 obs=5 bs=9 if=input $opt" \
+ "I WANT\n" "I WANT\n" ""
+
+testing "dd with ibs obs count" "dd ibs=1 obs=1 count=1 $opt" "I" "" "I WANT\n"
+testing "dd with ibs obs count if" "dd ibs=1 obs=1 count=3 if=input $opt" \
+ "I W" "I WANT\n" ""
+
+testing "dd with count" "dd count=1 $opt" "I WANT\n" "" "I WANT\n"
+testing "dd with count if" "dd count=1 if=input $opt" "I WANT\n" "I WANT\n" ""
+
+testing "dd with skip" "dd skip=0 $opt" "I WANT\n" "" "I WANT\n"
+testing "dd with skip if" "dd skip=0 if=input $opt" "I WANT\n" "I WANT\n" ""
+
+testing "dd with seek" "dd seek=0 $opt" "I WANT\n" "" "I WANT\n"
+testing "dd with seek if" "dd seek=0 if=input $opt" "I WANT\n" "I WANT\n" ""
+
+# These type of conv is not supported in toybox: 'ascii', 'ebcdic', 'ibm',
+# 'block', 'unblock', 'nocreat', 'notronc', 'lcase', 'ucase', 'excl', 'swab'
+
+# Testing only 'notrunc', 'noerror', 'fsync', 'sync'
+
+testing "dd conv=notrunc" "dd conv=notrunc $opt" "I WANT\n" "" "I WANT\n"
+testing "dd conv=notrunc with IF" "dd conv=notrunc if=input $opt" "I WANT\n" \
+ "I WANT\n" ""
+
+testing "dd conv=noerror" "dd conv=noerror $opt" "I WANT\n" "" "I WANT\n"
+testing "dd conv=noerror with IF" "dd conv=noerror if=input $opt" "I WANT\n" \
+ "I WANT\n" ""
+
+testing "dd conv=fsync" "dd conv=fsync $opt" "I WANT\n" "" "I WANT\n"
+testing "dd conv=fsync with IF" "dd conv=fsync if=input $opt" "I WANT\n" \
+ "I WANT\n" ""
+
+testing "dd conv=sync" "dd conv=sync $opt | head -n 1" "I WANT\n" "" "I WANT\n"
+testing "dd conv=sync with IF" "dd conv=sync if=input $opt | head -n 1" "I WANT\n" \
+ "I WANT\n" ""
diff --git a/tests/dirname.test b/tests/dirname.test
new file mode 100755
index 00000000..a0075384
--- /dev/null
+++ b/tests/dirname.test
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "dirname /-only" "dirname ///////" "/\n" "" ""
+testing "dirname trailing /" "dirname a//////" ".\n" "" ""
+testing "dirname combined" "dirname /////a///b///c///d/////" "/////a///b///c\n" "" ""
+testing "dirname /a/" "dirname /////a///" "/\n" "" ""
diff --git a/tests/du.test b/tests/du.test
new file mode 100755
index 00000000..ee4867b8
--- /dev/null
+++ b/tests/du.test
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+# we only test with -k since getting POSIX version is variable
+# POSIXLY_CORRECT is sometimes needed, sometimes -P is needed,
+# while -k is the default on most Linux systems
+
+mkdir -p du_test/test du_2/foo
+testing "du (no options)" "du -k du_test" "4\tdu_test/test\n8\tdu_test\n" "" ""
+testing "du -s" "du -k -s du_test" "8\tdu_test\n" "" ""
+ln -s ../du_2 du_test/xyz
+# "du shall count the size of the symbolic link"
+# I assume this means the space used to store the link name
+testing "du counts symlinks without following" "du -ks du_test" "12\tdu_test\n" "" ""
+testing "du -L follows symlinks" "du -ksL du_test" "16\tdu_test\n" "" ""
+# if -H and -L are specified, the last takes priority
+testing "du -HL follows symlinks" "du -ksHL du_test" "16\tdu_test\n" "" ""
+testing "du -H does not follow unspecified symlinks" "du -ksH du_test" "12\tdu_test\n" "" ""
+testing "du -LH does not follow unspecified symlinks" "du -ksLH du_test" "12\tdu_test\n" "" ""
+testing "du -H follows specified symlinks" "du -ksH du_test/xyz" "8\tdu_test/xyz\n" "" ""
+
+rm -rf du_test du_2
+
diff --git a/tests/echo.test b/tests/echo.test
new file mode 100755
index 00000000..3f562fd8
--- /dev/null
+++ b/tests/echo.test
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+# This one's tricky both because echo is a shell builtin (so $PATH is
+# irrelevant) and because the "result" field is parsed with echo -e.
+# To make it work, "$CMD" is an explicit path to the command being tested,
+# so "result" keeps using the shell builtin but we test the one in toybox.
+
+CMD="$(which echo)"
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "echo" "$CMD && echo yes" "\nyes\n" "" ""
+testing "echo 1 2 3" "$CMD one two three" "one two three\n" "" ""
+testing "echo with spaces" "$CMD 'one two three'" \
+ "one two three\n" "" ""
+testing "echo -n" "$CMD -n" "" "" ""
+testing "echo -n one" "$CMD -n one" "one" "" ""
+testing "echo one -n" "$CMD one -n" "one -n\n" "" ""
+testing "echo -en" "$CMD -en 'one\ntwo'" "one\ntwo" "" ""
+testing "echo --hello" "$CMD --hello" "--hello\n" "" ""
+testing "echo -e all" "$CMD -e '\a\b\c\f\n\r\t\v\\\0123'" \
+ "\a\b\c\f\n\r\t\v\\\0123\n" "" ""
+testing "echo -nex hello" "$CMD -nex hello" "-nex hello\n" "" ""
+
+# Octal formatting tests
+testing "echo -e octal values" \
+ "$CMD -ne '\01234 \0060 \060 \0130\0131\0132 \077\012'" \
+ "S4 0 0 XYZ ?\n" "" ""
+
+# Hexadecimal value tests
+testing "echo -e hexadecimal values" \
+ "$CMD -ne '\x534 \x30 \x58\x59\x5a \x3F\x0A'"\
+ "S4 0 XYZ ?\n" "" ""
+
+testing "echo -e \p" "$CMD -e '\\p'" "\\p\n" "" ""
diff --git a/tests/expand.test b/tests/expand.test
new file mode 100755
index 00000000..510f89f5
--- /dev/null
+++ b/tests/expand.test
@@ -0,0 +1,44 @@
+#!/bin/bash
+
+# POSIX 2008 compliant expand tests.
+# Copyright 2012 by Jonathan Clairembault <jonathan@clairembault.fr>
+
+[ -f testing.sh ] && . testing.sh
+
+# some basic tests
+
+testing "expand default" "expand input" " foo bar\n" "\tfoo\tbar\n" ""
+testing "expand default stdin" "expand" " foo bar\n" "" "\tfoo\tbar\n"
+testing "expand single" "expand -t 2 input" " foo bar\n" "\tfoo\tbar\n" ""
+testing "expand tablist" "expand -t 5,10,12 input" " foo bar foo\n" "\tfoo\tbar\tfoo\n" ""
+testing "expand backspace" "expand input" "foobarfoo\b\b bar\n" "foobarfoo\b\b\tbar\n" ""
+
+# advanced tests
+
+POW=15
+TABSTOP=1
+BIGTAB=" "
+for i in $(seq $POW); do
+ BIGTAB=$BIGTAB$BIGTAB
+ TABSTOP=$[$TABSTOP*2]
+done
+testing "expand long tab single" "expand -t $TABSTOP input" "${BIGTAB}foo\n" "\tfoo\n" ""
+testing "expand long tab tablist" "expand -t $TABSTOP,$[TABSTOP+5] input" \
+ "${BIGTAB}foo bar\n" "\tfoo\tbar\n" ""
+
+testing "expand multiline single" "expand -t 4 input" "foo \n bar\n" "foo\t\n\tbar\n" ""
+testing "expand multiline tablist" "expand -t 4,8 input" \
+ "foo bar\n bar foo\n" "foo\t\tbar\n\tbar\tfoo\n" ""
+POW=15
+BIGLINE="foo "
+for i in $(seq $POW); do
+ BIGLINE=$BIGLINE$BIGLINE
+done
+if [ $POW -gt 0 ]; then
+ EXPANDLINE="${BIGLINE} foo\n"
+else
+ EXPANDLINE="${BIGLINE} foo\n"
+fi
+BIGLINE="${BIGLINE}\tfoo\n"
+testing "expand long line single" "expand input" \
+ "${EXPANDLINE}" "$BIGLINE" ""
diff --git a/tests/expr.test b/tests/expr.test
new file mode 100644
index 00000000..cce7d9d0
--- /dev/null
+++ b/tests/expr.test
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+testing "expr integer" "expr 5" "5\n" "" ""
+testing "expr integer negative" "expr -5" "-5\n" "" ""
+testing "expr string" "expr astring" "astring\n" "" ""
+testing "expr 1 + 3" "expr 1 + 3" "4\n" "" ""
+testing "expr 5 + 6 * 3" "expr 5 + 6 \* 3" "23\n" "" ""
+testing "expr ( 5 + 6 ) * 3" "expr \( 5 + 6 \) \* 3" "33\n" "" ""
diff --git a/tests/factor.test b/tests/factor.test
new file mode 100755
index 00000000..a3e4cbf8
--- /dev/null
+++ b/tests/factor.test
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "factor -32" "factor -32" "-32: -1 2 2 2 2 2\n" "" ""
+testing "factor 0" "factor 0" "0: 0\n" "" ""
+testing "factor 1" "factor 1" "1: 1\n" "" ""
+testing "factor 2" "factor 2" "2: 2\n" "" ""
+testing "factor 3" "factor 3" "3: 3\n" "" ""
+testing "factor 4" "factor 4" "4: 2 2\n" "" ""
+testing "factor 10000000017" "factor 10000000017" \
+ "10000000017: 3 3 3 7 7 7 1079797\n" "" ""
+testing "factor 10000000018" "factor 10000000018" \
+ "10000000018: 2 131 521 73259\n" "" ""
+testing "factor 10000000019" "factor 10000000019" \
+ "10000000019: 10000000019\n" "" ""
diff --git a/tests/find.test b/tests/find.test
new file mode 100644
index 00000000..cbbce5fd
--- /dev/null
+++ b/tests/find.test
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+mkdir dir
+cd dir
+touch file
+mkfifo fifo
+ln -s fifo link
+cd ..
+
+#testing "name" "command" "result" "infile" "stdin"
+
+# Testing operators
+
+testing "find -type l -a -type d -o -type p" \
+ "find dir -type l -a -type d -o -type p" "dir/fifo\n" "" ""
+testing "find -type l -type d -o -type p" "find dir -type l -type d -o -type p" \
+ "dir/fifo\n" "" ""
+testing "find -type l -o -type d -a -type p" \
+ "find dir -type l -o -type d -a -type p" "dir/link\n" "" ""
+testing "find -type l -o -type d -type p" "find dir -type l -o -type d -type p" \
+ "dir/link\n" "" ""
+testing "find -type l ( -type d -o -type l )" \
+ "find dir -type l \( -type d -o -type l \)" "dir/link\n" "" ""
+testing "find extra parantheses" \
+ "find dir \( \( -type l \) \( -type d -o \( \( -type l \) \) \) \)" \
+ "dir/link\n" "" ""
+testing "find ( -type p -o -type d ) -type p" \
+ "find dir \( -type p -o -type d \) -type p" "dir/fifo\n" "" ""
+testing "find -type l -o -type d -type p -o -type f" \
+ "find dir -type l -o -type d -type p -o -type f | sort" \
+ "dir/file\ndir/link\n" "" ""
+
+# Testing short-circuit evaluations
+
+testing "find -type f -a -print" \
+ "find dir -type f -a -print" "dir/file\n" "" ""
+testing "find -print -o -print" \
+ "find dir -type f -a \( -print -o -print \)" "dir/file\n" "" ""
+
+rm -rf dir
diff --git a/tests/grep.test b/tests/grep.test
new file mode 100755
index 00000000..13b1af78
--- /dev/null
+++ b/tests/grep.test
@@ -0,0 +1,98 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+# Copyright 2013 by Kyungsu Kim <kaspyx@gmail.com>
+# Copyright 2013 by Kyungwan Han <asura321@gmail.com>
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "grep -c" "grep -c 123 input" "3\n" "123\ncount 123\n123\nfasdfasdf" ""
+
+echo -e "this is test" > foo
+echo -e "this is test2" > foo2
+echo -e "this is foo3" > foo3
+testing "grep -l" "grep -l test foo foo2 foo3" "foo\nfoo2\n" "" ""
+rm foo foo2 foo3
+
+testing "grep -q" "grep -q test input && echo yes" "yes\n" "this is a test\n" ""
+testing "grep -E" "grep -E '[0-9]' input" "1234123asdfas123123\n1\n" \
+ "1234123asdfas123123\nabc\n1\nabcde" ""
+testing "grep -e" "grep -e '[0-9]' input" "1234123asdfas123123\n1\n" \
+ "1234123asdfas123123\nabc\n1\nabcde" ""
+testing "grep -e -e" "grep -e one -e two -e three input" \
+ "two\ntwo\nthree\none\n" "two\ntwo\nthree\nand\none\n" ""
+testing "grep -F" "grep -F is input" "this is test\nthis is test2\n" \
+ "this is test\nthis is test2\ntest case" ""
+
+echo -e "this is test\nthis is test2\ntest case" > foo
+echo -e "hello this is test" > foo2
+echo -e "hi hello" > foo3
+testing "grep -H" "grep -H is foo foo2 foo3" "foo:this is test\nfoo:this is test2\nfoo2:hello this is test\n" "" ""
+rm foo foo2 foo3
+
+testing "grep -b" "grep -b is input" "0:this is test\n13:this is test2\n" \
+ "this is test\nthis is test2\ntest case" ""
+testing "grep -i" "grep -i is input" "thisIs test\nthis is test2\n" \
+ "thisIs test\nthis is test2\ntest case" ""
+testing "grep -n" "grep -n is input" "1:this is test\n2:this is test2\n" \
+ "this is test\nthis is test2\ntest case" ""
+testing "grep -o" "grep -o is input" "is\nis\nis\nis\n" \
+ "this is test\nthis is test2\ntest case" ""
+testing "grep -s" "grep -hs hello asdf input 2>&1" "hello\n" "hello\n" ""
+testing "grep -v" "grep -v abc input" "1234123asdfas123123\n1ABa\n" \
+ "1234123asdfas123123\n1ABabc\nabc\n1ABa\nabcde" ""
+testing "grep -w" "grep -w abc input" "abc\n" \
+ "1234123asdfas123123\n1ABabc\nabc\n1ABa\nabcde" ""
+testing "grep -x" "grep -x abc input" "abc\n" \
+ "aabcc\nabc\n" ""
+
+testing "grep -H (standard input)" "grep -H abc" "(standard input):abc\n" \
+ "" "abc\n"
+testing "grep -l (standard input)" "grep -l abc" "(standard input)\n" \
+ "" "abc\n"
+testing "grep -n two inputs" "grep -hn def - input" "2:def\n2:def\n" \
+ "abc\ndef\n" "abc\ndef\n"
+
+testing "grep pattern with newline" "grep 'abc
+def' input" "aabcc\nddeff\n" \
+ "aaaa\naabcc\n\dddd\nddeff\nffff\n" ""
+
+testing "grep -lH" "grep -lH abc input" "input\n" "abc\n" ""
+testing "grep -cn" "grep -cn abc input" "1\n" "abc\n" ""
+testing "grep -qs" "grep -qs abc none input && echo yes" "yes\n" "abc\n" ""
+testing "grep -hl" "grep -hl abc input" "input\n" "abc\n" ""
+testing "grep -b stdin" "grep -b one" "0:one\n4:one\n8:one\n" "" "one\none\none\n"
+testing "grep -o overlap" "grep -bo aaa" "1:aaa\n" "" "baaaa\n"
+# nonobvious: -co counts lines, not matches
+testing "grep -co" "grep -co one input" "1\n" "one one one\n" ""
+testing "grep -nom" "grep -nom 2 one" "1:one\n1:one\n1:one\n2:one\n2:one\n" \
+ "" "one one one\none one\none"
+testing "grep -vo" "grep -vo one input" "two\nthree\n" "onetwoonethreeone\n" ""
+testing "grep no newline" "grep -h one input -" \
+ "hello one\nthere one\n" "hello one" "there one"
+
+testing "grep -e multi" "grep -e one -ethree input" \
+ "three\none\n" "three\ntwo\none\n" ""
+# Suppress filenames for recursive test because dunno order they'd occur in
+mkdir sub
+echo -e "one\ntwo\nthree" > sub/one
+echo -e "three\ntwo\none" > sub/two
+testing "grep -hr" "grep -hr one sub" "one\none\n" "" ""
+testing "grep -r file" "grep -r three sub/two" "three\n" "" ""
+testing "grep -r dir" "grep -r one sub | sort" "sub/one:one\nsub/two:one\n" \
+ "" ""
+rm -rf sub
+
+# Not sure if -Fx '' should do? Posix is unclear, '' match every line but does
+# it match every _byte_ in that line?
+testing "grep -Fx ''" "grep -Fx '' input" "one one one\n" "one one one\n" ""
+testing "grep -F ''" "grep -F '' input" "one one one\n" "one one one\n" ""
+testing "grep -F -e blah -e ''" "grep -F -e blah -e '' input" "one one one\n" \
+ "one one one\n" ""
+testing "grep -e blah -e ''" "grep -e blah -e '' input" "one one one\n" \
+ "one one one\n" ""
+testing "grep -w ''" "grep -w '' input" "" "one one one\n" ""
+testing "grep -o ''" "grep -o '' input" "" "one one one\n" ""
+testing "grep backref" 'grep -e "a\(b\)" -e "b\(c\)\1"' "bcc\nab\n" \
+ "" "bcc\nbcb\nab\n"
diff --git a/tests/groupadd.test b/tests/groupadd.test
new file mode 100644
index 00000000..0395e01a
--- /dev/null
+++ b/tests/groupadd.test
@@ -0,0 +1,56 @@
+#!/bin/bash
+# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
+# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+# 70 characters long string; hereafter, we will use it as per our need.
+_s70="abcdefghijklmnopqrstuvwxyz123456789abcdefghijklmnopqrstuvwxyz123456789"
+
+echo "# usage: addgroup [-g GID] [USER] GROUP
+# Add a group or add a user to a group."
+
+# Redirecting all output to /dev/null for grep and delgroup
+arg="&>/dev/null"
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "groupadd group_name (text)" "groupadd toyTestGroup &&
+ grep '^toyTestGroup:' /etc/group $arg && groupdel toyTestGroup $arg &&
+ echo 'yes'" "yes\n" "" ""
+testing "groupadd group_name (alphanumeric)" "groupadd toy1Test2Group3 &&
+ grep '^toy1Test2Group3:' /etc/group $arg && groupdel toy1Test2Group3 $arg &&
+ echo 'yes'" "yes\n" "" ""
+testing "groupadd group_name (numeric)" "groupadd 987654321 &&
+ grep '^987654321:' /etc/group $arg && groupdel 987654321 $arg &&
+ echo 'yes'" "yes\n" "" ""
+testing "groupadd group_name (with ./-)" "groupadd toy.1Test-2Group.3 &&
+ grep '^toy.1Test-2Group.3:' /etc/group $arg &&
+ groupdel toy.1Test-2Group.3 $arg && echo 'yes'" "yes\n" "" ""
+
+_s210=`echo $_s70$_s70$_s70`
+testing "groupadd group_name (long string)" "groupadd $_s210 &&
+ grep '^$_s210:' /etc/group $arg && groupdel $_s210 $arg && echo 'yes'" \
+ "yes\n" "" ""
+testing "groupadd group_name with group_id" "groupadd -g 49999 toyTestGroup &&
+ grep '^toyTestGroup:' /etc/group $arg && groupdel toyTestGroup $arg &&
+ echo 'yes'" "yes\n" "" ""
+testing "groupadd group_name with group_id (system_group)" \
+ "groupadd -g 49999 -S toyTestGroup && grep '^toyTestGroup:' /etc/group $arg &&
+ groupdel toyTestGroup $arg && echo 'yes'" "yes\n" "" ""
+testing "groupadd group_name (system_group)" "groupadd -S toyTestGroup &&
+ grep '^toyTestGroup:' /etc/group $arg && groupdel toyTestGroup $arg &&
+ echo 'yes'" "yes\n" "" ""
+testing "groupadd group_name (add/del user)" "groupadd toyTestGroup &&
+ grep '^toyTestGroup:' /etc/group $arg && groupadd $USER toyTestGroup &&
+ grep '^toyTestGroup:.*:.*:.*$USER.*' /etc/group $arg &&
+ groupdel $USER toyTestGroup $arg || groupdel toyTestGroup &&
+ grep '^toyTestGroup:' /etc/group $arg || echo 'yes'" "yes\n" "" ""
+
+ echo "Testing to add single group multiple times after removing it..."
+ for each in {01..20}
+ do
+ testing "groupadd group_name ($each)" "groupadd toyTestGroup &&
+ grep '^toyTestGroup:' /etc/group $arg && groupdel toyTestGroup $arg &&
+ echo 'yes'" "yes\n" "" ""
+ done
diff --git a/tests/groupdel.test b/tests/groupdel.test
new file mode 100644
index 00000000..d46db53c
--- /dev/null
+++ b/tests/groupdel.test
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
+# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+# Redirecting all output to /dev/null for grep and delgroup
+arg="&>/dev/null"
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "groupadd group_name (text)" "groupadd toyTestGroup &&
+ grep '^toyTestGroup:' /etc/group $arg && groupdel toyTestGroup $arg &&
+ echo 'yes'" "yes\n" "" ""
+testing "groupadd group_name (alphanumeric)" "groupadd toy1Test2Group3 &&
+ grep '^toy1Test2Group3:' /etc/group $arg && groupdel toy1Test2Group3 $arg &&
+ echo 'yes'" "yes\n" "" ""
+testing "groupadd group_name (numeric)" "groupadd 987654321 &&
+ grep '^987654321:' /etc/group $arg && groupdel 987654321 $arg &&
+ echo 'yes'" "yes\n" "" ""
+testing "groupadd group_name (with ./-)" "groupadd toy.1Test-2Group.3 &&
+ grep '^toy.1Test-2Group.3:' /etc/group $arg &&
+ groupdel toy.1Test-2Group.3 $arg && echo 'yes'" "yes\n" "" ""
+testing "groupadd group_name with group_id" "groupadd -g 49999 toyTestGroup &&
+ grep '^toyTestGroup:' /etc/group $arg && groupdel toyTestGroup $arg &&
+ echo 'yes'" "yes\n" "" ""
diff --git a/tests/head.test b/tests/head.test
new file mode 100755
index 00000000..eeb07e00
--- /dev/null
+++ b/tests/head.test
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "head, stdin" "head -n 1 && echo yes" "one\nyes\n" "" "one\ntwo"
+testing "head, stdin via -" "head -n 1 - && echo yes" "one\nyes\n" "" "one\ntwo"
+testing "head, file" "head input -n 1 && echo yes" "one\nyes\n" "one\ntwo" ""
+testing "head, default lines" "head" "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n" "" "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12"
+
+echo "foo
+bar
+baz" > file1
+testing "head, multiple files" "head -n 2 input file1" "==> input <==\none\ntwo\n\n==> file1 <==\nfoo\nbar\n" "one\ntwo\nthree\n" ""
+rm file1
+
diff --git a/tests/hostname.test b/tests/hostname.test
new file mode 100644
index 00000000..11948458
--- /dev/null
+++ b/tests/hostname.test
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+# Copyright 2014 Divya Kothari <divya.s.kothari@gmail.com>
+# Copyright 2014 Naha Maggu <maggu.neha@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+# Get system hostname
+hostnameExe=`which hostname`
+hostnameOut=`$hostnameExe`
+
+# New hostname
+NewHostname="NewHostName.system"
+
+testing "Hostname - Get" "hostname" "$hostnameOut\n" "" ""
+testing "Hostname - Set, Get and then Reset" "hostname $NewHostname; hostname; hostname $hostnameOut; hostname" "$NewHostname\n$hostnameOut\n" "" ""
diff --git a/tests/link.test b/tests/link.test
new file mode 100755
index 00000000..769a7b67
--- /dev/null
+++ b/tests/link.test
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# Copyright 2014 Divya Kothari <divya.s.kothari@gmail.com>
+# Copyright 2014 Naha Maggu <maggu.neha@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+echo "" >foo
+testing "link fails on non-existent file" "link foo/foo baz || echo GOOD" "GOOD\n" "" ""
+rm -f foo bar
+
+echo file1 > file
+testing "ln create_hardlink" "link file hlink && [ file -ef hlink ] &&
+ echo 'yes'; rm -rf hlink" "yes\n" "" ""
+
+echo hlink1 > hlink
+set +e
+testing "ln preserves_hardlinks" "link file hlink 2>/dev/null || echo 'yes'; rm -rf hlink" \
+ "yes\n" "" ""
+
+echo file1 > file
+testing "ln create_hardlink_and_remove_sourcefile" "link file hlink &&
+ [ file -ef hlink ] && rm -rf file && [ -f hlink ] && echo 'yes'; rm -f file hlink" \
+ "yes\n" "" ""
diff --git a/tests/ln.test b/tests/ln.test
new file mode 100644
index 00000000..aea3ab04
--- /dev/null
+++ b/tests/ln.test
@@ -0,0 +1,70 @@
+#!/bin/bash
+
+# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
+# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+#set -x
+
+echo file1 > file
+testing "ln create_hardlink" "ln file hlink && [ file -ef hlink ] &&
+ echo 'yes'" "yes\n" "" ""
+testing "ln create_softlink" "ln -s file slink && [ -L slink ] &&
+ readlink slink" "file\n" "" ""
+rm slink hlink
+
+echo hlink1 > hlink
+testing "ln force_create_hardlink" "ln -f file hlink &&
+ [ file -ef hlink ] && cat hlink 2>/dev/null" "file1\n" "" ""
+
+echo slink1 > slink
+testing "ln force_create_softlink" "ln -f -s file slink &&
+ [ -L slink ] && readlink slink" "file\n" "" ""
+rm slink hlink
+
+echo hlink1 > hlink
+set +e
+testing "ln preserves_hardlinks" "ln file hlink 2>/dev/null || echo 'yes'" \
+ "yes\n" "" ""
+
+echo slink1 > slink
+set +e
+testing "ln preserves_softlinks" "ln -s file slink 2>/dev/null || echo 'yes'" \
+ "yes\n" "" ""
+rm slink hlink
+
+mkdir dir
+testing "ln multilevel_symbolic_links" "ln -s dir slink &&
+ ln -s file slink && [ -L slink -a -L slink/file ] &&
+ readlink slink && readlink slink/file" "dir\nfile\n" "" ""
+rm slink
+
+testing "ln no_dereference" "ln -s dir slink &&
+ ln -n -s file slink 2>/dev/null || [ -L slink ] && readlink slink" \
+ "dir\n" "" ""
+rm -rf file dir slink
+
+touch file1 file2 && mkdir dir
+testing "ln create_multiple_hardlinks" "ln file* dir/ &&
+ [ file1 -ef dir/file1 -a file2 -ef dir/file2 ] && echo 'yes'" "yes\n" "" ""
+rm -rf file* dir
+
+touch file1 file2 && mkdir dir
+testing "ln create_multiple_softlinks" "ln -s file* dir/ &&
+ [ -L dir/file1 -a -L dir/file2 ] && readlink dir/file1 &&
+ readlink dir/file2" "file1\nfile2\n" "" ""
+rm -rf file* dir
+
+echo file1 > file
+testing "ln create_softlink_and_remove_sourcefile" "ln -s file slink &&
+ [ -L slink ] && rm file && cat slink 2>/dev/null || echo 'yes' " \
+ "yes\n" "" ""
+rm -f file slink
+
+echo file1 > file
+testing "ln create_hardlink_and_remove_sourcefile" "ln file hlink &&
+ [ file -ef hlink ] && rm file && [ -f hlink ] && echo 'yes'" \
+ "yes\n" "" ""
+rm -f file hlink
diff --git a/tests/losetup.test b/tests/losetup.test
new file mode 100755
index 00000000..fe1e5206
--- /dev/null
+++ b/tests/losetup.test
@@ -0,0 +1,46 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+if [ "$(id -u)" -ne 0 ]
+then
+ echo "SKIPPED: losetup (not root)"
+ continue 2>/dev/null
+ exit
+fi
+
+#testing "name" "command" "result" "infile" "stdin"
+
+truncate -s 1M blah.img &&
+FILE="$(readlink -f blah.img)"
+DEV="$(printf '%04d' $(stat -t blah.img | awk '{print $7}'))"
+NODE="$(awk '{print $7}')"
+
+losetup -f
+losetup -f -s
+losetup -f file
+testing "cat" "cat && echo yes" "oneyes\n" "" "one"
+testing "cat -" "cat - && echo yes" "oneyes\n" "" "one"
+testing "cat file1 file2" "cat file1 file2" "one\ntwo\n" "" ""
+testing "cat - file" "cat - file1" "zero\none\n" "" "zero\n"
+testing "cat file -" "cat file1 -" "one\nzero\n" "" "zero\n"
+
+testing "cat file1 notfound file2" \
+ "cat file1 notfound file2 2>stderr && echo ok ; cat stderr; rm stderr" \
+ "one\ntwo\ncat: notfound: No such file or directory\n" "" ""
+
+testing "cat file1" \
+ "cat /proc/self/exe > file1 && cmp /proc/self/exe file1 && echo yes" \
+ "yes\n" "" ""
+
+testing "cat - file1" \
+ "cat - file1 | diff -a -U 0 - file1 | tail -n 1" \
+ "-hello\n" "" "hello\n"
+
+testing "cat > /dev/full" \
+ "cat - > /dev/full 2>stderr && echo ok; cat stderr; rm stderr" \
+ "cat: xwrite: No space left on device\n" "" "zero\n"
+
+losetup -d
+
+rm blah.img
diff --git a/tests/ls.test b/tests/ls.test
new file mode 100644
index 00000000..d052f13a
--- /dev/null
+++ b/tests/ls.test
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
+# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+#set -x
+
+# Creating test-file/dir for testing ls
+mkdir -p lstest/dir1 lstest/dir2 || exit 1
+echo "test file1" > lstest/file1.txt
+echo "test file2" > lstest/file2.txt
+echo "hidden file1" > lstest/.hfile1
+
+IN="cd lstest"
+OUT="cd .. "
+
+testing "ls no argument" "$IN && ls; $OUT" "dir1\ndir2\nfile1.txt\nfile2.txt\n" "" ""
+testing "ls with wild char" "$IN && ls file*; $OUT" "file1.txt\nfile2.txt\n" "" ""
+testing "ls with wild char - long listing" "$IN && ls -1 file*; $OUT" "file1.txt\nfile2.txt\n" "" ""
+testing "ls with -p" "$IN && ls -p; $OUT" "dir1/\ndir2/\nfile1.txt\nfile2.txt\n" "" ""
+testing "ls with -a" "$IN && ls -a; $OUT" \
+ ".\n..\ndir1\ndir2\nfile1.txt\nfile2.txt\n.hfile1\n" "" ""
+testing "ls with -A" "$IN && ls -A; $OUT" \
+ "dir1\ndir2\nfile1.txt\nfile2.txt\n.hfile1\n" "" ""
+testing "ls with -d" "$IN && ls -d; $OUT" ".\n" "" ""
+testing "ls with wild char and -d *" "$IN && ls -d *; $OUT" "dir1\ndir2\nfile1.txt\nfile2.txt\n" "" ""
+testing "ls with -k" "$IN && ls -k; $OUT" "dir1\ndir2\nfile1.txt\nfile2.txt\n" "" ""
+testing "ls with -m" "$IN && ls -m; $OUT" "dir1, dir2, file1.txt, file2.txt\n" "" ""
+testing "ls with -F" "$IN && ls -F; $OUT" "dir1/\ndir2/\nfile1.txt\nfile2.txt\n" "" ""
+testing "ls with -dk *" "$IN && ls -dk *; $OUT" "dir1\ndir2\nfile1.txt\nfile2.txt\n" "" ""
+
+ln -s file1.txt lstest/slink
+testing "ls softlink - long listing" "$IN && ls -l slink | awk '{ print \$NF }' ; $OUT" \
+ "file1.txt\n" "" ""
+rm -f lstest/slink
+
+rm -rf lstest/* && mkdir -p lstest/dir1 && touch lstest/file1.txt
+testing "ls nested recursively" "$IN && ls -R; $OUT" \
+ ".:\ndir1\nfile1.txt\n\n./dir1:\n" "" ""
+
+rm -rf lstest/* && touch lstest/file1.txt && INODE=`stat -c %i lstest/file1.txt`
+testing "ls with -i" "$IN && ls -i 2>/dev/null; $OUT" "$INODE file1.txt\n" "" ""
+unset INODE
+
+# Removing test dir for cleanup purpose
+rm -rf lstest
diff --git a/tests/lsattr.test b/tests/lsattr.test
new file mode 100644
index 00000000..870b3f66
--- /dev/null
+++ b/tests/lsattr.test
@@ -0,0 +1,159 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+# chattr - Testcases
+
+mkdir testattr
+IN="cd testattr"
+OUT="cd .."
+_t="abcdefghijklmnopqrstuvwxyz"
+
+testing "chattr [-/+]i FILE[write]" "$IN && echo "$_t" > testFile &&
+ chattr +i testFile && lsattr testFile && echo "$_t" > testFile;
+ chattr -i testFile; rm -rf testFile; $OUT " "----i-------- testFile\n" "" ""
+testing "chattr [-/+]i FILE[re-write]" "$IN && echo "$_t" > testFile &&
+ chattr +i testFile && echo \"$_t\" > testFile || chattr -i testFile &&
+ echo \"$_t\" > testFile && lsattr testFile; rm -rf testFile; $OUT" \
+ "------------- testFile\n" "" ""
+testing "chattr [-/+]i FILE[append]" "$IN && echo "$_t" > testFile &&
+ chattr +i testFile && echo \"$_t\" >> testFile || lsattr testFile &&
+ chattr -i testFile; rm -rf testFile; $OUT" "----i-------- testFile\n" "" ""
+testing "chattr [-/+]i FILE[move]" "$IN && echo "$_t" > testFile &&
+ chattr +i testFile && mv testFile testFile1 || lsattr testFile &&
+ chattr -i testFile; rm -rf testFile; $OUT" "----i-------- testFile\n" "" ""
+testing "chattr [-/+]i FILE[delete]" "$IN && echo "$_t" > testFile &&
+ chattr +i testFile && rm -f testFile || lsattr testFile &&
+ chattr -i testFile; rm -rf testFile; $OUT" "----i-------- testFile\n" "" ""
+testing "chattr [-/+]i FILE[read]" "$IN && echo "$_t" > testFile &&
+ chattr +i testFile && cat testFile && lsattr testFile &&
+ chattr -i testFile; rm -rf testFile; $OUT" "$_t\n----i-------- testFile\n" "" ""
+testing "chattr [-/+]a FILE[write]" "$IN && echo "$_t" > testFile &&
+ chattr +a testFile && echo $_t > testFile || lsattr testFile &&
+ chattr -a testFile; rm -rf testFile; $OUT" "-----a------- testFile\n" "" ""
+testing "chattr [-/+]a FILE[re-write]" "$IN && echo "$_t" > testFile &&
+ chattr +a testFile && echo $_t > testFile || lsattr testFile &&
+ chattr -a testFile && echo $_t > testFile && cat testFile &&
+ lsattr testFile; rm -rf testFile;
+ $OUT" "-----a------- testFile\n$_t\n------------- testFile\n" "" ""
+testing "chattr [-/+]a FILE[append]" "$IN && echo "$_t" > testFile &&
+ chattr +a testFile && echo $_t >> testFile && cat testFile &&
+ lsattr testFile && chattr -a testFile; rm -rf testFile; $OUT" \
+ "$_t\n$_t\n-----a------- testFile\n" "" ""
+testing "chattr [-/+]a FILE[move]" "$IN && echo "$_t" > testFile &&
+ chattr +a testFile && mv testFile testFile1 || lsattr testFile &&
+ chattr -a testFile; rm -rf testFile; $OUT" "-----a------- testFile\n" "" ""
+testing "chattr [-/+]a FILE[delete]" "$IN && echo "$_t" > testFile &&
+ chattr +a testFile && rm -f testFile || lsattr testFile &&
+ chattr -a testFile; rm -rf testFile; $OUT" "-----a------- testFile\n" "" ""
+testing "chattr [-/+]a FILE[read]" "$IN && echo "$_t" > testFile &&
+ chattr +a testFile && cat testFile && lsattr testFile && chattr -a testFile;
+ rm -rf testFile; $OUT" "$_t\n-----a------- testFile\n" "" ""
+
+for attr in "A" "a" "c" "D" "d" "i" "j" "s" "S" "t" "T" "u"
+do
+ testing "chattr [-/+]$attr FILE" "$IN && echo "$_t" > testFile &&
+ chattr +$attr testFile && cat testFile && chattr -$attr testFile &&
+ lsattr testFile; rm -rf testFile; $OUT" "$_t\n------------- testFile\n" "" ""
+done
+
+for attr in "A" "a" "c" "D" "d" "i" "j" "s" "S" "t" "T" "u"
+do
+ testing "chattr -$attr FILE" "$IN && echo "$_t" > testFile && chattr -$attr testFile &&
+ cat testFile && lsattr testFile; rm -rf testFile; $OUT" "$_t\n------------- testFile\n" "" ""
+done
+
+testing "chattr [-/+]AacDdijsStTu FILE" "$IN && echo "$_t" > testFile &&
+ chattr +AacDdijsStTu testFile && cat testFile && chattr -AacDdijsStTu testFile &&
+ lsattr testFile; rm -rf testFile; $OUT" "$_t\n------------- testFile\n" "" ""
+testing "chattr [-/+]AacDdijsStTu(random) FILE" \
+ "$IN && echo "$_t" > testFile &&
+ chattr +AacDdijsStTu testFile && cat testFile && chattr -A testFile &&
+ chattr -a testFile && chattr -c testFile && chattr -D testFile &&
+ chattr -d testFile && chattr -i testFile && chattr -j testFile &&
+ chattr -s testFile && chattr -S testFile && chattr -t testFile &&
+ chattr -T testFile && chattr -u testFile && lsattr testFile &&
+ chattr -AacDdijsStTu testFile; rm -rf testFile; $OUT" \
+ "$_t\n------------- testFile\n" "" ""
+testing "chattr [-/+]AacDdijsStTu FILE*" "$IN &&
+ echo "$_t" > testFile && echo "$_t" > testFile1 &&
+ echo "$_t" > testFile2 && echo "$_t" > testFile3 &&
+ echo "$_t" > testFile4 && echo "$_t" > testFile5 &&
+ echo "$_t" > testFile6 && echo "$_t" > testFile7 &&
+ echo "$_t" > testFile8 && echo "$_t" > testFile9 &&
+ echo "$_t" > testFile10 && echo "$_t" > testFile11 &&
+ chattr +AacDdijsStTu testFile* &&
+ cat testFile9 && chattr -AacDdijsStTu testFile* && lsattr testFile*; rm -rf testFile*; $OUT" \
+ "$_t\n------------- testFile\n------------- testFile1\n------------- testFile10\n------------- testFile11\n------------- testFile2\n------------- testFile3\n------------- testFile4\n------------- testFile5\n------------- testFile6\n------------- testFile7\n------------- testFile8\n------------- testFile9\n" "" ""
+testing "chattr [-/+]AacDdijsStTu(random) FILE*" \
+ "$IN && echo "$_t" > testFile &&
+ chattr +AacDdijsStTu testFile* && cat testFile && chattr -A testFile* &&
+ chattr -a testFile* && chattr -c testFile* && chattr -D testFile* &&
+ chattr -d testFile* && chattr -i testFile* && chattr -j testFile* &&
+ chattr -s testFile* && chattr -S testFile* && chattr -t testFile* &&
+ chattr -T testFile* && chattr -u testFile* && lsattr testFile;
+ rm -rf testFile; $OUT" \
+ "$_t\n------------- testFile\n" "" ""
+testing "chattr [-/+]i FILE[write]" \
+ "$IN && echo "$_t" > testFile &&
+ chattr +i testFile &&
+ echo \"$_t\" > testFile || lsattr testFile && chattr -i testFile;
+ rm -rf testFile; $OUT" "----i-------- testFile\n" "" ""
+testing "chattr [-/+]A FILE[write]" \
+ "$IN && echo "$_t" > testFile && chattr +A testFile &&
+ echo \"$_t\" > testFile && lsattr testFile && chattr -A testFile;
+ rm -rf testFile; $OUT" "-------A----- testFile\n" "" ""
+testing "chattr [-/+]s FILE[write]" \
+ "$IN && echo "$_t" > testFile && chattr +s testFile &&
+ echo \"$_t\" > testFile && lsattr testFile && chattr -s testFile
+ rm -rf testFile; $OUT" "s------------ testFile\n" "" ""
+testing "chattr -v version FILE[write]" \
+ "$IN && echo "$_t" > testFile &&
+ chattr -v 1234 testFile && echo \"$_t\" > testFile &&
+ lsattr -v testFile; rm -rf testFile" \
+ " 1234 ------------- testFile\n" "" ""
+
+_a="-------A-----"
+testing "chattr -R [-/+]a FILE" "$IN && touch aa && chattr -R +A aa && lsattr aa &&
+ chattr -R -A aa; rm -rf aa; $OUT" "$_a aa\n" "" ""
+testing "chattr -R [-/+]a FILE.." "$IN && touch aa bb &&
+ chattr -R +A aa bb && lsattr aa bb &&
+ chattr -R -A aa bb; rm -rf aa bb; $OUT" "$_a aa\n$_a bb\n" "" ""
+
+# Clean up
+rm -rf testattr
+
+# lsattr - Testcases
+mkdir dir && cd dir && touch file
+chattr +A file &>/dev/null
+
+_p=$PWD
+_b="-------------"
+_A="-------A-----"
+
+testing "lsattr file" "lsattr file" "$_A file\n" "" ""
+testing "lsattr file_path" "lsattr $_p/file" "$_A $_p/file\n" "" ""
+testing "lsattr -R file" "lsattr -R file" "$_A file\n" "" ""
+testing "lsattr -R file_path" "lsattr -R $_p/file" "$_A $_p/file\n" "" ""
+testing "lsattr -a file" "lsattr -a file" "$_A file\n" "" ""
+testing "lsattr -a file_path" "lsattr -a $_p/file" "$_A $_p/file\n" "" ""
+testing "lsattr -d ." "lsattr -d ." "$_b .\n" "" ""
+testing "lsattr -d dir_path" "lsattr -d $_p" "$_b $_p\n" "" ""
+testing "lsattr -d file" "lsattr -d file" "$_A file\n" "" ""
+testing "lsattr -d file_path" "lsattr -d $_p/file" "$_A $_p/file\n" "" ""
+sp_44=" "
+testing "lsattr -l file" "lsattr -l file" "file $sp_44 No_Atime\n" "" ""
+_v="12345"
+testing "lsattr -v file" "chattr -v $_v * && lsattr -v file" \
+ "$_v $_A file\n" "" ""
+testing "lsattr -v file_path" "chattr -v $_v * && lsattr -v $_p/file" \
+ "$_v $_A $_p/file\n" "" ""
+testing "lsattr -Radlv file1 file2" "chattr -v $_v * &&
+ lsattr -Radlv file input" \
+ "$_v file $sp_44 No_Atime\n$_v input $sp_44 ---\n" "" ""
+
+# Cleanup
+chattr -AacDdijsStTu file && cd ..
+rm -rf dir
diff --git a/tests/md5sum.test b/tests/md5sum.test
new file mode 100755
index 00000000..741ec62f
--- /dev/null
+++ b/tests/md5sum.test
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+# These tests are from RFC 1321 appendix 5, reshuffled slightly to test
+# varying argument numbers
+
+testing "md5sum ''" "md5sum" "d41d8cd98f00b204e9800998ecf8427e -\n" "" ""
+testing "md5sum infile" "md5sum input" \
+ "0cc175b9c0f1b6a831c399e269772661 input\n" "a" ""
+testing "md5sum two files" "md5sum - input" \
+ "900150983cd24fb0d6963f7d28e17f72 -\nf96b697d7cb7938d525a2f31aaf161d0 input\n" \
+ "message digest" "abc"
+testing "md5sum 4" "md5sum" "c3fcd3d76192e4007dfb496cca67e13b -\n" \
+ "" "abcdefghijklmnopqrstuvwxyz"
+testing "md5sum 5" "md5sum" "d174ab98d277d9f5a5611c2c9f419d9f -\n" \
+ "" "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+testing "md5sum 6" "md5sum" "57edf4a22be3c955ac49da2e2107b67a -\n" \
+ "" "12345678901234567890123456789012345678901234567890123456789012345678901234567890"
+
diff --git a/tests/mkdir.test b/tests/mkdir.test
new file mode 100755
index 00000000..8b2f99f5
--- /dev/null
+++ b/tests/mkdir.test
@@ -0,0 +1,73 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "mkdir" "mkdir one && [ -d one ] && echo yes" "yes\n" "" ""
+rmdir one
+
+touch existing
+testing "mkdir existing" \
+ "mkdir existing 2> /dev/null || [ -f existing ] && echo yes" "yes\n" "" ""
+rm existing
+
+testing "mkdir one two" \
+ "mkdir one two && [ -d one ] && [ -d two ] && echo yes" "yes\n" "" ""
+rmdir one two
+
+testing "mkdir missing/one" \
+ "mkdir missing/one 2> /dev/null || [ ! -d missing ] && echo yes" "yes\n" "" ""
+
+testing "mkdir -p" \
+ "mkdir -p one/two/three && [ -d one/two/three ] && echo yes" "yes\n" "" ""
+rm -rf one
+
+mkdir existing
+testing "mkdir -p existing" "mkdir -p existing && echo yes" "yes\n" "" ""
+rmdir existing
+
+umask 123
+testing "mkdir (default permissions)" \
+ "mkdir one && stat -c %a one" "654\n" "" ""
+rmdir one
+
+testing "mkdir -m 124" \
+ "mkdir -m 124 one && stat -c %a one" "124\n" "" ""
+rmdir one
+
+umask 000
+testing "mkdir -p -m 653" \
+ "mkdir -p -m 653 one/two && stat -c %a one && stat -c %a one/two" \
+ "777\n653\n" "" ""
+rm -rf one
+
+testing "mkdir -p one/two/ (trailing slash)" \
+ "mkdir -p one/two/ && [ -d one/two ] && echo yes" "yes\n" "" ""
+rm -rf one
+
+umask 022
+testing "mkdir -p -m 777 (022 umask)" \
+ "mkdir -p -m 777 one/two && stat -c %a one && stat -c %a one/two" \
+ "755\n777\n" "" ""
+rm -rf one
+
+umask 377
+testing "mkdir -p -m 777 (377 umask)" \
+ "mkdir -p -m 777 one/two && stat -c %a one && stat -c %a one/two" \
+ "700\n777\n" "" ""
+umask 002
+rm -rf one
+
+testing "mkdir -vp" "mkdir -vp walrus 2>&1" \
+ "mkdir: created directory 'walrus'\n" "" ""
+
+testing "mkdir -vp exists" "mkdir -vp walrus 2>&1" \
+ "" "" ""
+rm -rf walrus
+
+touch two
+testing "mkdir continue after fail" \
+ "mkdir -m 777 one two three 2>/dev/null || stat -c %a three" \
+ "777\n" "" ""
+rm -rf one two three
diff --git a/tests/mkfifo.test b/tests/mkfifo.test
new file mode 100755
index 00000000..b0253fed
--- /dev/null
+++ b/tests/mkfifo.test
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "mkfifo" "mkfifo one && [ -p one ] && echo yes" "yes\n" "" ""
+rm one
+
+touch existing
+testing "mkfifo existing" \
+ "mkfifo existing 2> /dev/null || [ -f existing ] && echo yes" "yes\n" "" ""
+rm existing
+
+testing "mkfifo one two" \
+ "mkfifo one two && [ -p one ] && [ -p two ] && echo yes" "yes\n" "" ""
+rm one two
+
+umask 123
+testing "mkfifo (default permissions)" \
+ "mkfifo one && stat -c %a one" "644\n" "" ""
+rm one
+
+umask 000
+
+testing "mkfifo -m 124" \
+ "mkfifo -m 124 one && stat -c %a one" "124\n" "" ""
+rm -f one
diff --git a/tests/modinfo.test b/tests/modinfo.test
new file mode 100755
index 00000000..ac94ce0f
--- /dev/null
+++ b/tests/modinfo.test
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+[ -e /proc/modules ] || { echo "Skipping test because modules are not supported"; exit 1; }
+
+# modinfo does not need to output fields in a specified order.
+# Instead, there are labelled fields. We can use sort to make up for this.
+# Other issues to beware of are the volatile nature of srcversion and vermagic,
+# which change from kernel to kernel and can be disabled.
+# We grep to remove these.
+
+#We expect they have ne2k-pci as a module.
+
+testing "modinfo gets right number of fields" "modinfo ne2k-pci |cut -d: -f1 |grep -v ver|sort" "alias\nalias\nalias\nalias\nalias\nalias\nalias\nalias\nalias\nalias\nalias\nauthor\ndepends\ndescription\nfilename\nlicense\nparm\nparm\nparm\n" "" ""
+testing "modinfo treats - and _ as equivalent" "modinfo ne2k_pci |cut -d: -f1 |grep -v ver|sort" "alias\nalias\nalias\nalias\nalias\nalias\nalias\nalias\nalias\nalias\nalias\nauthor\ndepends\ndescription\nfilename\nlicense\nparm\nparm\nparm\n" "" ""
+
+# Output of -F filename should be an absolute path to the module.
+# Otherwise, initrd generating scripts will break.
+
+testing "modinfo -F filename gets absolute path" "[ -e `modinfo -F filename ne2k-pci` ] && echo ne2k-pci " "ne2k-pci\n" "" ""
+
+testing "modinfo supports multiple modules" "modinfo -F filename ne2k-pci 8390 | wc -l" "2\n" "" ""
+
+testing "modinfo does not output filename for bad module" "modinfo -F filename zxcvbnm__9753" "" "" ""
+
+
+
diff --git a/tests/mount.test b/tests/mount.test
new file mode 100644
index 00000000..1fdc00f7
--- /dev/null
+++ b/tests/mount.test
@@ -0,0 +1,87 @@
+#!/bin/bash
+
+# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
+# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+root_fs=`df | grep "\/$" | awk '{print $1}'`
+root_fs_type=`file -sL $root_fs | awk '{print $5}'`
+
+tmp_b_fs="tmp_b_fs"
+tmp_b_fs_type="ext3"
+
+reCreateTmpFs() {
+ rm -rf $tmp_b_fs
+ mknod $tmp_b_fs b 1 0
+ mkfs.ext3 $tmp_b_fs >/dev/null 2>&1
+}
+reCreateTmpFs
+
+testing "mount $root_fs /mnt" \
+ "mount $root_fs /mnt >/dev/null 2>&1 && mkdir /mnt/testDir &&
+ sleep 1 && umount /mnt && test -e /testDir && rmdir /testDir" "" "" ""
+testing "mount $tmp_b_fs /mnt" \
+ "mount $tmp_b_fs /mnt >/dev/null 2>&1 && mkdir /mnt/testDir &&
+ sleep 1 && umount /mnt && ! test -e /mnt/testDir" "" "" ""
+reCreateTmpFs
+
+chmod 444 /mnt
+testing "mount $root_fs /mnt (read_only dir)" \
+ "mount $root_fs /mnt >/dev/null 2>&1 && mkdir /mnt/testDir &&
+ sleep 1 && umount /mnt && test -e /testDir && rmdir /testDir" "" "" ""
+testing "mount $tmp_b_fs /mnt (read_only dir)" \
+ "mount $tmp_b_fs /mnt >/dev/null 2>&1 && mkdir /mnt/testDir &&
+ sleep 1 && umount /mnt && ! test -e /mnt/testDir" "" "" ""
+reCreateTmpFs
+chmod 755 /mnt
+testing "mount -w $root_fs /mnt (write_only mode)" \
+ "mount -w $root_fs /mnt >/dev/null 2>&1 && mkdir /mnt/testDir &&
+ sleep 1 && umount /mnt && test -e /testDir && rmdir /testDir" "" "" ""
+testing "mount -w $tmp_b_fs /mnt (write_only mode)" \
+ "mount -w $tmp_b_fs /mnt >/dev/null 2>&1 && mkdir /mnt/testDir &&
+ sleep 1 && umount /mnt && ! test -e /mnt/testDir" "" "" ""
+reCreateTmpFs
+testing "mount -rw $tmp_b_fs /mnt (read_write mode)" \
+ 'mount -rw $tmp_b_fs /mnt >/dev/null && mkdir /mnt/testDir && \
+ sleep 1 && ! test -e /mnt/testDir && umount /mnt' "" "" ""
+reCreateTmpFs
+testing "mount $tmp_b_fs /mnt -t fs_type" \
+ "mount $tmp_b_fs /mnt -t $tmp_b_fs_type >/dev/null 2>&1 &&
+ mkdir /mnt/testDir && sleep 1 && umount /mnt &&
+ ! test -e /mnt/testDir" "" "" ""
+reCreateTmpFs
+mkdir -p testDir1/testDir2 testDir
+echo "abcdefghijklmnopqrstuvwxyz" > testDir1/testDir2/testFile
+testing "mount -o bind dir1 dir2" \
+ 'mount -o bind testDir1 testDir >/dev/null 2>&1 && \
+ cat testDir/testDir2/testFile && sleep 1 && umount testDir' \
+ "abcdefghijklmnopqrstuvwxyz\n" "" ""
+testing "mount -o rbind dir1 dir2" \
+ 'mount -o rbind testDir1 testDir >/dev/null 2>&1 && \
+ cat testDir/testDir2/testFile && sleep 1 && umount testDir' \
+ "abcdefghijklmnopqrstuvwxyz\n" "" ""
+testing "mount -o loop $tmp_b_fs /mnt" \
+ "mount -o loop $tmp_b_fs /mnt >/dev/null 2>&1 && mkdir /mnt/testDirp &&
+ sleep 1 && umount -d /mnt && ! test -e /mnt/testDirp" "" "" ""
+reCreateTmpFs
+
+mkdir testDir2
+testing "mount -o move mount_1 mount_2" \
+ "mount $tmp_b_fs testDir1 && mkdir testDir1/testDirr &&
+ mount -o move testDir1 testDir2 && test -r testDir2/testDirr &&
+ sleep 1 && umount testDir2" "" "" ""
+reCreateTmpFs
+testing "mount -o rw $tmp_b_fs /mnt" \
+ "mount -o rw $tmp_b_fs /mnt >/dev/null 2>&1 && mkdir /mnt/testDir &&
+ sleep 1 && umount /mnt && ! test -e /mnt/testDir" "" "" ""
+reCreateTmpFs
+testing "mount -o ro $tmp_b_fs /mnt" \
+ "mount -o ro $tmp_b_fs /mnt >/dev/null 2>&1 &&
+ mkdir /mnt/testDir 2>/dev/null || sleep 1 && umount /mnt" "" "" ""
+reCreateTmpFs
+
+umount testDir1
+rm -f $tmp_b_fs
diff --git a/tests/mv.test b/tests/mv.test
new file mode 100644
index 00000000..53fc9992
--- /dev/null
+++ b/tests/mv.test
@@ -0,0 +1,98 @@
+#!/bin/bash
+
+# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
+# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+touch file
+testing "Move old_file to new_file" "mv file file1 && [ ! -e file -a -f file1 ] &&
+ echo 'yes'" "yes\n" "" ""
+rm -f file*
+
+touch file
+mkdir dir
+testing "Move file to a dir" "mv file dir && [ ! -e file -a -f dir/file ] &&
+ echo 'yes'" "yes\n" "" ""
+rm -rf file* dir*
+
+mkdir dir
+testing "Move old_dir to new_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 "Move multiple files/dir 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*
+
+touch file1
+testing "Move a empty file to new_file" "mv file1 file2 &&
+ [ ! -e file1 -a -f file2 ] && stat -c %s file2" "0\n" "" ""
+rm -rf file*
+
+mkdir dir1
+testing "Move enpty dir to new_dir" "mv dir1 dir2 &&
+ [ ! -d dir1 -a -d dir2 ] && echo 'yes'" "yes\n" "" ""
+rm -rf dir*
+
+dd if=/dev/zero of=file1 seek=10k count=1 >/dev/null 2>&1
+testing "Move file new_file (random 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 "Move link new_link (softlink)" "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 "Move link new_link (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 "Move file new_file (unreadable)" "mv file1 file2 &&
+ [ ! -e file1 -a -f file2 ] && echo 'yes'" "yes\n" "" ""
+rm -f file*
+
+touch file1
+ln file1 link1
+mkdir dir1
+testing "Move file link dir (hardlink)" "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 "Move dir1/dir2 dir3/new_dir" "mv dir1/dir2 dir3/dir4 &&
+ [ ! -e dir1/dir2 -a -d dir3/dir4 -a -f dir3/dir4/file1 ] &&
+ [ -f dir3/dir4/file2 ] && echo 'yes'" "yes\n" "" ""
+rm -rf file* dir*
+
+mkdir dir1 dir2
+testing "Move dir new_dir (already exist)" "mv dir1 dir2 &&
+ [ ! -e dir1 -a -d dir2/dir1 ] && echo 'yes'" "yes\n" "" ""
+rm -rf dir*
+
+touch file1 file2
+testing "Move -f file new_file (exist)" "mv -f file1 file2 &&
+ [ ! -e file1 -a -e file2 ] && echo 'yes'" "yes\n" "" ""
+rm -f file*
+
+touch file1 file2
+testing "Move -n file new_file (exist)" "mv -n file1 file2 &&
+ [ -e file1 -a -e file2 ] && echo 'yes'" "yes\n" "" ""
+rm -f file*
diff --git a/tests/nl.test b/tests/nl.test
new file mode 100644
index 00000000..958cb41e
--- /dev/null
+++ b/tests/nl.test
@@ -0,0 +1,50 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "nl" "nl" " 1\tone\n 2\ttwo\n 3\tthree\n" \
+ "" "one\ntwo\nthree\n"
+
+testing "nl explicit defaults" "nl -nrn -b a" \
+ " 1\tone\n 2\ttwo\n 3\tthree\n" "" "one\ntwo\nthree\n"
+
+# -n ln rn rz
+
+testing "nl -nln" "nl -nln" "1 \tone\n2 \ttwo\n3 \tthree\n" \
+ "" "one\ntwo\nthree\n"
+testing "nl -nln -w" "nl -nln -w 8" \
+ "1 \tone\n2 \ttwo\n3 \tthree\n" "" "one\ntwo\nthree\n"
+
+testing "nl -nrz" "nl -nrz" "000001\tone\n000002\ttwo\n000003\tthree\n" \
+ "" "one\ntwo\nthree\n"
+
+testing "nl -nrz -w" "nl -w3 -nrz" "001\tone\n002\ttwo\n003\tthree\n" \
+ "" "one\ntwo\nthree\n"
+
+
+# For non-matching lines the separator is "suppressed" meaning it...
+# turns into spaces! And the tab turns into one space, and -d boom turns
+# into 4 spaces, but these:
+# nl -s"$(echo -e 'bo\tom')" -bpand README
+# nl -w 3 -bpthe README
+# Yeah. And I doubt utf8 fontmetrics are used either.
+
+testing "nl -b t" "nl -b t" " \n 1\tone\n \n 2\ttwo\n" \
+ "" "\none\n\ntwo\n"
+testing "nl -b n" "nl -b n" " one\n two\n three\n" \
+ "" "one\ntwo\nthree\n"
+testing "nl -sook -b p" "nl -sook -bpoing" \
+ " one\n 1ookboing\n 2ooksproingy\n" \
+ "" "one\nboing\nsproingy\n"
+
+testing "nl -v" "nl -v 42" " 42\tone\n 43\ttwo\n 44\tthree\n" \
+ "" "one\ntwo\nthree\n"
+testing "nl -l" "nl -ba -l2 -w2 - input" \
+ " 1\tone\n \n 2\t\n 3\ttwo\n \n 4\t\n \n 5\tthree\n 6\tfour\n \n 7\t\n \n 8\tbang\n \n" \
+ "\n\nbang\n\n" "one\n\n\ntwo\n\n\n\nthree\nfour\n\n"
+testing "nl no space" "nl -w 1 -v 42" "42\tline\n" "" "line\n"
+
+# Should test for -E but no other implementation seems to have it?
+#testing "nl -E" "nl -w2 -sx -Ebp'(one|two)'" " 1x" "one\nand\ntwo\n"
diff --git a/tests/pgrep.test b/tests/pgrep.test
new file mode 100644
index 00000000..36df573a
--- /dev/null
+++ b/tests/pgrep.test
@@ -0,0 +1,122 @@
+#!/bin/bash
+
+# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
+# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
+
+#cleaning 'yes' processes
+killall yes >/dev/null 2>&1
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+# Starting processes to test pgrep command
+yes >/dev/null &
+proc=$!
+echo "# Process created with id: $proc"
+sleep 1
+session_id=0
+proc_parent=`cat /proc/${proc}/stat | awk '{ print $4 }'`
+echo "# Parent Process id of $proc is $proc_parent"
+
+# Testcases for pgrep command
+testing "pgrep pattern" "pgrep yes" "$proc\n" "" ""
+testing "pgrep wildCardPattern" "pgrep ^y.*s$" "$proc\n" "" ""
+testing "pgrep -l pattern" "pgrep -l yes" "$proc yes\n" "" ""
+testing "pgrep -f pattern" "pgrep -f yes" "$proc\n" "" ""
+testing "pgrep -n pattern" "pgrep -n yes" "$proc\n" "" ""
+testing "pgrep -o pattern" "pgrep -o yes" "$proc\n" "" ""
+testing "pgrep -s" "pgrep -s $session_id yes" "$proc\n" "" ""
+testing "pgrep -P" "pgrep -P $proc_parent yes" "$proc\n" "" ""
+
+#Clean-up
+killall yes >/dev/null 2>&1
+
+# Testcases for pkill command
+
+yes >/dev/null &
+sleep 1
+testing "pkill pattern" "pkill yes && sleep 1 && (pgrep yes || echo 'yes')" \
+ "yes\n" "" ""
+killall yes >/dev/null 2>&1
+
+yes >/dev/null &
+yes print1 >/dev/null &
+yes print2 >/dev/null &
+sleep 1
+testing "pkill pattern (multiple)" "pkill yes && sleep 1 &&
+ (pgrep yes || echo 'yes')" "yes\n" "" ""
+killall yes >/dev/null 2>&1
+
+yes >/dev/null &
+sleep 1
+testing "pkill -f pattern (one)" "pkill -f yes && sleep 1 &&
+ (pgrep yes || echo 'yes')" "yes\n" "" ""
+killall yes >/dev/null 2>&1
+
+yes print1 >/dev/null &
+sleep 1
+testing "pkill -f pattern args" "pkill -f \"yes print1\" && sleep 1 &&
+ (pgrep yes || echo 'yes')" "yes\n" "" ""
+killall yes >/dev/null 2>&1
+
+yes >/dev/null &
+yes print1 >/dev/null &
+yes print2 >/dev/null &
+sleep 1
+testing "pkill -f pattern (multiple)" "pkill -f yes && sleep 1 &&
+ (pgrep yes || echo 'yes')" "yes\n" "" ""
+killall yes >/dev/null 2>&1
+
+yes >/dev/null &
+sleep 1
+testing "pkill -s 0 -f pattern (regexp)" "pkill -s 0 -f ye* && sleep 1 &&
+ (pgrep yes || echo 'yes')" "yes\n" "" ""
+killall yes >/dev/null 2>&1
+
+yes >/dev/null &
+proc1=$!
+yes >/dev/null &
+proc2=$!
+sleep 1
+testing "pkill -n pattern" "pkill -n yes && sleep 1 && pgrep yes" \
+ "$proc1\n" "" ""
+killall yes >/dev/null 2>&1
+
+yes >/dev/null &
+proc1=$!
+yes >/dev/null &
+proc2=$!
+sleep 1
+testing "pkill -o pattern" "pkill -o yes && sleep 1 && pgrep yes" \
+ "$proc2\n" "" ""
+killall yes >/dev/null 2>&1
+
+yes >/dev/null &
+sleep 1
+testing "pkill -s (blank) pattern" "pkill -s '' yes && sleep 1 &&
+ (pgrep yes || echo 'yes')" "yes\n" "" ""
+killall yes >/dev/null 2>&1
+
+yes >/dev/null &
+sleep 1
+testing "pkill -s 0 pattern" "pkill -s 0 yes && sleep 1 &&
+ (pgrep yes || echo 'yes')" "yes\n" "" ""
+killall yes >/dev/null 2>&1
+
+yes >/dev/null &
+proc=$!
+proc_p=`cat /proc/${proc}/stat | awk '{ print $4 }'`
+sleep 1
+testing "pkill -P parent_prodId pattern" "pkill -P $proc_p yes && sleep 1 &&
+ (pgrep yes || echo 'yes')" "yes\n" "" ""
+killall yes >/dev/null 2>&1
+
+yes >/dev/null &
+proc=$!
+proc_parent=`cat /proc/${proc}/stat | awk '{ print $4 }'`
+sleep 1
+testing "pkill -9 pattern" "pkill -9 yes && sleep 1 &&
+ (pgrep yes || echo 'yes')" "yes\n" "" ""
+killall yes >/dev/null 2>&1
+
diff --git a/tests/printf.test b/tests/printf.test
new file mode 100644
index 00000000..96789bd0
--- /dev/null
+++ b/tests/printf.test
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
+# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+#set -x
+
+testing "printf TEXT" "printf toyTestText" "toyTestText" "" ""
+testing "printf MULTILINE_TEXT" \
+ "printf 'Testing\nmultiline\ntext\nfrom\ntoybox\tcommand.\b'" \
+ "Testing\nmultiline\ntext\nfrom\ntoybox\tcommand.\b" "" ""
+testing "printf '%5d%4d' 1 21 321 4321 54321" \
+ "printf '%5d%4d' 1 21 321 4321 54321" " 1 21 321432154321 0" "" ""
+testing "printf '%c %c' 78 79" "printf '%c %c' 78 79" "7 7" "" ""
+testing "printf '%d %d' 78 79" "printf '%d %d' 78 79" "78 79" "" ""
+testing "printf '%f %f' 78 79" "printf '%f %f' 78 79" \
+ "78.000000 79.000000" "" ""
+testing "printf 'f f' 78 79" "printf 'f f' 78 79" "f f" "" ""
+testing "printf '%i %i' 78 79" "printf '%i %i' 78 79" "78 79" "" ""
+testing "printf '%o %o' 78 79" "printf '%o %o' 78 79" "116 117" "" ""
+testing "printf '%u %u' 78 79" "printf '%u %u' 78 79" "78 79" "" ""
+testing "printf '%u %u' -1 -2" "printf '%u %u' -1 -2" \
+ "18446744073709551615 18446744073709551614" "" ""
+testing "printf '%x %X' 78 79" "printf '%x %X' 78 79" "4e 4F" "" ""
+testing "printf '%g %G' 78 79" "printf '%g %G' 78 79" "78 79" "" ""
+testing "printf '%s %s' 78 79" "printf '%s %s' 78 79" "78 79" "" ""
diff --git a/tests/pwd.test b/tests/pwd.test
new file mode 100755
index 00000000..b02055b1
--- /dev/null
+++ b/tests/pwd.test
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+#TODO: Find better tests
+
+testing "pwd" "[ $(stat -c %i "$(pwd)") = $(stat -c %i .) ] && echo yes" \
+ "yes\n" "" ""
+testing "pwd -P" "[ $(stat -c %i "$(pwd -P)") = $(stat -c %i .) ] && echo yes" \
+ "yes\n" "" ""
+
+
+ln -s . sym
+cd sym
+testing "pwd" "[ $(stat -c %i "$(pwd)") = $(stat -c %i "$PWD") ] && echo yes" \
+ "yes\n" "" ""
+testing "pwd -P" "[ $(stat -c %i "$(pwd -P)") = $(stat -c %i "$PWD") ] || echo yes" \
+ "yes\n" "" ""
+cd ..
+rm sym
+
+export PWD=walrus
+testing "pwd (bad PWD)" "[ "$(pwd)" = "$(cd . ; pwd)" ] && echo yes" \
+ "yes\n" "" ""
diff --git a/tests/readlink.test b/tests/readlink.test
new file mode 100755
index 00000000..6c7b147f
--- /dev/null
+++ b/tests/readlink.test
@@ -0,0 +1,67 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+APWD="$(pwd -P)"
+
+testing "readlink missing" "readlink notfound || echo yes" "yes\n" "" ""
+
+# simple tests on a file
+
+touch file
+testing "readlink file" "readlink file || echo yes" "yes\n" "" ""
+testing "readlink -f dir" "readlink -f ." "$APWD\n" "" ""
+testing "readlink -f missing" "readlink -f notfound" "$APWD/notfound\n" "" ""
+
+ln -sf notfound link
+testing "readlink link" "readlink link" "notfound\n" "" ""
+testing "readlink link->missing" "readlink -f link" "$APWD/notfound\n" "" ""
+ln -sf ../../ link
+testing "readlink stays relative" "readlink link" "../../\n" "" ""
+rm link
+ln -sf file link
+testing "readlink -f link->file" "readlink -f link" "$APWD/file\n" "" ""
+ln -sf . link
+testing "readlink -f link->dir" "readlink -f link" "$APWD\n" "" ""
+ln -snf link link
+testing "readlink link->link (recursive)" "readlink link" "link\n" "" ""
+testing "readlink -f link->link (recursive)" \
+ "readlink -f link 2>/dev/null || echo yes" "yes\n" "" ""
+
+testing "readlink -q notlink" "readlink -q file || echo yes" "yes\n" "" ""
+testing "readlink -q link" "readlink -q link && echo yes" "yes\n" "" ""
+testing "readlink -q notfound" "readlink -q notfound || echo yes" "yes\n" "" ""
+testing "readlink -e found" "readlink -e file" "$APWD/file\n" "" ""
+testing "readlink -e notfound" \
+ "readlink -e notfound 2>/dev/null || echo yes" "yes\n" "" ""
+testing "readlink -nf ." "readlink -nf ." "$APWD" "" ""
+
+mkdir sub &&
+ln -s . here &&
+ln -s ./sub dir &&
+touch sub/bang || exit 1
+testing "readlink -f multi" "readlink -f dir/../here/dir/bang" \
+ "$APWD/sub/bang\n" "" ""
+testing "readlink -f link/missing" "readlink -f dir/boing" \
+ "$APWD/sub/boing\n" "" ""
+testing "readlink -f /dev/null/file" \
+ "readlink -f /dev/null/file 2>/dev/null || echo yes" "yes\n" "" ""
+ln -sf / link || exit 1
+testing "readlink -f link->/" "readlink -e link/dev" "/dev\n" "" ""
+testing "readlink -f /dev/null/.." \
+ "readlink -f link/null/.. 2>/dev/null || echo yes" "yes\n" "" ""
+rm -f link && ln -sf link link || exit 1
+testing "readlink recurse" "readlink link" "link\n" "" ""
+
+rm file link sub/bang dir here
+rmdir sub
+
+# Make sure circular links don't run away.
+
+ln -s link1 link2
+ln -s link2 link1
+testing "readlink follow recursive2" "readlink -f link1 || echo yes" \
+ "yes\n" "" ""
+rm link1 link2
diff --git a/tests/renice.test b/tests/renice.test
new file mode 100644
index 00000000..e87111cc
--- /dev/null
+++ b/tests/renice.test
@@ -0,0 +1,110 @@
+#!/bin/bash
+
+# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
+# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+fun_nice_val()
+{
+ for each_proc in $@
+ do
+ echo `awk '{ print $18 }' /proc/${each_proc}/stat`
+ done
+}
+
+# creating processes as a test data
+yes >/dev/null &
+proc1=$!
+yes >/dev/null &
+proc2=$!
+yes >/dev/null &
+proc3=$!
+yes >/dev/null &
+proc4=$!
+yes >/dev/null &
+proc5=$!
+
+n_val1=`fun_nice_val $proc1`
+n_val2=`fun_nice_val $proc2`
+n_val3=`fun_nice_val $proc3`
+n_val4=`fun_nice_val $proc4`
+n_val5=`fun_nice_val $proc5`
+
+# Redirecting errors to /dev/null
+arg="2>/dev/null"
+
+for n_v in "-1" "1"
+do
+ for n_o in "" " -p"
+ do
+ nice_val1=$((`fun_nice_val $proc1` + $n_v))
+ nice_val2=$((`fun_nice_val $proc2` + $n_v))
+ nice_val3=$((`fun_nice_val $proc3` + $n_v))
+ nice_val4=$((`fun_nice_val $proc4` + $n_v))
+ nice_val5=$((`fun_nice_val $proc5` + $n_v))
+ testing "renice with -n=$n_v and with$n_o multiple_pids" \
+ "renice -n $n_v$n_o $proc1 $proc2 $proc3 $proc4 $proc5 &&
+ fun_nice_val $proc1 $proc2 $proc3 $proc4 $proc5" \
+ "$nice_val1\n$nice_val2\n$nice_val3\n$nice_val4\n$nice_val5\n" "" ""
+
+ nice_val1=$((`fun_nice_val $proc1` + $n_v))
+ nice_val2=$((`fun_nice_val $proc2` + $n_v))
+ nice_val3=$((`fun_nice_val $proc3` + $n_v))
+ nice_val4=$((`fun_nice_val $proc4` + $n_v))
+ nice_val5=$((`fun_nice_val $proc5` + $n_v))
+ testing "renice with -n=$n_v and with$n_o multiple_pids (some invalid)" \
+ "renice -n $n_v$n_o $proc1 $proc2 88888 99999 $proc3 $proc4 $proc5 $arg ||
+ fun_nice_val $proc1 $proc2 $proc3 $proc4 $proc5" \
+ "$nice_val1\n$nice_val2\n$nice_val3\n$nice_val4\n$nice_val5\n" "" ""
+ done
+done
+
+# Starting Boundary Test Here ..
+loop_cnt=2
+echo -n "TEST: Boundary value test for Id($proc1)..[old_nice_val/new_nice_val]:"
+cnt=0
+n_val=1
+while [ $cnt -gt -1 ]
+do
+ old_nice_val=`fun_nice_val $proc1`
+ new_nice_val=`renice -n $n_val $proc1 >/dev/null 2>&1 && fun_nice_val $proc1`
+ echo -n "[$old_nice_val/$new_nice_val],"
+ if [ $old_nice_val -eq 39 -a $old_nice_val -eq $new_nice_val ]
+ then
+ echo -n " [Equals 39,doing -1] "
+ n_val="-1"
+ elif [ $old_nice_val -eq 0 -a $old_nice_val -eq $new_nice_val ]
+ then
+ echo -n " [Equals 0,doing +1] "
+ n_val="1"
+ elif [ $new_nice_val -gt 39 -o $new_nice_val -lt 0 ]
+ then
+ echo " [Test Fail] "
+ echo "FAIL: renice with step 1 ($proc1) (boundary value)"
+ cnt="-1"
+ elif [ $new_nice_val -eq $n_val1 -a $new_nice_val -eq $(($old_nice_val+1)) ]
+ then
+ cnt=$(($cnt + 1))
+ if [ $cnt -eq $loop_cnt ]
+ then
+ echo " [Test Pass] "
+ echo "PASS: renice with step 1 ($proc1) (boundary value)"
+ cnt="-1"
+ fi
+ else
+ dif=`echo $(($new_nice_val-$old_nice_val))`
+ dif=`echo ${dif/-}`
+ if [ $dif -ne 1 ]
+ then
+ echo " [Test Fail] "
+ echo "FAIL: renice with step 1 ($proc1) (boundary value)"
+ cnt="-1"
+ fi
+ fi
+done
+# Boundary test End
+
+killall yes >/dev/null 2>&1
diff --git a/tests/rev.test b/tests/rev.test
new file mode 100644
index 00000000..c7622b9d
--- /dev/null
+++ b/tests/rev.test
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+echo -e "one" > file1
+echo -e "two" > file2
+testing "rev" "rev && echo yes" "orez\nyes\n" "" "zero\n"
+testing "rev -" "rev - && echo yes" "orez\nyes\n" "" "zero\n"
+testing "rev file1 file2" "rev file1 file2" "eno\nowt\n" "" ""
+testing "rev - file" "rev - file1" "orez\neno\n" "" "zero\n"
+testing "rev file -" "rev file1 -" "eno\norez\n" "" "zero\n"
+testing "rev no trailing newline" "rev -" "cba\nfed\n" "" "abc\ndef"
+
+testing "rev file1 notfound file2" \
+ "rev file1 notfound file2 2>stderr && echo ok ; cat stderr; rm stderr" \
+ "eno\nowt\nrev: notfound: No such file or directory\n" "" ""
+
+testing "rev different input sizes"\
+ "rev"\
+ "\n1\n21\n321\n4321\n54321\n4321\n321\n21\n1\n\n"\
+ "" "\n1\n12\n123\n1234\n12345\n1234\n123\n12\n1\n\n"
+
+rm file1 file2 \ No newline at end of file
diff --git a/tests/rm.test b/tests/rm.test
new file mode 100644
index 00000000..0dca8538
--- /dev/null
+++ b/tests/rm.test
@@ -0,0 +1,46 @@
+#!/bin/bash
+
+# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
+# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+echo "abcdefghijklmnopqrstuvwxyz" > file.txt
+testing "Remove text-file" "rm file.txt && [ ! -e file.txt ] && echo 'yes'" "yes\n" "" ""
+rm -f file*
+
+mkdir dir
+testing "Remove empty directory" "rm -r dir && [ ! -d dir ] && echo 'yes'" "yes\n" "" ""
+rm -rf dir
+
+echo "abcdefghijklmnopqrstuvwxyz" > file.txt && chmod 000 file.txt
+testing "Remove text file(mode 000)" "rm -f file.txt && [ ! -e file.txt ] && echo 'yes'" \
+ "yes\n" "" ""
+rm -f file*
+
+touch file1.txt file2.txt
+mkdir dir1 dir2
+testing "rm -r (multiple files and dirs)" \
+ "rm -r file1.txt file2.txt dir1 dir2 2>/dev/null &&
+ [ ! -e file1.txt -a ! -e file2.txt -a ! -d dir1 -a ! -d dir2 ] && echo 'yes'" \
+ "yes\n" "" ""
+rm -rf file* dir*
+
+touch file1.txt file2.txt
+mkdir dir1 dir2
+testing "rm -rf (present + missing files and dirs)" \
+ "rm -rf file1.txt file2.txt file3.txt dir1 dir2 dir3 2>/dev/null &&
+ [ ! -e file1.txt -a ! -e file2.txt -a ! -d dir1 -a ! -d dir2 ] && echo 'yes'" \
+ "yes\n" "" ""
+rm -rf file* dir*
+
+# testing with nested dirs.
+mkdir -p dir1/dir2/dir3 dir1/dir2/dir4
+touch dir1/file1.txt dir1/dir2/file2.txt dir1/dir2/dir3/file3.txt
+testing "rm -r nested_dir" "rm -r dir1/dir2/ 2>/dev/null &&
+ [ -d dir1 -a -f dir1/file1.txt -a ! -d dir1/dir2 ] && echo 'yes'" \
+ "yes\n" "" ""
+rm -rf dir*
+
diff --git a/tests/rmdir.test b/tests/rmdir.test
new file mode 100755
index 00000000..a7b027e0
--- /dev/null
+++ b/tests/rmdir.test
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+mkdir one
+testing "rmdir" "rmdir one && [ ! -d one ] && echo yes" "yes\n" "" ""
+
+touch walrus
+testing "rmdir file" \
+ "rmdir walrus 2> /dev/null || [ -f walrus ] && echo yes" "yes\n" "" ""
+
+mkdir one two
+testing "rmdir one two" \
+ "rmdir one two 2> /dev/null && [ ! -d one ] && [ ! -d two ] && echo yes" \
+ "yes\n" "" ""
+
+mkdir one two three
+testing "rmdir one missing two file three" \
+ "rmdir one missing two walrus three 2> /dev/null || [ ! -d three ] && echo yes" \
+ "yes\n" "" ""
+rm walrus
+
+mkdir one
+chmod 000 one
+testing "rmdir mode 000" "rmdir one && [ ! -d one ] && echo yes" "yes\n" "" ""
+
+mkdir temp
+touch temp/thing
+testing "rmdir non-empty" \
+ "rmdir temp 2>/dev/null || [ -d temp ] && echo yes" "yes\n" "" ""
+testing "rmdir -p dir/file" \
+ "rmdir -p temp/thing 2>/dev/null || [ -f temp/thing ] && echo yes" \
+ "yes\n" "" ""
+
+mkdir -p temp/one/two/three
+testing "rmdir -p part of path" \
+ "rmdir -p temp/one/two/three 2>/dev/null || [ -d temp ] && [ ! -e temp/one ] && echo yes" \
+ "yes\n" "" ""
+rm -rf temp
+
+
+mkdir -p one/two/three
+testing "rmdir -p one/two/three" \
+ "rmdir -p one/two/three && [ ! -e one ] && echo yes" "yes\n" "" ""
+
+mkdir -p one/two/three
+testing "rmdir -p one/two/three/" \
+ "rmdir -p one/two/three/ && [ ! -e one ] && echo yes" "yes\n" "" ""
+
+#mkdir -p one/two/three
+#chmod 000 one/two/three one/two one
+#testing "rmdir -p one/two/three" \
+# "rmdir -p one/two/three && [ ! -e one ] && echo yes" "yes\n" "" ""
diff --git a/tests/seq.test b/tests/seq.test
new file mode 100755
index 00000000..3f3b4099
--- /dev/null
+++ b/tests/seq.test
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "seq (exit with error)" "seq 2> /dev/null || echo yes" "yes\n" "" ""
+testing "seq (exit with error)" "seq 1 2 3 4 2> /dev/null || echo yes" \
+ "yes\n" "" ""
+testing "seq one argument" "seq 3" "1\n2\n3\n" "" ""
+testing "seq two arguments" "seq 5 7" "5\n6\n7\n" "" ""
+testing "seq two arguments reversed" "seq 7 5" "" "" ""
+testing "seq two arguments equal" "seq 3 3" "3\n" "" ""
+testing "seq two arguments equal, arbitrary negative step" "seq 1 -15 1" \
+ "1\n" "" ""
+testing "seq two arguments equal, arbitrary positive step" "seq 1 +15 1" \
+ "1\n" "" ""
+testing "seq count up by 2" "seq 4 2 8" "4\n6\n8\n" "" ""
+testing "seq count down by 2" "seq 8 -2 4" "8\n6\n4\n" "" ""
+testing "seq count wrong way #1" "seq 4 -2 8" "" "" ""
+testing "seq count wrong way #2" "seq 8 2 4" "" "" ""
+testing "seq count by .3" "seq 3 .3 4" "3\n3.3\n3.6\n3.9\n" "" ""
+testing "seq count by -.9" "seq .7 -.9 -2.2" "0.7\n-0.2\n-1.1\n-2\n" "" ""
+testing "seq count by zero" "seq 4 0 8 | head -n 10" "" "" ""
+testing "seq separator -" "seq -s - 1 3" "1-2-3\n" "" ""
+testing "seq format string" 'seq -f %+01g -10 5 10' "-10\n-5\n+0\n+5\n+10\n" "" ""
+testing "seq separator and format string" "seq -f \%03g -s \; 5 -1 0" "005;004;003;002;001;000\n" "" ""
+
diff --git a/tests/sha1sum.test b/tests/sha1sum.test
new file mode 100755
index 00000000..cd621fd1
--- /dev/null
+++ b/tests/sha1sum.test
@@ -0,0 +1,57 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+# These tests are based on RFC3174 which were based on FIPS PUB 180-1
+
+testing "sha1sum TEST1" \
+ "sha1sum" \
+ "a9993e364706816aba3e25717850c26c9cd0d89d -\n" \
+ "" "abc"
+
+testing "sha1sum TEST2" \
+ "sha1sum" \
+ "84983e441c3bd26ebaae4aa1f95129e5e54670f1 -\n" \
+ "" "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
+
+testing "sha1sum TEST3" \
+ 'dd if=/dev/zero bs=1000 count=1000 2>/dev/null | tr \\0 a | sha1sum' \
+ "34aa973cd4c4daa4f61eeb2bdbad27316534016f -\n" \
+ "" ""
+
+testing "sha1sum TEST4" \
+ 'for i in `seq 1 10`; do echo -n 0123456701234567012345670123456701234567012345670123456701234567 ; done | sha1sum' \
+ "dea356a2cddd90c7a7ecedc5ebb563934f460452 -\n" \
+ "" ""
+
+echo -n "abc" > file1
+echo -n "def" > file2
+testing "sha1sum" \
+ "sha1sum" \
+ "a9993e364706816aba3e25717850c26c9cd0d89d -\n" \
+ "" "abc"
+
+testing "sha1sum -" \
+ "sha1sum -" \
+ "a9993e364706816aba3e25717850c26c9cd0d89d -\n" \
+ "" "abc"
+
+testing "sha1sum file" \
+ "sha1sum file1" \
+ "a9993e364706816aba3e25717850c26c9cd0d89d file1\n" \
+ "" ""
+
+testing "sha1sum file1 file2" \
+ "sha1sum file1 file2" \
+ "a9993e364706816aba3e25717850c26c9cd0d89d file1\n589c22335a381f122d129225f5c0ba3056ed5811 file2\n" \
+ "" ""
+
+testing "sha1sum file1 file2 -" \
+ "sha1sum file1 file2 -" \
+ "a9993e364706816aba3e25717850c26c9cd0d89d file1\n589c22335a381f122d129225f5c0ba3056ed5811 file2\na9993e364706816aba3e25717850c26c9cd0d89d -\n" \
+ "" "abc"
+
+rm -f file1 file2
+
diff --git a/tests/sort.test b/tests/sort.test
new file mode 100755
index 00000000..7bd413f7
--- /dev/null
+++ b/tests/sort.test
@@ -0,0 +1,100 @@
+#!/bin/bash
+
+# SUSv4 compliant sort tests.
+# Copyright 2005, 2012 by Rob Landley <rob@landley.net>
+
+[ -f testing.sh ] && . testing.sh
+
+# The basic tests. These should work even with the small config.
+
+testing "sort" "sort input" "a\nb\nc\n" "c\na\nb\n" ""
+testing "sort #2" "sort input" "010\n1\n3\n" "3\n1\n010\n" ""
+testing "sort stdin" "sort" "a\nb\nc\n" "" "b\na\nc\n"
+testing "sort numeric" "sort -n input" "1\n3\n010\n" "3\n1\n010\n" ""
+testing "sort reverse" "sort -r input" "wook\nwalrus\npoint\npabst\naargh\n" \
+ "point\nwook\npabst\naargh\nwalrus\n" ""
+
+# These tests require the full option set.
+
+optional SORT_BIG
+# Longish chunk of data re-used by the next few tests. The expected output
+# varies, but the input (this) is the same.
+
+data="42 1 3 woot
+42 1 010 zoology
+egg 1 2 papyrus
+7 3 42 soup
+999 3 0 algebra
+"
+
+# Sorting with keys
+
+testing "sort one key" "sort -k4,4 input" \
+"999 3 0 algebra
+egg 1 2 papyrus
+7 3 42 soup
+42 1 3 woot
+42 1 010 zoology
+" "$data" ""
+
+# The numeric sort orders field 2, ignores field 3 (because numeric sort stops
+# at the whitespace), then the global fallback sort does an alpha sort on
+# the whole string (starting at the beginning of the line).
+
+testing "sort key range with numeric option" "sort -k2,3n input" \
+"42 1 010 zoology
+42 1 3 woot
+egg 1 2 papyrus
+7 3 42 soup
+999 3 0 algebra
+" "$data" ""
+
+# Numeric sort on field 2 (again, ignore field 3 because it's numeric),
+# then do a _reversed_ alpha sort on the whole line as a tiebreaker.
+
+testing "sort key range with numeric option and global reverse" \
+"sort -k2,3n -r input" \
+"egg 1 2 papyrus
+42 1 3 woot
+42 1 010 zoology
+999 3 0 algebra
+7 3 42 soup
+" "$data" ""
+
+# Reversed numeric sort on field 2 (numeric ignores field 3), then
+# break ties with alpha sort on whole line.
+
+testing "sort key range with multiple options" "sort -k2,3rn input" \
+"7 3 42 soup
+999 3 0 algebra
+42 1 010 zoology
+42 1 3 woot
+egg 1 2 papyrus
+" "$data" ""
+
+testing "sort key doesn't strip leading blanks, disables fallback global sort" \
+"sort -n -k2 -t ' '" " a \n 1 \n 2 \n" "" " 2 \n 1 \n a \n"
+
+# Test case contributed by Joey Hess:
+
+testing "sort key edge case with -t" "sort -n -k4 -t/" \
+"/usr/lib/finish-install.d/1
+/usr/lib/finish-install.d/4
+/usr/lib/prebaseconfig.d/2
+/usr/lib/prebaseconfig.d/6
+" "" "/usr/lib/finish-install.d/1
+/usr/lib/prebaseconfig.d/2
+/usr/lib/finish-install.d/4
+/usr/lib/prebaseconfig.d/6
+"
+
+testing "sort -x" "sort -x" "010\na0\n 0c0\n" "" "a0\n010\n 0c0\n"
+
+optional SORT_FLOAT
+
+# not numbers < NaN < -infinity < numbers < +infinity
+testing "sort -g" "sort -g" \
+ "bork\nNaN\n-inf\n0.4\n1.222\n01.37\n2.1\n+infinity\n" "" \
+ "01.37\n1.222\n2.1\n0.4\nNaN\nbork\n-inf\n+infinity\n"
+
+
diff --git a/tests/split.test b/tests/split.test
new file mode 100755
index 00000000..d86b0250
--- /dev/null
+++ b/tests/split.test
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "split" "seq 1 12345 | split && ls xa[a-z] | wc -l" "13\n" "" ""
+rm xa[a-z]
+
+testing "split -" "seq 1 12345 | split - && ls xa[a-z] | wc -l" "13\n" "" ""
+rm xa[a-z]
+
+seq 1 12345 > file
+testing "split file" "split file && ls xa[a-z] | wc -l" "13\n" "" ""
+rm xa[a-z]
+
+testing "split -l" "split file -l 10k && wc -l xab" "2105 xab\n" "" ""
+rm xa[ab]
+
+testing "split suffix exhaustion" \
+ "split file -l 10 -a 1 walrus 2>/dev/null || ls walrus* | wc -l" "26\n" "" ""
+rm walrus*
+
+testing "split bytes" \
+ "toybox seq 1 20000 | split -b 100 -a 3 - whang && ls whang* | wc -l && wc -c whangbpw" "1089\n94 whangbpw\n" "" ""
+
+testing "split reassembly" \
+ 'diff -u <(ls whang* | sort | xargs cat) <(seq 1 20000) && echo yes' \
+ "yes\n" "" ""
+
+rm file whang*
diff --git a/tests/tac.test b/tests/tac.test
new file mode 100644
index 00000000..96f25310
--- /dev/null
+++ b/tests/tac.test
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+
+echo -e "one-A\none-B" > file1
+echo -e "two-A\ntwo-B" > file2
+testing "tac" "tac && echo yes" "one-B\none-A\nyes\n" "" "one-A\none-B\n"
+testing "tac -" "tac - && echo yes" "one-B\none-A\nyes\n" "" "one-A\none-B\n"
+testing "tac file1 file2" "tac file1 file2" "one-B\none-A\ntwo-B\ntwo-A\n" "" ""
+testing "tac - file" "tac - file1" "zero-B\nzero-A\none-B\none-A\n" "" "zero-A\nzero-B\n"
+testing "tac file -" "tac file1 -" "one-B\none-A\nzero-B\nzero-A\n" "" "zero-A\nzero-B\n"
+
+testing "tac file1 notfound file2" \
+ "tac file1 notfound file2 2>stderr && echo ok ; tac stderr; rm stderr" \
+ "one-B\none-A\ntwo-B\ntwo-A\ntac: notfound: No such file or directory\n" "" ""
+
+testing "tac no trailing newline" "tac -" "defabc\n" "" "abc\ndef"
+
+# xputs used by tac does not propagate this error condition properly.
+#testing "tac > /dev/full" \
+# "tac - > /dev/full 2>stderr && echo ok; cat stderr; rm stderr" \
+# "tac: write: No space left on device\n" "" "zero\n"
+
+#
+
+rm file1 file2 \ No newline at end of file
diff --git a/tests/tail.test b/tests/tail.test
new file mode 100755
index 00000000..f4b86673
--- /dev/null
+++ b/tests/tail.test
@@ -0,0 +1,61 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+BIGTEST="one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\n"
+echo -ne "$BIGTEST" > file1
+testing "tail" "tail && echo yes" "oneyes\n" "" "one"
+testing "tail file" "tail file1" \
+ "two\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\n" "" ""
+testing "tail -n in bounds" "tail -n 3 file1" "nine\nten\neleven\n" "" ""
+testing "tail -n out of bounds" "tail -n 999 file1" "$BIGTEST" "" ""
+testing "tail -n+ in bounds" "tail -n +3 file1" \
+ "three\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\n" "" ""
+testing "tail -n+ outof bounds" "tail -n +999 file1" "" "" ""
+testing "tail -c in bounds" "tail -c 27 file1" \
+ "even\neight\nnine\nten\neleven\n" "" ""
+testing "tail -c out of bounds" "tail -c 999 file1" "$BIGTEST" "" ""
+testing "tail -c+ in bounds" "tail -c +27 file1" \
+ "x\nseven\neight\nnine\nten\neleven\n" "" ""
+testing "tail -c+ out of bonds" "tail -c +999 file1" "" "" ""
+rm file1
+
+testing "tail stdin no trailing newline" "tail -n 1 - " "c" "" "a\nb\nc"
+testing "tail file no trailing newline" "tail -n 1 input" "c" "a\nb\nc" ""
+
+optional TAIL_SEEK
+testing "tail noseek -n in bounds" "tail -n 3" "nine\nten\neleven\n" \
+ "" "$BIGTEST"
+testing "tail noseek -n out of bounds" "tail -n 999" "$BIGTEST" "" "$BIGTEST"
+testing "tail noseek -n+ in bounds" "tail -n +3" \
+ "three\nfour\nfive\nsix\nseven\neight\nnine\nten\neleven\n" "" \
+ "$BIGTEST"
+testing "tail noseek -n+ outof bounds" "tail -n +999" "" "" "$BIGTEST"
+testing "tail noseek -c in bounds" "tail -c 27" \
+ "even\neight\nnine\nten\neleven\n" "" "$BIGTEST"
+testing "tail noseek -c out of bounds" "tail -c 999" "$BIGTEST" "" "$BIGTEST"
+testing "tail noseek -c+ in bounds" "tail -c +27" \
+ "x\nseven\neight\nnine\nten\neleven\n" "" "$BIGTEST"
+testing "tail noseek -c+ out of bonds" "tail -c +999" "" "" "$BIGTEST"
+
+makebigfile()
+{
+
+ for j in $(seq 1 100)
+ do
+ printf "%s " $j
+ for i in $(seq 1 100)
+ do
+ printf %s 123456789abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+ done
+ echo
+ done
+}
+makebigfile > bigfile
+
+testing "tail -c 12345 -n 3 bigfile" "tail -c 12345 -n 3 bigfile | md5sum" \
+ "347bbdcbad8a313f4dc7bd558c5bfcb8 -\n" "" ""
+testing "tail -n 3 -c 12345 bigfile" "tail -n 3 -c 12345 bigfile | md5sum" \
+ "1698825a750288284ec3ba7d8a59f302 -\n" "" ""
diff --git a/tests/tar.test b/tests/tar.test
new file mode 100644
index 00000000..187186a8
--- /dev/null
+++ b/tests/tar.test
@@ -0,0 +1,73 @@
+#!/bin/bash
+
+# Copyright 2014 Divya Kothari <divya.s.kothari@gmail.com>
+# Copyright 2014 Naha Maggu <maggu.neha@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+#Creating dir
+mkdir dir/dir1 -p
+echo "This is testdata" > dir/dir1/file
+testing "tar tgz - compession, extraction and data validation" "tar -czf dir.tgz dir/ && [ -e dir.tgz ] && echo 'yes'; rm -rf dir; tar -xf dir.tgz && [ -f dir/dir1/file ] && cat dir/dir1/file; rm -rf dir.tgz" "yes\nThis is testdata\n" "" ""
+
+#Creating dir
+mkdir dir/dir1 -p
+echo "This is testdata" > dir/dir1/file
+testing "tar tar.gz - compession, extraction and data validation" "tar -czf dir.tar.gz dir/ && [ -e dir.tar.gz ] && echo 'yes'; rm -rf dir; tar -xf dir.tar.gz && [ -f dir/dir1/file ] && cat dir/dir1/file; rm -rf dir.tar.gz" "yes\nThis is testdata\n" "" ""
+
+#Creating dir
+mkdir dir/dir1 -p
+echo "This is testdata" > dir/dir1/file
+testing "tar verbose compression" "tar -cvzf dir.tgz dir/; rm -rf dir.tgz" "dir/\ndir/dir1/\ndir/dir1/file\n" "" ""
+rm -rf dir/
+
+#creating test file
+dd if=/dev/zero of=testFile ibs=4096 obs=4096 count=1000 2>/dev/null
+testing "tar - compession and extraction of a file" "tar -czf testFile.tgz testFile && [ -e testFile.tgz ] && echo 'yes'; rm -rf testFile; tar -xf testFile.tgz && [ -f testFile ] && echo 'yes'; rm -rf testFile.tgz" "yes\nyes\n" "" ""
+
+#creating empty test file
+touch testFile
+testing "tar - compession and extraction of a empty file" "tar -czf testFile.tgz testFile && [ -e testFile.tgz ] && echo 'yes'; rm -rf testFile; tar -xf testFile.tgz && [ -f testFile ] && echo 'yes'; rm -rf testFile.tgz" "yes\nyes\n" "" ""
+
+#Creating dir
+mkdir dir/dir1 -p
+touch dir/dir1/file1 dir/dir1/file2 dir/dir1/file3 dir/dir1/file4
+testing "tar -t option" "tar -czf dir.tar.gz dir/; rm -rf dir; tar -tf dir.tar.gz; rm -rf dir.tar.gz" "dir/\ndir/dir1/\ndir/dir1/file2\ndir/dir1/file4\ndir/dir1/file3\ndir/dir1/file1\n" "" ""
+rm -rf dir/
+
+#Creating nested directory
+mkdir -p dir/dir1 dir/dir2 dir/dir3 dir/dir4
+echo "This is testdata" > dir/dir1/file; echo "Dont exclude me" > dir/dir3/file1 ;
+echo "Exclude me" > dir/dir3/file2 ; echo "YO" > dir/dir4/file1 ; echo "Hello" >dir/dir4/file2; echo "Dont" > dir/dir2/file1
+echo "dir/dir4\ndir/dir3/file2" > exclude_file
+testing "Creating tar with files excluded : -X" "tar -cvzf dir.tgz dir/ -X exclude_file ; rm -rf dir ; tar -tf dir.tgz; rm -rf dir.tgz " "dir/\ndir/dir2/\ndir/dir2/file1\ndir/dir1/\ndir/dir1/file\ndir/dir3/\ndir/dir3/file1\ndir/\ndir/dir2/\ndir/dir2/file1\ndir/dir1/\ndir/dir1/file\ndir/dir3/\ndir/dir3/file1\n" "" ""
+rm -rf exclude_file
+
+#Creating nested directory
+mkdir dir/dir1 -p ; mkdir dir/dir2 ; mkdir dir/dir3 ; mkdir dir/dir4
+echo "This is testdata" > dir/dir1/file
+echo "Dont exclude me" > dir/dir3/file1 ; echo "Exclude me" > dir/dir3/file2 ; echo "YO" > dir/dir4/file1 ; echo "Hello" >dir/dir4/file2; echo "Dont" > dir/dir2/file1
+testing "tar with pattern --exclude" "tar --exclude=dir/dir3/* -cvzf dir.tgz dir/ ; rm -rf dir ; tar -tf dir.tgz; rm -rf dir.tgz " "dir/\ndir/dir2/\ndir/dir2/file1\ndir/dir1/\ndir/dir1/file\ndir/dir3/\ndir/dir4/\ndir/dir4/file2\ndir/dir4/file1\ndir/\ndir/dir2/\ndir/dir2/file1\ndir/dir1/\ndir/dir1/file\ndir/dir3/\ndir/dir4/\ndir/dir4/file2\ndir/dir4/file1\n" "" ""
+
+#Creating directory to be compressed
+mkdir dir/dir1 -p
+echo "This is testdata" > dir/dir1/file
+mkdir temp
+testing "Extraction with -C Dir" "tar -czf dir.tgz dir/ ;rm -rf dir ;tar -xf dir.tgz -C temp/ ; [ -e temp/dir ] && echo 'yes' ; rm -rf dir dir.tgz" "yes\n" "" ""
+rm -rf temp
+
+#Creating nested directory
+mkdir dir/dir1 -p ; mkdir dir/dir2 ; mkdir dir/dir3 ; mkdir dir/dir4 ; mkdir temp_dir
+echo "dir1/file" > dir/dir1/file ; echo "temp_dir/file" > temp_dir/file
+echo "dir3/file1" > dir/dir3/file1 ; echo "dir3/file2" > dir/dir3/file2 ; echo "YO" > dir/dir4/file1 ; echo "Hello" >dir/dir4/file2; echo "dir2/file1" > dir/dir2/file1
+echo "temp_dir/file" > exclude_file
+testing "Creating tar extra files/directory included : -T" "tar -czf dir.tgz dir/ -T exclude_file ; rm -rf dir ; tar -tf dir.tgz; rm -rf dir.tgz " "dir/\ndir/dir2/\ndir/dir2/file1\ndir/dir1/\ndir/dir1/file\ndir/dir3/\ndir/dir3/file2\ndir/dir3/file1\ndir/dir4/\ndir/dir4/file2\ndir/dir4/file1\ntemp_dir/file\n" "" ""
+rm -rf exclude_file
+rm -rf temp_dir
+
+#Creating dir
+mkdir dir/dir1 -p
+echo "Inside dir/dir1" > dir/dir1/file ; echo "Hello Inside dir" > dir/file
+testing "Exctraction on STDOUT : -O" " tar -czf dir.tgz dir/ ; rm -rf dir ; tar -xf dir.tgz -O ; [ -e 'Inside dir/dir1/\nHello Inside dir\n' ] && echo 'yes'; rm -rf dir.tgz " "" "" ""
diff --git a/tests/test.test b/tests/test.test
new file mode 100755
index 00000000..f5011573
--- /dev/null
+++ b/tests/test.test
@@ -0,0 +1,67 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+# TODO: Should also have device and socket files
+
+mkdir d
+touch f
+ln -s /dev/null L
+echo nonempty > s
+mkfifo p
+
+type_test()
+{
+ result=""
+ for i in d f L s p n
+ do
+ if test $* $i
+ then
+ result=$result$i
+ fi
+ done
+ printf "%s" $result
+}
+
+testing "test -b" "type_test -b" "" "" ""
+testing "test -c" "type_test -c" "L" "" ""
+testing "test -d" "type_test -d" "d" "" ""
+testing "test -f" "type_test -f" "fs" "" ""
+testing "test -h" "type_test -h" "L" "" ""
+testing "test -L" "type_test -L" "L" "" ""
+testing "test -s" "type_test -s" "ds" "" ""
+testing "test -S" "type_test -S" "" "" ""
+testing "test -p" "type_test -p" "p" "" ""
+testing "test -e" "type_test -e" "dfLsp" "" ""
+testing "test ! -e" "type_test ! -e" "n" "" ""
+
+rm f L s p
+rmdir d
+
+# TODO: Test rwx gu t
+
+testing "test" "test "" || test a && echo yes" "yes\n" "" ""
+testing "test -n" "test -n "" || test -n a && echo yes" "yes\n" "" ""
+testing "test -z" "test -n a || test -n "" && echo yes" "yes\n" "" ""
+testing "test a = b" "test a = b || test "" = "" && echo yes" "yes\n" "" ""
+testing "test a != b" "test "" != "" || test a = b && echo yes" "yes\n" "" ""
+
+arith_test()
+{
+ test -1 $1 1 && echo l
+ test 0 $1 0 && echo e
+ test -3 $1 -5 && echo g
+}
+
+testing "test -eq" "arith_test -eq" "e\n" "" ""
+testing "test -ne" "arith_test -ne" "l\ng\n" "" ""
+testing "test -gt" "arith_test -gt" "g\n" "" ""
+testing "test -ge" "arith_test -ge" "e\ng\n" "" ""
+testing "test -lt" "arith_test -lt" "l\n" "" ""
+testing "test -le" "arith_test -le" "l\ne\n" "" ""
+
+# test ! = -o a
+# test ! \( = -o a \)
+# test \( ! = \) -o a
diff --git a/tests/touch.test b/tests/touch.test
new file mode 100755
index 00000000..03ab8ce1
--- /dev/null
+++ b/tests/touch.test
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "touch" "touch walrus && [ -e walrus ] && echo yes" "yes\n" "" ""
+testing "touch 1 2 3" "touch one two three && rm one two three && echo yes" "yes\n" \
+ "" ""
+testing "touch -c" "touch -c walrus && [ -e walrus ] && echo yes" "yes\n" "" ""
+testing "touch -c missing" "touch -c warrus && [ ! -e warrus ] && echo yes" \
+ "yes\n" "" ""
+
+# This isn't testing fraction of a second because I dunno how to read it back
+
+testing "touch -d" \
+ "touch -d 2009-02-13T23:31:30.12Z walrus && date -r walrus +%s.%N" "1234567890\n" \
+ "" ""
+#testing "touch -t" "touch -t 200902132331.42
+#testing "touch -r"
+#testing "touch -a"
+#testing "touch -m"
+#testing "touch -am"
+rm walrus
diff --git a/tests/useradd.test b/tests/useradd.test
new file mode 100644
index 00000000..a87da070
--- /dev/null
+++ b/tests/useradd.test
@@ -0,0 +1,90 @@
+#!/bin/bash
+
+# Copyright 2013 Divya Kothari <divya.s.kothari@gmail.com>
+# Copyright 2013 Robin Mittal <robinmittal.it@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+# 70 characters long string; hereafter, we will use it as per our need.
+_s70="abcdefghijklmnopqrstuvwxyz123456789abcdefghijklmnopqrstuvwxyz123456789"
+
+# Redirecting all output to /dev/null for grep, adduser and deluser
+arg="&>/dev/null"
+
+#testing "name" "command" "result" "infile" "stdin"
+
+# Default password for adding user is: 'password'
+pass=`echo -ne 'password\npassword\n'`
+
+testing "adduser user_name (text)" "useradd toyTestUser $arg ||
+ grep '^toyTestUser:' /etc/passwd $arg && test -d /home/toyTestUser &&
+ userdel toyTestUser $arg && rm -rf /home/toyTestUser && echo 'yes'" \
+ "yes\n" "" "$pass"
+
+testing "adduser user_name (alphanumeric)" "useradd toy1Test2User3 $arg ||
+ grep '^toy1Test2User3:' /etc/passwd $arg && test -d /home/toy1Test2User3 &&
+ userdel toy1Test2User3 $arg && rm -rf /home/toy1Test2User3 && echo 'yes'" \
+ "yes\n" "" "$pass"
+
+testing "adduser user_name (numeric)" "useradd 987654321 $arg ||
+ grep '^987654321:' /etc/passwd $arg && test -d /home/987654321 &&
+ userdel 987654321 $arg && rm -rf /home/987654321 && echo 'yes'" \
+ "yes\n" "" "$pass"
+
+testing "adduser user_name (with ./-/_)" "useradd toy.1Test-2User_3 $arg ||
+ grep '^toy.1Test-2User_3:' /etc/passwd $arg &&
+ test -d /home/toy.1Test-2User_3 && userdel toy.1Test-2User_3 $arg &&
+ rm -rf /home/toy.1Test-2User_3 && echo 'yes'" "yes\n" "" "$pass"
+
+testing "adduser user_name (long string)" "useradd $_s70 $arg ||
+ grep '^$_s70:' /etc/passwd $arg && test -d /home/$_s70 &&
+ userdel $_s70 $arg && rm -rf /home/$_s70 && echo 'yes'" "yes\n" "" "$pass"
+
+testing "adduser user_name with dir" "useradd -h $PWD/dir toyTestUser $arg ||
+ grep '^toyTestUser:.*dir' /etc/passwd $arg && test -d $PWD/dir &&
+ userdel toyTestUser $arg && rm -rf $PWD/dir && echo 'yes'" "yes\n" "" "$pass"
+
+gecos="aaa,bbb,ccc,ddd,eee"
+testing "adduser user_name with gecos" "useradd -g '$gecos' toyTestUser $arg ||
+ grep '^toyTestUser:.*$gecos' /etc/passwd $arg && test -d /home/toyTestUser &&
+ userdel toyTestUser $arg && rm -rf /home/toyTestUser && echo 'yes'" \
+ "yes\n" "" "$pass"
+
+shl="/bin/sh"
+testing "adduser user_name with shell" "useradd -s $shl toyTestUser $arg ||
+ grep '^toyTestUser:.*$shl$' /etc/passwd $arg && test -d /home/toyTestUser &&
+ userdel toyTestUser $arg && rm -rf /home/toyTestUser && echo 'yes'" \
+ "yes\n" "" "$pass"
+
+g_name="root"
+g_id=`grep $g_name /etc/group | cut -d : -f 3`
+testing "adduser user_name with group" "useradd -G $g_name toyTestUser $arg ||
+ grep '^toyTestUser:.*:.*:$g_id:.*' /etc/passwd $arg &&
+ test -d /home/toyTestUser && userdel toyTestUser $arg &&
+ rm -rf /home/toyTestUser && echo 'yes'" "yes\n" "" "$pass"
+
+testing "adduser user_name (system user)" "useradd -S toyTestUser $arg ||
+ grep '^toyTestUser:.*:.*:.*' /etc/passwd $arg &&
+ test ! -e /home/toyTestUser && userdel toyTestUser $arg && echo 'yes'" \
+ "yes\n" "" "$pass"
+
+testing "adduser user_name with -D" "useradd -D toyTestUser $arg ||
+ grep '^toyTestUser:.*:.*:.*' /etc/passwd $arg && test -d /home/toyTestUser &&
+ userdel toyTestUser $arg && rm -rf /home/toyTestUser && echo 'yes'" \
+ "yes\n" "" "$pass"
+
+testing "adduser user_name with -H" "useradd -H toyTestUser $arg ||
+ grep '^toyTestUser:.*:.*:.*' /etc/passwd $arg &&
+ test ! -e /home/toyTestUser && userdel toyTestUser $arg && echo 'yes'" \
+ "yes\n" "" "$pass"
+
+testing "adduser user_name with dir and -H" \
+ "useradd -H -h $PWD/dir toyTestUser $arg ||
+ grep '^toyTestUser:.*dir' /etc/passwd $arg && test ! -e $PWD/dir &&
+ userdel toyTestUser $arg && echo 'yes'" "yes\n" "" "$pass"
+
+testing "adduser user_name with user_id" "useradd -u 49999 toyTestUser $arg ||
+ grep '^toyTestUser:x:49999:.*' /etc/passwd $arg &&
+ test -d /home/toyTestUser && userdel toyTestUser $arg &&
+ rm -rf /home/toyTestUser && echo 'yes'" "yes\n" "" "$pass"
+
diff --git a/tests/uudecode.test b/tests/uudecode.test
new file mode 100644
index 00000000..b9d7d012
--- /dev/null
+++ b/tests/uudecode.test
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "uudecode uu empty file" "uudecode -o /dev/stdout && echo yes" \
+ "yes\n" "" "begin 744 test\n\`\nend\n"
+testing "uudecode uu 1-char" "uudecode -o /dev/stdout" "a" "" \
+ "begin 744 test\n!80 \n\`\nend\n"
+testing "uudecode uu 2-char" "uudecode -o /dev/stdout" "ab" "" \
+ "begin 744 test\n\"86( \n\`\nend\n"
+testing "uudecode uu 3-char" "uudecode -o /dev/stdout" "abc" "" \
+ "begin 744 test\n#86)C\n\`\nend\n"
+
+testing "uudecode b64 empty file" "uudecode -o /dev/stdout && echo yes" \
+ "yes\n" "" "begin-base64 744 test\n====\n"
+testing "uudecode b64 1-char" "uudecode -o /dev/stdout" "a" "" \
+ "begin-base64 744 test\nYQ==\n====\n"
+testing "uudecode b64 2-char" "uudecode -o /dev/stdout" "ab" "" \
+ "begin-base64 744 test\nYWI=\n====\n"
+testing "uudecode b64 3-char" "uudecode -o /dev/stdout" "abc" "" \
+ "begin-base64 744 test\nYWJj\n====\n"
+
+testing "uudecode filename" "uudecode && echo -ne 'abc' | cmp uudecode-fn-test /dev/stdin && echo -ne yes && rm uudecode-fn-test" \
+ "yes" "" "begin-base64 744 uudecode-fn-test\nYWJj\n====\n"
+
diff --git a/tests/uuencode.test b/tests/uuencode.test
new file mode 100644
index 00000000..7c19faa3
--- /dev/null
+++ b/tests/uuencode.test
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "uuencode not enough args [fail]" "uuencode 2>/dev/null" "" "" ""
+
+testing "uuencode uu empty file" "uuencode test" \
+ "begin 744 test\nend\n" "" ""
+testing "uuencode uu 1-char" "uuencode test" \
+ "begin 744 test\n!80\`\`\nend\n" "" "a"
+testing "uuencode uu 2-char" "uuencode test" \
+ "begin 744 test\n\"86(\`\nend\n" "" "ab"
+testing "uuencode uu 3-char" "uuencode test" \
+ "begin 744 test\n#86)C\nend\n" "" "abc"
+
+testing "uuencode b64 empty file" "uuencode -m test" \
+ "begin-base64 744 test\n====\n" "" ""
+testing "uuencode b64 1-char" "uuencode -m test" \
+ "begin-base64 744 test\nYQ==\n====\n" "" "a"
+testing "uuencode b64 2-char" "uuencode -m test" \
+ "begin-base64 744 test\nYWI=\n====\n" "" "ab"
+testing "uuencode b64 3-char" "uuencode -m test" \
+ "begin-base64 744 test\nYWJj\n====\n" "" "abc"
+
diff --git a/tests/wc.test b/tests/wc.test
new file mode 100755
index 00000000..40891323
--- /dev/null
+++ b/tests/wc.test
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+cat >file1 <<EOF
+some words .
+
+some
+lines
+EOF
+
+testing "wc" "wc >/dev/null && echo yes" "yes\n" "" ""
+testing "wc empty file" "wc" "0 0 0\n" "" ""
+testing "wc standard input" "wc" "1 3 5\n" "" "a b\nc"
+testing "wc -c" "wc -c file1" "26 file1\n" "" ""
+testing "wc -l" "wc -l file1" "4 file1\n" "" ""
+testing "wc -w" "wc -w file1" "5 file1\n" "" ""
+testing "wc format" "wc file1" "4 5 26 file1\n" "" ""
+testing "wc multiple files" "wc input - file1" \
+ "1 2 3 input\n0 2 3 -\n4 5 26 file1\n5 9 32 total\n" "a\nb" "a b"
+
+optional TOYBOX_I18N
+
+#Tests for wc -m
+if printf "%s" "$LANG" | grep -q UTF-8
+then
+
+printf " " > file1
+for i in $(seq 1 8192)
+do
+ printf "ü" >> file1
+done
+testing "wc -m" "wc -m file1" "8193 file1\n" "" ""
+printf " " > file1
+for i in $(seq 1 8192)
+do
+ printf "ü" >> file1
+done
+testing "wc -m (invalid chars)" "wc -m file1" "8193 file1\n" "" ""
+testing "wc -mlw" "wc -mlw input" "1 2 11 input\n" "hello, 世界!\n" ""
+
+else
+printf "skipping tests for wc -m"
+fi
+
+rm file1
diff --git a/tests/xargs.test b/tests/xargs.test
new file mode 100755
index 00000000..e49445d6
--- /dev/null
+++ b/tests/xargs.test
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "xargs" "xargs && echo yes" "hello\nyes\n" "" "hello"
+testing "xargs spaces" "xargs" \
+ "one two three four\n" "" "one two\tthree \nfour\n\n"
+
+testing "xargs -n 0" "xargs -n 0 2>/dev/null || echo ok" "ok\n" \
+ "" "one \ntwo\n three"
+testing "xargs -n 2" "xargs -n 2" "one two\nthree\n" "" "one \ntwo\n three"
+testing "xargs -n exact match" "xargs -n 3" "one two three\n" "" "one two three"
+testing "xargs2" "xargs -n2" "one two\nthree four\nfive\n" "" \
+ "one two three four five"
+testing "xargs -s too long" "xargs -s 9 echo 2>/dev/null || echo ok" \
+ "one\ntwo\nok\n" "" "one two three"
+testing "xargs -s 13" "xargs -s 13 echo" "one two\nthree\n" "" "one \ntwo\n three"
+testing "xargs -s 12" "xargs -s 12 echo" "one\ntwo\nthree\n" "" "one \ntwo\n three"
+
+touch one two three
+testing "xargs command -opt" "xargs -n2 ls -1" "one\ntwo\nthree\n" "" \
+ "one two three"
+rm one two three
+
+exit
+
+testing "xargs -n exact match"
+testing "xargs -s exact match"
+testing "xargs -s 0"
+testing "xargs -s impossible"
+
+# xargs command_not_found - returns 127
+# xargs false - returns 1
diff --git a/tests/xzcat.test b/tests/xzcat.test
new file mode 100644
index 00000000..e82ca881
--- /dev/null
+++ b/tests/xzcat.test
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# Copyright 2014 Divya Kothari <divya.s.kothari@gmail.com>
+# Copyright 2014 Naha Maggu <maggu.neha@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+echo "hello" > file
+tar -cJf file.xz file
+# Get system xzcat
+xzcatExe=`which xzcat`
+$xzcatExe file.xz > xzcatOut
+testing "xzcat - decompresses a single file" "xzcat file.xz > Tempfile && echo "yes"; diff Tempfile xzcatOut && echo "yes"; rm -rf file* xzcatOut Tempfile" "yes\nyes\n" "" ""
+
+#testing "name" "command" "result" "infile" "stdin"
+echo "hello" > file1
+echo "hi" > file2
+echo "Hi, Good morning !! I am a xzcat tester" > file3
+tar -cJf file1.xz file1
+tar -cJf file2.xz file2
+tar -cJf file3.xz file3
+# Get system xzcat
+xzcatExe=`which xzcat`
+$xzcatExe file1.xz file2.xz file3.xz > xzcatOut
+testing "xzcat - decompresses multiple files" "xzcat file1.xz file2.xz file3.xz > Tempfile && echo "yes" ; diff Tempfile xzcatOut && echo "yes"; rm -rf file* xzcatOut Tempfile " "yes\nyes\n" "" ""
diff --git a/tests/zcat.test b/tests/zcat.test
new file mode 100644
index 00000000..c1297c91
--- /dev/null
+++ b/tests/zcat.test
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# Copyright 2014 Divya Kothari <divya.s.kothari@gmail.com>
+# Copyright 2014 Naha Maggu <maggu.neha@gmail.com>
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+echo "hello" > file
+tar -czf file.gz file
+# Get system zcat
+zcatExe=`which zcat`
+$zcatExe file.gz > zcatOut
+testing "zcat - decompresses a single file" "zcat file.gz > Tempfile && echo "yes"; diff Tempfile zcatOut && echo "yes"; rm -rf file* zcatOut Tempfile" "yes\nyes\n" "" ""
+
+#testing "name" "command" "result" "infile" "stdin"
+echo "hello" > file1
+echo "hi" > file2
+echo "Hi, Good morning !! I am a bzcat tester" > file3
+tar -czf file1.gz file1
+tar -czf file2.gz file2
+tar -czf file3.gz file3
+# Get system zcat
+zcatExe=`which zcat`
+$zcatExe file1.gz file2.gz file3.gz > zcatOut
+testing "zcat - decompresses multiple files" "zcat file1.gz file2.gz file3.gz > Tempfile && echo "yes" ; diff Tempfile zcatOut && echo "yes"; rm -rf file* zcatOut Tempfile " "yes\nyes\n" "" ""