summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichał Łyszczek <michal.lyszczek@bofc.pl>2018-12-13 18:17:28 +0100
committerMichał Łyszczek <michal.lyszczek@bofc.pl>2018-12-13 19:52:39 +0100
commit3b413162c7f5ab1cb658df26cfd3137993660c37 (patch)
tree5a85a633e9274e3b1339696ca94d8afabc106068
parent38c9a7fecc6375f0f2a31dd960967b2e869c42e2 (diff)
downloadu3-3b413162c7f5ab1cb658df26cfd3137993660c37.tar.gz
u3-3b413162c7f5ab1cb658df26cfd3137993660c37.tar.bz2
u3-3b413162c7f5ab1cb658df26cfd3137993660c37.zip
sleep: add new programHEADmaster
-rw-r--r--configure.ac12
-rw-r--r--inc/u3.h6
-rw-r--r--src/.gitignore1
-rw-r--r--src/Makefile.am12
-rw-r--r--src/seq.c54
-rw-r--r--src/sleep.c223
-rw-r--r--src/utils.c78
-rw-r--r--src/utils.h11
-rw-r--r--tst/Makefile.am4
-rwxr-xr-xtst/rev-test.sh71
-rwxr-xr-xtst/sleep-test.sh196
11 files changed, 576 insertions, 92 deletions
diff --git a/configure.ac b/configure.ac
index e025b18..7f056cc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -122,6 +122,16 @@ AS_IF([test "x$enable_library" = "xyes"],
#
###
+# TEST_RUN
+#
+
+
+AC_ARG_VAR([TEST_RUN], [Enables code neede by tests only])
+AS_IF([test "x$TEST_RUN" = "x"], [TEST_RUN="0"])
+AC_DEFINE_UNQUOTED([TEST_RUN], [$TEST_RUN], [Enables code neede by tests only])
+
+
+###
# U3_REV_LINE_MAX
#
@@ -129,12 +139,14 @@ AC_ARG_VAR([U3_REV_LINE_MAX], [Max size of line buffer])
AS_IF([test "x$U3_REV_LINE_MAX" = "x"], [U3_REV_LINE_MAX="256"])
AC_DEFINE_UNQUOTED([U3_REV_LINE_MAX], [$U3_REV_LINE_MAX], [Max size of line buffer])
+
AC_OUTPUT
echo
echo "u3 compilation configuration summary"
echo "build standalone.......: $enable_standalone"
echo "build library..........: $enable_library"
+echo "test run...............: $TEST_RUN"
echo ""
echo "enable malloc..........: $enable_malloc"
echo ""
diff --git a/inc/u3.h b/inc/u3.h
index 05b26a7..8f0ef04 100644
--- a/inc/u3.h
+++ b/inc/u3.h
@@ -3,10 +3,10 @@
Author: Michał Łyszczek <michal.lyszczek@bofc.pl>
========================================================================== */
-#ifndef U3_UTILS_H
-#define U3_UTILS_H 1
+#ifndef U3_PROGS_H
+#define U3_PROGS_H 1
int u3_rev_main(int argc, char *argv[]);
int u3_seq_main(int argc, char *argv[]);
-#endif /* U3_UTILS_H */
+#endif /* U3_PROGS_H */
diff --git a/src/.gitignore b/src/.gitignore
index 7cd27c0..866f2ea 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -2,3 +2,4 @@
/.deps
/rev
/seq
+/sleep
diff --git a/src/Makefile.am b/src/Makefile.am
index 02a8e04..2e6f0f1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,6 +1,6 @@
if ENABLE_STANDALONE
-bin_PROGRAMS = rev seq
+bin_PROGRAMS = rev seq sleep
bin_cflags = $(COVERAGE_CFLAGS) -I$(top_srcdir)/inc -DU3_STANDALONE=1
bin_ldflags = $(COVERAGE_LDFLAGS)
@@ -9,19 +9,23 @@ rev_SOURCES = rev.c
rev_CFLAGS = $(bin_cflags)
rev_LDFLAGS = $(bin_ldflags)
-seq_SOURCES = seq.c
+seq_SOURCES = seq.c utils.c
seq_CFLAGS = $(bin_cflags)
seq_LDFLAGS = $(bin_ldflags)
+sleep_SOURCES = sleep.c utils.c
+sleep_CFLAGS = $(bin_cflags)
+sleep_LDFLAGS = $(bin_ldflags)
+
endif # ENABLE_STANDALONE
if ENABLE_LIBRARY
lib_LTLIBRARIES = libu3.la
-source = rev.c seq.c
+source = rev.c seq.c sleep.c utils.c
libu3_la_SOURCES = $(source)
-libu3_la_SOURCES += u3defs.h
+libu3_la_SOURCES += u3defs.h utils.h
libu3_la_CFLAGS = $(COVERAGE_CFLAGS) -I$(top_srcdir)/inc -DU3_LIBRARY=1
libu3_la_LDFLAGS = $(COVERAGE_LDFLAGS) -version-info 1:0:1
diff --git a/src/seq.c b/src/seq.c
index 8038943..bd753dc 100644
--- a/src/seq.c
+++ b/src/seq.c
@@ -27,8 +27,9 @@
#include <stdlib.h>
#include <string.h>
-#include <u3.h>
-#include <u3defs.h>
+#include "u3.h"
+#include "u3defs.h"
+#include "utils.h"
/* ==========================================================================
@@ -58,49 +59,6 @@ static void print_help(void)
/* ==========================================================================
- Converts string number 'num' into number representation. Converted value
- will be stored in address pointed by 'n'.
- ========================================================================== */
-
-
-static int get_number
-(
- const char *num, /* string to convert to number */
- long *n /* converted num will be placed here */
-)
-{
- const char *ep; /* endptr for strtol function */
- /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-
-
- if (*num == '\0')
- {
- fprintf(stderr, "e/number is an empty string\n");
- errno = EINVAL;
- return -1;
- }
-
- *n = strtol(num, (char **)&ep, 10);
-
- if (*ep != '\0')
- {
- fprintf(stderr, "e/invalid number passed\n");
- errno = EINVAL;
- return -1;
- }
-
- if (*n == LONG_MAX || *n == LONG_MIN)
- {
- fprintf(stderr, "e/number is out of range\n");
- errno = ERANGE;
- return -1;
- }
-
- return 0;
-}
-
-
-/* ==========================================================================
_
____ ___ ____ _ (_)____
/ __ `__ \ / __ `// // __ \
@@ -181,21 +139,21 @@ int u3_seq_main
/* when all arguments are passed, increment is at 'argc == 2'
*/
- current |= get_number(argv[2], &increment);
+ current |= u3u_get_number(argv[2], &increment);
case 3:
/* if more than 2 arguments are passed, 'first' will always
* be at 'argc == 1' position
*/
- current |= get_number(argv[1], &first);
+ current |= u3u_get_number(argv[1], &first);
case 2:
/* 'last' argument is always present and always is at 'argc - 1'
* position
*/
- current |= get_number(argv[argc - 1], &last);
+ current |= u3u_get_number(argv[argc - 1], &last);
if (current == 0)
{
diff --git a/src/sleep.c b/src/sleep.c
new file mode 100644
index 0000000..f9d21e0
--- /dev/null
+++ b/src/sleep.c
@@ -0,0 +1,223 @@
+/* ==========================================================================
+ Licensed under BSD 2clause license See LICENSE file for more information
+ Author: Michał Łyszczek <michal.lyszczek@bofc.pl>
+ ========================================================================== */
+
+
+#define U3_SLEEP_VERSION "v0.1.0"
+
+
+/* ==========================================================================
+ _ __ __
+ (_)____ _____ / /__ __ ____/ /___ _____
+ / // __ \ / ___// // / / // __ // _ \ / ___/
+ / // / / // /__ / // /_/ // /_/ // __/(__ )
+ /_//_/ /_/ \___//_/ \__,_/ \__,_/ \___//____/
+
+ ========================================================================== */
+
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <limits.h>
+
+#include "utils.h"
+#include "u3.h"
+#include "u3defs.h"
+
+
+/* ==========================================================================
+ ____ __ _
+ / __/__ __ ____ _____ / /_ (_)____ ____ _____
+ / /_ / / / // __ \ / ___// __// // __ \ / __ \ / ___/
+ / __// /_/ // / / // /__ / /_ / // /_/ // / / /(__ )
+ /_/ \__,_//_/ /_/ \___/ \__//_/ \____//_/ /_//____/
+
+ ========================================================================== */
+
+
+static void print_help(void)
+{
+ fprintf(stderr,
+ "usage: sleep <time>[.<fraction>]\n"
+ " sleep <option>\n"
+ "\n"
+ "Pause execution for time seconds.\n"
+ "\n"
+ "\t<time> number of seconds to pause\n"
+ "\t<fraction> number of fraction of seconds to pause\n"
+ "\t-h show this help\n"
+ "\t-v show version and exit\n"
+ );
+}
+
+
+/* ==========================================================================
+ _
+ ____ ___ ____ _ (_)____
+ / __ `__ \ / __ `// // __ \
+ / / / / / // /_/ // // / / /
+ /_/ /_/ /_/ \__,_//_//_/ /_/
+
+ ========================================================================== */
+
+
+#if U3_STANDALONE
+int main
+#else
+int u3_sleep_main
+#endif
+(
+ int argc,
+ char *argv[]
+)
+{
+ char *sfractions;
+ struct timespec request;
+ long nano;
+ long seconds;
+ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+
+ if (argc != 2)
+ {
+ fprintf(stderr, "wrong number of arguments passed\n");
+ print_help();
+ return 1;
+ }
+
+ if (argv[1][0] == '-')
+ {
+ if (argv[1][1] == 'v')
+ {
+ /* '-v' passed, print version and exit
+ */
+
+ fprintf(stderr, "sleep " U3_SLEEP_VERSION "\n"
+ "u3 " U3_VERSION "\n");
+ return 0;
+ }
+
+ if (argv[1][1] == 'h')
+ {
+ /* '-h' passed, print help and exit
+ */
+
+ print_help();
+ return 0;
+ }
+
+ /* minus encoutered without option, negative number?
+ * not likely!
+ */
+
+ fprintf(stderr, "negative seconds passed: '%s'\n", argv[1]);
+ return 1;
+ }
+
+ /* no '-' option, assume argument is number
+ */
+
+ nano = 1000000000l;
+ request.tv_sec = -1;
+ request.tv_nsec = -1;
+
+ /* check if fractions are passed or whole seconds
+ */
+
+ for (sfractions = argv[1]; *sfractions != '\0'; ++sfractions)
+ {
+ if (*sfractions == '.')
+ {
+ /* fractions are enabled, change that '.' to '\0', so
+ * argv[1] is valid seconds also increment sfractions
+ * so it points to first number of fraction string
+ */
+
+ *sfractions++ = '\0';
+ break;
+ }
+ }
+
+ if (*sfractions == '-')
+ {
+ fprintf(stderr, "negative fractions of seconds passed: '%s'\n",
+ sfractions);
+ return 1;
+ }
+
+ if (u3u_get_number(argv[1], &seconds) != 0)
+ {
+ fprintf(stderr, "error parsing seconds part of argument\n");
+ return 1;
+ }
+
+ /* tv_sec is time_t type, and u3u_get_number() gets pointer to long,
+ * so we cannot directly pass tv_sec to u3u_get_number() as this
+ * may lead to wrong values when sizeof(time_t) != sizeof(long)
+ */
+
+ request.tv_sec = seconds;
+
+ if (*sfractions)
+ {
+ if (u3u_get_number(sfractions, &request.tv_nsec) != 0)
+ {
+ fprintf(stderr, "error parsing fractions of seconds part of "
+ "argument\n");
+ return 1;
+ }
+ }
+
+ for (; *sfractions != '\0'; ++sfractions)
+ {
+ nano /= 10;
+ }
+
+ if (nano == 0)
+ {
+ /* nano will 0 when user passed bigger fraction number than
+ * 999999999
+ */
+
+ fprintf(stderr, "fractions cannot be bigger than 999999999\n");
+ return 1;
+ }
+
+ if (request.tv_nsec == -1l)
+ {
+ /* fractions not set, so don't use them, set tv_nsec to 0,
+ * so nanosleep() don't cry about wrong number there
+ */
+
+ request.tv_nsec = 0;
+ }
+
+ request.tv_nsec *= nano;
+
+ /* number parsed properly, now perform sleep
+ */
+
+#if TEST_RUN
+ /* when we are running tests, we don't want to sleep because
+ * tests would be long and it would be hard to calculate how
+ * long did we really sleep. Instead we just print value that
+ * we would have slept for in normal execution.
+ *
+ * use seconds instead of request.tv_sec since, time_t is
+ * hard to print
+ */
+
+ fprintf(stderr, "sleep for: %ld.%ld\n", seconds, request.tv_nsec);
+#else
+ nanosleep(&request, NULL);
+#endif
+ return 0;
+}
diff --git a/src/utils.c b/src/utils.c
new file mode 100644
index 0000000..f5ef009
--- /dev/null
+++ b/src/utils.c
@@ -0,0 +1,78 @@
+/* ==========================================================================
+ Licensed under BSD 2clause license See LICENSE file for more information
+ Author: Michał Łyszczek <michal.lyszczek@bofc.pl>
+ ==========================================================================
+ _ __ __
+ (_)____ _____ / /__ __ ____/ /___ _____
+ / // __ \ / ___// // / / // __ // _ \ / ___/
+ / // / / // /__ / // /_/ // /_/ // __/(__ )
+ /_//_/ /_/ \___//_/ \__,_/ \__,_/ \___//____/
+
+ ========================================================================== */
+
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <u3.h>
+#include <u3defs.h>
+
+
+/* ==========================================================================
+ __ __ _ ____
+ ____ __ __ / /_ / /(_)_____ / __/__ __ ____ _____ _____
+ / __ \ / / / // __ \ / // // ___/ / /_ / / / // __ \ / ___// ___/
+ / /_/ // /_/ // /_/ // // // /__ / __// /_/ // / / // /__ (__ )
+ / .___/ \__,_//_.___//_//_/ \___/ /_/ \__,_//_/ /_/ \___//____/
+ /_/
+ ========================================================================== */
+
+
+/* ==========================================================================
+ Converts string number 'num' into number representation. Converted value
+ will be stored in address pointed by 'n'.
+ ========================================================================== */
+
+
+int u3u_get_number
+(
+ const char *num, /* string to convert to number */
+ long *n /* converted num will be placed here */
+)
+{
+ const char *ep; /* endptr for strtol function */
+ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+
+ if (*num == '\0')
+ {
+ fprintf(stderr, "e/number is an empty string\n");
+ errno = EINVAL;
+ return -1;
+ }
+
+ *n = strtol(num, (char **)&ep, 10);
+
+ if (*ep != '\0')
+ {
+ fprintf(stderr, "e/invalid number passed: '%s'\n", num);
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (*n == LONG_MAX || *n == LONG_MIN)
+ {
+ fprintf(stderr, "e/number is out of range: '%s'\n", num);
+ errno = ERANGE;
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/src/utils.h b/src/utils.h
new file mode 100644
index 0000000..4609864
--- /dev/null
+++ b/src/utils.h
@@ -0,0 +1,11 @@
+/* ==========================================================================
+ Licensed under BSD 2clause license See LICENSE file for more information
+ Author: Michał Łyszczek <michal.lyszczek@bofc.pl>
+ ========================================================================== */
+
+#ifndef U3_UTILS_H
+#define U3_UTILS_H 1
+
+int u3u_get_number(const char *num, long *n);
+
+#endif
diff --git a/tst/Makefile.am b/tst/Makefile.am
index eda37a3..6c1cbae 100644
--- a/tst/Makefile.am
+++ b/tst/Makefile.am
@@ -1,5 +1,5 @@
check_PROGRAMS = rev-test seq-test
-dist_check_SCRIPTS = rev-test.sh
+dist_check_SCRIPTS = rev-test.sh sleep-test.sh
rev_test_SOURCES = $(sources_common) rev-test.c
seq_test_SOURCES = $(sources_common) seq-test.c
@@ -9,7 +9,7 @@ include_common = mtest.h std-redirects.h fops.h
sources_common = std-redirects.c fops.c $(include_common)
CFLAGS += -I$(top_srcdir)/src -I$(top_srcdir)/tst -I$(top_srcdir)/inc \
- -DU3_STANDALONE=1 $(COVERAGE_CFLAGS) \
+ -DU3_STANDALONE=0 $(COVERAGE_CFLAGS) \
-DTEST_DATA_DIR=\"$(top_srcdir)/tst/data\"
LDFLAGS += -static -L$(top_builddir)/src/.libs $(COVERAGE_LDFLAGS)
LDADD = -lu3
diff --git a/tst/rev-test.sh b/tst/rev-test.sh
index 4640df4..21c173d 100755
--- a/tst/rev-test.sh
+++ b/tst/rev-test.sh
@@ -14,6 +14,7 @@ rev_expected_data="rev-expected-data"
rev_line_max=$(cat ../config.h | grep U3_REV_LINE_MAX | cut -f3 -d' ')
enable_malloc=$(cat ../config.h | grep ENABLE_MALLOC | cut -f3 -d' ')
+stderr=rev-test-stderr
## ==========================================================================
# ____ __ _
@@ -27,7 +28,7 @@ enable_malloc=$(cat ../config.h | grep ENABLE_MALLOC | cut -f3 -d' ')
mt_cleanup_test()
{
- rm -f stderr
+ rm -f ${stderr}
rm -f "${rev_test_data}"
rm -f "${rev_test_file}"
rm -f "${rev_expected_data}"
@@ -129,8 +130,8 @@ gen_data()
rev_sh_print_help()
{
- ${rev} -h 2>stderr
- mt_fail "strcmp \"$(cat stderr)\" \"usage: rev [ -v | -h | <file> ]\""
+ ${rev} -h 2>${stderr}
+ mt_fail "strcmp \"$(cat ${stderr})\" \"usage: rev [ -v | -h | <file> ]\""
}
@@ -177,15 +178,15 @@ rev_sh_pipe_single_full_line()
rev_sh_pipe_single_overflow_line()
{
gen_data 1 $(( 2 * ${rev_line_max} ))
- out="$(cat "${rev_test_data}" | ${rev} 2>stderr)"
+ out="$(cat "${rev_test_data}" | ${rev} 2>${stderr})"
empty=
if [ "${enable_malloc}" = "1" ]
then
mt_fail "[ \"${out}\" = \"$(cat ${rev_expected_data})\" ]"
- mt_fail "[ \"$(cat stderr)\" = \"${empty}\" ]"
+ mt_fail "[ \"$(cat ${stderr})\" = \"${empty}\" ]"
else
- mt_fail "strcmp \"$(cat stderr)\" \"e/line is longer than\""
+ mt_fail "strcmp \"$(cat ${stderr})\" \"e/line is longer than\""
mt_fail "[ \"${out}\" = \"${empty}\" ]"
fi
}
@@ -234,15 +235,15 @@ rev_sh_pipe_single_full_line_no_nl()
rev_sh_pipe_single_overflow_line_no_nl()
{
gen_data 0 $(( 2 * ${rev_line_max} ))
- out="$(cat "${rev_test_data}" | ${rev} 2>stderr)"
+ out="$(cat "${rev_test_data}" | ${rev} 2>${stderr})"
empty=
if [ "${enable_malloc}" = "1" ]
then
mt_fail "[ \"${out}\" = \"$(cat ${rev_expected_data})\" ]"
- mt_fail "[ \"$(cat stderr)\" = \"${empty}\" ]"
+ mt_fail "[ \"$(cat ${stderr})\" = \"${empty}\" ]"
else
- mt_fail "strcmp \"$(cat stderr)\" \"e/line is longer than\""
+ mt_fail "strcmp \"$(cat ${stderr})\" \"e/line is longer than\""
mt_fail "[ \"${out}\" = \"${empty}\" ]"
fi
}
@@ -291,15 +292,15 @@ rev_sh_pipe_multi_overflow_line()
{
gen_data 1 $(( 2 * ${rev_line_max} )) $(( 3 * ${rev_line_max} )) 42 \
$(( 2 * ${rev_line_max} ))
- out="$(cat "${rev_test_data}" | ${rev} 2>stderr)"
+ out="$(cat "${rev_test_data}" | ${rev} 2>${stderr})"
empty=
if [ "${enable_malloc}" = "1" ]
then
mt_fail "[ \"${out}\" = \"$(cat ${rev_expected_data})\" ]"
- mt_fail "[ \"$(cat stderr)\" = \"${empty}\" ]"
+ mt_fail "[ \"$(cat ${stderr})\" = \"${empty}\" ]"
else
- mt_fail "strcmp \"$(cat stderr)\" \"e/line is longer than\""
+ mt_fail "strcmp \"$(cat ${stderr})\" \"e/line is longer than\""
mt_fail "[ \"${out}\" = \"${empty}\" ]"
fi
}
@@ -349,15 +350,15 @@ rev_sh_pipe_multi_overflow_line_no_nl()
{
gen_data 1 $(( 2 * ${rev_line_max} )) $(( 3 * ${rev_line_max} )) 42 \
$(( 2 * ${rev_line_max} ))
- out="$(cat "${rev_test_data}" | ${rev} 2>stderr)"
+ out="$(cat "${rev_test_data}" | ${rev} 2>${stderr})"
empty=
if [ "${enable_malloc}" = "1" ]
then
mt_fail "[ \"${out}\" = \"$(cat ${rev_expected_data})\" ]"
- mt_fail "[ \"$(cat stderr)\" = \"${empty}\" ]"
+ mt_fail "[ \"$(cat ${stderr})\" = \"${empty}\" ]"
else
- mt_fail "strcmp \"$(cat stderr)\" \"e/line is longer than\""
+ mt_fail "strcmp \"$(cat ${stderr})\" \"e/line is longer than\""
mt_fail "[ \"${out}\" = \"${empty}\" ]"
fi
}
@@ -408,15 +409,15 @@ rev_sh_file_single_full_line()
rev_sh_file_single_overflow_line()
{
gen_data 1 $(( 2 * ${rev_line_max} ))
- out="$(${rev} "${rev_test_data}" 2>stderr)"
+ out="$(${rev} "${rev_test_data}" 2>${stderr})"
empty=
if [ "${enable_malloc}" = "1" ]
then
mt_fail "[ \"${out}\" = \"$(cat ${rev_expected_data})\" ]"
- mt_fail "[ \"$(cat stderr)\" = \"${empty}\" ]"
+ mt_fail "[ \"$(cat ${stderr})\" = \"${empty}\" ]"
else
- mt_fail "strcmp \"$(cat stderr)\" \"e/line is longer than\""
+ mt_fail "strcmp \"$(cat ${stderr})\" \"e/line is longer than\""
mt_fail "[ \"${out}\" = \"${empty}\" ]"
fi
}
@@ -467,15 +468,15 @@ rev_sh_file_single_full_line_no_nl()
rev_sh_file_single_overflow_line_no_nl()
{
gen_data 0 $(( 2 * ${rev_line_max} ))
- out="$(${rev} "${rev_test_data}" 2>stderr)"
+ out="$(${rev} "${rev_test_data}" 2>${stderr})"
empty=
if [ "${enable_malloc}" = "1" ]
then
mt_fail "[ \"${out}\" = \"$(cat ${rev_expected_data})\" ]"
- mt_fail "[ \"$(cat stderr)\" = \"${empty}\" ]"
+ mt_fail "[ \"$(cat ${stderr})\" = \"${empty}\" ]"
else
- mt_fail "strcmp \"$(cat stderr)\" \"e/line is longer than\""
+ mt_fail "strcmp \"$(cat ${stderr})\" \"e/line is longer than\""
mt_fail "[ \"${out}\" = \"${empty}\" ]"
fi
}
@@ -524,15 +525,15 @@ rev_sh_file_multi_overflow_line()
{
gen_data 1 $(( 2 * ${rev_line_max} )) $(( 3 * ${rev_line_max} )) 42 \
$(( 2 * ${rev_line_max} ))
- out="$(${rev} "${rev_test_data}" 2>stderr)"
+ out="$(${rev} "${rev_test_data}" 2>${stderr})"
empty=
if [ "${enable_malloc}" = "1" ]
then
mt_fail "[ \"${out}\" = \"$(cat ${rev_expected_data})\" ]"
- mt_fail "[ \"$(cat stderr)\" = \"${empty}\" ]"
+ mt_fail "[ \"$(cat ${stderr})\" = \"${empty}\" ]"
else
- mt_fail "strcmp \"$(cat stderr)\" \"e/line is longer than\""
+ mt_fail "strcmp \"$(cat ${stderr})\" \"e/line is longer than\""
mt_fail "[ \"${out}\" = \"${empty}\" ]"
fi
}
@@ -582,15 +583,15 @@ rev_sh_file_multi_overflow_line_no_nl()
{
gen_data 1 $(( 2 * ${rev_line_max} )) $(( 3 * ${rev_line_max} )) 42 \
$(( 2 * ${rev_line_max} ))
- out="$(${rev} "${rev_test_data}" 2>stderr)"
+ out="$(${rev} "${rev_test_data}" 2>${stderr})"
empty=
if [ "${enable_malloc}" = "1" ]
then
mt_fail "[ \"${out}\" = \"$(cat ${rev_expected_data})\" ]"
- mt_fail "[ \"$(cat stderr)\" = \"${empty}\" ]"
+ mt_fail "[ \"$(cat ${stderr})\" = \"${empty}\" ]"
else
- mt_fail "strcmp \"$(cat stderr)\" \"e/line is longer than\""
+ mt_fail "strcmp \"$(cat ${stderr})\" \"e/line is longer than\""
mt_fail "[ \"${out}\" = \"${empty}\" ]"
fi
}
@@ -602,8 +603,8 @@ rev_sh_file_multi_overflow_line_no_nl()
rev_sh_three_args()
{
- ${rev} file1 file2 2>stderr
- mt_fail "strcmp \"$(cat stderr)\" \"usage: rev [ -v | -h | <file> ]\""
+ ${rev} file1 file2 2>${stderr}
+ mt_fail "strcmp \"$(cat ${stderr})\" \"usage: rev [ -v | -h | <file> ]\""
}
@@ -613,8 +614,8 @@ rev_sh_three_args()
rev_sh_invalid_arg()
{
- ${rev} -a 2>stderr
- mt_fail "strcmp \"$(cat stderr)\" \"e/invalid option -a\""
+ ${rev} -a 2>${stderr}
+ mt_fail "strcmp \"$(cat ${stderr})\" \"e/invalid option -a\""
}
@@ -624,8 +625,8 @@ rev_sh_invalid_arg()
rev_sh_file_not_found()
{
- ${rev} "/i/dont/exist" 2>stderr
- mt_fail "strcmp \"$(cat stderr)\" \"e/fopen(): \""
+ ${rev} "/i/dont/exist" 2>${stderr}
+ mt_fail "strcmp \"$(cat ${stderr})\" \"e/fopen(): \""
}
@@ -637,8 +638,8 @@ rev_sh_permision_denied()
{
echo "test" > "${rev_test_file}"
chmod 200 "${rev_test_file}"
- ${rev} "${rev_test_file}" 2>stderr
- mt_fail "strcmp \"$(cat stderr)\" \"e/fopen(): \""
+ ${rev} "${rev_test_file}" 2>${stderr}
+ mt_fail "strcmp \"$(cat ${stderr})\" \"e/fopen(): \""
}
diff --git a/tst/sleep-test.sh b/tst/sleep-test.sh
new file mode 100755
index 0000000..9f5e5b5
--- /dev/null
+++ b/tst/sleep-test.sh
@@ -0,0 +1,196 @@
+#!/usr/bin/env sh
+## ==========================================================================
+# Licensed under BSD 2clause license See LICENSE file for more information
+# Author: Michał Łyszczek <michal.lyszczek@bofc.pl>
+## ==========================================================================
+
+
+. ./mtest.sh
+
+sleep="../src/sleep"
+stderr=sleep-test-stderr
+
+
+## ==========================================================================
+# ____ __ _
+# / __/__ __ ____ _____ / /_ (_)____ ____ _____
+# / /_ / / / // __ \ / ___// __// // __ \ / __ \ / ___/
+# / __// /_/ // / / // /__ / /_ / // /_/ // / / /(__ )
+# /_/ \__,_//_/ /_/ \___/ \__//_/ \____//_/ /_//____/
+#
+## ==========================================================================
+
+
+mt_cleanup_test()
+{
+ rm -f ${stderr}
+}
+
+
+## ==========================================================================
+# __ __
+# / /_ ___ _____ / /_ _____
+# / __// _ \ / ___// __// ___/
+# / /_ / __/(__ )/ /_ (__ )
+# \__/ \___//____/ \__//____/
+#
+## ==========================================================================
+
+
+## ==========================================================================
+## ==========================================================================
+
+
+sleep_sh_print_help()
+{
+ ${sleep} -h 2>${stderr}
+ mt_fail "grep \"usage: sleep <time>\[.<fraction>\]\" ${stderr} >/dev/null 2>&1"
+}
+
+
+## ==========================================================================
+## ==========================================================================
+
+
+sleep_sh_print_version()
+{
+ ${sleep} -v 2>${stderr}
+ mt_fail "grep \"sleep v\" ${stderr} >/dev/null 2>&1"
+}
+
+
+## ==========================================================================
+## ==========================================================================
+
+
+sleep_sh_no_arguments()
+{
+ ${sleep} 2>${stderr}
+ mt_fail "grep \"wrong number of arguments passed\" ${stderr} >/dev/null 2>&1"
+ mt_fail "grep \"usage: sleep <time>\[.<fraction>\]\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_too_many_arguments()
+{
+ ${sleep} 5 10 2>${stderr}
+ mt_fail "grep \"wrong number of arguments passed\" ${stderr} >/dev/null 2>&1"
+ mt_fail "grep \"usage: sleep <time>\[.<fraction>\]\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_not_a_number()
+{
+ ${sleep} "five" 2>${stderr}
+ mt_fail "grep \"invalid number passed: 'five'\" ${stderr} >/dev/null 2>&1"
+ mt_fail "grep \"error parsing seconds part of argument\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_negative_number()
+{
+ ${sleep} -5 2>${stderr}
+ mt_fail "grep \"negative seconds passed: '-5'\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_bad_characters_in_number()
+{
+ ${sleep} 5O2 2>${stderr}
+ mt_fail "grep \"invalid number passed: '5O2'\" ${stderr} >/dev/null 2>&1"
+ mt_fail "grep \"error parsing seconds part of argument\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_too_big_number()
+{
+ big_num="547839265897234789569236454659234538942658758943755843758987234"
+ ${sleep} ${big_num} 2>${stderr}
+ mt_fail "grep \"number is out of range: '${big_num}'\" ${stderr} >/dev/null 2>&1"
+ mt_fail "grep \"error parsing seconds part of argument\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_fract_not_a_number()
+{
+ ${sleep} "5.five" 2>${stderr}
+ mt_fail "grep \"invalid number passed: 'five'\" ${stderr} >/dev/null 2>&1"
+ mt_fail "grep \"error parsing fractions of seconds part of argument\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_fract_negative_number()
+{
+ ${sleep} "1.-5" 2>${stderr}
+ mt_fail "grep \"negative fractions of seconds passed: '-5'\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_fract_bad_characters_in_number()
+{
+ ${sleep} "5.5O2" 2>${stderr}
+ mt_fail "grep \"invalid number passed: '5O2'\" ${stderr} >/dev/null 2>&1"
+ mt_fail "grep \"error parsing fractions of seconds part of argument\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_fract_too_big_number()
+{
+ big_num="547839265897234789569236454659234538942658758943755843758987234"
+ ${sleep} 5.${big_num} 2>${stderr}
+ mt_fail "grep \"number is out of range: '${big_num}'\" ${stderr} >/dev/null 2>&1"
+ mt_fail "grep \"error parsing fractions of seconds part of argument\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_fract_too_big_fractions()
+{
+ ${sleep} 5.1000000000 2>${stderr}
+ mt_fail "grep \"fractions cannot be bigger than 999999999\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_seconds()
+{
+ ${sleep} 5 2>${stderr}
+ mt_fail "grep \"sleep for: 5.0\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_seconds_zero()
+{
+ ${sleep} 0 2>${stderr}
+ mt_fail "grep \"sleep for: 0.0\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_fract_zero()
+{
+ ${sleep} 5.0 2>${stderr}
+ mt_fail "grep \"sleep for: 5.0\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_fract_missing()
+{
+ ${sleep} 1. 2>${stderr}
+ mt_fail "grep \"sleep for: 1.0\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_fract_one()
+{
+ ${sleep} 2.4 2>${stderr}
+ mt_fail "grep \"sleep for: 2.400000000\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_fract_five()
+{
+ ${sleep} 1234.12345 2>${stderr}
+ mt_fail "grep \"sleep for: 1234.123450000\" ${stderr} >/dev/null 2>&1"
+}
+sleep_sh_fract_max()
+{
+ ${sleep} 1234.999999999 2>${stderr}
+ mt_fail "grep \"sleep for: 1234.999999999\" ${stderr} >/dev/null 2>&1"
+}
+
+## ==========================================================================
+# __ __
+# / /_ ___ _____ / /_ ___ _ __ ___ _____
+# / __// _ \ / ___// __/ / _ \ | |/_// _ \ / ___/
+# / /_ / __/(__ )/ /_ / __/_> < / __// /__
+# \__/ \___//____/ \__/ \___//_/|_| \___/ \___/
+#
+## ==========================================================================
+
+mt_run sleep_sh_print_help
+mt_run sleep_sh_print_version
+mt_run sleep_sh_no_arguments
+mt_run sleep_sh_too_many_arguments
+mt_run sleep_sh_not_a_number
+mt_run sleep_sh_negative_number
+mt_run sleep_sh_bad_characters_in_number
+mt_run sleep_sh_too_big_number
+mt_run sleep_sh_fract_not_a_number
+mt_run sleep_sh_fract_negative_number
+mt_run sleep_sh_fract_bad_characters_in_number
+mt_run sleep_sh_fract_too_big_number
+mt_run sleep_sh_fract_too_big_fractions
+mt_run sleep_sh_seconds
+mt_run sleep_sh_seconds_zero
+mt_run sleep_sh_fract_zero
+mt_run sleep_sh_fract_missing
+mt_run sleep_sh_fract_one
+mt_run sleep_sh_fract_five
+mt_run sleep_sh_fract_max
+mt_return