Home | History | Annotate | Download | only in timer_settime
      1 /*
      2  * Copyright (c) Wipro Technologies Ltd, 2003.  All Rights Reserved.
      3  *
      4  * This program is free software; you can redistribute it and/or modify it
      5  * under the terms of version 2 of the GNU General Public License as
      6  * published by the Free Software Foundation.
      7  *
      8  * This program is distributed in the hope that it would be useful, but
      9  * WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     11  *
     12  * You should have received a copy of the GNU General Public License along
     13  * with this program; if not, write the Free Software Foundation, Inc.,
     14  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
     15  *
     16  */
     17 /**************************************************************************
     18  *
     19  *    TEST IDENTIFIER	: timer_settime03
     20  *
     21  *    EXECUTED BY	: anyone
     22  *
     23  *    TEST TITLE	: Test checking for basic error conditions for
     24  *    			  timer_settime(2)
     25  *
     26  *    TEST CASE TOTAL	: 6
     27  *
     28  *    AUTHOR		: Aniruddha Marathe <aniruddha.marathe (at) wipro.com>
     29  *
     30  *    SIGNALS
     31  * 	Uses SIGUSR1 to pause before test if option set.
     32  * 	(See the parse_opts(3) man page).
     33  *
     34  *    DESCRIPTION
     35  *    	This test case check whether timer_settime(2) returns appropriate error
     36  *    	value for invalid parameter
     37  *
     38  * 	Setup:
     39  *	 Setup signal handling.
     40  *	 Pause for SIGUSR1 if option specified.
     41  *
     42  * 	Test:
     43  *	 Loop if the proper options are given.
     44  *	 setup the individual test.
     45  *	 Execute system call with invalid parameters.
     46  *	 Check return code, if system call fails with errno == expected errno
     47  * 	 	Issue syscall passed with expected errno
     48  *	 Otherwise, Issue syscall failed to produce expected errno
     49  *
     50  * 	Cleanup:
     51  * 	 Print errno log and/or timing stats if options given
     52  *
     53  * USAGE:  <for command-line>
     54  * timer_settime03 [-c n] [-e] [-i n] [-I x] [-P x] [-t] [-p]
     55  * where:
     56  * 	-c n : run n copies simultaneously
     57  *	-e   : Turn on errno logging.
     58  *	-i n : Execute test n times.
     59  *	-I x : Execute test for x seconds.
     60  *	-p   : Pause for SIGUSR1 before starting
     61  *	-P x : Pause for x seconds between iterations.
     62  *	-t   : Turn on syscall timing.
     63  *
     64  * RESTRICTIONS:
     65  * None
     66  *****************************************************************************/
     67 
     68 #include <errno.h>
     69 #include <time.h>
     70 #include <unistd.h>
     71 
     72 #include "test.h"
     73 #include "common_timers.h"
     74 
     75 void setup(void);
     76 void setup_test(int option);
     77 
     78 int testcase[] = {
     79 	EINVAL,			/* New setting null */
     80 	EINVAL,			/* tv_nsec < 0 */
     81 	EINVAL,			/* nsec > NSEC/SEC */
     82 	EINVAL,			/* Invalid timerid */
     83 	EFAULT,			/* bad newsetting * */
     84 	EFAULT			/* bad oldsetting * */
     85 };
     86 
     87 char *TCID = "timer_settime03";
     88 int TST_TOTAL = ARRAY_SIZE(testcase);
     89 
     90 static struct itimerspec new_set, old_set, *old_temp, *new_temp;
     91 static kernel_timer_t timer, tim;
     92 
     93 int main(int ac, char **av)
     94 {
     95 	int lc, i;
     96 
     97 	tst_parse_opts(ac, av, NULL, NULL);
     98 
     99 	setup();
    100 
    101 	for (lc = 0; TEST_LOOPING(lc); lc++) {
    102 
    103 		tst_count = 0;
    104 
    105 		for (i = 0; i < TST_TOTAL; i++) {
    106 
    107 			/* Set up individual tests */
    108 			setup_test(i);
    109 			TEST(ltp_syscall(__NR_timer_settime, tim, 0, new_temp,
    110 				     old_temp));
    111 
    112 			/* check return code */
    113 			if (TEST_RETURN == -1 && TEST_ERRNO == testcase[i]) {
    114 				tst_resm(TPASS | TTERRNO, "failed as expected");
    115 			} else {
    116 				tst_resm(TFAIL | TTERRNO,
    117 					 "didn't fail as expected [expected "
    118 					 "errno = %d (%s)]",
    119 					 testcase[i], strerror(testcase[i]));
    120 			}	/* end of else */
    121 
    122 		}
    123 
    124 	}
    125 
    126 	cleanup();
    127 	tst_exit();
    128 }
    129 
    130 /* This function sets up individual tests */
    131 void setup_test(int option)
    132 {
    133 	switch (option) {
    134 	case 0:
    135 		/* Pass NULL structure as new setting */
    136 		new_temp = NULL;
    137 		tim = timer;
    138 		old_temp = &old_set;
    139 		break;
    140 	case 1:
    141 		/* Make tv_nsec value less than 0 */
    142 		new_set.it_value.tv_nsec = -1;
    143 		new_set.it_value.tv_sec = 5;
    144 		new_set.it_interval.tv_sec = 0;
    145 		new_set.it_interval.tv_nsec = 0;
    146 		new_temp = &new_set;
    147 		break;
    148 	case 2:
    149 		/* Make tv_nsec more than NSEC_PER_SEC */
    150 		new_set.it_value.tv_nsec = NSEC_PER_SEC + 1;
    151 		break;
    152 	case 3:
    153 		/* make timer_id invalid */
    154 		tim = (kernel_timer_t) - 1;
    155 		new_set.it_value.tv_nsec = 0;
    156 		break;
    157 	case 4:
    158 		/* make new_setting a bad pointer */
    159 		tim = timer;
    160 		new_temp = (struct itimerspec *)-1;
    161 		break;
    162 	case 5:
    163 		/* make old_setting a bad pointer */
    164 		new_temp = &new_set;
    165 		old_temp = (struct itimerspec *)-1;
    166 		break;
    167 	}
    168 }
    169 
    170 /* setup() - performs all ONE TIME setup for this test */
    171 void setup(void)
    172 {
    173 
    174 	tst_sig(NOFORK, DEF_HANDLER, cleanup);
    175 
    176 	if (ltp_syscall(__NR_timer_create, CLOCK_REALTIME, NULL, &timer) < 0) {
    177 		tst_brkm(TBROK, NULL, "Timer create failed. Cannot"
    178 			 " setup test");
    179 	}
    180 
    181 	TEST_PAUSE;
    182 }
    183 
    184 /*
    185  * cleanup() - Performs one time cleanup for this test at
    186  * completion or premature exit
    187  */
    188 void cleanup(void)
    189 {
    190 }
    191