diff options
author | Michał Łyszczek <michal.lyszczek@bofc.pl> | 2018-12-13 18:17:28 +0100 |
---|---|---|
committer | Michał Łyszczek <michal.lyszczek@bofc.pl> | 2018-12-13 19:52:39 +0100 |
commit | 3b413162c7f5ab1cb658df26cfd3137993660c37 (patch) | |
tree | 5a85a633e9274e3b1339696ca94d8afabc106068 | |
parent | 38c9a7fecc6375f0f2a31dd960967b2e869c42e2 (diff) | |
download | u3-3b413162c7f5ab1cb658df26cfd3137993660c37.tar.gz u3-3b413162c7f5ab1cb658df26cfd3137993660c37.tar.bz2 u3-3b413162c7f5ab1cb658df26cfd3137993660c37.zip |
-rw-r--r-- | configure.ac | 12 | ||||
-rw-r--r-- | inc/u3.h | 6 | ||||
-rw-r--r-- | src/.gitignore | 1 | ||||
-rw-r--r-- | src/Makefile.am | 12 | ||||
-rw-r--r-- | src/seq.c | 54 | ||||
-rw-r--r-- | src/sleep.c | 223 | ||||
-rw-r--r-- | src/utils.c | 78 | ||||
-rw-r--r-- | src/utils.h | 11 | ||||
-rw-r--r-- | tst/Makefile.am | 4 | ||||
-rwxr-xr-x | tst/rev-test.sh | 71 | ||||
-rwxr-xr-x | tst/sleep-test.sh | 196 |
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 "" @@ -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 @@ -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 |