1 /*
2  * Copyright (c) 2002, Intel Corporation. All rights reserved.
3  * Created by:  julie.n.fleischer REMOVE-THIS AT intel DOT com
4  * This file is licensed under the GPL license.  For the full content
5  * of this license, see the COPYING file at the top level of this
6  * source tree.
7 
8  * Test nanosleep() on a variety of valid and invalid input parameters.
9  *
10  * For valid parameters, if the seconds spent is within OKSECERR, the
11  * test is considered a pass (Note:  This is not too accurate since
12  * accuracy is at the second level.).
13  *
14  * For invalid parameters, nanosleep should fail with -1 exit and
15  * errno set to EINVAL.
16  */
17 #include <stdio.h>
18 #include <time.h>
19 #include <errno.h>
20 #include "posixtest.h"
21 
22 #define NUMVALID 6
23 #define NUMINVALID 7
24 
25 #define OKSECERR 1
26 
27 /*
28  * Copyright (c) 2002, Intel Corporation. All rights reserved.
29  * Created by:  julie.n.fleischer REMOVE-THIS AT intel DOT com
30  * This file is licensed under the GPL license.  For the full content
31  * of this license, see the COPYING file at the top level of this
32  * source tree.
33 
34  * input tests
35  */
36 static int sleepvalid[NUMVALID][2] = { {0, 30000000}, {1, 0},
37 {1, 30000000}, {2, 0},
38 {10, 5000}, {13, 5}
39 };
40 static int sleepinvalid[NUMINVALID][2] = { {-1, -1}, {0, -1},
41 {1, 1000000000}, {2, 1000000000},
42 {-2147483647, -2147483647},
43 {1, 2147483647},
44 {0, 1075002478}
45 };
46 
main(void)47 int main(void)
48 {
49 	struct timespec tssleepfor, tsstorage, tsbefore, tsafter;
50 	int i;
51 	int failure = 0;
52 	int slepts = 0, sleptns = 0;
53 
54 	for (i = 0; i < NUMVALID; i++) {
55 		tssleepfor.tv_sec = sleepvalid[i][0];
56 		tssleepfor.tv_nsec = sleepvalid[i][1];
57 		printf("sleep %d sec %d nsec\n",
58 		       (int)tssleepfor.tv_sec, (int)tssleepfor.tv_nsec);
59 		if (clock_gettime(CLOCK_REALTIME, &tsbefore) == -1) {
60 			perror("Error in clock_gettime()\n");
61 			return PTS_UNRESOLVED;
62 		}
63 
64 		if (nanosleep(&tssleepfor, &tsstorage) == 0) {
65 			if (clock_gettime(CLOCK_REALTIME, &tsafter) == -1) {
66 				perror("Error in clock_gettime()\n");
67 				return PTS_UNRESOLVED;
68 			}
69 			/*
70 			 * Generic alg for calculating slept time.
71 			 */
72 			slepts = tsafter.tv_sec - tsbefore.tv_sec;
73 			sleptns = tsafter.tv_nsec - tsbefore.tv_nsec;
74 			if (sleptns < 0) {
75 				sleptns = sleptns + 1000000000;
76 				slepts = slepts - 1;
77 			}
78 
79 			if ((slepts - tssleepfor.tv_sec) > OKSECERR) {
80 				printf("FAIL - slept %ds%dns >> %lds%ldns\n",
81 				       slepts, sleptns,
82 				       tssleepfor.tv_sec, tssleepfor.tv_nsec);
83 				failure = 1;
84 			} else {
85 				printf("PASS - slept %ds%dns ~= %lds%ldns\n",
86 				       slepts, sleptns,
87 				       tssleepfor.tv_sec, tssleepfor.tv_nsec);
88 			}
89 		} else {
90 			printf("nanosleep() did not return 0 on success\n");
91 			failure = 1;
92 		}
93 	}
94 
95 	for (i = 0; i < NUMINVALID; i++) {
96 		tssleepfor.tv_sec = sleepinvalid[i][0];
97 		tssleepfor.tv_nsec = sleepinvalid[i][1];
98 		printf("sleep %d sec %d nsec\n",
99 		       (int)tssleepfor.tv_sec, (int)tssleepfor.tv_nsec);
100 		if (nanosleep(&tssleepfor, &tsstorage) == -1) {
101 			if (EINVAL != errno) {
102 				printf("errno != EINVAL\n");
103 				failure = 1;
104 			}
105 		} else {
106 			printf("nanosleep() did not return -1 on failure\n");
107 			failure = 1;
108 		}
109 	}
110 
111 	if (failure) {
112 		printf("At least one test FAILED\n");
113 		return PTS_FAIL;
114 	} else {
115 		printf("All tests PASSED\n");
116 		return PTS_PASS;
117 	}
118 	return PTS_PASS;
119 }
120