# testcases
#
# This file should be filled with test cases to test applets that:
#
#  - can somehow produce output (we can't test sync or sleep)
#  - have a GNU (or other) counterpart
#  - are not interactive (don't require a ^C or anything)
#  - don't require extensive setup or cleanup (a litte setup is fine)
#  - don't have huge and possibly damaging effects (fsck, swapoff)
#
# If possible, a test case should be made that tests each option the applet
# supports. When a new option is added, a new test case should be written for
# it. When somebody reports a bug with a testcase, that testcase should be
# added here as well.
#
# Some other guidelines to follow:
#
#  - please try to keep applets alphabetized, it will make life easier
#  - use the file tester.sh or testcases when you need to do a non-destructive
#    test on a file (i.e., cat, md5sum)
#  - try to make the applet you're testing the first thing on the line (this
#    not always possible)
#  - (???) if you have to create a temporary file, call it TMPFILE
#  - pipe symbols that represent real pipes need a space in front of them
#     (so the test script can find them and add the "../busybox" after it).
#  - pipe symbols that are not used for pipes need to be shell-escaped,
#     with a double \.  See the expr test cases.


# ar

# basename
basename `pwd`

# cat
cat tester.sh
echo hello there | cat tester.sh -

# chmod
# chown
# chgrp
# chroot
# chvt - can't be tested here
# clear - can't be tested here
# cmp
# cp

# cut
echo "1234" | cut -c1
echo "1234" | cut -c 1
echo "1234567890" | cut -c2-7
echo "1234567890" | cut -c 2-7
echo "f1	f2" | cut -f2
echo "f1	f2" | cut -f 2
echo "f1	f2	f3	f4	f5" | cut -f2-4
echo "f1	f2	f3	f4	f5" | cut -f 2-4

# date
date
date -R
date -u
date +%d/%m/%y

# dc - needs an input file

# dd
# BUG: record count line goes to stdout instead of stderr
dd if=/dev/urandom of=O bs=1k count=1 ; ls -l O ; rm O

# deallocvt

# df
# XXX: minor formatting differences
df
df .
df -k
df -h
df -m

# dirname
dirname `pwd`

# dmesg (XXX: change the silly cmd business in the source)
dmesg
dmesg -n 8
dmesg -s 512
# I really don't want to do this next one
#dmesg -c

# dos2unix - needs an input file
# dpkg
# dpkg_deb

# du
# BUG: rounding behavior differs from GNU du
du
du -s
du -l
du -k
du -h
du -m

# dumpkmap - no counterprt?
# dutmp - no counterprt?

# echo
echo "foo bar baz"
echo -n "no newline"


# expr
expr 1 \\| 1
expr 1 \\| 0
expr 0 \\| 1
expr 0 \\| 0

expr 1 \\& 1
expr 1 \\& 0
expr 0 \\& 1
expr 0 \\& 0

expr 0 \\< 1
expr 1 \\< 0

expr 1 \\> 0
expr 0 \\> 1

expr 0 \\<= 1
expr 1 \\<= 0
expr 1 \\<= 1

expr 1 \\>= 0
expr 0 \\>= 1
expr 1 \\>= 1

expr 1 + 2
expr 2 - 1
expr 2 \\* 3
expr 12 / 2
expr 12 % 5

# somebody else can do all the string stuff


# fbset - can't be tested here
# fdflush
# find
find .

# free
# XXX: minor formatting differences
free

# freeramdisk
# fsck.minix - won't test
# getopt

# grep
grep -l strdup ../*.c
grep -c strdup ../*.c
grep -lc strdup ../*.c
grep -cv strdup ../*.c
grep -i null ../grep.c
grep -e strdup -e regcomp -e atexit ../grep.c

# gunzip

# gzip
# XXX: compressed output differs from gzip-1.2.4, but decompresses fine
echo testing 1 2 3 >tmpfile1; gzip tmpfile1; echo tmpfile*; md5sum tmpfile1.gz; rm tmpfile1.gz
echo testing 1 2 3 | gzip >tmpfile1.gz; md5sum tmpfile1.gz; rm tmpfile1.gz


# halt - won't test, dangerous

# head
head tester.sh
head -n 2 tester.sh

# hostid
hostid

# hostname
# XXX: minor formatting differences
hostname
hostname -s
hostname -i
hostname -d
# not going to do this next one
#hostname -F

# id
# BUG: Busybox id doesn't print supplemental groups
id
id -u
id -g
id -ur
id -un


# ifconfig
# requires BB_FEATURE_IFCONFIG_STATUS
ifconfig
#ifconfig -a
#ifconfig eth0
#ifconfig lo

# init - won't test
# insmod - won't test

# kill
#kill -l
# not going to do any more

# length
# ln - see ln_tests.mk
# loadacm
# loadfont
# loadkmap
# logger
# logname

# ls
# XXX: minor formatting differences
ls ../e*
ls -l ../e*
ls -s ../e*
ls -h ../e*
ls -1 ../e*

# lsmod
lsmod

# makedevs

# md5sum
md5sum tester.sh

# mkdir
mkdir D ; ls -ld D ; rmdir D

# mkfifo
#
# we will test making one. actually testing pushing data through it requires
# more interaction than we can manage here.
# (these lines turn up an existing ls bug)
mkfifo F ; ls -l F ; rm F
mkfifo -m 0600 F ; ls -l F ; rm F

# mkfs.minix - won't test
# mknod
# mkswap - won't test
# mktemp
# more - can't test: interactive

# mount
# BUG: proc line starts with /proc instead of proc
mount
# not going to test mount with any args, can't be done safely or sanely

# mt
# mv - see mv_tests.mk
# nc
# nfsmount
# nslookup
# ping
ping -c 3 yahoo.com
# pivot_root
# poweroff - won't test
# printf
# ps - there's lotsa differences between busybox ps and any other ps

# pwd
pwd

# rdate - won't test

# readlink
ln -sf tester.sh L ; readlink L ; rm -f L

# reboot - won't test
# renice - won't test
# reset - can't test: no output

# rm
touch F ; rm F

# rmdir
# rmmod - won't test: dangerous

# route
# XXX: doesn't DNS resolve
route

# rpm2cpio

# rpmunpack

# sed - we can do some one-liners here, some testing is a little
# difficult to do in just this space (like a,i,c cmds).

# test ^$ matching
echo foo | sed -ne '/^$/p'
echo -e "foo\\n\\nbar" | sed -ne '/^$/p'

sed -e '/test$/d' testcases
sed -e '/^echo/d' testcases
sed -e '/test/s/dangerous/PELIGROSO/' testcases
sed -ne '1,/getopt/p' ../pwd.c
sed -e '/getopt/r ../pwd.c' ../sed.c


# setkeycodes

# sh - note that we cannot test the shell interactively here
sh -c "echo a b c"
sh -c ">"
sh -c "a"
sh sh.testcases


# sleep - can't test: produces no output

# sort
sort tester.sh
sort -n tester.sh
sort -r tester.sh

# stty
# swapon - won't test: dangerous
# swapoff - won't test: dangerous
# sync - can't test: no output
# syslogd - won't test: too involved

# tail
tail tester.sh
tail -n 2  tester.sh

# tar

# tee
echo "please tee me!" | tee A B C ; cat A B C
echo "please tee me!" | tee A B C ; echo "tee me too!" | tee -a A B C ; cat A B C ; rm A B C

# telnet - can't test: interactive

# test
# tftp

# touch
touch tmpfile1; ls tmpfile1; rm -f tmpfile1
touch -c tmpfile1; ls tmpfile1; rm -f tmpfile1

# tr
# BUG: Busybox tr range handling minix style [a-z] instead of GNU # style a-z
echo "cbaab" | tr abc zyx
echo "TESTING A B C" | tr [A-Z] [a-z]
# not GNU compatible
echo fdhrnzvfu bffvsentr | tr [a-z] [n-z][a-m]
echo abc[] | tr a[b AXB
echo testing | tr -d aeiou

# true
true ; echo $?

# false
false ; echo $?

# tty
# umount
# uname
# uniq
# unix2dos
# update

# uptime
# BUG: doesn't print number of users
uptime

# usleep
# uudecode
# uuencode
# watchdog

# wc
wc tester.sh
wc -c tester.sh
wc -w tester.sh
wc -l tester.sh
wc -L tester.sh

# wget

# which
which ls

# whoami
whoami

# xargs
# XXX: Busygox xargs divides filenames with '\n' instead of ' '
ls -1 ../e* | xargs
ls -1 ../e* | xargs md5sum

# yes - can't test: interactive (needs ^C)

