From patchwork Tue Jul 23 07:08:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Amann X-Patchwork-Id: 1135432 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=lists.linux.it (client-ip=213.254.12.146; helo=picard.linux.it; envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.com Received: from picard.linux.it (picard.linux.it [213.254.12.146]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45t8hl3swPz9sDB for ; Tue, 23 Jul 2019 17:08:39 +1000 (AEST) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id EEFC93C1D37 for ; Tue, 23 Jul 2019 09:08:36 +0200 (CEST) X-Original-To: ltp@lists.linux.it Delivered-To: ltp@picard.linux.it Received: from in-4.smtp.seeweb.it (in-4.smtp.seeweb.it [217.194.8.4]) by picard.linux.it (Postfix) with ESMTP id 384EA3C1C7C for ; Tue, 23 Jul 2019 09:08:26 +0200 (CEST) Received: from mx1.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by in-4.smtp.seeweb.it (Postfix) with ESMTPS id 1FC8E1000376 for ; Tue, 23 Jul 2019 09:08:19 +0200 (CEST) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 7EBABAE91 for ; Tue, 23 Jul 2019 07:08:23 +0000 (UTC) From: Christian Amann To: ltp@lists.linux.it Date: Tue, 23 Jul 2019 09:08:15 +0200 Message-Id: <20190723070817.637-1-camann@suse.com> X-Mailer: git-send-email 2.16.4 X-Virus-Scanned: clamav-milter 0.99.2 at in-4.smtp.seeweb.it X-Virus-Status: Clean X-Spam-Status: No, score=0.0 required=7.0 tests=SPF_HELO_NONE,SPF_PASS autolearn=disabled version=3.4.0 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on in-4.smtp.seeweb.it Subject: [LTP] [PATCH v1 1/3] timers/timer_delete0{2, 3}: Ported to new library X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it Sender: "ltp" Cleaned up and ported both timer_delete(2) tests to new library. Signed-off-by: Christian Amann --- .../kernel/timers/timer_delete/timer_delete02.c | 188 +++++++-------------- .../kernel/timers/timer_delete/timer_delete03.c | 175 +++++-------------- 2 files changed, 102 insertions(+), 261 deletions(-) rewrite testcases/kernel/timers/timer_delete/timer_delete02.c (93%) rewrite testcases/kernel/timers/timer_delete/timer_delete03.c (93%) diff --git a/testcases/kernel/timers/timer_delete/timer_delete02.c b/testcases/kernel/timers/timer_delete/timer_delete02.c dissimilarity index 93% index b9b9c7ffc..6380a34cf 100644 --- a/testcases/kernel/timers/timer_delete/timer_delete02.c +++ b/testcases/kernel/timers/timer_delete/timer_delete02.c @@ -1,125 +1,63 @@ -/* - * Copyright (c) Wipro Technologies Ltd, 2003. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - */ -/************************************************************************** - * - * TEST IDENTIFIER : timer_delete02 - * - * EXECUTED BY : anyone - * - * TEST TITLE : Basic test for timer_delete(2) - * - * TEST CASE TOTAL : 1 - * - * AUTHOR : Aniruddha Marathe - * - * SIGNALS - * Uses SIGUSR1 to pause before test if option set. - * (See the parse_opts(3) man page). - * - * DESCRIPTION - * This is a Phase I test for the timer_delete(2) system call. - * It is intended to provide a limited exposure of the system call. - * - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. - * - * Test: - * Loop if the proper options are given. - * Create a POSIX timer - * Execute system call - * Check return code, if system call failed (return=-1) - * Log the errno and Issue a FAIL message. - * Otherwise, Issue a PASS message. - * - * Cleanup: - * Print errno log and/or timing stats if options given - * - * USAGE: - * timer_delete02 [-c n] [-e] [-i n] [-I x] [-P x] [-t] [-p] - * where: - * -c n : Run n copies simultaneously. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -p : Pause for SIGUSR1 before starting - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - *RESTRICTIONS: - * None - *****************************************************************************/ - -#include -#include -#include -#include - -#include "test.h" -#include "common_timers.h" - -void setup(void); - -char *TCID = "timer_delete02"; /* Test program identifier. */ -int TST_TOTAL = 1; /* Total number of test cases. */ - -int main(int ac, char **av) -{ - int lc; - kernel_timer_t timer_id; - - tst_parse_opts(ac, av, NULL, NULL); - - setup(); - - for (lc = 0; TEST_LOOPING(lc); lc++) { - - tst_count = 0; - - /* Create a Posix timer */ - if (ltp_syscall(__NR_timer_create, CLOCK_REALTIME, NULL, - &timer_id) < 0) { - tst_count = TST_TOTAL; - tst_brkm(TBROK | TERRNO, cleanup, - "timer_delete can't be tested because " - "timer_create failed"); - } - TEST(ltp_syscall(__NR_timer_delete, timer_id)); - tst_resm((TEST_RETURN == 0 ? TPASS : TFAIL | TTERRNO), - "%s", (TEST_RETURN == 0 ? "passed" : "failed")); - } - - cleanup(); - tst_exit(); -} - -/* setup() - performs all ONE TIME setup for this test */ -void setup(void) -{ - - tst_sig(NOFORK, DEF_HANDLER, cleanup); - - TEST_PAUSE; -} - -/* - * cleanup() - Performs one time cleanup for this test at - * completion or premature exit - */ -void cleanup(void) -{ -} +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) Wipro Technologies Ltd, 2003. All Rights Reserved. + * + * Author: Aniruddha Marathe + * + * Ported to new library: + * 07/2019 Christian Amann + */ +/* + * Basic test for timer_delete(2) + * + * Creates a timer for each available clock and then tries + * to delete them again. + */ + +#include +#include +#include "tst_test.h" +#include "common_timers.h" + +static void run(void) +{ + unsigned int i; + kernel_timer_t timer_id; + + for (i = 0; i < CLOCKS_DEFINED; ++i) { + clock_t clock = clock_list[i]; + + if (clock == CLOCK_PROCESS_CPUTIME_ID || + clock == CLOCK_THREAD_CPUTIME_ID) { + if (!have_cputime_timers()) + continue; + } + + tst_res(TINFO, "Testing %s", get_clock_str(clock)); + + TEST(tst_syscall(__NR_timer_create, clock, NULL, &timer_id)); + if (TST_RET != 0) { + if (possibly_unsupported(clock) && TST_ERR == EINVAL) { + tst_res(TPASS | TTERRNO, + "%s unsupported, failed as expected", + get_clock_str(clock)); + } else { + tst_res(TBROK | TTERRNO, + "Aborting test - timer_create(%s) failed", + get_clock_str(clock)); + } + continue; + } + + TEST(tst_syscall(__NR_timer_delete, timer_id)); + if (TST_RET == 0) + tst_res(TPASS, "Timer deleted successfully!"); + else + tst_res(TFAIL | TTERRNO, "Timer deletion failed!"); + } +} + +static struct tst_test test = { + .test_all = run, + .needs_root = 1, +}; diff --git a/testcases/kernel/timers/timer_delete/timer_delete03.c b/testcases/kernel/timers/timer_delete/timer_delete03.c dissimilarity index 93% index 02506fb90..748c23c0f 100644 --- a/testcases/kernel/timers/timer_delete/timer_delete03.c +++ b/testcases/kernel/timers/timer_delete/timer_delete03.c @@ -1,136 +1,39 @@ -/* - * Copyright (c) Wipro Technologies Ltd, 2003. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - */ -/************************************************************************** - * - * TEST IDENTIFIER : timer_delete03 - * - * EXECUTED BY : anyone - * - * TEST TITLE : Test checking for basic error conditions for - * timer_delete(2) - * - * TEST CASE TOTAL : 1 - * - * AUTHOR : Aniruddha Marathe - * - * SIGNALS - * Uses SIGUSR1 to pause before test if option set. - * (See the parse_opts(3) man page). - * - * DESCRIPTION - * This test case check whether timer_delete(2) returns appropriate error - * value for invalid parameter - * - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. - * - * Test: - * Loop if the proper options are given. - * Execute system call with invalid parameter. - * Check return code, if system call fails with errno == expected errno - * Issue syscall passed with expected errno - * Otherwise, Issue syscall failed to produce expected errno - * - * Cleanup: - * Print errno log and/or timing stats if options given - * - * USAGE: - * timer_delete03 [-c n] [-e] [-i n] [-I x] [-P x] [-t] [-p] - * where: - * -c n : run n copies simultaneously - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -p : Pause for SIGUSR1 before starting - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * RESTRICTIONS: - * None - *****************************************************************************/ - -#include -#include -#include -#include - -#include "test.h" -#include "common_timers.h" - -#define INVALID_ID ((kernel_timer_t)-1) - -void setup(void); - -int testcase[] = { - EINVAL /* Invalid timer ID */ -}; - -char *TCID = "timer_delete03"; -int TST_TOTAL = ARRAY_SIZE(testcase); - -int main(int ac, char **av) -{ - int lc, i; - - tst_parse_opts(ac, av, NULL, NULL); - - setup(); - - for (lc = 0; TEST_LOOPING(lc); lc++) { - - tst_count = 0; - - for (i = 0; i < TST_TOTAL; i++) { - - TEST(ltp_syscall(__NR_timer_delete, INVALID_ID)); - - /* check return code */ - if (TEST_RETURN == -1 && TEST_ERRNO == testcase[i]) { - tst_resm(TPASS | TTERRNO, - "failed as expected failure"); - } else { - tst_resm(TFAIL | TTERRNO, - "didn't fail as expected [expected " - "errno = %d (%s)]", - testcase[i], strerror(testcase[i])); - } /* end of else */ - - } /* End of TEST CASE LOOPING */ - - } /* End for TEST_LOOPING */ - - cleanup(); - tst_exit(); -} - -/* setup() - performs all ONE TIME setup for this test */ -void setup(void) -{ - - tst_sig(NOFORK, DEF_HANDLER, cleanup); - - TEST_PAUSE; -} - -/* - * cleanup() - Performs one time cleanup for this test at - * completion or premature exit - */ -void cleanup(void) -{ -} +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) Wipro Technologies Ltd, 2003. All Rights Reserved. + * + * Author: Aniruddha Marathe + * + * Ported to new library: + * 07/2019 Christian Amann + */ +/* + * Basic error handling test for timer_delete(2): + * + * This test case checks whether timer_delete(2) returns an appropriate + * error (EINVAL) for an invalid timerid parameter + */ + +#include +#include +#include "tst_test.h" +#include "common_timers.h" + +#define INVALID_ID ((kernel_timer_t)-1) + +static void run(void) +{ + TEST(tst_syscall(__NR_timer_delete, INVALID_ID)); + + if (TST_RET == -1 && TST_ERR == EINVAL) { + tst_res(TPASS | TTERRNO, + "Failed as expected"); + } else { + tst_res(TFAIL | TTERRNO, + "Didn't fail with EINVAL as expected - got"); + } +} + +static struct tst_test test = { + .test_all = run, +}; From patchwork Tue Jul 23 07:08:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Amann X-Patchwork-Id: 1135433 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=lists.linux.it (client-ip=2001:1418:10:5::2; helo=picard.linux.it; envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.com Received: from picard.linux.it (picard.linux.it [IPv6:2001:1418:10:5::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45t8hz0ykNz9sBF for ; Tue, 23 Jul 2019 17:08:50 +1000 (AEST) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id 32F893C1D19 for ; Tue, 23 Jul 2019 09:08:44 +0200 (CEST) X-Original-To: ltp@lists.linux.it Delivered-To: ltp@picard.linux.it Received: from in-7.smtp.seeweb.it (in-7.smtp.seeweb.it [IPv6:2001:4b78:1:20::7]) by picard.linux.it (Postfix) with ESMTP id 76E293C1C7C for ; Tue, 23 Jul 2019 09:08:27 +0200 (CEST) Received: from mx1.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by in-7.smtp.seeweb.it (Postfix) with ESMTPS id 724112010EC for ; Tue, 23 Jul 2019 09:08:25 +0200 (CEST) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id B10CEB061 for ; Tue, 23 Jul 2019 07:08:24 +0000 (UTC) From: Christian Amann To: ltp@lists.linux.it Date: Tue, 23 Jul 2019 09:08:16 +0200 Message-Id: <20190723070817.637-2-camann@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190723070817.637-1-camann@suse.com> References: <20190723070817.637-1-camann@suse.com> X-Virus-Scanned: clamav-milter 0.99.2 at in-7.smtp.seeweb.it X-Virus-Status: Clean X-Spam-Status: No, score=0.0 required=7.0 tests=SPF_HELO_NONE,SPF_PASS autolearn=disabled version=3.4.0 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on in-7.smtp.seeweb.it Subject: [LTP] [PATCH v1 2/3] timers/timer_settime0{2, 3}: Ported to new library X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it Sender: "ltp" Cleaned up and ported both timer_settime(2) tests to new library. Signed-off-by: Christian Amann --- .../kernel/timers/timer_settime/timer_settime02.c | 318 ++++++++------------- .../kernel/timers/timer_settime/timer_settime03.c | 314 ++++++++------------ 2 files changed, 249 insertions(+), 383 deletions(-) rewrite testcases/kernel/timers/timer_settime/timer_settime02.c (92%) rewrite testcases/kernel/timers/timer_settime/timer_settime03.c (95%) diff --git a/testcases/kernel/timers/timer_settime/timer_settime02.c b/testcases/kernel/timers/timer_settime/timer_settime02.c dissimilarity index 92% index cfeb7b3d3..36d9a745f 100644 --- a/testcases/kernel/timers/timer_settime/timer_settime02.c +++ b/testcases/kernel/timers/timer_settime/timer_settime02.c @@ -1,193 +1,125 @@ -/* - * Copyright (c) Wipro Technologies Ltd, 2003. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - */ -/************************************************************************** - * - * TEST IDENTIFIER : timer_settime02 - * - * EXECUTED BY : anyone - * - * TEST TITLE : Basic test for timer_settime(2) - * - * TEST CASE TOTAL : 4 - * - * AUTHOR : Aniruddha Marathe - * - * SIGNALS - * Uses SIGUSR1 to pause before test if option set. - * (See the parse_opts(3) man page). - * - * DESCRIPTION - * This is a Phase I test for the timer_settime(2) system call. - * It is intended to provide a limited exposure of the system call. - * - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. - * - * Test: - * Loop if the proper options are given. - * setup individual test - * Execute system call - * Check return code, if system call failed (return=-1) - * Log the errno and Issue a FAIL message. - * Otherwise, Issue a PASS message. - * - * Cleanup: - * Print errno log and/or timing stats if options given - * - * USAGE: - * timer_settime02 [-c n] [-e] [-i n] [-I x] [-P x] [-t] [-p] - * where: - * -c n : Run n copies simultaneously. - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -p : Pause for SIGUSR1 before starting - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - *RESTRICTIONS: - * None - *****************************************************************************/ - -#include -#include -#include -#include - -#include "test.h" -#include "common_timers.h" - -void setup(void); -static int setup_test(int option); - -char *TCID = "timer_settime02"; /* Test program identifier. */ -int TST_TOTAL = 4; /* Total number of test cases. */ - -static struct itimerspec new_set, old_set, *old_temp; -static kernel_timer_t timer; -static int flag; - -int main(int ac, char **av) -{ - int lc, i; - - tst_parse_opts(ac, av, NULL, NULL); - - setup(); - - for (lc = 0; TEST_LOOPING(lc); lc++) { - - tst_count = 0; - - for (i = 0; i < TST_TOTAL; i++) { - - /* Set up individual test */ - if (setup_test(i) == 0) { - TEST(ltp_syscall(__NR_timer_settime, timer, - flag, &new_set, old_temp)); - tst_resm((TEST_RETURN == 0 ? - TPASS : - TFAIL | TTERRNO), - "%s", - (TEST_RETURN == - 0 ? "passed" : "failed") - ); - } - - } - } - - cleanup(); - tst_exit(); -} - -/* This function does set up for individual tests */ -static int setup_test(int option) -{ - struct timespec timenow; /* Used to obtain current time */ - int rc = 0; - - switch (option) { - case 0: - /* This is general initialization. - * make old_setting NULL - * make flags equal to zero - * use one-shot timer - */ - old_temp = NULL; - new_set.it_interval.tv_sec = 0; - new_set.it_interval.tv_nsec = 0; - new_set.it_value.tv_sec = 5; - new_set.it_value.tv_nsec = 0; - flag = 0; - break; - case 1: - /* get the old_setting in old_set - * This test case also takes care - * of situation where the timerid is - * already armed - */ - old_temp = &old_set; - break; - case 2: - /* Use the periodic timer */ - new_set.it_interval.tv_sec = 5; - new_set.it_value.tv_sec = 0; - break; - case 3: - /* Use TIMER_ABSTIME flag for setting - * absolute time for timer - */ - flag = TIMER_ABSTIME; - /* - * Let's not use the linux_syscall_number syscall(2) - * wrapper here because our primary test focus is - * timer_create, not clock_gettime. That's covered in - * those respective tests. - */ - if (clock_gettime(CLOCK_REALTIME, &timenow) < 0) { - tst_resm(TWARN | TERRNO, - "clock_gettime failed; skipping the test"); - rc = -1; - } else { - new_set.it_value.tv_sec = timenow.tv_sec + 25; - } - break; - } - return rc; -} - -/* setup() - performs all ONE TIME setup for this test */ -void setup(void) -{ - - tst_sig(NOFORK, DEF_HANDLER, cleanup); - - TEST_PAUSE; - - if (ltp_syscall(__NR_timer_create, CLOCK_REALTIME, NULL, &timer) < 0) - tst_brkm(TBROK, NULL, "timer_create failed"); -} - -/* - * cleanup() - Performs one time cleanup for this test at - * completion or premature exit - */ -void cleanup(void) -{ -} +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) Wipro Technologies Ltd, 2003. All Rights Reserved. + * + * Author: Aniruddha Marathe + * + * Ported to new library: + * 07/2019 Christian Amann + */ +/* + * This tests the timer_settime(2) syscall under various conditions: + * + * 1) General initialization: No old_value, no flags, 5-second-timer + * 2) Setting a pointer to a itimerspec struct as old_set parameter + * 3) Using a periodic timer + * 4) Using absolute time + * + * All of these tests are supposed to be successful. + */ + +#include +#include +#include +#include +#include "tst_test.h" +#include "common_timers.h" + +static struct timespec timenow; +static struct itimerspec new_set, old_set; +static kernel_timer_t timer; + +static struct testcase { + struct itimerspec *old_ptr; + int it_value_tv_sec; + int it_internal_tv_sec; + int check_clock_gettime; + int flag; + char *description; +} tcases[] = { + {NULL, 5, 0, 0, 0, "general initialization"}, + {&old_set, 5, 0, 0, 0, "setting old_value"}, + {&old_set, 0, 5, 0, 0, "using periodic timer"}, + {&old_set, 5, 0, 1, TIMER_ABSTIME, "using absolute time"}, +}; + +static void run(unsigned int n) +{ + unsigned int i; + struct testcase *tc = &tcases[n]; + + tst_res(TINFO, "Testing for %s:", tc->description); + + for (i = 0; i < CLOCKS_DEFINED; ++i) { + clock_t clock = clock_list[i]; + + if (clock == CLOCK_PROCESS_CPUTIME_ID || + clock == CLOCK_THREAD_CPUTIME_ID) { + if (!have_cputime_timers()) + continue; + } + + TEST(tst_syscall(__NR_timer_create, clock, NULL, &timer)); + if (TST_RET != 0) { + if (possibly_unsupported(clock) && TST_ERR == EINVAL) { + tst_res(TPASS | TTERRNO, + "%s unsupported, failed as expected", + get_clock_str(clock)); + } else { + tst_res(TBROK | TTERRNO, + "timer_create(%s) failed", + get_clock_str(clock)); + } + continue; + } + + memset(&new_set, 0, sizeof(new_set)); + memset(&old_set, 0, sizeof(old_set)); + + new_set.it_value.tv_sec = tc->it_value_tv_sec; + new_set.it_interval.tv_sec = tc->it_internal_tv_sec; + + if (tc->check_clock_gettime) { + if (clock_gettime(clock, &timenow) < 0) { + tst_res(TBROK, + "clock_gettime(%s) failed - skipping the test", + get_clock_str(clock)); + continue; + } + new_set.it_value.tv_sec = timenow.tv_sec + 25; + } + + TEST(tst_syscall(__NR_timer_settime, timer, + tc->flag, &new_set, tc->old_ptr)); + + if (TST_RET != 0) { + tst_res(TFAIL | TTERRNO, "%s failed", + get_clock_str(clock)); + } else { + tst_res(TPASS, "%s was successful", + get_clock_str(clock)); + } + + TEST(tst_syscall(__NR_timer_delete, timer)); + if (TST_RET != 0) + tst_res(TFAIL | TTERRNO, "timer_delete() failed!"); + } +} + +static void sighandler(int sig) +{ + /* sighandler for CLOCK_*_ALARM */ + tst_res(TINFO, "Caught signal %s", tst_strsig(sig)); +} + +static void setup(void) +{ + SAFE_SIGNAL(SIGALRM, sighandler); +} + +static struct tst_test test = { + .test = run, + .needs_root = 1, + .tcnt = ARRAY_SIZE(tcases), + .setup = setup, +}; diff --git a/testcases/kernel/timers/timer_settime/timer_settime03.c b/testcases/kernel/timers/timer_settime/timer_settime03.c dissimilarity index 95% index 1216c117c..80861995f 100644 --- a/testcases/kernel/timers/timer_settime/timer_settime03.c +++ b/testcases/kernel/timers/timer_settime/timer_settime03.c @@ -1,190 +1,124 @@ -/* - * Copyright (c) Wipro Technologies Ltd, 2003. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - */ -/************************************************************************** - * - * TEST IDENTIFIER : timer_settime03 - * - * EXECUTED BY : anyone - * - * TEST TITLE : Test checking for basic error conditions for - * timer_settime(2) - * - * TEST CASE TOTAL : 6 - * - * AUTHOR : Aniruddha Marathe - * - * SIGNALS - * Uses SIGUSR1 to pause before test if option set. - * (See the parse_opts(3) man page). - * - * DESCRIPTION - * This test case check whether timer_settime(2) returns appropriate error - * value for invalid parameter - * - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. - * - * Test: - * Loop if the proper options are given. - * setup the individual test. - * Execute system call with invalid parameters. - * Check return code, if system call fails with errno == expected errno - * Issue syscall passed with expected errno - * Otherwise, Issue syscall failed to produce expected errno - * - * Cleanup: - * Print errno log and/or timing stats if options given - * - * USAGE: - * timer_settime03 [-c n] [-e] [-i n] [-I x] [-P x] [-t] [-p] - * where: - * -c n : run n copies simultaneously - * -e : Turn on errno logging. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -p : Pause for SIGUSR1 before starting - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * RESTRICTIONS: - * None - *****************************************************************************/ - -#include -#include -#include - -#include "test.h" -#include "common_timers.h" - -void setup(void); -void setup_test(int option); - -int testcase[] = { - EINVAL, /* New setting null */ - EINVAL, /* tv_nsec < 0 */ - EINVAL, /* nsec > NSEC/SEC */ - EINVAL, /* Invalid timerid */ - EFAULT, /* bad newsetting * */ - EFAULT /* bad oldsetting * */ -}; - -char *TCID = "timer_settime03"; -int TST_TOTAL = ARRAY_SIZE(testcase); - -static struct itimerspec new_set, old_set, *old_temp, *new_temp; -static kernel_timer_t timer, tim; - -int main(int ac, char **av) -{ - int lc, i; - - tst_parse_opts(ac, av, NULL, NULL); - - setup(); - - for (lc = 0; TEST_LOOPING(lc); lc++) { - - tst_count = 0; - - for (i = 0; i < TST_TOTAL; i++) { - - /* Set up individual tests */ - setup_test(i); - TEST(ltp_syscall(__NR_timer_settime, tim, 0, new_temp, - old_temp)); - - /* check return code */ - if (TEST_RETURN == -1 && TEST_ERRNO == testcase[i]) { - tst_resm(TPASS | TTERRNO, "failed as expected"); - } else { - tst_resm(TFAIL | TTERRNO, - "didn't fail as expected [expected " - "errno = %d (%s)]", - testcase[i], strerror(testcase[i])); - } /* end of else */ - - } - - } - - cleanup(); - tst_exit(); -} - -/* This function sets up individual tests */ -void setup_test(int option) -{ - switch (option) { - case 0: - /* Pass NULL structure as new setting */ - new_temp = NULL; - tim = timer; - old_temp = &old_set; - break; - case 1: - /* Make tv_nsec value less than 0 */ - new_set.it_value.tv_nsec = -1; - new_set.it_value.tv_sec = 5; - new_set.it_interval.tv_sec = 0; - new_set.it_interval.tv_nsec = 0; - new_temp = &new_set; - break; - case 2: - /* Make tv_nsec more than NSEC_PER_SEC */ - new_set.it_value.tv_nsec = NSEC_PER_SEC + 1; - break; - case 3: - /* make timer_id invalid */ - tim = (kernel_timer_t) - 1; - new_set.it_value.tv_nsec = 0; - break; - case 4: - /* make new_setting a bad pointer */ - tim = timer; - new_temp = (struct itimerspec *)-1; - break; - case 5: - /* make old_setting a bad pointer */ - new_temp = &new_set; - old_temp = (struct itimerspec *)-1; - break; - } -} - -/* setup() - performs all ONE TIME setup for this test */ -void setup(void) -{ - - tst_sig(NOFORK, DEF_HANDLER, cleanup); - - if (ltp_syscall(__NR_timer_create, CLOCK_REALTIME, NULL, &timer) < 0) { - tst_brkm(TBROK, NULL, "Timer create failed. Cannot" - " setup test"); - } - - TEST_PAUSE; -} - -/* - * cleanup() - Performs one time cleanup for this test at - * completion or premature exit - */ -void cleanup(void) -{ -} +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) Wipro Technologies Ltd, 2003. All Rights Reserved. + * + * Author: Aniruddha Marathe + * + * Ported to new library: + * 07/2019 Christian Amann + */ +/* + * This tests basic error handling of the timer_settime(2) syscall: + * + * 1) Setting pointer to new settings to NULL -> EINVAL + * 2) Setting tv_nsec of the itimerspec structure to a negative value + * -> EINVAL + * 3) Setting tv_nsec of the itimerspec structure to something larger + * than NSEC_PER_SEC -> EINVAL + * 4) Passing an invalid timer -> EINVAL + * 5) Passing an invalid address for new_value -> EFAULT + * 6) Passing an invalid address for old_value -> EFAULT + */ + +#include +#include +#include "tst_test.h" +#include "common_timers.h" + +static struct itimerspec new_set, old_set; +static kernel_timer_t timer, timer_inval; + +/* separate description-array to (hopefully) improve readability */ +static const char * const descriptions[] = { + "setting new_set pointer to NULL", + "setting tv_nsec to a negative value", + "setting tv_nsec value too high", + "passing pointer to invalid timer_id", + "passing invalid address for new_value", + "passing invalid address for old_value", +}; + +static struct testcase { + kernel_timer_t *timer_id; + struct itimerspec *new_ptr; + struct itimerspec *old_ptr; + int it_value_tv_nsec; + int error; +} tcases[] = { + {&timer, NULL, &old_set, 0, EINVAL}, + {&timer, &new_set, &old_set, -1, EINVAL}, + {&timer, &new_set, &old_set, NSEC_PER_SEC + 1, EINVAL}, + {&timer_inval, &new_set, &old_set, 0, EINVAL}, + {&timer, (struct itimerspec *) -1, &old_set, 0, EFAULT}, + {&timer, &new_set, (struct itimerspec *) -1, 0, EFAULT}, +}; + +static void run(unsigned int n) +{ + unsigned int i; + struct testcase *tc = &tcases[n]; + + tst_res(TINFO, "Testing for %s:", descriptions[n]); + + for (i = 0; i < CLOCKS_DEFINED; ++i) { + clock_t clock = clock_list[i]; + + if (clock == CLOCK_PROCESS_CPUTIME_ID || + clock == CLOCK_THREAD_CPUTIME_ID) { + if (!have_cputime_timers()) + continue; + } + + /* Init temporary timer */ + TEST(tst_syscall(__NR_timer_create, clock, NULL, &timer)); + if (TST_RET != 0) { + if (possibly_unsupported(clock) && TST_ERR == EINVAL) { + tst_res(TPASS | TTERRNO, + "%s unsupported, failed as expected", + get_clock_str(clock)); + } else { + tst_res(TBROK | TTERRNO, + "timer_create(%s) failed", + get_clock_str(clock)); + } + continue; + } + + memset(&new_set, 0, sizeof(new_set)); + memset(&old_set, 0, sizeof(old_set)); + + new_set.it_value.tv_sec = 5; + new_set.it_value.tv_nsec = tc->it_value_tv_nsec; + + TEST(tst_syscall(__NR_timer_settime, *tc->timer_id, + 0, tc->new_ptr, tc->old_ptr)); + + if (tc->error != TST_ERR) { + tst_res(TFAIL | TTERRNO, + "%s didn't fail as expected. Expected: %s - Got", + get_clock_str(clock), + tst_strerrno(tc->error)); + } else { + tst_res(TPASS | TTERRNO, + "%s failed as expected", + get_clock_str(clock)); + } + + /* Delete temporary timer */ + TEST(tst_syscall(__NR_timer_delete, timer)); + if (TST_RET != 0) + tst_res(TFAIL | TTERRNO, "timer_delete() failed!"); + } +} + +static void setup(void) +{ + timer_inval = -1; +} + +static struct tst_test test = { + .test = run, + .needs_root = 1, + .tcnt = ARRAY_SIZE(tcases), + .setup = setup, +}; From patchwork Tue Jul 23 07:08:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Amann X-Patchwork-Id: 1135431 X-Patchwork-Delegate: petr.vorel@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=lists.linux.it (client-ip=213.254.12.146; helo=picard.linux.it; envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.com Received: from picard.linux.it (picard.linux.it [213.254.12.146]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 45t8hj609kz9sBt for ; Tue, 23 Jul 2019 17:08:35 +1000 (AEST) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id 7B9CF3C1D04 for ; Tue, 23 Jul 2019 09:08:29 +0200 (CEST) X-Original-To: ltp@lists.linux.it Delivered-To: ltp@picard.linux.it Received: from in-2.smtp.seeweb.it (in-2.smtp.seeweb.it [217.194.8.2]) by picard.linux.it (Postfix) with ESMTP id 3A2183C1C7F for ; Tue, 23 Jul 2019 09:08:26 +0200 (CEST) Received: from mx1.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by in-2.smtp.seeweb.it (Postfix) with ESMTPS id 8C0E56018A3 for ; Tue, 23 Jul 2019 09:08:25 +0200 (CEST) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 3015FB06B for ; Tue, 23 Jul 2019 07:08:25 +0000 (UTC) From: Christian Amann To: ltp@lists.linux.it Date: Tue, 23 Jul 2019 09:08:17 +0200 Message-Id: <20190723070817.637-3-camann@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190723070817.637-1-camann@suse.com> References: <20190723070817.637-1-camann@suse.com> X-Virus-Scanned: clamav-milter 0.99.2 at in-2.smtp.seeweb.it X-Virus-Status: Clean X-Spam-Status: No, score=0.0 required=7.0 tests=SPF_HELO_NONE,SPF_PASS autolearn=disabled version=3.4.0 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on in-2.smtp.seeweb.it Subject: [LTP] [PATCH v1 3/3] timers/leapsec_timer: Ported to new library X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it Sender: "ltp" Ported the test to the new library Signed-off-by: Christian Amann Notes: The leapsec timer is still a mess, even after porting it. Cleaning it up would probably be its own patch as the best solution would be to rewrite it from scratch --- testcases/kernel/timers/include/common_timers.h | 1 - testcases/kernel/timers/leapsec/leapsec_timer.c | 174 +++++++++++------------- 2 files changed, 80 insertions(+), 95 deletions(-) diff --git a/testcases/kernel/timers/include/common_timers.h b/testcases/kernel/timers/include/common_timers.h index 154be670f..df4196eeb 100644 --- a/testcases/kernel/timers/include/common_timers.h +++ b/testcases/kernel/timers/include/common_timers.h @@ -7,7 +7,6 @@ #ifndef __COMMON_TIMERS_H__ #define __COMMON_TIMERS_H__ -#define CLEANUP cleanup #include "config.h" #include "lapi/syscalls.h" #include "lapi/posix_clocks.h" diff --git a/testcases/kernel/timers/leapsec/leapsec_timer.c b/testcases/kernel/timers/leapsec/leapsec_timer.c index 1d18f6433..e087cc47a 100644 --- a/testcases/kernel/timers/leapsec/leapsec_timer.c +++ b/testcases/kernel/timers/leapsec/leapsec_timer.c @@ -1,3 +1,12 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) Red Hat, Inc., 2012. + * + * Author: Lingzhu Xiang + * + * Ported to new library: + * 07/2019 Christian Amann + */ /* * Regression test for hrtimer early expiration during and after leap seconds * @@ -7,60 +16,36 @@ * * This is a regression test for the bug. * - * Lingzhu Xiang Copyright (c) Red Hat, Inc., 2012. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * + * Note: running this test simultaneously with a timesync daemon + * (e.g. systemd-timesyncd) can cause this test to fail. */ #include -#include -#include #include -#include +#include #include -#include "test.h" +#include "tst_test.h" +#include "tst_safe_clocks.h" #include "common_timers.h" #define SECONDS_BEFORE_LEAP 2 #define SECONDS_AFTER_LEAP 2 -char *TCID = "leapsec_timer"; -int TST_TOTAL = 1; - -static inline int in_order(struct timespec a, struct timespec b); -static void adjtimex_status(struct timex *tx, int status); -static const char *strtime(const struct timespec *now); -static void test_hrtimer_early_expiration(void); -static void run_leapsec(void); -static void setup(void); -static void cleanup(void); +static int errors; -int main(int argc, char **argv) +static const char *strtime(const struct timespec *now) { - int lc; - - tst_parse_opts(argc, argv, NULL, NULL); - - setup(); + static char fmt[256], buf[256]; - for (lc = 0; TEST_LOOPING(lc); lc++) { - tst_count = 0; - run_leapsec(); + if (snprintf(fmt, sizeof(fmt), "%%T.%09ld", now->tv_nsec) < 0) { + buf[0] = '\0'; + return buf; } - - cleanup(); - tst_exit(); + if (!strftime(buf, sizeof(buf), fmt, localtime(&now->tv_sec))) { + buf[0] = '\0'; + return buf; + } + return buf; } static inline int in_order(struct timespec a, struct timespec b) @@ -84,64 +69,53 @@ static void adjtimex_status(struct timex *tx, int status) "leap second has occurred", "clock not synchronized", }; - int r; + + int ret; struct timespec now; tx->modes = ADJ_STATUS; tx->status = status; - r = adjtimex(tx); + ret = adjtimex(tx); now.tv_sec = tx->time.tv_sec; now.tv_nsec = tx->time.tv_usec * 1000; if ((tx->status & status) != status) - tst_brkm(TBROK, cleanup, "adjtimex status %d not set", status); - else if (r < 0) - tst_brkm(TBROK | TERRNO, cleanup, "adjtimex"); - else if (r < 6) - tst_resm(TINFO, "%s adjtimex: %s", strtime(&now), msgs[r]); + tst_brk(TBROK, "adjtimex status %d not set", status); + else if (ret < 0) + tst_brk(TBROK | TERRNO, "adjtimex"); + else if (ret < 6) + tst_res(TINFO, "%s adjtimex: %s", strtime(&now), msgs[ret]); else - tst_resm(TINFO, "%s adjtimex: clock state %d", - strtime(&now), r); -} - -static const char *strtime(const struct timespec *now) -{ - static char fmt[256], buf[256]; - - if (snprintf(fmt, sizeof(fmt), "%%F %%T.%09ld %%z", now->tv_nsec) < 0) { - buf[0] = '\0'; - return buf; - } - if (!strftime(buf, sizeof(buf), fmt, localtime(&now->tv_sec))) { - buf[0] = '\0'; - return buf; - } - return buf; + tst_res(TINFO, "%s adjtimex: clock state %d", + strtime(&now), ret); } static void test_hrtimer_early_expiration(void) { struct timespec now, target; - int r, fail; + int ret; - clock_gettime(CLOCK_REALTIME, &now); - tst_resm(TINFO, "now is %s", strtime(&now)); + SAFE_CLOCK_GETTIME(CLOCK_REALTIME, &now); + tst_res(TINFO, "now is %s", strtime(&now)); target = now; target.tv_sec++; - tst_resm(TINFO, "sleep till %s", strtime(&target)); - r = clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &target, NULL); - if (r < 0) { - tst_resm(TINFO | TERRNO, "clock_nanosleep"); + tst_res(TINFO, "sleep until %s", strtime(&target)); + ret = clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &target, NULL); + if (ret < 0) { + tst_res(TINFO | TERRNO, "clock_nanosleep"); return; } - clock_gettime(CLOCK_REALTIME, &now); - tst_resm(TINFO, "now is %s", strtime(&now)); + SAFE_CLOCK_GETTIME(CLOCK_REALTIME, &now); + tst_res(TINFO, "now is %s", strtime(&now)); - fail = !in_order(target, now); - tst_resm(fail ? TFAIL : TINFO, "hrtimer early expiration is %s.", - fail ? "detected" : "not detected"); + if (in_order(target, now)) { + tst_res(TINFO, "hrtimer early expiration is not detected."); + } else { + tst_res(TFAIL, "hrtimer early expiration is detected."); + errors++; + } } static void run_leapsec(void) @@ -150,9 +124,9 @@ static void run_leapsec(void) struct timespec now, leap, start; struct timex tx; - clock_gettime(CLOCK_REALTIME, &now); + SAFE_CLOCK_GETTIME(CLOCK_REALTIME, &now); start = now; - tst_resm(TINFO, "test start at %s", strtime(&now)); + tst_res(TINFO, "test start at %s", strtime(&now)); test_hrtimer_early_expiration(); @@ -160,13 +134,13 @@ static void run_leapsec(void) now.tv_sec += 86400 - now.tv_sec % 86400; now.tv_nsec = 0; leap = now; - tst_resm(TINFO, "scheduling leap second %s", strtime(&leap)); + tst_res(TINFO, "scheduling leap second %s", strtime(&leap)); /* start before the leap second */ now.tv_sec -= SECONDS_BEFORE_LEAP; - if (clock_settime(CLOCK_REALTIME, &now) < 0) - tst_brkm(TBROK | TERRNO, cleanup, "clock_settime"); - tst_resm(TINFO, "setting time to %s", strtime(&now)); + SAFE_CLOCK_SETTIME(CLOCK_REALTIME, &now); + + tst_res(TINFO, "setting time to %s", strtime(&now)); /* reset NTP time state */ adjtimex_status(&tx, STA_PLL); @@ -175,7 +149,7 @@ static void run_leapsec(void) /* set the leap second insert flag */ adjtimex_status(&tx, STA_INS); - /* reliably sleep till after the leap second */ + /* reliably sleep until after the leap second */ while (tx.time.tv_sec < leap.tv_sec + SECONDS_AFTER_LEAP) { adjtimex_status(&tx, tx.status); clock_nanosleep(CLOCK_MONOTONIC, 0, &sleeptime, NULL); @@ -187,31 +161,43 @@ static void run_leapsec(void) adjtimex_status(&tx, 0); /* recover from timer expiring state and restore time */ - clock_gettime(CLOCK_REALTIME, &now); + SAFE_CLOCK_GETTIME(CLOCK_REALTIME, &now); start.tv_sec += now.tv_sec - (leap.tv_sec - SECONDS_BEFORE_LEAP); start.tv_nsec += now.tv_nsec; start.tv_sec += start.tv_nsec / NSEC_PER_SEC; start.tv_nsec = start.tv_nsec % NSEC_PER_SEC; - tst_resm(TINFO, "restoring time to %s", strtime(&start)); + tst_res(TINFO, "restoring time to %s", strtime(&start)); /* calls clock_was_set() in kernel to revert inconsistency */ - if (clock_settime(CLOCK_REALTIME, &start) < 0) - tst_brkm(TBROK | TERRNO, cleanup, "clock_settime"); + SAFE_CLOCK_SETTIME(CLOCK_REALTIME, &start); test_hrtimer_early_expiration(); + + if (!errors) + tst_res(TPASS, "No errors were reported during this test!"); + else + tst_res(TFAIL, "Got %d errors during this test!", errors); + } static void setup(void) { - tst_require_root(); - tst_sig(NOFORK, DEF_HANDLER, CLEANUP); - TEST_PAUSE; + errors = 0; } static void cleanup(void) { struct timespec now; - clock_gettime(CLOCK_REALTIME, &now); - /* Calls clock_was_set() in kernel to revert inconsistency. - * The only possible EPERM doesn't matter here. */ - clock_settime(CLOCK_REALTIME, &now); + + SAFE_CLOCK_GETTIME(CLOCK_REALTIME, &now); + /* Calls clock_was_set() in the kernel to revert inconsistencies. + * The only possible error EPERM doesn't matter here. + * */ + SAFE_CLOCK_SETTIME(CLOCK_REALTIME, &now); } + +static struct tst_test test = { + .test_all = run_leapsec, + .setup = setup, + .cleanup = cleanup, + .needs_root = 1, +};