* [LTP] [PATCH 1/2] lib: move create_sig_proc() into newlib @ 2016-11-16 16:18 Petr Vorel 2016-11-16 16:18 ` [LTP] [PATCH 2/2] testcases/clock_nanosleep01: convert to use new test library API Petr Vorel 2016-11-21 14:57 ` [LTP] [PATCH 1/2] lib: move create_sig_proc() into newlib Cyril Hrubis 0 siblings, 2 replies; 6+ messages in thread From: Petr Vorel @ 2016-11-16 16:18 UTC (permalink / raw) To: ltp Signed-off-by: Petr Vorel <pvorel@suse.cz> --- include/tst_sig_proc.h | 23 ++++++++++++++++++ lib/tst_sig_proc.c | 39 +++++++++++++++++++++++++++++++ testcases/kernel/syscalls/ppoll/ppoll01.c | 20 +--------------- 3 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 include/tst_sig_proc.h create mode 100644 lib/tst_sig_proc.c diff --git a/include/tst_sig_proc.h b/include/tst_sig_proc.h new file mode 100644 index 0000000..bc918eb --- /dev/null +++ b/include/tst_sig_proc.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2016 Cyril Hrubis <chrubis@suse.cz> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. + */ + +#ifndef TST_SIG_PROC_H__ +#define TST_SIG_PROC_H__ + +#include <sys/types.h> +#include <unistd.h> + +pid_t create_sig_proc(int sig, int count, unsigned int usec); + +#endif /* TST_SIG_PROC_H__ */ diff --git a/lib/tst_sig_proc.c b/lib/tst_sig_proc.c new file mode 100644 index 0000000..a5f6c54 --- /dev/null +++ b/lib/tst_sig_proc.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016 Cyril Hrubis <chrubis@suse.cz> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. + */ + +#include <sys/types.h> +#include <unistd.h> +#include <stdlib.h> + +#define TST_NO_DEFAULT_MAIN +#include "tst_test.h" + +pid_t create_sig_proc(int sig, int count, unsigned int usec) +{ + pid_t pid, cpid; + + pid = getpid(); + cpid = SAFE_FORK(); + + if (cpid == 0) { + while (count-- > 0) { + usleep(usec); + if (kill(pid, sig) == -1) + break; + } + exit(0); + } + + return cpid; +} diff --git a/testcases/kernel/syscalls/ppoll/ppoll01.c b/testcases/kernel/syscalls/ppoll/ppoll01.c index a5815b3..8d6d7e7 100644 --- a/testcases/kernel/syscalls/ppoll/ppoll01.c +++ b/testcases/kernel/syscalls/ppoll/ppoll01.c @@ -28,6 +28,7 @@ #include <sys/wait.h> #include "linux_syscall_numbers.h" #include "ltp_signal.h" +#include "tst_sig_proc.h" #include "tst_test.h" /* Older versions of glibc don't publish this constant's value. */ @@ -205,25 +206,6 @@ static void cleanup(void) close(fd1); } -static pid_t create_sig_proc(int sig, int count, unsigned int usec) -{ - pid_t pid, cpid; - - pid = getpid(); - cpid = SAFE_FORK(); - - if (cpid == 0) { - while (count-- > 0) { - usleep(usec); - if (kill(pid, sig) == -1) - break; - } - exit(0); - } - - return cpid; -} - static void do_test(unsigned int i) { pid_t pid = 0; -- 2.10.2 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [LTP] [PATCH 2/2] testcases/clock_nanosleep01: convert to use new test library API 2016-11-16 16:18 [LTP] [PATCH 1/2] lib: move create_sig_proc() into newlib Petr Vorel @ 2016-11-16 16:18 ` Petr Vorel 2016-11-21 15:23 ` Cyril Hrubis 2016-11-21 14:57 ` [LTP] [PATCH 1/2] lib: move create_sig_proc() into newlib Cyril Hrubis 1 sibling, 1 reply; 6+ messages in thread From: Petr Vorel @ 2016-11-16 16:18 UTC (permalink / raw) To: ltp Signed-off-by: Petr Vorel <pvorel@suse.cz> --- Removed test type NULL_POINTER. Not sure if I've done signal hadling correctly and whether it needs temporary directory. --- .../syscalls/clock_nanosleep/clock_nanosleep01.c | 397 ++++++--------------- 1 file changed, 104 insertions(+), 293 deletions(-) diff --git a/testcases/kernel/syscalls/clock_nanosleep/clock_nanosleep01.c b/testcases/kernel/syscalls/clock_nanosleep/clock_nanosleep01.c index 08c1fbd..82e7381 100644 --- a/testcases/kernel/syscalls/clock_nanosleep/clock_nanosleep01.c +++ b/testcases/kernel/syscalls/clock_nanosleep/clock_nanosleep01.c @@ -1,158 +1,54 @@ -/******************************************************************************/ -/* Copyright (c) Crackerjack Project., 2007-2008 ,Hitachi, Ltd */ -/* Author(s): Takahiro Yasui <takahiro.yasui.mp@hitachi.com>, */ -/* Yumiko Sugita <yumiko.sugita.yf@hitachi.com>, */ -/* Satoshi Fujiwara <sa-fuji@sdl.hitachi.co.jp> */ -/* */ -/* This program is free software; you can redistribute it and/or modify */ -/* it under the terms of the GNU General Public License as published by */ -/* the Free Software Foundation; either version 2 of the License, or */ -/* (at your option) any later version. */ -/* */ -/* This program is distributed in the hope that it will be useful, */ -/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ -/* the GNU General Public License for more details. */ -/* */ -/* You should have received a copy of the GNU General Public License */ -/* along with this program; if not, write to the Free Software */ -/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -/* */ -/******************************************************************************/ -/******************************************************************************/ -/* */ -/* File: clock_nanosleep01.c */ -/* */ -/* Description: This tests the clock_nanosleep() syscall */ -/* */ -/* */ -/* */ -/* */ -/* */ -/* */ -/* Usage: <for command-line> */ -/* clock_nanosleep01 [-c n] [-e][-i n] [-I x] [-p x] [-t] */ -/* where, -c n : Run n copies concurrently. */ -/* -e : Turn on errno logging. */ -/* -i n : Execute test n times. */ -/* -I x : Execute test for x seconds. */ -/* -P x : Pause for x seconds between iterations. */ -/* -t : Turn on syscall timing. */ -/* */ -/* Total Tests: 1 */ -/* */ -/* Test Name: clock_nanosleep01 */ -/* History: Porting from Crackerjack to LTP is done by */ -/* Manas Kumar Nayak maknayak@in.ibm.com> */ -/******************************************************************************/ -#include <sys/syscall.h> -#include <sys/types.h> -#include <getopt.h> -#include <string.h> -#include <stdlib.h> -#include <errno.h> -#include <stdio.h> -#include <time.h> -#include <signal.h> -#include "../utils/common_j_h.c" -#include "../utils/include_j_h.h" - -#include "test.h" -#include "linux_syscall_numbers.h" - -char *TCID = "clock_nanosleep01"; -int testno; -int TST_TOTAL = 1; -struct sigaction act; - /* - * sighandler() + * Copyright (c) Crackerjack Project., 2007-2008 ,Hitachi, Ltd + * Author(s): Takahiro Yasui <takahiro.yasui.mp@hitachi.com>, + * Yumiko Sugita <yumiko.sugita.yf@hitachi.com>, + * Satoshi Fujiwara <sa-fuji@sdl.hitachi.co.jp> + * Copyright (c) 2016 Linux Test Project + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. */ -void sighandler(int sig) -{ - if (sig == SIGINT) - return; - return; -} +#include <limits.h> -/* Extern Global Functions */ -/******************************************************************************/ -/* */ -/* Function: cleanup */ -/* */ -/* Description: Performs all one time clean up for this test on successful */ -/* completion, premature exit or failure. Closes all temporary */ -/* files, removes all temporary directories exits the test with */ -/* appropriate return code by calling tst_exit() function. */ -/* */ -/* Input: None. */ -/* */ -/* Output: None. */ -/* */ -/* Return: On failure - Exits calling tst_exit(). Non '0' return code. */ -/* On success - Exits calling tst_exit(). With '0' return code. */ -/* */ -/******************************************************************************/ -void cleanup(void) -{ +#include "linux_syscall_numbers.h" +#include "tst_sig_proc.h" +#include "tst_test.h" - tst_rmdir(); +int testno; +static void sighandler(int sig LTP_ATTRIBUTE_UNUSED) +{ } -/* Local Functions */ -/******************************************************************************/ -/* */ -/* Function: setup */ -/* */ -/* Description: Performs all one time setup for this test. This function is */ -/* typically used to capture signals, create temporary dirs */ -/* and temporary files that may be used in the course of this */ -/* test. */ -/* */ -/* Input: None. */ -/* */ -/* Output: None. */ -/* */ -/* Return: On failure - Exits by calling cleanup(). */ -/* On success - returns 0. */ -/* */ -/******************************************************************************/ void setup(void) { - /* Capture signals if any */ - act.sa_handler = sighandler; - sigfillset(&act.sa_mask); - sigaction(SIGINT, &act, NULL); - - /* Create temporary directories */ - TEST_PAUSE; - tst_tmpdir(); + SAFE_SIGNAL(SIGINT, sighandler); } -/* - * Macros - */ -#define SYSCALL_NAME "clock_nanosleep" - enum test_type { NORMAL, - NULL_POINTER, SEND_SIGINT, }; -/* - * Data Structure - */ +#define TYPE_NAME(x) .ttype = x, .desc = #x + struct test_case { - clockid_t clk_id; - int ttype; - int flags; + clockid_t clk_id; /* clock_* clock type parameter */ + int ttype; /* test type (enum) */ + const char *desc; /* test description (name) */ + int flags; /* clock_nanosleep flags parameter */ time_t sec; long nsec; - int ret; - int err; + int ret; /* expected ret code */ + int err; /* expected errno code */ }; /* Test cases @@ -161,58 +57,57 @@ struct test_case { * * EINTR v (function was interrupted by a signal) * EINVAL v (invalid tv_nsec, etc.) - * ENOTSUP can't check because not supported clk_id generates - * EINVAL + * ENOTSUP can't check because not supported clk_id generates EINVAL */ static struct test_case tcase[] = { - { // case00 + { .clk_id = CLOCK_REALTIME, - .ttype = NORMAL, + TYPE_NAME(NORMAL), .flags = 0, .sec = 0, - .nsec = 500000000, // 500msec + .nsec = 500000000, .ret = 0, .err = 0, }, - { // case01 + { .clk_id = CLOCK_MONOTONIC, - .ttype = NORMAL, + TYPE_NAME(NORMAL), .flags = 0, .sec = 0, - .nsec = 500000000, // 500msec + .nsec = 500000000, .ret = 0, .err = 0, }, - { // case02 - .ttype = NORMAL, + { + TYPE_NAME(NORMAL), .clk_id = CLOCK_REALTIME, .flags = 0, .sec = 0, - .nsec = -1, // invalid + .nsec = -1, .ret = EINVAL, .err = 0, }, - { // case03 - .ttype = NORMAL, + { + TYPE_NAME(NORMAL), .clk_id = CLOCK_REALTIME, .flags = 0, .sec = 0, - .nsec = 1000000000, // invalid + .nsec = 1000000000, .ret = EINVAL, .err = 0, }, - { // case04 - .ttype = NORMAL, - .clk_id = CLOCK_THREAD_CPUTIME_ID, // not supported + { + TYPE_NAME(NORMAL), + .clk_id = CLOCK_THREAD_CPUTIME_ID, .flags = 0, .sec = 0, - .nsec = 500000000, // 500msec - .ret = EINVAL, // RHEL4U1 + 2.6.18 returns EINVAL + .nsec = 500000000, + .ret = EINVAL, .err = 0, }, - { // case05 - .ttype = SEND_SIGINT, + { + TYPE_NAME(SEND_SIGINT), .clk_id = CLOCK_REALTIME, .flags = 0, .sec = 10, @@ -220,23 +115,8 @@ static struct test_case tcase[] = { .ret = EINTR, .err = 0, }, -#if 0 // glibc generates SEGV error (RHEL4U1 + 2.6.18) - { // caseXX - .ttype = NULL_POINTER, - .clk_id = CLOCK_REALTIME, - .flags = 0, - .sec = 0, - .nsec = 500000000, // 500msec - .ret = EFAULT, - .err = 0, - }, -#endif }; -/* - * chk_difftime() - * Return : OK(0), NG(-1) - */ #define MAX_MSEC_DIFF 20 static int chk_difftime(struct timespec *bef, struct timespec *aft, @@ -254,152 +134,83 @@ static int chk_difftime(struct timespec *bef, struct timespec *aft, } expect = (sec * 1000) + (nsec / 1000000); result = (t.tv_sec * 1000) + (t.tv_nsec / 1000000); - tst_resm(TINFO, "check sleep time: (min:%ld) < %ld < (max:%ld) (msec)", + + tst_res(TINFO, "check sleep time: (min: %ld) < %ld < (max: %ld) (msec)", expect - MAX_MSEC_DIFF, result, expect + MAX_MSEC_DIFF); + if (result < expect - MAX_MSEC_DIFF || result > expect + MAX_MSEC_DIFF) return -1; + return 0; } -/* - * do_test() - * - * Input : TestCase Data - * Return : RESULT_OK(0), RESULT_NG(1) - * - */ -static int do_test(struct test_case *tc) +static void do_test(unsigned int i) { - int sys_ret; - int sys_errno; - int result = RESULT_OK; + int sys_ret, sys_errno, dummy; struct timespec beftp, afttp, rq, rm; - int rc, range_ok = 1, remain_ok = 1; + int rc; pid_t pid = 0; + struct test_case *tc = &tcase[i]; - /* - * Check before sleep time - */ + tst_res(TINFO, "case %s", tc->desc); + + /* setup */ if (tc->ttype == SEND_SIGINT) { - pid = create_sig_proc(500000, SIGINT, UINT_MAX); - if (pid < 0) - return 1; + pid = create_sig_proc(SIGINT, 40, 500000); } - /* - * Check before sleep time - */ TEST(rc = clock_gettime(tc->clk_id, &beftp)); if (rc < 0) { - tst_resm(TFAIL | TTERRNO, "clock_gettime failed"); - result = 1; - goto EXIT; + tst_brk(TBROK, "clock_gettime failed"); } - /* - * Execute system call - */ + + /* test */ rq.tv_sec = tc->sec; rq.tv_nsec = tc->nsec; - // !!!CAUTION: 'clock_gettime' returns errno itself errno = 0; - if (tc->ttype == NULL_POINTER) - TEST(sys_ret = - clock_nanosleep(tc->clk_id, tc->flags, NULL, &rm)); - else - TEST(sys_ret = - clock_nanosleep(tc->clk_id, tc->flags, &rq, &rm)); + TEST(sys_ret = clock_nanosleep(tc->clk_id, tc->flags, &rq, &rm)); sys_errno = errno; - if (sys_ret != 0) - goto TEST_END; - - /* - * Check after sleep time - */ - TEST(rc = clock_gettime(tc->clk_id, &afttp)); - if (TEST_RETURN < 0) { - EPRINTF("clock_gettime failed.\n"); - result = 1; - goto EXIT; - } - range_ok = chk_difftime(&beftp, &afttp, tc->sec, tc->nsec) == 0; - /* - * Check remaining time - */ -TEST_END: - if (tc->ttype == NORMAL || tc->ttype == SEND_SIGINT) { - tst_resm(TINFO, "remain time: %ld %ld", rm.tv_sec, rm.tv_nsec); - if (tc->ttype == NORMAL) - remain_ok = 1; - else - remain_ok = rm.tv_sec != 0 || rm.tv_nsec != 0; + if (sys_ret == 0) { + TEST(rc = clock_gettime(tc->clk_id, &afttp)); + if (TEST_RETURN < 0) { + tst_brk(TBROK, "clock_gettime failed"); + } } - /* - * Check results - */ - result |= (sys_ret != tc->ret) || !range_ok || !remain_ok; - if (!range_ok) - PRINT_RESULT_EXTRA(0, tc->ret, tc->err, sys_ret, sys_errno, - "time range check", range_ok); - else - PRINT_RESULT_EXTRA(0, tc->ret, tc->err, sys_ret, sys_errno, - "remain time check", remain_ok); -EXIT: + tst_res(TINFO, "remain time: %ld %ld", rm.tv_sec, rm.tv_nsec); + + /* cleanup */ if (pid > 0) { - int st; - TEST(kill(pid, SIGTERM)); - TEST(wait(&st)); + kill(pid, SIGTERM); + SAFE_WAIT(&dummy); } - return result; -} - -/* - * main() - */ - -int main(int ac, char **av) -{ - int result = RESULT_OK; - int i; - int lc; - - tst_parse_opts(ac, av, NULL, NULL); - - setup(); - - for (lc = 0; TEST_LOOPING(lc); ++lc) { - - tst_count = 0; - - for (testno = 0; testno < TST_TOTAL; ++testno) { - - for (i = 0; i < (int)(sizeof(tcase) / sizeof(tcase[0])); - i++) { - int ret; - tst_resm(TINFO, "(case%02d) START", i); - ret = do_test(&tcase[i]); - tst_resm(TINFO, "(case%02d) END => %s", - i, (ret == 0) ? "OK" : "NG"); - result |= ret; - } - - switch (result) { - case RESULT_OK: - tst_resm(TPASS, - "clock_nanosleep call succeeded"); - break; - - default: - tst_brkm(TFAIL | TERRNO, cleanup, - "clock_nanosleep failed"); - break; - } - - } + /* result check */ + if (sys_ret == 0 && chk_difftime(&beftp, &afttp, tc->sec, tc->nsec) != 0) { + tst_res(TFAIL, "time range check ret: %d, exp: %d, ret_errno: %s (%d)," + " exp_errno: %s (%d)", sys_ret, tc->ret, + tst_strerrno(sys_errno), sys_errno, + tst_strerrno(tc->err), tc->err); + } else if (tc->ttype == SEND_SIGINT && !rm.tv_sec && !rm.tv_nsec) { + tst_res(TFAIL, "remain time check ret: %d, exp: %d, ret_errno: %s (%d)," + " exp_errno: %s (%d)", sys_ret, tc->ret, + tst_strerrno(sys_errno), sys_errno, + tst_strerrno(tc->err), tc->err); + } else if (sys_ret != tc->ret) { + tst_res(TFAIL, "ret: %d, exp: %d, ret_errno: %s (%d)," + " exp_errno: %s (%d)", sys_ret, tc->ret, + tst_strerrno(sys_errno), sys_errno, + tst_strerrno(tc->err), tc->err); + } else { + tst_res(TPASS, "ret: %d", sys_ret); } - - cleanup(); - tst_exit(); - } + +static struct tst_test test = { + .tid = "clock_nanosleep01", + .tcnt = ARRAY_SIZE(tcase), + .test = do_test, + .setup = setup, + .forks_child = 1, + .needs_tmpdir = 1, +}; -- 2.10.2 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [LTP] [PATCH 2/2] testcases/clock_nanosleep01: convert to use new test library API 2016-11-16 16:18 ` [LTP] [PATCH 2/2] testcases/clock_nanosleep01: convert to use new test library API Petr Vorel @ 2016-11-21 15:23 ` Cyril Hrubis 0 siblings, 0 replies; 6+ messages in thread From: Cyril Hrubis @ 2016-11-21 15:23 UTC (permalink / raw) To: ltp Hi! > +#include "linux_syscall_numbers.h" > +#include "tst_sig_proc.h" > +#include "tst_test.h" > > - tst_rmdir(); > +int testno; ^ Is this used for anything? > +static void sighandler(int sig LTP_ATTRIBUTE_UNUSED) > +{ > } > > -/* Local Functions */ > -/******************************************************************************/ > -/* */ > -/* Function: setup */ > -/* */ > -/* Description: Performs all one time setup for this test. This function is */ > -/* typically used to capture signals, create temporary dirs */ > -/* and temporary files that may be used in the course of this */ > -/* test. */ > -/* */ > -/* Input: None. */ > -/* */ > -/* Output: None. */ > -/* */ > -/* Return: On failure - Exits by calling cleanup(). */ > -/* On success - returns 0. */ > -/* */ > -/******************************************************************************/ > void setup(void) > { > - /* Capture signals if any */ > - act.sa_handler = sighandler; > - sigfillset(&act.sa_mask); > - sigaction(SIGINT, &act, NULL); > - > - /* Create temporary directories */ > - TEST_PAUSE; > - tst_tmpdir(); > + SAFE_SIGNAL(SIGINT, sighandler); > } > > -/* > - * Macros > - */ > -#define SYSCALL_NAME "clock_nanosleep" > - > enum test_type { > NORMAL, > - NULL_POINTER, > SEND_SIGINT, > }; > > -/* > - * Data Structure > - */ > +#define TYPE_NAME(x) .ttype = x, .desc = #x > + > struct test_case { > - clockid_t clk_id; > - int ttype; > - int flags; > + clockid_t clk_id; /* clock_* clock type parameter */ > + int ttype; /* test type (enum) */ > + const char *desc; /* test description (name) */ > + int flags; /* clock_nanosleep flags parameter */ > time_t sec; > long nsec; > - int ret; > - int err; > + int ret; /* expected ret code */ > + int err; /* expected errno code */ It's a bit better to name these variables so that the names are clear and avoid comments. Here exp_ret and exp_err should be descriptive enough so that we don't have to explain it. I tend to avoid comments unless necessary. > }; > > /* Test cases > @@ -161,58 +57,57 @@ struct test_case { > * > * EINTR v (function was interrupted by a signal) > * EINVAL v (invalid tv_nsec, etc.) > - * ENOTSUP can't check because not supported clk_id generates > - * EINVAL > + * ENOTSUP can't check because not supported clk_id generates EINVAL > */ > > static struct test_case tcase[] = { > - { // case00 > + { > .clk_id = CLOCK_REALTIME, > - .ttype = NORMAL, > + TYPE_NAME(NORMAL), > .flags = 0, > .sec = 0, > - .nsec = 500000000, // 500msec > + .nsec = 500000000, > .ret = 0, > .err = 0, > }, > - { // case01 > + { > .clk_id = CLOCK_MONOTONIC, > - .ttype = NORMAL, > + TYPE_NAME(NORMAL), > .flags = 0, > .sec = 0, > - .nsec = 500000000, // 500msec > + .nsec = 500000000, > .ret = 0, > .err = 0, > }, > - { // case02 > - .ttype = NORMAL, > + { > + TYPE_NAME(NORMAL), > .clk_id = CLOCK_REALTIME, > .flags = 0, > .sec = 0, > - .nsec = -1, // invalid > + .nsec = -1, > .ret = EINVAL, > .err = 0, > }, > - { // case03 > - .ttype = NORMAL, > + { > + TYPE_NAME(NORMAL), > .clk_id = CLOCK_REALTIME, > .flags = 0, > .sec = 0, > - .nsec = 1000000000, // invalid > + .nsec = 1000000000, > .ret = EINVAL, > .err = 0, > }, > - { // case04 > - .ttype = NORMAL, > - .clk_id = CLOCK_THREAD_CPUTIME_ID, // not supported > + { > + TYPE_NAME(NORMAL), > + .clk_id = CLOCK_THREAD_CPUTIME_ID, > .flags = 0, > .sec = 0, > - .nsec = 500000000, // 500msec > - .ret = EINVAL, // RHEL4U1 + 2.6.18 returns EINVAL > + .nsec = 500000000, > + .ret = EINVAL, > .err = 0, > }, > - { // case05 > - .ttype = SEND_SIGINT, > + { > + TYPE_NAME(SEND_SIGINT), > .clk_id = CLOCK_REALTIME, > .flags = 0, > .sec = 10, > @@ -220,23 +115,8 @@ static struct test_case tcase[] = { > .ret = EINTR, > .err = 0, > }, > -#if 0 // glibc generates SEGV error (RHEL4U1 + 2.6.18) > - { // caseXX > - .ttype = NULL_POINTER, > - .clk_id = CLOCK_REALTIME, > - .flags = 0, > - .sec = 0, > - .nsec = 500000000, // 500msec > - .ret = EFAULT, > - .err = 0, > - }, > -#endif > }; > > -/* > - * chk_difftime() > - * Return : OK(0), NG(-1) > - */ > #define MAX_MSEC_DIFF 20 > > static int chk_difftime(struct timespec *bef, struct timespec *aft, > @@ -254,152 +134,83 @@ static int chk_difftime(struct timespec *bef, struct timespec *aft, > } > expect = (sec * 1000) + (nsec / 1000000); > result = (t.tv_sec * 1000) + (t.tv_nsec / 1000000); > - tst_resm(TINFO, "check sleep time: (min:%ld) < %ld < (max:%ld) (msec)", > + > + tst_res(TINFO, "check sleep time: (min: %ld) < %ld < (max: %ld) (msec)", > expect - MAX_MSEC_DIFF, result, expect + MAX_MSEC_DIFF); > + > if (result < expect - MAX_MSEC_DIFF || result > expect + MAX_MSEC_DIFF) > return -1; > + > return 0; > } We do have helper functions for measuring elapsed time in LTP. See 2.2.21 Measuring elapsed time in test-writing-guidelines. > -/* > - * do_test() > - * > - * Input : TestCase Data > - * Return : RESULT_OK(0), RESULT_NG(1) > - * > - */ > -static int do_test(struct test_case *tc) > +static void do_test(unsigned int i) > { > - int sys_ret; > - int sys_errno; > - int result = RESULT_OK; > + int sys_ret, sys_errno, dummy; > struct timespec beftp, afttp, rq, rm; > - int rc, range_ok = 1, remain_ok = 1; > + int rc; > pid_t pid = 0; > + struct test_case *tc = &tcase[i]; > > - /* > - * Check before sleep time > - */ > + tst_res(TINFO, "case %s", tc->desc); > + > + /* setup */ > if (tc->ttype == SEND_SIGINT) { > - pid = create_sig_proc(500000, SIGINT, UINT_MAX); > - if (pid < 0) > - return 1; > + pid = create_sig_proc(SIGINT, 40, 500000); > } > > - /* > - * Check before sleep time > - */ > TEST(rc = clock_gettime(tc->clk_id, &beftp)); > if (rc < 0) { > - tst_resm(TFAIL | TTERRNO, "clock_gettime failed"); > - result = 1; > - goto EXIT; > + tst_brk(TBROK, "clock_gettime failed"); > } > - /* > - * Execute system call > - */ > + > + /* test */ > rq.tv_sec = tc->sec; > rq.tv_nsec = tc->nsec; > - // !!!CAUTION: 'clock_gettime' returns errno itself > errno = 0; > - if (tc->ttype == NULL_POINTER) > - TEST(sys_ret = > - clock_nanosleep(tc->clk_id, tc->flags, NULL, &rm)); > - else > - TEST(sys_ret = > - clock_nanosleep(tc->clk_id, tc->flags, &rq, &rm)); > + TEST(sys_ret = clock_nanosleep(tc->clk_id, tc->flags, &rq, &rm)); If you use TEST macro, the errno is zeroed before the call and stored into TEST_ERRNO right after the call. There is no need to do anything else than examine TEST_RETURN after a call to clock_nanoslee(). > sys_errno = errno; > - if (sys_ret != 0) > - goto TEST_END; > - > - /* > - * Check after sleep time > - */ > - TEST(rc = clock_gettime(tc->clk_id, &afttp)); > - if (TEST_RETURN < 0) { > - EPRINTF("clock_gettime failed.\n"); > - result = 1; > - goto EXIT; > - } > - range_ok = chk_difftime(&beftp, &afttp, tc->sec, tc->nsec) == 0; > - /* > - * Check remaining time > - */ > -TEST_END: > - if (tc->ttype == NORMAL || tc->ttype == SEND_SIGINT) { > - tst_resm(TINFO, "remain time: %ld %ld", rm.tv_sec, rm.tv_nsec); > - if (tc->ttype == NORMAL) > - remain_ok = 1; > - else > - remain_ok = rm.tv_sec != 0 || rm.tv_nsec != 0; > + if (sys_ret == 0) { > + TEST(rc = clock_gettime(tc->clk_id, &afttp)); > + if (TEST_RETURN < 0) { > + tst_brk(TBROK, "clock_gettime failed"); > + } > } > > - /* > - * Check results > - */ > - result |= (sys_ret != tc->ret) || !range_ok || !remain_ok; > - if (!range_ok) > - PRINT_RESULT_EXTRA(0, tc->ret, tc->err, sys_ret, sys_errno, > - "time range check", range_ok); > - else > - PRINT_RESULT_EXTRA(0, tc->ret, tc->err, sys_ret, sys_errno, > - "remain time check", remain_ok); > -EXIT: > + tst_res(TINFO, "remain time: %ld %ld", rm.tv_sec, rm.tv_nsec); > + > + /* cleanup */ > if (pid > 0) { > - int st; > - TEST(kill(pid, SIGTERM)); > - TEST(wait(&st)); > + kill(pid, SIGTERM); > + SAFE_WAIT(&dummy); You can pass NULL to wait() if you are not going to examine the status. > } > - return result; > -} > - > -/* > - * main() > - */ > - > -int main(int ac, char **av) > -{ > - int result = RESULT_OK; > - int i; > - int lc; > - > - tst_parse_opts(ac, av, NULL, NULL); > - > - setup(); > - > - for (lc = 0; TEST_LOOPING(lc); ++lc) { > - > - tst_count = 0; > - > - for (testno = 0; testno < TST_TOTAL; ++testno) { > - > - for (i = 0; i < (int)(sizeof(tcase) / sizeof(tcase[0])); > - i++) { > - int ret; > - tst_resm(TINFO, "(case%02d) START", i); > - ret = do_test(&tcase[i]); > - tst_resm(TINFO, "(case%02d) END => %s", > - i, (ret == 0) ? "OK" : "NG"); > - result |= ret; > - } > - > - switch (result) { > - case RESULT_OK: > - tst_resm(TPASS, > - "clock_nanosleep call succeeded"); > - break; > - > - default: > - tst_brkm(TFAIL | TERRNO, cleanup, > - "clock_nanosleep failed"); > - break; > - } > - > - } > > + /* result check */ > + if (sys_ret == 0 && chk_difftime(&beftp, &afttp, tc->sec, tc->nsec) != 0) { > + tst_res(TFAIL, "time range check ret: %d, exp: %d, ret_errno: %s (%d)," > + " exp_errno: %s (%d)", sys_ret, tc->ret, > + tst_strerrno(sys_errno), sys_errno, > + tst_strerrno(tc->err), tc->err); > + } else if (tc->ttype == SEND_SIGINT && !rm.tv_sec && !rm.tv_nsec) { > + tst_res(TFAIL, "remain time check ret: %d, exp: %d, ret_errno: %s (%d)," > + " exp_errno: %s (%d)", sys_ret, tc->ret, > + tst_strerrno(sys_errno), sys_errno, > + tst_strerrno(tc->err), tc->err); > + } else if (sys_ret != tc->ret) { > + tst_res(TFAIL, "ret: %d, exp: %d, ret_errno: %s (%d)," > + " exp_errno: %s (%d)", sys_ret, tc->ret, > + tst_strerrno(sys_errno), sys_errno, > + tst_strerrno(tc->err), tc->err); > + } else { > + tst_res(TPASS, "ret: %d", sys_ret); > } Can we get rid of this else if spaghetti and use return instead? > - cleanup(); > - tst_exit(); > - > } > + > +static struct tst_test test = { > + .tid = "clock_nanosleep01", > + .tcnt = ARRAY_SIZE(tcase), > + .test = do_test, > + .setup = setup, > + .forks_child = 1, > + .needs_tmpdir = 1, Do we really need tmpdir here? > +}; > -- > 2.10.2 > > > -- > Mailing list info: https://lists.linux.it/listinfo/ltp -- Cyril Hrubis chrubis@suse.cz ^ permalink raw reply [flat|nested] 6+ messages in thread
* [LTP] [PATCH 1/2] lib: move create_sig_proc() into newlib 2016-11-16 16:18 [LTP] [PATCH 1/2] lib: move create_sig_proc() into newlib Petr Vorel 2016-11-16 16:18 ` [LTP] [PATCH 2/2] testcases/clock_nanosleep01: convert to use new test library API Petr Vorel @ 2016-11-21 14:57 ` Cyril Hrubis 2016-11-22 7:09 ` Petr Vorel 1 sibling, 1 reply; 6+ messages in thread From: Cyril Hrubis @ 2016-11-21 14:57 UTC (permalink / raw) To: ltp Hi! > diff --git a/include/tst_sig_proc.h b/include/tst_sig_proc.h > new file mode 100644 > index 0000000..bc918eb > --- /dev/null > +++ b/include/tst_sig_proc.h > @@ -0,0 +1,23 @@ > +/* > + * Copyright (c) 2016 Cyril Hrubis <chrubis@suse.cz> ^ This should be you, or Linux Test Project, as it is in several other files > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See > + * the GNU General Public License for more details. > + */ > + > +#ifndef TST_SIG_PROC_H__ > +#define TST_SIG_PROC_H__ > + > +#include <sys/types.h> > +#include <unistd.h> The sys/types.h is enough to get the pid_t defined here. > +pid_t create_sig_proc(int sig, int count, unsigned int usec); > + > +#endif /* TST_SIG_PROC_H__ */ > diff --git a/lib/tst_sig_proc.c b/lib/tst_sig_proc.c > new file mode 100644 > index 0000000..a5f6c54 > --- /dev/null > +++ b/lib/tst_sig_proc.c > @@ -0,0 +1,39 @@ > +/* > + * Copyright (c) 2016 Cyril Hrubis <chrubis@suse.cz> Here as well. > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See > + * the GNU General Public License for more details. > + */ > + > +#include <sys/types.h> > +#include <unistd.h> > +#include <stdlib.h> You should include the tst_sig_proc.h header here, if nothing else that will force that the function definitions in header and source are in sync. > +#define TST_NO_DEFAULT_MAIN > +#include "tst_test.h" Shouldn't be including tst_safe_macros.h here enough? > +pid_t create_sig_proc(int sig, int count, unsigned int usec) > +{ > + pid_t pid, cpid; > + > + pid = getpid(); > + cpid = SAFE_FORK(); > + > + if (cpid == 0) { > + while (count-- > 0) { > + usleep(usec); > + if (kill(pid, sig) == -1) > + break; > + } > + exit(0); > + } > + > + return cpid; > +} > diff --git a/testcases/kernel/syscalls/ppoll/ppoll01.c b/testcases/kernel/syscalls/ppoll/ppoll01.c > index a5815b3..8d6d7e7 100644 > --- a/testcases/kernel/syscalls/ppoll/ppoll01.c > +++ b/testcases/kernel/syscalls/ppoll/ppoll01.c > @@ -28,6 +28,7 @@ > #include <sys/wait.h> > #include "linux_syscall_numbers.h" > #include "ltp_signal.h" > +#include "tst_sig_proc.h" > #include "tst_test.h" > > /* Older versions of glibc don't publish this constant's value. */ > @@ -205,25 +206,6 @@ static void cleanup(void) > close(fd1); > } > > -static pid_t create_sig_proc(int sig, int count, unsigned int usec) > -{ > - pid_t pid, cpid; > - > - pid = getpid(); > - cpid = SAFE_FORK(); > - > - if (cpid == 0) { > - while (count-- > 0) { > - usleep(usec); > - if (kill(pid, sig) == -1) > - break; > - } > - exit(0); > - } > - > - return cpid; > -} > - > static void do_test(unsigned int i) > { > pid_t pid = 0; > -- > 2.10.2 > > > -- > Mailing list info: https://lists.linux.it/listinfo/ltp -- Cyril Hrubis chrubis@suse.cz ^ permalink raw reply [flat|nested] 6+ messages in thread
* [LTP] [PATCH 1/2] lib: move create_sig_proc() into newlib 2016-11-21 14:57 ` [LTP] [PATCH 1/2] lib: move create_sig_proc() into newlib Cyril Hrubis @ 2016-11-22 7:09 ` Petr Vorel 2016-11-22 8:02 ` Cyril Hrubis 0 siblings, 1 reply; 6+ messages in thread From: Petr Vorel @ 2016-11-22 7:09 UTC (permalink / raw) To: ltp Hi Cyril, thanks for a review! > Hi! > > diff --git a/include/tst_sig_proc.h b/include/tst_sig_proc.h > > new file mode 100644 > > index 0000000..bc918eb > > --- /dev/null > > +++ b/include/tst_sig_proc.h > > @@ -0,0 +1,23 @@ > > +/* > > + * Copyright (c) 2016 Cyril Hrubis <chrubis@suse.cz> > ^ > This should be you, or Linux Test Project, as it > is in several other files I'll chose LTP as it's not a code I wrote. <snip> > > diff --git a/lib/tst_sig_proc.c b/lib/tst_sig_proc.c > > new file mode 100644 > > index 0000000..a5f6c54 > > --- /dev/null > > +++ b/lib/tst_sig_proc.c <snip> > > +#define TST_NO_DEFAULT_MAIN > > +#include "tst_test.h" > Shouldn't be including tst_safe_macros.h here enough? Well, create_sig_proc() uses SAFE_FORK macro (defined in tst_test.h), which uses (via safe_fork() function) tst_test structure (also defined in tst_test.h). That's probably the reason, why SAFE_FORK isn't in tst_safe_macros.h among with other SAFE_* macros. So I'd keep it as it is. > > +pid_t create_sig_proc(int sig, int count, unsigned int usec) > > +{ > > + pid_t pid, cpid; > > + > > + pid = getpid(); > > + cpid = SAFE_FORK(); > > + > > + if (cpid == 0) { > > + while (count-- > 0) { > > + usleep(usec); > > + if (kill(pid, sig) == -1) > > + break; > > + } > > + exit(0); > > + } > > + > > + return cpid; > > +} Kind regards, Petr -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 801 bytes Desc: not available URL: <http://lists.linux.it/pipermail/ltp/attachments/20161122/dbb81ef3/attachment.sig> ^ permalink raw reply [flat|nested] 6+ messages in thread
* [LTP] [PATCH 1/2] lib: move create_sig_proc() into newlib 2016-11-22 7:09 ` Petr Vorel @ 2016-11-22 8:02 ` Cyril Hrubis 0 siblings, 0 replies; 6+ messages in thread From: Cyril Hrubis @ 2016-11-22 8:02 UTC (permalink / raw) To: ltp Hi! > > Shouldn't be including tst_safe_macros.h here enough? > Well, create_sig_proc() uses SAFE_FORK macro (defined in tst_test.h), which uses (via > safe_fork() function) tst_test structure (also defined in tst_test.h). That's probably the > reason, why SAFE_FORK isn't in tst_safe_macros.h among with other SAFE_* macros. > So I'd keep it as it is. Ah, right, the SAFE_FORK() is special since we have do make sure stdio is flushed before we call fork, etc. -- Cyril Hrubis chrubis@suse.cz ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2016-11-22 8:02 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-11-16 16:18 [LTP] [PATCH 1/2] lib: move create_sig_proc() into newlib Petr Vorel 2016-11-16 16:18 ` [LTP] [PATCH 2/2] testcases/clock_nanosleep01: convert to use new test library API Petr Vorel 2016-11-21 15:23 ` Cyril Hrubis 2016-11-21 14:57 ` [LTP] [PATCH 1/2] lib: move create_sig_proc() into newlib Cyril Hrubis 2016-11-22 7:09 ` Petr Vorel 2016-11-22 8:02 ` Cyril Hrubis
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox