summaryrefslogtreecommitdiff
path: root/release/src/router/busybox/tests
diff options
context:
space:
mode:
Diffstat (limited to 'release/src/router/busybox/tests')
-rwxr-xr-xrelease/src/router/busybox/tests/.cvsignore16
-rw-r--r--release/src/router/busybox/tests/Makefile34
-rw-r--r--release/src/router/busybox/tests/cp_tests.mk360
-rw-r--r--release/src/router/busybox/tests/ln_tests.mk71
-rwxr-xr-xrelease/src/router/busybox/tests/multibuild.pl73
-rwxr-xr-xrelease/src/router/busybox/tests/multifeat.pl83
-rw-r--r--release/src/router/busybox/tests/mv_tests.mk167
-rw-r--r--release/src/router/busybox/tests/sh.testcases89
-rw-r--r--release/src/router/busybox/tests/syslog_test.c19
-rw-r--r--release/src/router/busybox/tests/testcases406
-rwxr-xr-xrelease/src/router/busybox/tests/tester.sh158
-rw-r--r--release/src/router/busybox/tests/tst-syslogd.c44
12 files changed, 1520 insertions, 0 deletions
diff --git a/release/src/router/busybox/tests/.cvsignore b/release/src/router/busybox/tests/.cvsignore
new file mode 100755
index 00000000..3645cf92
--- /dev/null
+++ b/release/src/router/busybox/tests/.cvsignore
@@ -0,0 +1,16 @@
+cp
+cp_*.bb
+cp_*.gnu
+cp_tests
+date
+df
+du
+ln
+ln_*.bb
+ln_*.gnu
+ln_tests
+mv
+mv_*.bb
+mv_*.gnu
+mv_tests
+syslog_test
diff --git a/release/src/router/busybox/tests/Makefile b/release/src/router/busybox/tests/Makefile
new file mode 100644
index 00000000..8ad304d8
--- /dev/null
+++ b/release/src/router/busybox/tests/Makefile
@@ -0,0 +1,34 @@
+# busybox/tests/Makefile - Run through all defined tests.
+# ------------------------
+# Copyright (C) 2000 Karl M. Hegbloom <karlheg@debian.org> GPL
+
+all:: message_header
+
+message_header:
+ @echo
+ @echo BusyBox Test Suite.
+ @echo
+ (cd ..; tests/busybox.REGRESS.sh)
+
+clean::
+
+distclean: clean
+
+.PHONY: all clean distclean message_header
+
+include $(wildcard *_tests.mk)
+
+BBL := $(shell pushd .. >/dev/null && \
+ ${MAKE} busybox.links >/dev/null && \
+ popd >/dev/null && \
+ cat ../busybox.links | \
+ sed -e 's,.*/\(.*\)$$,\1,')
+
+../busybox:
+ cd .. && ${MAKE} busybox
+
+${BBL}: ../busybox
+ rm -f $@
+ ln ../busybox $@
+
+syslog_test: syslog_test.c
diff --git a/release/src/router/busybox/tests/cp_tests.mk b/release/src/router/busybox/tests/cp_tests.mk
new file mode 100644
index 00000000..b96c5cea
--- /dev/null
+++ b/release/src/router/busybox/tests/cp_tests.mk
@@ -0,0 +1,360 @@
+# cp_tests.mk - Set of test cases for busybox cp
+# -------------
+# Copyright (C) 2000 Karl M. Hegbloom <karlheg@debian.org> GPL
+#
+
+# GNU `cp'
+GCP = /bin/cp
+# BusyBox `cp'
+BCP = $(shell pwd)/cp
+
+all:: cp_tests
+clean:: cp_clean
+
+cp_clean:
+ - rm -rf cp_tests cp_*.{gnu,bb} cp
+
+# check_cp_dir_to_dir_wo_a removed from this list; see below
+cp_tests: cp_clean cp check_exists check_simple_cp check_cp_symlnk \
+ check_cp_symlink_w_a check_cp_files_to_dir check_cp_files_to_dir_w_d \
+ check_cp_files_to_dir_w_p check_cp_files_to_dir_w_p_and_d \
+ check_cp_dir_to_dir_w_a \
+ check_cp_dir_to_dir_w_a_take_two
+
+check_exists:
+ @echo;
+ @echo "No output from diff means busybox cp is functioning properly.";
+ @echo "Some tests might show timestamp differences that are Ok.";
+
+ @echo;
+ @echo Verify that busybox cp exists;
+ @echo ------------------------------;
+ [ -x ${BCP} ] || exit 0
+
+ @echo;
+ mkdir cp_tests;
+
+check_simple_cp:
+ @echo Copy a file to a copy of the file;
+ @echo ------------------------------;
+ cd cp_tests; \
+ echo A file > afile; \
+ ls -l afile > ../cp_afile_afilecopy.gnu; \
+ ${GCP} afile afilecopy; \
+ ls -l afile afilecopy >> ../cp_afile_afilecopy.gnu;
+
+ @echo;
+ rm -rf cp_tests/*;
+
+ @echo;
+ cd cp_tests; \
+ echo A file > afile; \
+ ls -l afile > ../cp_afile_afilecopy.bb; \
+ ${BCP} afile afilecopy; \
+ ls -l afile afilecopy >> ../cp_afile_afilecopy.bb;
+
+ @echo;
+ @echo Might show timestamp differences.
+ -diff -u cp_afile_afilecopy.gnu cp_afile_afilecopy.bb;
+
+ @echo;
+ rm -rf cp_tests/*;
+
+check_cp_symlnk:
+ @echo; echo Copy a file pointed to by a symlink;
+ @echo ------------------------------;
+ cd cp_tests; \
+ mkdir here there; \
+ echo A file > afile; \
+ cd here; \
+ ln -s ../afile .; \
+
+ @echo;
+ cd cp_tests; \
+ ls -lR . > ../cp_symlink.gnu; \
+ ${GCP} here/afile there; \
+ ls -lR . >> ../cp_symlink.gnu;
+
+ @echo;
+ rm -rf cp_tests/there/*;
+
+ sleep 1;
+
+ @echo;
+ cd cp_tests; \
+ ls -lR . > ../cp_symlink.bb; \
+ ${BCP} here/afile there; \
+ ls -lR . >> ../cp_symlink.bb;
+
+ @echo;
+ @echo Will show timestamp difference.
+ -diff -u cp_symlink.gnu cp_symlink.bb;
+
+ @echo;
+ rm -rf cp_tests/*
+
+check_cp_symlink_w_a:
+ @echo; echo Copy a symlink, useing the -a switch.;
+ @echo ------------------------------;
+ cd cp_tests; \
+ echo A file > afile; \
+ mkdir here there; \
+ cd here; \
+ ln -s ../afile .
+
+ cd cp_tests; \
+ ls -lR . > ../cp_a_symlink.gnu; \
+ ${GCP} -a here/afile there; \
+ ls -lR . >> ../cp_a_symlink.gnu;
+
+ @echo;
+ rm -rf cp_tests/there/*;
+
+ sleep 1;
+
+ @echo;
+ cd cp_tests; \
+ echo A file > afile; \
+ ls -lR . > ../cp_a_symlink.bb; \
+ ${BCP} -a here/afile there; \
+ ls -lR . >> ../cp_a_symlink.bb;
+
+ @echo;
+ diff -u cp_a_symlink.gnu cp_a_symlink.bb;
+
+ @echo;
+ rm -rf cp_tests/*;
+
+
+check_cp_files_to_dir:
+ # Copy a set of files to a directory.
+ @echo; echo Copy a set of files to a directory.;
+ @echo ------------------------------;
+ cd cp_tests; \
+ echo A file number one > afile1; \
+ echo A file number two, blah. > afile2; \
+ ln -s afile1 symlink1; \
+ mkdir there;
+
+ cd cp_tests; \
+ ${GCP} afile1 afile2 symlink1 there/; \
+ ls -lR > ../cp_files_dir.gnu;
+
+ @echo;
+ rm -rf cp_tests/there/*;
+
+ @echo;
+ cd cp_tests; \
+ ${BCP} afile1 afile2 symlink1 there/; \
+ ls -lR > ../cp_files_dir.bb;
+
+ @echo;
+ diff -u cp_files_dir.gnu cp_files_dir.bb;
+
+ @echo;
+ rm -rf cp_tests/*;
+
+check_cp_files_to_dir_w_d:
+ # Copy a set of files to a directory with the -d switch.
+ @echo; echo Copy a set of files to a directory with the -d switch.;
+ @echo ------------------------------;
+ cd cp_tests; \
+ echo A file number one > afile1; \
+ echo A file number two, blah. > afile2; \
+ ln -s afile1 symlink1; \
+ mkdir there1; \
+ ${GCP} -d afile1 afile2 symlink1 there1/; \
+ ls -lR > ../cp_d_files_dir.gnu;
+
+ @echo;
+ rm -rf cp_tests/{afile{1,2},symlink1,there1};
+
+ @echo;
+ cd cp_tests; \
+ echo A file number one > afile1; \
+ echo A file number two, blah. > afile2; \
+ ln -s afile1 symlink1; \
+ mkdir there1; \
+ ${BCP} -d afile1 afile2 symlink1 there1/; \
+ ls -lR > ../cp_d_files_dir.bb;
+
+ @echo;
+ diff -u cp_d_files_dir.gnu cp_d_files_dir.bb;
+
+ @echo;
+ rm -rf cp_tests/{afile{1,2},symlink1,there1};
+
+check_cp_files_to_dir_w_p:
+ # Copy a set of files to a directory with the -p switch.
+ @echo; echo Copy a set of files to a directory with the -p switch.;
+ @echo ------------------------------;
+ cd cp_tests; \
+ echo A file number one > afile1; \
+ echo A file number two, blah. > afile2; \
+ touch --date='Sat Jan 29 21:24:08 PST 2000' afile1; \
+ ln -s afile1 symlink1; \
+ mkdir there1; \
+ ${GCP} -p afile1 afile2 symlink1 there1/; \
+ ls -lR > ../cp_p_files_dir.gnu;
+
+ @echo;
+ rm -rf cp_tests/{afile{1,2},symlink1,there1};
+
+ @echo;
+ cd cp_tests; \
+ echo A file number one > afile1; \
+ echo A file number two, blah. > afile2; \
+ touch --date='Sat Jan 29 21:24:08 PST 2000' afile1; \
+ ln -s afile1 symlink1; \
+ mkdir there1; \
+ ${BCP} -p afile1 afile2 symlink1 there1/; \
+ ls -lR > ../cp_p_files_dir.bb;
+
+ @echo;
+ diff -u cp_p_files_dir.gnu cp_p_files_dir.bb;
+
+ @echo;
+ rm -rf cp_tests/{afile{1,2},symlink1,there1};
+
+
+check_cp_files_to_dir_w_p_and_d:
+ @echo; echo Copy a set of files to a directory with -p and -d switches.
+ @echo ------------------------------;
+ cd cp_tests; \
+ echo A file number one > afile1; \
+ echo A file number two, blah. > afile2; \
+ touch --date='Sat Jan 29 21:24:08 PST 2000' afile1; \
+ ln -s afile1 symlink1; \
+ mkdir there1; \
+ ${GCP} -p -d afile1 afile2 symlink1 there1/; \
+ ls -lR > ../cp_pd_files_dir.gnu;
+
+ @echo;
+ rm -rf cp_tests/{afile{1,2},symlink1,there1};
+
+ @echo;
+ cd cp_tests; \
+ echo A file number one > afile1; \
+ echo A file number two, blah. > afile2; \
+ touch --date='Sat Jan 29 21:24:08 PST 2000' afile1; \
+ ln -s afile1 symlink1; \
+ mkdir there1; \
+ ${BCP} -p -d afile1 afile2 symlink1 there1/; \
+ ls -lR > ../cp_pd_files_dir.bb;
+
+ @echo;
+ diff -u cp_pd_files_dir.gnu cp_pd_files_dir.bb;
+
+ @echo;
+ rm -rf cp_tests/{afile{1,2},symlink1,there1};
+
+# This test doesn't work any more; gnu cp now _does_ copy a directory
+# to a subdirectory of itself. What's worse, that "feature" has no
+# (documented) way to be disabled with command line switches.
+# It's not obvious that busybox cp should mimic this behavior.
+# For now, this test is removed from the cp_tests list, above.
+check_cp_dir_to_dir_wo_a:
+ # Copy a directory to another directory, without the -a switch.
+ @echo; echo Copy a directory to another directory, without the -a switch.
+ @echo ------------------------------;
+ @echo There should be an error message about cannot cp a dir to a subdir of itself.
+ cd cp_tests; \
+ touch a b c; \
+ mkdir adir; \
+ ls -lR . > ../cp_a_star_adir.gnu; \
+ ${GCP} -a * adir; \
+ ls -lR . >> ../cp_a_star_adir.gnu;
+
+ @echo
+ @echo There should be an error message about cannot cp a dir to a subdir of itself.
+ cd cp_tests; \
+ rm -rf adir; \
+ mkdir adir; \
+ ls -lR . > ../cp_a_star_adir.bb; \
+ ${BCP} -a * adir; \
+ ls -lR . >> ../cp_a_star_adir.bb;
+
+ @echo;
+ diff -u cp_a_star_adir.gnu cp_a_star_adir.bb;
+
+ # Done
+ @echo;
+ rm -rf cp_tests;
+ @echo; echo Done.
+
+
+check_cp_dir_to_dir_w_a:
+ @echo; echo Copy a directory into another directory with the -a switch.
+ @echo ------------------------------;
+ cd cp_tests; \
+ mkdir dir{a,b}; \
+ echo A file > dira/afile; \
+ echo A file in dirb > dirb/afileindirb; \
+ ln -s dira/afile dira/alinktoafile; \
+ mkdir dira/subdir1; \
+ echo Another file > dira/subdir1/anotherfile; \
+ ls -lR . > ../cp_a_dira_dirb.gnu; \
+ ${GCP} -a dira dirb; \
+ ls -lR . >> ../cp_a_dira_dirb.gnu;
+
+ @echo;
+ rm -rf cp_tests/dir{a,b};
+
+ @echo;
+ cd cp_tests; \
+ mkdir dir{a,b}; \
+ echo A file > dira/afile; \
+ echo A file in dirb > dirb/afileindirb; \
+ ln -s dira/afile dira/alinktoafile; \
+ mkdir dira/subdir1; \
+ echo Another file > dira/subdir1/anotherfile; \
+ ls -lR . > ../cp_a_dira_dirb.bb; \
+ ${BCP} -a dira dirb; \
+ ls -lR . >> ../cp_a_dira_dirb.bb;
+
+ @echo;
+ diff -u cp_a_dira_dirb.gnu cp_a_dira_dirb.bb;
+
+ @echo;
+ rm -rf cp_tests/dir{a,b};
+
+
+check_cp_dir_to_dir_w_a_take_two:
+ @echo; echo Copy a directory into another directory with the -a switch;
+ @echo ------------------------------;
+ mkdir -p cp_tests/gnu; \
+ mkdir -p cp_tests/bb; \
+ cd cp_tests; \
+ mkdir here there; \
+ echo A file > here/afile; \
+ mkdir here/adir; \
+ touch here/adir/afileinadir; \
+ ln -s $$(pwd) here/alink;
+
+ @echo;
+ cd cp_tests/gnu; \
+ ls -lR . > ../../cp_a_dir_dir.gnu; \
+ ${GCP} -a here/ there/; \
+ ls -lR . >> ../../cp_a_dir_dir.gnu;
+
+ @echo;
+ rm -rf cp_tests/there/*;
+
+ sleep 1;
+
+ @echo;
+ cd cp_tests/bb; \
+ ls -lR . > ../../cp_a_dir_dir.bb; \
+ ${BCP} -a here/ there/; \
+ ls -lR . >> ../../cp_a_dir_dir.bb;
+
+ @echo;
+ echo "Erik 1"
+ diff -u cp_a_dir_dir.gnu cp_a_dir_dir.bb;
+ echo "Erik 2"
+
+ @echo;
+ echo "Erik 3"
+ rm -rf cp_tests/*;
+
+
diff --git a/release/src/router/busybox/tests/ln_tests.mk b/release/src/router/busybox/tests/ln_tests.mk
new file mode 100644
index 00000000..3110f819
--- /dev/null
+++ b/release/src/router/busybox/tests/ln_tests.mk
@@ -0,0 +1,71 @@
+# ln_tests.mk - Set of tests for busybox ln
+# -------------
+# Copyright (C) 2000 Karl M. Hegbloom <karlheg@debian.org> GPL
+#
+
+# GNU `ln'
+GLN = /bin/ln
+# BusyBox `ln'
+BLN = $(shell pwd)/ln
+
+all:: ln_tests
+clean:: ln_clean
+
+ln_clean:
+ rm -rf ln_tests ln_*.{gnu,bb} ln
+
+ln_tests: ln_clean ln
+ @echo;
+ @echo "No output from diff means busybox ln is functioning properly.";
+
+ @echo;
+ ${BLN} || true;
+
+ @echo;
+ mkdir ln_tests;
+
+ @echo;
+ cd ln_tests; \
+ echo A file > afile; \
+ ls -l afile > ../ln_afile_newname.gnu; \
+ ${GLN} afile newname; \
+ ls -l afile newname >> ../ln_afile_newname.gnu;
+
+ @echo;
+ rm -f ln_tests/{afile,newname};
+
+ @echo;
+ cd ln_tests; \
+ echo A file > afile; \
+ ls -l afile > ../ln_afile_newname.bb; \
+ ${BLN} afile newname; \
+ ls -l afile newname >> ../ln_afile_newname.bb;
+
+ @echo;
+ diff -u ln_afile_newname.gnu ln_afile_newname.bb
+
+ @echo;
+ rm -f ln_tests/{afile,newname};
+
+ @echo;
+ cd ln_tests; \
+ echo A file > afile; \
+ ls -l afile > ../ln_s_afile_newname.gnu; \
+ ${GLN} -s afile newname; \
+ ls -l afile newname >> ../ln_s_afile_newname.gnu;
+
+ @echo;
+ rm -f ln_tests/{afile,newname};
+
+ @echo;
+ cd ln_tests; \
+ echo A file > afile; \
+ ls -l afile > ../ln_s_afile_newname.bb; \
+ ${BLN} -s afile newname; \
+ ls -l afile newname >> ../ln_s_afile_newname.bb;
+
+ @echo;
+ diff -u ln_s_afile_newname.gnu ln_s_afile_newname.bb
+
+ @echo;
+ rm -f ln_tests/{afile,newname};
diff --git a/release/src/router/busybox/tests/multibuild.pl b/release/src/router/busybox/tests/multibuild.pl
new file mode 100755
index 00000000..94930bd9
--- /dev/null
+++ b/release/src/router/busybox/tests/multibuild.pl
@@ -0,0 +1,73 @@
+#!/usr/bin/perl
+
+# multibuild.pl
+# Tests BusyBox-0.48 (at least) to see if each applet builds
+# properly on its own. The most likely problems this will
+# flush out are those involving preprocessor instructions in
+# utility.c.
+#
+# TODO: some time it might be nice to list absolute and
+# differential object sizes for each option...
+#
+
+$logfile = "multibuild.log";
+
+# How to handle all the BB_FEATURE_FOO lines
+if ($ARGV[0] eq "-all" ) { shift(@ARGV); $choice="all"; }
+if ($ARGV[0] eq "-none") { shift(@ARGV); $choice="none"; }
+# neither means, leave that part of Config.h alone
+
+# Support building from pristine source
+$make_opt = "-f $ARGV[0]/Makefile BB_SRC_DIR=$ARGV[0]" if ($ARGV[0] ne "");
+
+# Move the config file to a safe place
+-e "Config.h.orig" || 0==system("mv -f Config.h Config.h.orig") || die;
+
+# Clear previous log file, if any
+unlink($logfile);
+
+# Parse the config file
+open(C,"<Config.h.orig") || die;
+while (<C>) {
+ if ($in_trailer) {
+ if (!$in_olympus) {
+ s/^\/\/#/#/ if ($choice eq "all" && !/USE_DEVPS_PATCH/);
+ s/^#/\/\/#/ if ($choice eq "none");
+ }
+ $in_olympus=1 if /End of Features List/;
+ $trailer .= $_;
+ } else {
+ $in_trailer=1 if /End of Applications List/;
+ if (/^\/*#define BB_([A-Z0-9_]*)/) {
+ push @apps, $1;
+ }
+ }
+}
+close C;
+
+# Do the real work ...
+$failed_tests=0;
+for $a (@apps) {
+ # print "Testing build of applet $a ...\n";
+ open (O, ">Config.h") || die;
+ print O "#define BB_$a\n", $trailer;
+ close O;
+ system("echo -e '\n***\n$a\n***' >>$logfile");
+ # With a fast computer and 1-second resolution on file timestamps, this
+ # process pushes beyond the limits of what unix make can understand.
+ # That's why need to weed out obsolete files before restarting make.
+ $result{$a} = system("rm -f *.o applet_source_list; make $make_opt busybox >>$logfile 2>&1");
+ $flag = $result{$a} ? "FAILED!!!" : "ok";
+ printf("Applet %-20s: %s\n", $a, $flag);
+ $total_tests++;
+ $failed_tests++ if $flag eq "FAILED!!!";
+ # pause long enough to let user stop us with a ^C
+ select(undef, undef, undef, 0.03);
+}
+
+# Clean up our mess
+system("mv -f Config.h.orig Config.h");
+
+print "$total_tests applets tested, $failed_tests failures\n";
+print "See $logfile for details.\n";
+
diff --git a/release/src/router/busybox/tests/multifeat.pl b/release/src/router/busybox/tests/multifeat.pl
new file mode 100755
index 00000000..adcb30bb
--- /dev/null
+++ b/release/src/router/busybox/tests/multifeat.pl
@@ -0,0 +1,83 @@
+#!/usr/bin/perl
+#
+# multifeat.pl
+#
+# Turns on all applets, then tests turning on one feature at a time through
+# iterative compilations. Tests if any features depend on each other in any
+# weird ways or such-like problems.
+#
+# Hacked by Mark Whitley, but based *heavily* on multibuild.pl which was
+# written by Larry Doolittle.
+
+$logfile = "multifeat.log";
+
+# How to handle all the BB_APPLET lines
+# (most thorough testing occurs when you call it with the -all switch)
+if ($ARGV[0] eq "-all" ) { shift(@ARGV); $choice="all"; }
+if ($ARGV[0] eq "-none") { shift(@ARGV); $choice="none"; }
+# neither means, leave that part of Config.h alone
+
+# Support building from pristine source
+$make_opt = "-f $ARGV[0]/Makefile BB_SRC_DIR=$ARGV[0]" if ($ARGV[0] ne "");
+
+# Move the config file to a safe place
+-e "Config.h.orig" || 0==system("mv -f Config.h Config.h.orig") || die;
+
+# Clear previous log file, if any
+unlink($logfile);
+
+# Parse the config file
+open(C,"<Config.h.orig") || die;
+$in_applist=1;
+$in_features=0;
+$in_olympus=0;
+while (<C>) {
+ if ($in_applist) {
+ s/^\/\/#/#/ if ($choice eq "all");
+ s/^#/\/\/#/ if ($choice eq "none");
+ $header .= $_;
+ if (/End of Applications List/) {
+ $in_applist=0;
+ $in_features=1
+ }
+ }
+ elsif ($in_features) {
+ if (/^\/*#define BB_FEATURE_([A-Z0-9_]*)/) {
+ push @features, $1;
+ }
+ if (/End of Features List/) {
+ $in_features=0;
+ $in_olympus=1
+ }
+ } elsif ($in_olympus) {
+ $trailer .= $_;
+ }
+}
+close C;
+
+# Do the real work ...
+$failed_tests=0;
+for $f (@features) {
+ # print "Testing build with feature $f ...\n";
+ open (O, ">Config.h") || die;
+ print O $header, "#define BB_FEATURE_$f\n", $trailer;
+ close O;
+ system("echo -e '\n***\n$f\n***' >>$logfile");
+ # With a fast computer and 1-second resolution on file timestamps, this
+ # process pushes beyond the limits of what unix make can understand.
+ # That's why need to weed out obsolete files before restarting make.
+ $result{$f} = system("rm -f *.o applet_source_list; make $make_opt busybox >>$logfile 2>&1");
+ $flag = $result{$f} ? "FAILED!!!" : "ok";
+ printf("Feature %-20s: %s\n", $f, $flag);
+ $total_tests++;
+ $failed_tests++ if $flag eq "FAILED!!!";
+ # pause long enough to let user stop us with a ^C
+ select(undef, undef, undef, 0.03);
+}
+
+# Clean up our mess
+system("mv -f Config.h.orig Config.h");
+
+print "$total_tests applets tested, $failed_tests failures\n";
+print "See $logfile for details.\n";
+
diff --git a/release/src/router/busybox/tests/mv_tests.mk b/release/src/router/busybox/tests/mv_tests.mk
new file mode 100644
index 00000000..f03e08a7
--- /dev/null
+++ b/release/src/router/busybox/tests/mv_tests.mk
@@ -0,0 +1,167 @@
+# mv_tests.mk - Set of tests cases for busybox mv
+# -------------
+# Copyright (C) 2000 Karl M. Hegbloom <karlheg@debian.org> GPL
+#
+
+# GNU `mv'
+GMV = /bin/mv
+# BusyBox `mv'
+BMV = $(shell pwd)/mv
+
+all:: mv_tests
+clean:: mv_clean
+
+mv_clean:
+ rm -rf mv_tests mv_*.{gnu,bb} mv
+
+mv_tests: mv_clean mv
+ @echo;
+ @echo "No output from diff means busybox mv is functioning properly.";
+ @echo;
+ @echo "No such file or directory is good; it means the old file got removed.";
+ @echo;
+ ${BMV} || true;
+
+ @echo;
+ mkdir mv_tests;
+
+ @echo;
+ cd mv_tests; \
+ echo A file > afile; \
+ ls -l afile > ../mv_afile_newname.gnu; \
+ ${GMV} afile newname; \
+ ls -l newname >> ../mv_afile_newname.gnu;
+ -ls -l mv_tests/afile;
+
+ @echo;
+ rm -f mv_tests/{afile,newname};
+
+ @echo;
+ cd mv_tests; \
+ echo A file > afile; \
+ ls -l afile > ../mv_afile_newname.bb; \
+ ${BMV} afile newname; \
+ ls -l newname >> ../mv_afile_newname.bb;
+ -ls -l mv_tests/afile;
+
+ @echo;
+ diff -u mv_afile_newname.gnu mv_afile_newname.bb;
+
+ @echo;
+ rm -f mv_tests/{afile,newname};
+
+ @echo; echo ------------------------------;
+ cd mv_tests; \
+ echo A file > afile; \
+ ln -s afile symlink; \
+ ls -l afile symlink > ../mv_symlink_newname.gnu; \
+ ${GMV} symlink newname; \
+ ls -l afile newname >> ../mv_symlink_newname.gnu;
+ -ls -l mv_tests/symlink;
+
+ @echo;
+ rm -f mv_tests/{afile,newname};
+
+ @echo;
+ cd mv_tests; \
+ echo A file > afile; \
+ ln -s afile symlink; \
+ ls -l afile symlink > ../mv_symlink_newname.bb;\
+ ${BMV} symlink newname; \
+ ls -l afile newname >> ../mv_symlink_newname.bb;
+ -ls -l mv_tests/symlink;
+
+ @echo;
+ diff -u mv_symlink_newname.gnu mv_symlink_newname.bb;
+
+ @echo;
+ rm -rf mv_tests/*;
+
+ @echo; echo ------------------------------;
+ cd mv_tests; \
+ echo A file > afile; \
+ ln -s afile symlink; \
+ mkdir newdir; \
+ ls -lR > ../mv_file_symlink_dir.gnu; \
+ ${GMV} symlink afile newdir; \
+ ls -lR >> ../mv_file_symlink_dir.gnu;
+ -ls -l mv_tests/{symlink,afile};
+
+ @echo;
+ rm -rf mv_tests/*
+
+ @echo; echo ------------------------------;
+ cd mv_tests; \
+ echo A file > afile; \
+ ln -s afile symlink; \
+ mkdir newdir; \
+ ls -lR > ../mv_file_symlink_dir.bb; \
+ ${BMV} symlink afile newdir; \
+ ls -lR >> ../mv_file_symlink_dir.bb;
+ -ls -l mv_tests/{symlink,afile};
+
+ @echo;
+ diff -u mv_file_symlink_dir.gnu mv_file_symlink_dir.bb;
+
+ @echo;
+ rm -rf mv_tests/*;
+
+ @echo; echo ------------------------------;
+ cd mv_tests; \
+ mkdir dir{a,b}; \
+ echo A file > dira/afile; \
+ echo A file in dirb > dirb/afileindirb; \
+ ln -s dira/afile dira/alinktoafile; \
+ mkdir dira/subdir1; \
+ echo Another file > dira/subdir1/anotherfile; \
+ ls -lR . > ../mv_dira_dirb.gnu; \
+ ${GMV} dira dirb; \
+ ls -lR . >> ../mv_dira_dirb.gnu;
+
+ # false;
+ @echo;
+ rm -rf mv_tests/dir{a,b};
+
+ @echo;
+ cd mv_tests; \
+ mkdir dir{a,b}; \
+ echo A file > dira/afile; \
+ echo A file in dirb > dirb/afileindirb; \
+ ln -s dira/afile dira/alinktoafile; \
+ mkdir dira/subdir1; \
+ echo Another file > dira/subdir1/anotherfile; \
+ ls -lR . > ../mv_dira_dirb.bb; \
+ ${BMV} dira dirb; \
+ ls -lR . >> ../mv_dira_dirb.bb;
+
+ @echo;
+ diff -u mv_dira_dirb.gnu mv_dira_dirb.bb;
+
+ # false;
+ @echo;
+ rm -rf mv_tests/dir{a,b};
+
+ @echo; echo ------------------------------;
+ @echo There should be an error message about cannot mv a dir to a subdir of itself.
+ cd mv_tests; \
+ mkdir adir; \
+ touch -r . a b c adir; \
+ ls -lR . > ../mv_a_star_adir.gnu; \
+ ${GMV} * adir; \
+ ls -lR . >> ../mv_a_star_adir.gnu;
+
+ @echo
+ @echo There should be an error message about cannot mv a dir to a subdir of itself.
+ cd mv_tests; \
+ rm -rf a b c adir; \
+ mkdir adir; \
+ touch -r . a b c adir; \
+ ls -lR . > ../mv_a_star_adir.bb; \
+ ${BMV} * adir; \
+ ls -lR . >> ../mv_a_star_adir.bb;
+
+ @echo;
+ diff -u mv_a_star_adir.gnu mv_a_star_adir.bb;
+
+ @echo;
+ rm -rf mv_test/*;
diff --git a/release/src/router/busybox/tests/sh.testcases b/release/src/router/busybox/tests/sh.testcases
new file mode 100644
index 00000000..e2a75873
--- /dev/null
+++ b/release/src/router/busybox/tests/sh.testcases
@@ -0,0 +1,89 @@
+# try running this with bash, ksh, ash, and hush.
+
+# simple quoting rules.
+echo a b
+echo "a b"
+echo a "" b
+echo a '' b
+echo hello?
+echo "hello?"
+echo t* hello
+echo t\* hello
+
+# quick and painless exit for lash
+if false; then true; exit; fi
+
+# fairly simple command substitution
+echo `echo -e foo\\\necho bar`
+
+echo THIS IS A TEST >foo
+cat $(echo FOO | tr 'A-Z' 'a-z')
+cat foo | tr 'A-Z' 'a-z'
+cat $(echo FOO | tr 'A-Z' 'a-z') | tr 'A-Z' 'a-z'
+
+cat foo | if true; then tr 'A-Z' 'a-z'; else echo bar1; fi
+cat foo | if false; then tr 'A-Z' 'a-z'; else echo bar2; fi
+if true; then tr 'A-Z' 'a-z'; else echo bar3; fi <foo
+if false; then tr 'A-Z' 'a-z'; else echo bar4; fi <foo
+if true || false; then echo foo; else echo bar5; fi
+if true && false; then echo bar6; else echo foo; fi
+
+# basic distinction between local and env variables
+unset FOO
+FOO=bar env | grep FOO
+echo "but not here: $FOO"
+FOO=bar
+env | grep FOO
+echo "yes, here: $FOO"
+FOO=
+echo a $FOO b
+echo "a $FOO b"
+
+# not quite so basic variables. Credit to Matt Kraai.
+unset FOO
+FOO=bar
+export FOO
+env | grep FOO
+unset FOO
+export FOO=bar
+FOO=baz
+env | grep FOO
+
+# interaction between environment variables and if/then and subshells
+FOO=default
+if true; then FOO=new; fi
+echo $FOO
+FOO=default
+(FOO=bogus)
+echo $FOO
+
+# make sure we can duplicate file descriptors properly
+echo replacement >foo 2>&1
+cat foo
+cat doesnt_exist >foo 2>&1
+tr 'a-z' 'A-Z' <foo
+
+# fairly simple example of hush expanding variables too early
+unset TMP
+rm -f fish
+TMP=fish && >$TMP
+ls fish
+
+# ash, lash, and hush do not create fish; bash and ksh do.
+# Thanks to Tapani Tarvainen <tt@mit.jyu.fi> for this stress test.
+unset TMP
+rm -f fish
+TMP=fish >$TMP
+ls fish
+
+# The following example shows that hush's parser is
+# not _really_ Bourne compatible
+echo "echo Hello World" >"a=b"
+unset a
+chmod a+x "a=b"
+PATH=$PATH:.
+"a=b"
+echo $a
+
+# assuming the shell wasn't too buggy, clean up the mess
+rm -f a=b fish foo
diff --git a/release/src/router/busybox/tests/syslog_test.c b/release/src/router/busybox/tests/syslog_test.c
new file mode 100644
index 00000000..fb4c691b
--- /dev/null
+++ b/release/src/router/busybox/tests/syslog_test.c
@@ -0,0 +1,19 @@
+#include <syslog.h>
+
+int do_log(char* msg, int delay)
+{
+ openlog("testlog", LOG_PID, LOG_DAEMON);
+ while(1) {
+ syslog(LOG_ERR, "%s: testing one, two, three\n", msg);
+ sleep(delay);
+ }
+ closelog();
+ return(0);
+};
+
+int main(void)
+{
+ if (fork()==0)
+ do_log("A", 2);
+ do_log("B", 3);
+}
diff --git a/release/src/router/busybox/tests/testcases b/release/src/router/busybox/tests/testcases
new file mode 100644
index 00000000..4708e54e
--- /dev/null
+++ b/release/src/router/busybox/tests/testcases
@@ -0,0 +1,406 @@
+# 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)
+
diff --git a/release/src/router/busybox/tests/tester.sh b/release/src/router/busybox/tests/tester.sh
new file mode 100755
index 00000000..a767c6c7
--- /dev/null
+++ b/release/src/router/busybox/tests/tester.sh
@@ -0,0 +1,158 @@
+#!/bin/bash
+#
+# tester.sh - reads testcases from file and tests busybox applets vs GNU
+# counterparts
+#
+# This should be run from within the tests/ directory. Before you run it, you
+# should compile up a busybox that has all applets and all features turned on.
+
+# set up defaults (can be changed with cmd-line options)
+BUSYBOX=../busybox
+TESTCASES=testcases
+LOGFILE=tester.log
+BB_OUT=bb.out
+GNU_OUT=gnu.out
+SETUP=""
+CLEANUP=""
+KEEPTMPFILES="no"
+DEBUG=2
+
+
+#while getopts 'p:t:l:b:g:s:c:kd:' opt
+while getopts 'p:t:l:s:c:kd:' opt
+do
+ case $opt in
+ p) BUSYBOX=$OPTARG; ;;
+ t) TESTCASES=$OPTARG; ;;
+ l) LOGFILE=$OPTARG; ;;
+# b) BB_OUT=$OPTARG; ;;
+# g) GNU_OUT=$OPTARG; ;;
+ s) SETUP=$OPTARG; ;;
+ c) CLEANUP=$OPTARG; ;;
+ k) KEEPTMPFILES="yes"; ;;
+ d) DEBUG=$OPTARG; ;;
+ *)
+ echo "usage: $0 [-ptlbgsc]"
+ echo " -p PATH path to busybox executable (default=$BUSYBOX)"
+ echo " -t FILE run testcases in FILE (default=$TESTCASES)"
+ echo " -l FILE log test results in FILE (default=$LOGFILE)"
+# echo " -b FILE store temporary busybox output in FILE"
+# echo " -g FILE store temporary GNU output in FILE"
+ echo " -s FILE (setup) run commands in FILE before testcases"
+ echo " -c FILE (cleanup) run commands in FILE after testcases"
+ echo " -k keep temporary output files (don't delete them)"
+ echo " -d NUM set level of debugging output"
+ echo " 0 = no output"
+ echo " 1 = output failures / whoops lines only"
+ echo " 2 = (default) output setup / cleanup msgs and testcase lines"
+ echo " 3+= other debug noise (internal stuff)"
+ exit 1
+ ;;
+ esac
+done
+#shift `expr $OPTIND - 1`
+
+
+# maybe print some debug output
+if [ $DEBUG -ge 3 ]
+then
+ echo "BUSYBOX=$BUSYBOX"
+ echo "TESTCASES=$TESTCASES"
+ echo "LOGFILE=$LOGFILE"
+ echo "BB_OUT=$BB_OUT"
+ echo "GNU_OUT=$GNU_OUT"
+ echo "SETUP=$SETUP"
+ echo "CLEANUP=$CLEANUP"
+ echo "DEBUG=$DEBUG"
+fi
+
+
+# do sanity checks
+if [ ! -e $BUSYBOX ]
+then
+ echo "Busybox executable: $BUSYBOX not found!"
+ exit 1
+fi
+
+if [ ! -e $TESTCASES ]
+then
+ echo "Testcases file: $TESTCASES not found!"
+ exit 1
+fi
+
+
+# do normal setup
+[ -e $LOGFILE ] && rm $LOGFILE
+unalias -a # gets rid of aliases that might create different output
+
+
+# do extra setup (if any)
+if [ ! -z "$SETUP" ]
+then
+ [ $DEBUG -ge 2 ] && echo "running setup commands in $SETUP"
+ source $SETUP
+fi
+
+
+# go through each line in the testcase file
+cat $TESTCASES | while read line
+do
+ #echo $line
+ # only process non-blank lines and non-comment lines
+ if [ "$line" ]
+ then
+ if [ `echo "$line" | cut -c1` != "#" ]
+ then
+
+ # test if the applet was compiled into busybox
+ # (this only tests the applet at the beginning of the line)
+ #applet=`echo $line | cut -d' ' -f1`
+ applet=`echo $line | sed 's/\(^[^ ;]*\)[ ;].*/\1/'`
+ $BUSYBOX 2>&1 | grep -qw $applet
+ if [ $? -eq 1 ]
+ then
+ echo "WHOOPS: $applet not compiled into busybox" | tee -a $LOGFILE
+ else
+
+ # execute line using gnu / system programs
+ [ $DEBUG -ge 2 ] && echo "testing: $line" | tee -a $LOGFILE
+ sh -c "$line" > $GNU_OUT
+
+ # change line to include "busybox" before every statement
+ line="$BUSYBOX $line"
+ # is this a bash-2-ism?
+ # line=${line//;/; $BUSYBOX }
+ # line=${line//|/| $BUSYBOX }
+ # assume $BUSYBOX has no commas
+ line=`echo "$line" | sed -e 's,;,; '$BUSYBOX, \
+ -e 's, |, | '$BUSYBOX,`
+
+ # execute line using busybox programs
+ [ $DEBUG -ge 2 ] && echo "testing: $line" | tee -a $LOGFILE
+ sh -c "$line" > $BB_OUT
+
+ # see if they match
+ diff -q $BB_OUT $GNU_OUT > /dev/null
+ if [ $? -eq 1 ]
+ then
+ [ $DEBUG -ge 1 ] && echo "FAILED: $line" | tee -a $LOGFILE
+ diff -u $BB_OUT $GNU_OUT >> $LOGFILE
+ fi
+ fi
+ fi
+ fi
+done
+
+[ $DEBUG -gt 0 ] && echo "Finished. Results are in $LOGFILE"
+
+
+# do normal cleanup
+[ "$KEEPTMPFILES" = "no" ] && rm -f $BB_OUT $GNU_OUT
+
+
+# do extra cleanup (if any)
+if [ ! -z "$CLEANUP" ]
+then
+ [ $DEBUG -ge 2 ] && echo "running cleanup commands in $CLEANUP"
+ source $CLEANUP
+fi
diff --git a/release/src/router/busybox/tests/tst-syslogd.c b/release/src/router/busybox/tests/tst-syslogd.c
new file mode 100644
index 00000000..bae10afd
--- /dev/null
+++ b/release/src/router/busybox/tests/tst-syslogd.c
@@ -0,0 +1,44 @@
+/*
+ * tst-syslogd.c - tests concurrent threads calling syslog
+ *
+ * build with: gcc -Wall tst-syslogd.c -lpthread
+ */
+
+#include <stdio.h>
+#include <pthread.h>
+#include <syslog.h>
+#include <unistd.h>
+
+void *log_func(void *arg)
+{
+ int i;
+ int thrid = (int)arg;
+
+ openlog(NULL, LOG_PERROR | LOG_PID, LOG_USER);
+ for (i = 0; i < 10; i++) {
+ syslog(LOG_DEBUG, "thread %i iter %i\n", thrid, i);
+ sleep(thrid); /* this mixes things up a bit */
+ }
+ closelog();
+
+ return NULL;
+}
+
+int main(int argc, char **argv)
+{
+ pthread_t thr1, thr2, thr3;
+ int id1 = 1;
+ int id2 = 2;
+ int id3 = 3;
+
+ pthread_create(&thr1, NULL, log_func, (void *)id1);
+ pthread_create(&thr2, NULL, log_func, (void *)id2);
+ pthread_create(&thr3, NULL, log_func, (void *)id3);
+
+ pthread_join(thr1, NULL);
+ pthread_join(thr2, NULL);
+ pthread_join(thr3, NULL);
+
+ return 0;
+}
+