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