1 /*
2  * Copyright (c) International Business Machines  Corp., 2001
3  *  07/2001 Ported by Wayne Boyer
4  * Copyright (C) 2015 Cyril Hrubis <chrubis@suse.cz>
5  *
6  * This program is free software;  you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY;  without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
14  * the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program;  if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /*
22  * Test Name: nanosleep01
23  *
24  * Test Description:
25  *  nanosleep() should return with value 0 and the process should be
26  *  suspended for time specified by timespec structure.
27  */
28 
29 #include <errno.h>
30 #include "test.h"
31 
32 char *TCID = "nanosleep01";
33 int TST_TOTAL = 1;
34 
35 static void setup(void);
36 
main(int ac,char ** av)37 int main(int ac, char **av)
38 {
39 	int lc;
40 	struct timespec timereq = {.tv_sec = 2, .tv_nsec = 9999};
41 
42 	tst_parse_opts(ac, av, NULL, NULL);
43 
44 	setup();
45 
46 	for (lc = 0; TEST_LOOPING(lc); lc++) {
47 		tst_timer_start(CLOCK_MONOTONIC);
48 		TEST(nanosleep(&timereq, NULL));
49 		tst_timer_stop();
50 
51 		if (TEST_RETURN == -1) {
52 			tst_resm(TFAIL | TERRNO, "nanosleep() failed");
53 			continue;
54 		}
55 
56 		if (tst_timespec_lt(tst_timer_elapsed(), timereq)) {
57 			tst_resm(TFAIL,
58 			         "nanosleep() suspended for %lli us, expected %lli",
59 				 tst_timer_elapsed_us(), tst_timespec_to_us(timereq));
60 		} else {
61 			tst_resm(TPASS, "nanosleep() suspended for %lli us",
62 			         tst_timer_elapsed_us());
63 		}
64 	}
65 
66 	tst_exit();
67 }
68 
setup(void)69 static void setup(void)
70 {
71 	tst_sig(FORK, DEF_HANDLER, NULL);
72 	tst_timer_check(CLOCK_MONOTONIC);
73 	TEST_PAUSE;
74 }
75